Введение
В прошлый раз мы разобрали как открывать модели:
А теперь надо понять как это все закрывать. В идеале сделать так, чтобы появлялось окно с настройками закрытия по типу того, которое мы видим при использование кнопки синхронизации:
Значит надо придумать, чем в этот раз отрисовать форму. В Pyrevit нет возможности создавать произвольные пользовательские интерфейсы, поэтому воспользуемся еще одним модулем rpw.
Окно настроек синхронизации
В rpw есть возможность создавать простые произвольные формы. Посмотрим как это было реализовано у меня:
Тут все достаточно просто: в components вызываем нужный тип формы и передаем в него (переменную для хранения, Имя которые будет отображаться, стандартное значение) и так для всех нужных элементов интерфейса. После чего вызываем саму форму и записываем значения в одноименные переменные
Получается следующее окошко:
Мне понравилось использовать комментарий к синхронизации, таким образом стало проще понимать с какими моделями я уже работал через Revit Server Administrator.
Метод закрытия моделей
Как-то так совпало, что в момент когда я сел разбираться, как лучше произвести синхронизацию и закрытие, у pyRevit вышло обновление, в котором ребята реализовали аналог кнопки синхронизации.
Там задумка была в том, что Revit быстрее производит синхронизацию, если закрыты неактивные виды, а в идеале если вообще остался только начальный вид.
Но главное, что там было для меня - функция синхронизации.
Я обрадовался и решил не изобретать колесо, а позаимствовать эту функцию, немного модернизировав ее для работы с окном настроек.
Так же были добавлены принты и таймер для оценки скорости синхронизации:
Давайте попробую описать что же происходит в этой функции:
- Проверка модели на то может ли она синхронизироваться (включен ли режим совместной работы, не является ли она документом семейства, не является ли связью.) стр 63
- Задаем настройки синхронизации
- Применяем комментарий который мы задавали в форме.
- И проходимся условиями для выбранных в форме функций - если поставили галочку Синхронизации, только в этом случае запускаем d.SynhoronizeWithCentral (стр 82)
MAIN
Остается только собрать список открытых моделей и для каждой запустить данную функцию
Для сборки списка открытых моделей идеально подходит функция select_open_docs которая уже есть в pyRevit.
Мало того, что появляется окно выбора, так еще и исключается активная на данный момент модель? что предотвращает появление ошибки - если мы попытаемся через код закрыть активную модель ревит выдает ошибку, мол вы пытаетесь закрыть активную модель, а так нельзя.
Так же исключаются из списка документы относящиеся к семействам
Окно выглядит так:
Результат выбора пользователя записываем в переменную dest_docs (стр 99)
И перед тем как начать проходится по всем выбранным моделям, убедимся что этот список не пустой. (стр 101)
Далее я добавил всякие визуальные подтверждения работы скрипта, типа output.update_progress и total time для подсчета общего затраченного времени. На всякий случай покажу как этот кусок выглядит чистым:
В последствие я буду использовать такой main для всех скриптов связанных с работой внутри открытых моделей, просто переписывая основную функцию расположенную на строчке 104.
В резултате работы скрипта появится консоль с выводом хода работы:
Итог
Мы получили удобный, гибкий и быстрый способ закрытия моделей. Теперь между скриптом открытия и скриптом закрытия мы можем помещать все что угодно.
Примеры работ которые уже были проведены с помощью данной связки:
- Перемещение базовой точки проекте
- Добавление видов, шаблонов и назначение шаблонов видам
- Переименование видов
- Добавление связей
- Создание рабочих наборов
и тд.