Найти в Дзене

REVIT API. PyRevit: Как массово синхронизировать модели.

Оглавление

Введение

В прошлый раз мы разобрали как открывать модели:

А теперь надо понять как это все закрывать. В идеале сделать так, чтобы появлялось окно с настройками закрытия по типу того, которое мы видим при использование кнопки синхронизации:

-2

Значит надо придумать, чем в этот раз отрисовать форму. В Pyrevit нет возможности создавать произвольные пользовательские интерфейсы, поэтому воспользуемся еще одним модулем rpw.

Revit Python Wrapper — Revit Python Wrapper 1.7.4 documentation

Окно настроек синхронизации

В rpw есть возможность создавать простые произвольные формы. Посмотрим как это было реализовано у меня:

-3

Тут все достаточно просто: в components вызываем нужный тип формы и передаем в него (переменную для хранения, Имя которые будет отображаться, стандартное значение) и так для всех нужных элементов интерфейса. После чего вызываем саму форму и записываем значения в одноименные переменные

Получается следующее окошко:

-4

Мне понравилось использовать комментарий к синхронизации, таким образом стало проще понимать с какими моделями я уже работал через Revit Server Administrator.

Метод закрытия моделей

Как-то так совпало, что в момент когда я сел разбираться, как лучше произвести синхронизацию и закрытие, у pyRevit вышло обновление, в котором ребята реализовали аналог кнопки синхронизации.
Там задумка была в том, что Revit быстрее производит синхронизацию, если закрыты неактивные виды, а в идеале если вообще остался только начальный вид.
Но главное, что там было для меня - функция синхронизации.
Я обрадовался и решил не изобретать колесо, а позаимствовать эту функцию, немного модернизировав ее для работы с окном настроек.

-5

Так же были добавлены принты и таймер для оценки скорости синхронизации:

Давайте попробую описать что же происходит в этой функции:

  • Проверка модели на то может ли она синхронизироваться (включен ли режим совместной работы, не является ли она документом семейства, не является ли связью.) стр 63
  • Задаем настройки синхронизации
  • Применяем комментарий который мы задавали в форме.
  • И проходимся условиями для выбранных в форме функций - если поставили галочку Синхронизации, только в этом случае запускаем d.SynhoronizeWithCentral (стр 82)

MAIN

Остается только собрать список открытых моделей и для каждой запустить данную функцию

-6

Для сборки списка открытых моделей идеально подходит функция select_open_docs которая уже есть в pyRevit.

Мало того, что появляется окно выбора, так еще и исключается активная на данный момент модель? что предотвращает появление ошибки - если мы попытаемся через код закрыть активную модель ревит выдает ошибку, мол вы пытаетесь закрыть активную модель, а так нельзя.
Так же исключаются из списка документы относящиеся к семействам

Окно выглядит так:

-7

Результат выбора пользователя записываем в переменную dest_docs (стр 99)

И перед тем как начать проходится по всем выбранным моделям, убедимся что этот список не пустой. (стр 101)

Далее я добавил всякие визуальные подтверждения работы скрипта, типа output.update_progress и total time для подсчета общего затраченного времени. На всякий случай покажу как этот кусок выглядит чистым:

-8

В последствие я буду использовать такой main для всех скриптов связанных с работой внутри открытых моделей, просто переписывая основную функцию расположенную на строчке 104.

В резултате работы скрипта появится консоль с выводом хода работы:

-9

Итог

Мы получили удобный, гибкий и быстрый способ закрытия моделей. Теперь между скриптом открытия и скриптом закрытия мы можем помещать все что угодно.

Примеры работ которые уже были проведены с помощью данной связки:

  • Перемещение базовой точки проекте
  • Добавление видов, шаблонов и назначение шаблонов видам
  • Переименование видов
  • Добавление связей
  • Создание рабочих наборов

и тд.