Формат IFC (Industry Foundation Classes) широко используется в строительстве для обеспечения интероперабельности между различными программными продуктами в области архитектуры, проектирования и строительства. Он позволяет обмениваться данными о моделях, что особенно важно для крупных и сложных проектов.
Применение формата IFC продолжает расширятся. Некоторые IFC-Вьюверы после недавнего обновления обрели возможность указывать документ со списком элементов модели, которые этот документ охватывает. Вторая интересная возможность – увидеть процедуру согласования вместе с элементами модели, которые её проходят.
IFC без ассоциаций
Если мы посмотрим на модель, в которой ассоциации не созданы, то увидим пустые разделы "Документы" и "Согласования".

Это не удивительно, ведь в STEP-коде IFC-файла должны быть строки, которые у определённых элементов устанавливают ассоциации с конкретным документом и/или процессом согласования. Пока таких отношений не создано. Сделаем это.
Откроем в блокноте IFC-файл и добавим в конец всего 5 строк.
Документы
Для создания ассоциаций в разделе "Документы" воспользуемся тремя IFC-Сущностями.
1. IfcDocumentInformation
Согласно семантическому определению IfcDocumentInformation получает метаданные внешнего документа. Ссылку же на сам документ будем передавать в атрибуте Location.
Итак, создадим первую строку, чтобы определить сам документ. Порядковый номер строки #1000
условный.
#1000=IFCDOCUMENTINFORMATION('Doc_1 (Идентификатор Документа)', 'ДОКУМЕНТ', 'Описание документа/содержания', 'Документ.pdf', 'Назначение документа: Для Строительства', 'Использование документа: Для Конструктора', 'Область применения: Расчеты нагрузок', 'Идентификатор версии документа: v.1.0', $, $,'Создан: 2024-02-13 10:20:15', 'Изменение редакции: 2024-02-14', 'Формат: Документ/pdf','Дата вступления документа в силу: 2025-02-16','Дата окончания действия документа: 2026-12-31', .PUBLIC., .FINAL.);
Рассмотрим атрибуты и их наполнение подробнее.
Атрибуты IfcDocumentInformation
Identification. Идентификатор, который однозначно идентифицирует документ.
Name. Имя документа. Присваивается пользователем.
Description. Описание документа и его содержания.
Location. Ссылка на документ. Ссылка может быть URL, прямая или отностительная. Например 'Документ.pdf'. В данном случае документ должен лежать в папке с IFC-файлом.
Purpose. Цель/назначение документа.
IntendedUse. Предполагаемое использование этого документа.
Scope. Область применения документа.
Revision. Описание редакции/версии документа.
DocumentOwner. Информация о лице и/или организации-владельце документа.
Editors. Лица и/или организации, которые создали/изменили документ.
CreationTime. Дата и время первоначального создания документа.
LastRevisionTime. Дата и время создания данной редакции/версии документа.
ElectronicFormat. Описывает тип документа. Например, image/png или application/pdf.
ValidFrom. Дата вступления документа в силу.
ValidUntil. Дата, до которой документ остается действительным.
Confidentiality. Уровень конфиденциальности документа. Указывается не произвольной строкой в одинарных кавычках 'string', а берется строго из перечисления и записывается между двух точек. Например, .CONFIDENTIAL. , .PUBLIC. и прочее.
Status. Текущий статус документа. Берётся из этого перечисления. Например, .DRAFT. , .FINAL. и прочее.
Для символов кириллицы IFC и STEP-формат используют символы BMP (Basic Multilingual Plane). Слова передаются последовательностями вида '/X2/коды символов кириллицы/X0/'
Однако в примере сделано отступление от этого порядка. Для удобства восприятия.
Не лишним будет упомянуть следующее: если какая-то информация о документе не нужна, то вместо атрибута следует писать знак $.
Теперь нужно создать ссылку на этот документ. Воспользуемся другой IFC-сущностью.
2. IfcDocumentReference
IfcDocumentReference — это по сути ссылка на документ. Заполнять атрибуты у данной IFC-сущности не обязательно. Однако для удобства чтения человеком сделаем это.
#2000=IFCDOCUMENTREFERENCE($, $, 'СПИСОК ЭЛЕМЕНТОВ, охваченных документом', 'Описание списка', $, $, $, #1000);
Теперь всё готово, чтобы создать ассоциацию.
3. IfcRelAssociatesDocument
Что умеет данная IFC-сущность? Именно она создаёт ассоциации между элементами модели, например стенами и документом. Другими словами, устанавливает отношения между элементами и документом.
Одна ссылка на документ может быть применена к нескольким элементам.
Найдем в STEP-коде элементы класса IfcWall, чтобы получить номера их строк. На эти номера мы создадим ассоциацию.
#67=IFCWALL......;
#150=IFCWALL......;
#110=IFCWALL......;
#274=IFCWALL......;
Стены найдены. Напишем ассоциацию, чтобы подружить элементы и документ.
#4000=IFCRELASSOCIATESDOCUMENT('Doc_1_Association', $, $, $, (#1000, #67, #150, #274), #2000);
В результате IFC-Вьювер видит метаданные документа и список стен, которые этот документ охватывает.

