Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя
Архитектор, BIM-эксперт и Аналитик данных  · 7 нояб 2022

Тюнинг IFC-моделей. Добавляем Зоны (IfcZone). Часть 1.

Вопрос: "Как добавить зоны в IFC-модель, полученной из Renga?". 
Да, Renga не оперирует такими сущностями как группировка или зона (по крайней мере пока), тем не менее это не умаляет ее первоклассные возможности по работе с IFC. Однако, поступил вопрос и надо разобраться. Поэтому я решил попробовать вручную внести в экспортированную IFC-модель зоны… и вот, что у меня получилось.
Для примера я взял модель Автосервиса на 4 машиноместа и попробовал добавить 2-е зоны:
  1. Зона сервисного обслуживания, состоящая из помещений "Мастерской" и "Мойки", с названием "Service area".
  2. Зона административно-бытовой пристройки, состоящая из остальных помещений, с названием "Administrative area".
Начинаем разбираться.
Зона - это группа помещений, их частей (помещение также может быть разбито на части, где каждую часть определяет "частичное пространство" (Partial space)) или других зон. 
Зона определяется классом IfcZone, который является наследником родительского класса IfcGroup.
Перейти по ссылке
standards.buildingsmart.org/IFC/RELEASE/IFC4/ADD2_TC1/HTML/link/ifczone.htm
На языке EXPRESS добавление зоны в IFC-модель будет примерно таким :
#300000= IFCZONE('1NNxNXwxP3wxfJpgfdDDGZ',$,'Service area',$,$,$)
в скобках нам надо определить значения 6 атрибутов:
  1. GlobalId,
  2. OwnerHistory (optional),
  3. Name (optional),
  4. Description (optional),
  5. ObjectType (optional),
  6. LongName (optional),
Первый атрибут GlobalId является обязательным, ему необходимо присвоить уникальное значение, т.е. GUID. Остальные же - опциональные, т.е. можно не задавать значения (в таком случае в EXPRESS-записи ставим знак $).
Для генерации GUID надо учесть особенность, что в IFC, мы должны записывать не  привычное по работе в Renga 128-битное представление уникального идентификатора, например, такое:
'{b2e7c481-1be6-491e-a965-52f118c6e20c}'
а его сжатое представление:
'2ovyI16_P97gbbKl4Onk8C'
Хорошим инструментом для генерации таких GUID может быть опенсорс-библиотека IfcOpenShell. Решение на его основе приводится на самом сайте BuildingSMART.
IFC GUID - buildingSMART Technical
technical.buildingsmart.org/resources/ifcimplementationguidance/ifc-guid
Мне, как не программисту, достаточно быстро удалось скачать, установить эту библиотеку для Python и разобраться как генерировать подобные GUID'ы.
Идём дальше.  Укажем для новой зоны помещения, которые должны ее составлять.
Помещения группируются в зоны с использованием класса IfcRelAssignsToGroup, группирующего отношения, как указано в родительском классе IfcGroup.
На языке EXPRESS добавление группирующего отношения в IFC-модель будет примерно таким :
#300001= IFCRELASSIGNSTOGROUP('18qeiGXJzFsOYWk0Jc191Q',$,$,$,(#57463,#57481),$,#300000)
в скобках нам надо определить значения уже 7 атрибутам. Первые по-прежнему (как у наследников класса IfcRoot) будут:
  1. GlobalId,
  2. OwnerHistory (optional),
  3. Name (optional),
  4. Description (optional),
и далее
  1. RelatedObjects,
  2. RelatedObjectsType (optional),
  3. RelatingGroup.
Получается, что обязательными к заполнению являются GlobalId (мы с ним уже разобрались), а также RelatedObjects где перечисляются помещения, составляющие группу, и RelatingGroup где указывается сама группа. Все указания выполняются ссылками на соответствующий номер строки, в котором указан необходимый нам класс. Например, #300000 - это ссылка на строку с уже определенной выше зоной.
Осталось добавить еще одно отношение IfcRelServicesBuildings, которое укажет, что созданная зона находится не просто где-то абстрактно, а в нашем здании:
#300002= IFCRELSERVICESBUILDINGS('0fWKGXkc9D3gPGuU$muhVR',$,$,$,#300000,(#42))
в скобках определяем значения следующих атрибутов:
  1. GlobalId,
  2. OwnerHistory (optional),
  3. Name (optional),
  4. Description (optional),
  5. RelatingSystem,
  6. RelatedBuilding.
В RelatingSystem, я ссылаюсь на зону (#300000), а в RelatedBuilding на строку (#42), где определен класс IfcBuilding, т.е. само здание.
Итого, получается, чтобы добавить одну зону нужно всего лишь добавить 3 строки в файл IFC. В моем примере получилось так:
А в IFC-вьювере выглядит вот так:
Технически это всё. НО! Зоны нужны же не просто для группировки. Они даже не имеют геометрического представления и саму зону мы выделить и посмотреть не сможем.
Как минимум, нам нужно дополнить наши зоны свойствами. Чем мы и займемся в следующей части.
4 эксперта согласны