Продолжение цикла про работу с соединителями и Ревит АПИ. В этой части посмотрим на свойства соединителей через Динамо и Питон. Первую статью можете найти по ссылкам ниже в оглавлении.
Оглавление цикла
По мере выхода статей будут добавлять сюда ссылки.
- Часть 1 — Про Ревит Лукап и зачем он нужен
- Часть 2 — Обращение к соединителям через Динамо и Питон (вы здесь)
- Часть 3 — Обработка нескольких элементов сразу
Обращение к соединителям в Динамо
Первым делом нужно в Динамо создать новый скрипт и добавить пару нодов: первый для выбора элемента в модели, Select Model Element, второй — для Питона, Python Script. Жму кнопку «Выбрать» в ноде для выбора элемента и выделяю диффузор. После этого в Динамо приходит диффузор, с ним и поработаем как с элементом, у которого только один соединитель.
Чтобы получить доступ к свойствам элемента в Питоне, нужно провести специальную операцию — распаковать элементы. В Ревите и Динамо какая-то чехарда с элементами, потому что в Ревите одни элементы, в Динамо приходят уже какие-то другие. В общем, чтобы работать дальше, нужно поданные в Питон-нод элементы «засунуть» в функцию UnwrapElement() — распаковать элемент. Выглядит это так:
IN[0] — это вход с моими элементами, чаще всего подают список элементов. Если подаёте список элементов в другой вход Питон-нода, то нужно указывать его индекс, например IN[1] или IN[2].
После распаковки мы получаем доступ к свойствам наших элементов. И вот тут пригодятся знания, которые получили в первой статье — про работу с Ревит Лукапом. Там мы обсуждали, что путь к соединителям системных и загружаемых категорий немного отличается. У загружаемых семейств есть свойство «MEPModel», а у системных — нет.
Посмотрим же на примере, как добраться до соединителей диффузора. Для этого нужно воспроизвести тот путь, что мы делаем в Ревит Лукапе. Каждый шаг записываем через точку. Давайте сначала покажу Ревит Лукап, а потом код в Питоне.
Каждое жирное имя поля в Ревит Лукапе — это отдельный шаг на пути к соединителям. Напишу его в одну строку: Диффузор → MEPModel → ConnectorManager → Connectors → Connector (набор соединителей, в нашем случае всего один).
Чтобы то же самое сделать в Питоне, нужно записать этот путь через точки, здесь Elements — это то, что мы подали в Питон-нод и распаковали, то есть наш диффузор, а connset — новая переменная, в которую записываю соединители:
Рекомендую код отсюда копировать сначала в Блокнот, чтобы очистить форматирование, а уже потом закидывать в Питон-нод.
Elements = UnwrapElement(IN[0])
connset = Elements.MEPModel.ConnectorManager.Connectors
OUT = connset
Autodesk.Revit.DB.Connector — это так Питон выводит наш набор соединителей. Обратите внимание на область под Питон-нодом: есть индекс 0 и чуть выше слово «List», то есть мы получили список. Connector Set — это набор соединителей, то есть список. Поэтому Питон выводит список соединителей, пусть даже там всего один соединитель. OUT — специальный оператор, который выводит из Питон-нода информацию.
Для воздуховода, трубы или другой системной категории запись будет похожей, но без MEPModel:
connset = Elements.ConnectorManager.Connectors
Поздравляю, вы только что использовали Ревит АПИ в своей работе. Бегите, скажите маме, что теперь вы программист и скоро у вас будет очень много деняк.
Получение свойств соединителей
Соединители сидят в наборе соединителей, который представляет из себя список. Даже если в списке всего один элемент, нам придётся обрабатывать его через цикл. Поэтому сейчас заодно изучим, как устроен цикл for в Питоне. Цикл будет проходить по каждому отдельному элементу списка, то есть по каждому соединителю, и вот тогда мы получим доступ к их свойствам.
Подробнее узнать про цикл for можете самостоятельно, погуглите, основы синтаксиса объяснять не буду. Сейчас моя задача — получить свойства соединителя.
Для этого пишу вот такой код с циклом for:
for con in connset:
con_svoistvo = con.Shape
con — новая переменная, в неё Питон будет записывать по мере прохождения цикла каждый соединитель. Далее ввожу ещё одну переменную con_svoistvo — в неё буду записывать свойства соединителя.
Чтобы получить свойство, достаточно взять соединитель и через точку написать имя свойства. Названия свойств на английском и их опять-таки можно посмотреть в Ревит Лукапе, в моём примере беру свойство Shape — форма соединителя:
В Питоне это выглядит вот так:
Если написать код так же, как у меня выше, то в OUT всегда будет выходить форма самого последнего соединителя из списка, даже если будем подавать в Питон несколько инженерных элементов. Обычно это неинформативно, так как нужны данные по всем соединителям. Поэтому давайте изменим код так, чтобы записывать данные по каждому соединителю, который подадим в Питон.
Для этого нужно создать пустой список и добавлять в него данные. Пустой список нужно объявить перед циклом, внутри цикла добавлять данные, и в OUT подавать уже наш новый список. Если создать список внутри цикла, то будет добавлять данные только для одного элемента, так как цикл за один раз обрабатывает только один элемент.
Код будет таким:
Elements = UnwrapElement(IN[0])
connset = Elements.MEPModel.ConnectorManager.Connectors
newlist = []
for con in connset:
con_svoistvo = con.Shape
newlist.append(con_svoistvo)
OUT = newlist
newlist — это имя новой переменной, через знак «равно» говорю Питону, что в эту переменную нужно записать пустой список, он обозначается []. Далее внутри цикла методом append() добавляю то свойство, что вытащил из соединителя. На выходе получаю не просто текст «Round», как до этого а список, в котором есть один элемент — текст «Round».
Чтобы это было нагляднее, выделю в модели не диффузор, а тройник воздуховода. Ровно тот же код выдаст мне список уже из трёх свойств соединителей — по одному на каждый соединитель тройника.
Свойства соединителей
Посмотрим, какие вообще свойства можно вытащить. Снова обратимся к Ревит Лукапу и диффузору. Пронумерую свойства на скриншоте и ниже расскажу про них. Свойств много, расскажу только про те, что считаю главными.
- Domain — вид соединителя, Hvac — это воздуховоды, Piping — трубы и так далее. Полный список можно посмотреть в документации по Ревит АПИ (не надо, не лезь, она тебя сожрёт).
- Origin — координаты соединителя в пространстве модели. Важный параметр, некоторые операции с соединителями нужно проводить с указанием их координат.
- Radius — нетрудно догадаться, что это радиус соединителя, аналогичные параметры для прямоугольных соединителей — Height (высота) и Width (ширина). Данные приходят в футах, чтобы перевести в мм нужно домножить на 304,8. Под списком будет скриншот-пример.
- Shape — форма соединителя, для воздуховодов могут быть вариации, для остального — нет.
- AllRefs — очень интересное свойство, оно показывает все подключённые к соединителю другие соединители. То есть мы можем «посмотреть», что за соединитель подключён к нашему соединителю, а потом и получить подключённый элемент.
- Angle — угол соединителя, может пригодится при работе с отводами или косыми тройниками.
- Параметры со словом Assigned — назначенный, отвечают за свойства, которые мы назначаем на соединитель в редакторе семейств. AssignedFlow — расход, FlowDirection — направление потока, PressureDrop — потери давления и так далее.
- ConnectorManager — тут можно вернуться в Коннектор Менеджер, в котором «сидит» наш соединитель.
- Direction — направление соединителя, In — Внутрь, Out — Наружу, Bidirectional — Двухсторонний.
- Flow — расход в кубических футах в секунду, если домножить на 3600*0,3048**3, то получаются кубометры в час. ** — это возведение в степень в Питоне.
- IsConnected — проверка, подключён ли соединитель к какому-либо элементу.
- MEPSystem — инженерная система, к которой принадлежит соединитель. Очень важная проверка, чтобы исключать соединители, которые есть в семействе, но никуда не подключены.
Например, в проекте ВК может быть насос, у которого есть соединители по воде и электрике. В ВК к электроцепям насос подключать не будут, но соединитель нужен для электриков. В итоге он будет возвращать значение null в свойстве MEPSystem. Или приточка в ОВ, у которой теплоснабжение сделано в другом файле, тогда соединители по воде тоже будут возвращать null.
Такие соединители в ряде задач нужно исключать из обработки. Это мы посмотрим в другой статье цикла. - Owner — владелец соединителя. С помощью этого свойства можно получить элемент, которому принадлежит соединитель. Например, если скомбинировать свойства AllRefs и Owner, то можно первым свойством получить подключённый соединитель, а потом и его владельца. Таким образом мы узнаем, что за элемент подключён к нашему.
- GetMEPConnectorInfo() — это не свойство, а метод, поэтому выделил оранжевым. В программном коде они записываются с круглыми скобками на конце. Если «провалиться» в этот метод, то можно узнать, является ли данный соединитель первичным. Иногда бывает нужно.
В следующей статье посмотрим, как обрабатывать сразу несколько элементов, а не один, и некоторые практические примеры по работе со свойствами.