Теперь посмотрим, как создать ассоциацию элемента с каким-нибудь процессом согласования.
Согласования
Здесь нам потребуется две оставшиеся IFC-сущности.
4. IfcApproval
IfcApproval создает информацию о процедурах согласования. Мы можем использовать ее для утвердждения чертежей, изменений в проекте, рассмотрения технических предложений и так далее. Процедура может быть связана не только с проектированием, но и со строительством, эксплуатацией и другими периодами жизненного цикла здания.
Напишем код описания процедуры согласования.
#5000=IFCAPPROVAL('Идентификатор процедуры', 'СПИСОК ЭЛЕМЕНТОВ НА УТВЕРЖДЕНИЕ', 'Описание Процедуры', 'Дата/время получения результата: 2025-02-15', 'Статус: Одобрено', 'Стадия: Предпроектная проработка', 'Условие для утверждения: Согласование у ГИП/ГАП');
Рассмотрим атрибуты и их значения более детально.
Атрибуты IfcApproval
Identifier. Идентификатор процедуры согласования.
Name. Наименование процедуры согласования.
Description. Описание проекта, конструкции, элементов и т. д., которые проходят процедуру согласования.
TimeOfApproval. Дата и время получения результата процедуры.
Status. Статус процедуры согласования. Например «Одобрено», «Не одобрено».
Level. Стадия/фаза, в которой находится процедура согласования. Например «Эскиз», «Проект».
Qualifier. Условие, при выполнении которого процедура согласования будет официально и положительно завершена. Например «Требуется проверка на соответствие СП__п.1.9».
RequestingApproval. Организация или лицо, запросившие процедуру согласования.
GivingApproval. Организация или лицо, выдающие согласование. Например ГИП, утверждающий чертежи, или надзорный орган, подтверждающий соответствие нормативам.
Теперь создадим ассоциацию нескольких стен с данной процедурой.
5. IfcRelAssociatesApproval
Не будем усложнять код. Просто перечислим номера строк со стенами (IfcWall) и укажем номер строки процедуры согласования.
#110=IFCWALL......;
#274=IFCWALL......;
#5000=IFCRELASSOCIATESAPPROVAL($, $, $, $, (#110, #274),#4000);
В результате наш IFC-Вьювер видит, что две стены проходят процедуру утверждения.

Заключение
Итак, всего пятью строками кода мы ассоциируем конкретные элементы IFC-Модели с выбранным документом или процедурой согласования.
Конечно, мы можем расширить функционал ассоциации, задействовав неиспользованные атрибуты. Например, добавить, информацию о физическом или юридическом лице — владельце документа. Для этого перед нашим кодом для создания ассоциации вставим строку с информацией о какой-нибудь организации.
#999=IFCORGANIZATION('Id (Идентификатор организации)','Гос.Экспертиза','Описание организации',$,$);

В конечном виде наш STEP-код выглядит следущим образом:
#67=IFCWALL......;
#150=IFCWALL......;
#110=IFCWALL......;
#274=IFCWALL......;
#999=IFCORGANIZATION('Id (Идентификатор организации)','Владелец документа: OOO "Застройщик"','Описание организации',$,$);
#1000=IFCDOCUMENTINFORMATION('Doc_1 (Идентификатор Документа)', 'ДОКУМЕНТ', 'Описание документа/содержания', 'Документ.pdf', 'Назначение документа: Для Строительства', 'Использование документа: Для Конструктора', 'Область применения: Расчеты нагрузок', 'Идентификатор версии документа: v.1.0', #999, $,'Создан: 2024-02-13 10:20:15', 'Изменение редакции: 2024-02-14', 'Формат: Документ/pdf','Дата вступления документа в силу: 2025-02-16','Дата окончания действия документа: 2026-12-31', .PUBLIC., .FINAL.);
#2000=IFCDOCUMENTREFERENCE($, $, 'СПИСОК ЭЛЕМЕНТОВ, охваченных документом', 'Описание списка', $, $, $, #1000);
#3000=IFCRELASSOCIATESDOCUMENT('Doc_1_Association', $, $, $, (#1000, #67, #150, #274), #2000);
#4000=IFCAPPROVAL('Идентификатор процедуры', 'СПИСОК ЭЛЕМЕНТОВ НА УТВЕРЖДЕНИЕ', 'Описание Процедуры', 'Дата/время получения результата: 2025-02-15', 'Статус: Одобрено', 'Стадия: Предпроектная проработка', 'Условие для утверждения: Согласование у ГИП/ГАП');
#5000=IFCRELASSOCIATESAPPROVAL($, $, $, $, (#110, #274),#4000);
Могу предположить, что осталось много вопросов. Например, как создавать ассоциации не в блокноте, а напрямую в BIM-софте.
Но это, как вы понимаете, совсем другая история.

Список ссылок на документацию IFC 4.3.2.0
Документы
8.6.3.3 IfcDocumentInformation
8.6.3.5 IfcDocumentReference
5.1.3.31 IfcRelAssociatesDocument
Согласования
8.2.3.1 IfcApproval
5.2.3.2 IfcRelAssociatesApproval
Перечисления
8.6.2.3 IfcDocumentConfidentialityEnum
8.6.2.5 IfcDocumentStatusEnum
Комментарии (4)
FerZ_174
17.02.2025 06:50Приветствую! То есть получается, внедрение тех же связей... и самих ПИР в таком случае возможно и на уровне самого же IFC (просто ранее такое предусматривалось в IFC XML). Хотелось бы получить большую информацию по данной "фишке"
Ryzhov_Roman Автор
17.02.2025 06:50Да. Это связи.
Сам ifc- формат имеет огромное количество возможностей. Ограничения в основном на уровне софта. Возможности создавать подобные 'фишки' типа ассоциаций с процедурой согласования были ещё в IFC 2x3 (20! лет назад). Ifc-вьювер BimVision смог это только сейчас показывать.
itGuevara
Вы рассказали про IFC-SPF. А похожие примеры на IFC-Turtle где-то можно посмотреть?
Ryzhov_Roman Автор
Тут, простите, не могу помочь.
Так как ifc-софт преимущественно читает ifc-spf, то копаюсь в основном в нём.