Формат 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