Найти тему
Хроники Георга

Renga API (Dynamo) Взаимодействие с IFC файлом через IfcOpenShell для получения геометрии осей

Оглавление
Логика работы с 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", куда прописываем все объектные свойства.

Устанавливаем его в Renga
Устанавливаем его в Renga

В принципе, ещё можно настроить правила экспорта геометрии, но оставим это на усмотрение читателя - нам сейчас пока это не важно.

Файл в среде BIM-Vision с наличием нашего свойства.
Файл в среде BIM-Vision с наличием нашего свойства.

Шаг 2 - Установка библиотеки IfcOpenShell для Python

Мы с вами будем работать с IFC-файлами из-под Python скриптов в Dynamo, поэтому необходимо добавить путь к библиотеке для работы с Ifc (IfcOpenShell) для используемого Python.

Здесь нам потребуется провернуть действия, указанные в данной справочной статье, а именно:

  1. Узнать версию Python для версии Python в Dynamo. Для демонстрируемой 2.12.1 версию CPython = 3.8.3;
  2. Скачать для данной версии версию IfcOpenShell не старше этой (то есть 3.8 в нашем случае, или, полное название - IfcOpenShell-python for python 3.8 64bit Windows;
  3. Распаковать этот пакет и заглянуть в каталог \ifcopenshell\requirements.txt: там будет список зависимостей (вспомогательных Python-библиотек) которые нужны для работы ifcopenshell;
  4. Установить 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.

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

Используя встроенные в Dynamo ноды можно узнать длину, направление оси и опять же, пользуясь методами в API Renga, переименовать оси, теперь зная их геометрию полученную через IFC-файл :)

Путь редактирования обозначения оси
Путь редактирования обозначения оси

Этот скрипт доступен по такой ссылке.

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

Не пропускайте публикации, подписывайтесь на Telegram-канал с тизерами статей.

Также подписывайтесь на тематический Telegram-канал под программирование для Renga.

#renga #rengabim #bim #dynamo #rengadyn