< СТАТЬИ

ОПРЕДЕЛЯЕМ ПРИНАДЛЕЖНОСТЬ ОКОН И ДВЕРЕЙ ПОМЕЩЕНИЯМ С ПОМОЩЬЮ DYNAMO + REVIT API

18.10.2021

Каждый проектировщик в своей практике регулярно сталкивается с ситуациями, когда необходимо передать параметры из помещения в экземпляры семейств которые его окружают (в первую очередь, двери и окна). А так как при проектировании приходится иметь дело с десятками параметров и сотнями дверей и окон, то очень много времени тратится неэффективно.

Чтобы сократить непроизводительные временные затраты, целесообразно автоматизировать такие процессы, для чего можно использовать Dynamo – гибкую среду, которая служит для адаптации и расширения функциональных возможностей базового ПО.

Стандартных нодов в Dynamo, позволяющих сделать это не существует, а вариант с пакетными нодами зачастую неудобен. Но выход есть, и это Revit API. Чтобы узнать, из какого помещения, в какое ведет дверь, или какому помещению принадлежит окно, воспользуемся классом FamilyInstance в Revit API. В этом классе имеются два свойства, позволяющие решить проблему:

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

import clr

clr.AddReference("RevitAPI")

from Autodesk.Revit.DB import *

clr.AddReference("RevitServices")

import RevitServices

from RevitServices.Persistence import DocumentManager

doc = DocumentManager.Instance.CurrentDBDocument # Текущий документ

doors = UnwrapElement(IN[0]) # Список дверей который подаем в входной слот IN[0]

lst = [] # пустой список

#-----------------------ОСНОВНОЙ КОД-----------------------

for door in doors: # перебираем в цикле все двери

                    phaseId = door.CreatedPhaseId # Получаем Id стадии в которой была создана дверь

                    phase = doc.GetElement(phaseId) # получаем саму стадию

                    toRoom = door.ToRoom[phase] # в помещение

                    fromRoom = door.FromRoom[phase] # из помещения

                    lst.append([fromRoom, toRoom]) # набираем полученные помещения в список

OUT = lst

Как вариант, Id стадии можно получить, обратившись к встроенному параметру "Стадия возведения":

phaseId = door.get_Parameter(BuiltInParameter.PHASE_CREATED).AsElementId()

Код представленный выше, нужно вставить в нод PythonScript.

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

Как с помощью Dynamo и Revit API определить принадлежность дверей и окон помещению

В случае если данный параметр выключен, то стрелочки определения не будут видны, и по умолчанию, они лежат на опорной плоскости семейства. При включенном данном параметре можно управлять ими вручную. Соответственно, если стрелка определения не пересекается с помещением (к примеру, врезается в пол), на выходе из OUT мы получим значение None, что, естественно, будет являться ошибкой. Нужно всегда помнить об этом.

Надеемся, теперь у вас не будет сложностей с определением принадлежности и передачей параметров "Из помещения" и "В помещение" для дверей и окон. По вопросам, связанным с этой темой, вы можете обратиться к специалистам Академии БИМ.