Логика работы с IFC будет справедливо для любого Dynamo
В текущей реализации Renga API не ко всем объектам есть доступ для их программного чтения, а геометрия через API получается только в Faceted-представлении. В то же время, у Renga имеется прекрасный IFC-модуль по импорту\экспорту, чем можно пользоваться для расширенного доступ к данным информационной модели (по большей части к геометрии).
Конечно, использование IFC как промежуточного файла не панацея от всех потребностей, и сам способ методически не правильный, но мы всё же покажем применение такого подхода.
Показывать будем на примере работы в Dynamo по двум причинам: это наглядно, а по другой - нам потребуется среда написания и визуализации Python (на котором мы и будем "обращаться" к IFC-файлу).
Как я оговорился выше, работать с IFC-файлом мы будем с помощью библиотеки IfcOpenShell для Python. Разумеется, есть и другие библиотеки, но я решил остановиться на ней.
В качестве действий, мы будем получать доступ к геометрии осей (так как базово их не получить средствами Renga API).
Шаг 1 - Подготовка IFC-файла и модели Renga.
IFC-файл представляет собой структуру графо-подобных элементов. В нашем случае, нас будут интересовать объекты модели с их свойствами и геометрией (хранимыми в корне "этажа" здания или иной структурной группы).
Рассматриваемые оси не относятся к категории твердотельных объектов, это скорее вспомогательные сущности, которые в структуре IFC файла хранятся как класс IfcGridAxis зачастую без каких-либо свойств (даже если таковые и есть в модели).
Действие 1. Небольшая вводная на тему объектов и их идентификаторов
Каждый элемент IFC-модели имеет свой идентификатор. Как правило, идентификаторы хранятся в поле GlobalId элемента IFC. Если вы захотите проверить это, то можете столкнуться, что эти идентификаторы не совпадают. Дело в том (см. закрепленный комментарий под статьей), что в IFC уходят UUID'ы -- это есть и спецификация к уникальным значениям и её стандарт, в то время как внутри Renga у нас GUID'ы, и соответственно в IFC у нас uuid'ы, которые нужно преобразовать к виду GUID для сравнения с идентификаторами модели.
Действие 2. Выгрузка IFC с правилами
При желании работать в IFC с объектными свойствами (которые по умолчанию не попадают в выгрузку, следует воспользоваться следующим скриптом из курса):
Скрипт расположен по ссылке -https://github.com/GeorgGrebenyuk/RengaDyn/releases/download/dyn_scripts/RengaDyn_Sample_EditMappingPSetsFile.dyn
В нем мы создаем копию системного файла "export_attr_qto_pset.json", куда прописываем все объектные свойства.
В принципе, ещё можно настроить правила экспорта геометрии, но оставим это на усмотрение читателя - нам сейчас пока это не важно.
Шаг 2 - Установка библиотеки IfcOpenShell для Python
Мы с вами будем работать с IFC-файлами из-под Python скриптов в Dynamo, поэтому необходимо добавить путь к библиотеке для работы с Ifc (IfcOpenShell) для используемого Python.
Здесь нам потребуется провернуть действия, указанные в данной справочной статье, а именно:
- Узнать версию Python для версии Python в Dynamo. Для демонстрируемой 2.12.1 версию CPython = 3.8.3;
- Скачать для данной версии версию IfcOpenShell не старше этой (то есть 3.8 в нашем случае, или, полное название - IfcOpenShell-python for python 3.8 64bit Windows;
- Распаковать этот пакет и заглянуть в каталог \ifcopenshell\requirements.txt: там будет список зависимостей (вспомогательных Python-библиотек) которые нужны для работы ifcopenshell;
- Установить pip для версии dynamo -- по руководству из ссылки выше и загрузить для него зависимости. Ниже приведены зависимости для версии 3.8.3:
lxml==4.6.5
numpy==1.21.0
regex==2021.4.4
xmlschema==1.6.4
5. В каталог для dynamo-python распаковать дополнительно IfcOpenShell.
Все перечисленные действия, как и в целом действия в статье будут приведены в видео к статье. Но рекомендуется для текстового варианта -- ориентироваться на приведенную инструкцию.
Шаг 3 - парсинг IFC файла в Dynamo
Теперь, получив IFC и подготовив библиотеку IfcOpenShell, мы можем приступать к самому интересному - к чтению ifc-файла. Для примера выведем информацию о геометрии осей из файла "House.rnp" входящего в базовые проекты с программой:
Нам нужны оси, следовательно -- нужен Ifc-класс "IFCGRIDAXIS"
Сперва получим оси как объекты модели и возьмем у них имена:
Так как в конечный IFC-файл попадает идентификатор оси (часть слова "Ось - " исчезает), видоизменим результат:
Если бы нас интересовали оси только на каком-то уровне, мы могли бы также их отфильтровать (из подели по Уровню (нод "GetObjectsByLevel"), а в IFC - по классу IfcBuildingStorey.
Используя встроенные в Dynamo ноды можно узнать длину, направление оси и опять же, пользуясь методами в API Renga, переименовать оси, теперь зная их геометрию полученную через IFC-файл :)
Этот скрипт доступен по такой ссылке.
На этом всё, способ думаю понятен -- и так можно рассматривать более сложные вещи, доходя даже до проверок на коллизии между элементами выраженными человеческой параметрической геометрией! (но об этом как-нибудь позднее).
Не пропускайте публикации, подписывайтесь на Telegram-канал с тизерами статей.
Также подписывайтесь на тематический Telegram-канал под программирование для Renga.
#renga #rengabim #bim #dynamo #rengadyn