В сфере строительного проектирования все больше места занимают технологии информационного моделирования (ТИМ). Главным форматом обмена данных в ТИМ является формат IFC. Модели в этом формате требуют как коммерческие заказчики, так и государственная экспертиза.

Работа с нативными форматами данных (такими как RVT) обычно не вызывает затруднений благодаря широкому функционалу, который предоставляет разработчик программного обеспечения. Однако работа с форматом IFC часто вызывает вопросы из-за нехватки специализированных инструментов и знаний.

Одним из таких вопросов является создание чётко сформулированных требований к моделям IFC и последующая их проверка на соответствие этим требованиям.

В этой статье будет подробно рассмотрен данный вопрос. В качестве инструментов будут использованы формат IDS и библиотека ifcopenshell а также предложено готовое решение для валидации моделей IFC на основе этих инструментов.

Кроме того, статья включает инструкцию по созданию спецификаций IDS и автоматизацию процесса проверки IFC-моделей. Для удобства читателей представлены полезные ссылки и готовый исходный код программы.

Описание стандарта IFC

Industry Foundation Classes (IFC) — открытый стандарт для обмена данными в области информационного моделирования зданий (BIM или ТИМ). Разработанный организацией buildingSMART, стандарт обеспечивает совместимость между различными программными решениями, используемыми в проектировании, строительстве и управлении объектами. Выгрузку моделей в формат IFC поддерживают большинство популярных программ, таких как Revit, Tekla, Renga, Nanocad и др.

IFC базируется на объектно-ориентированной схеме данных, где каждый элемент (стена, окно, инженерная система) описывается как экземпляр класса с атрибутами и связями.
Условно, структуру ifc файла можно представить следующим образом:
IfcProject -> IfcSite (Площадка) -> IfcBuilding (Здание) -> IfcBuildingStorey (Уровни) -> IfcBuldingElement ( Элементы классов IfcWall, IfcDoor и т.д.)
У классов могут быть наборы свойств IfcPropertySet, которые содержат свойства IfcProperty с их значениями.

Больше информации можно найти в следующих источниках:

В рамках данной статьи нам интересны IfcPropertySet и IfcProperty т.к. в них содержатся необходимые данные. Для описания требований к наборам свойств и самим свойствам buildingSMART разработали стандарт IDS.

Описание стандарта IDS

Information Delivery Specification (IDS) — это открытый стандарт, разработанный организацией buildingSMART, который определяет требования к информации, которая содержится в IFC моделях. IDS определяет формат и набор данных, которые должны содержать элементы.

Так как IDS основан на машиночитаемой XML-схеме, он позволяет автоматизировать проверку IFC моделей по набору требований.

Рассмотрим схему IDS на конкретном примере машиночитаемых требований к ЦИМ от  СПб ГАУ «Центр государственной экспертизы»

Пример IDS: Документы для стандартизации цифровых информационных моделей (ЦИМ).

Для просмотра и редактирования IDS можно использовать следующие ресурсы:

Я буду использовать Национальная ТИМ Платформа (рис.1).

рис.1 - Сервис для просмотра и редактирования IDS
рис.1 - Сервис для просмотра и редактирования IDS
  1. Сервис позволяет открыть существующие и сохранить открытые файлы IDS

  2. Файл IDS содержит общую информацию о наборе требований

  3. Файл IDS содержит список требований

  4. Сервис формирует легкую для восприятия человеком информацию о требовании.

Каждое требование имеет следующее содержание (рис.2)

рис.2 - Редактирование требования
рис.2 - Редактирование требования
  1. Общая информация - описание и пояснение к конкретному требованию

  2. Контекст - указание элементов, к которым предъявляются требования (например список классов IFC, таких как IfcWall, IfcDoor и т.д. )

  3. Само требование (рис.3)

рис.3 - Требование IDS
рис.3 - Требование IDS
  1. Требование может содержать одно и более условий

  2. Условия могут описывать требования к наличию наборов свойств, наличию свойств и к их значению. Например, на рисунке 3 выбранное условие требует наличия набора свойств (IfcPropertySet) с названием "Местоположение" и наличия в этом наборе свойства (IfcProperty) с названием "Номер корпуса".

Сам файл IDS представляет собой схему xml (рис.4)

рис.4 - Файл IDS как xml схема
рис.4 - Файл IDS как xml схема

Блок <info> содержит общую информацию о наборе требований, блок <specifications> содержит требования - <specification>.

В данном примере с помощью IDS файлов экспертиза СПБ передает проектировщикам понятные и прозрачные требования к моделям а так же имеет возможность проверять получаемые модели.

Больше информации можно найти в следующих источниках:

Итак, после того, как стало понятно, что такое IDS, зачем он нужен и как его формировать. можно перейти к проверке IFC-моделей. Для этого я использовал специальную библиотеку ifcopenshell.

Библиотека ifcopenshell

ifcopenshell – это библиотека с открытым исходным кодом для языка python, которая предоставляет возможность для чтения, записи и манипулирования данными IFC.

Официальный сайт проекта: https://ifcopenshell.org/

Библиотеки имеет обширный функционал, но в рамках данной статьи будет рассмотрено получение значений свойств и проверка моделей по требованиям IDS.

Вот пример простой функции для получения сведений о проекте IfcProject с помощью данной библиотеки:

import ifcopenshell
def get_ifc_project_info(ifc_file):
	"""
	Функция для получения информации о проекте
	"""
	ifc_project_by_type = ifc_file.by_type('IfcProject')[0]
	proj_info = ifc_project_by_type.get_info()
	print('\n', str(proj_info),'\n')

file_path = r'c:\Users\...\Здание_1.ifc'  # Указать путь к файлу IFC 
ifc_file = ifcopenshell.open(file_path)
get_ifc_project_info(ifc_file)

В результате выполнения функции в консоль будет выведен словарь с свойствами и их значениями

{'id': 123, 'type': 'IfcProject', 'GlobalId': '1J53FU2aL3RP_XqOqg8qfk', 
'OwnerHistory': #42=IfcOwnerHistory(#39,#5,$,.NOCHANGE.,$,$,$,1739627670), 
'Name': '163101-98 АР', 'Description': None, 'ObjectType': None, 
'LongName': 'ул. Отдыха, Санаторий Дюны', 'Phase': 'У', 
'RepresentationContexts': (#114=IfcGeometricRepresentationContext($,'Model',3,0.01,#111,#112),), 
'UnitsInContext': #109=IfcUnitAssignment((#43,#45,#46,#50,#52,#55,#58,#60,#61,#63,#67,#72,#74,#75,#76,#77,#78,#79,#80,#85,#89,#91,#95,#101,#107))}

Вот более сложная, но и более полезная функция для вывода всех наборов свойств (IfcPropertySet), свойств (IfcProperty) и их значений в окно консоли.

import ifcopenshell
def get_property_by_propertySet(ifc_file, ifc_id):
    """
    Функция для вывода наборов свойств и свойств в виде:
    - PropertySet
    ------ prop.Name: prop.NominalValue
    """
    ifc_entitie = ifc_file.by_guid(ifc_id)
    # обработка элемента
    for rel in ifc_entitie.IsDefinedBy:  # Набор связей с определениями наборов 
        # свойств, прикрепленных к данному объекту
        if rel.is_a("IfcRelDefinesByProperties"):  # IfcRelDefinesByProperties 
            # определяет отношения между определениями наборов свойств и объектами
            prop_set = rel.RelatingPropertyDefinition  # Ссылка на определение 
            # набора свойств для этого объекта
            if prop_set.is_a("IfcPropertySet"):  # IfcPropertySet - это контейнер, 
                # который содержит свойства в дереве свойств
                print('-', f'"{prop_set.Name}"')  # Вывод имени набора свойств
                for prop in prop_set.HasProperties:
                    print('------', f'"{prop.Name}: {prop.NominalValue}"')  
                    # Вывод имен и значений свойств для всех свойств в наборе

    # Обработка Property Sets из типа элемента (если есть)
    if hasattr(ifc_entitie, "IsTypedBy") and ifc_entitie.IsTypedBy:  # обработка типа
        for type_rel in ifc_entitie.IsTypedBy:
            type_entity = type_rel.RelatingType
            if hasattr(type_entity, "HasPropertySets") and type_entity.HasPropertySets:
                for prop_set in type_entity.HasPropertySets:
                    if prop_set.is_a("IfcPropertySet"):
                        print('-', f'"{prop_set.Name}" (Тип ifc)')
                        for prop in prop_set.HasProperties: 
                            print('------', f'"{prop.Name}: {prop.NominalValue}"')
  
file_path = r'c:\Users\...\Здание_1.ifc'  # Указать полный путь до файла
ifc_id = '22X3PS23z9Xwf8iH$NMQN3'  # Указать GlobalId
ifc_file = ifcopenshell.open(file_path)  
get_property_by_propertySet(ifc_file, ifc_id)

Более подробно с библиотекой можно ознакомиться в разделе документации на сайте, там представлено много примеров кода.

Также есть хороший бесплатный курс на bim.vc: "ТИМ-ориентированная аналитика. Современные инструменты работы с данными"

Модуль ifctester

Данный модуль является частью библиотеки и позволяет проверять IFC файлы по требованиям IDS и выгружать отчеты в форматах json, html.

Вот пример функции для проверки модели и формирования отчета в формате html.

import ifcopenshell
import ifctester
import ifctester.reporter
import os

def check_ifc_file(file_path, ids_path_file, report_path_folder):
    """
    Функция проверяет файл ifc по ids и формирует отчет
    """
    if file_path.endswith('.ifc'):
        ifc_file = ifcopenshell.open(file_path)  # Открытие ifc файла
        ifc_file_name = os.path.basename(file_path)  # Получение имени файла
        ids_file_path = ids_path_file
        test_ids = ifctester.ids.open(ids_file_path)  # Открытие файла ids
        test_ids.validate(ifc_file)  # Проверка файла ifc
        reporter_obj = ifctester.reporter.Html(test_ids)  # создание отчета
        reporter_obj.report()
        # Запись отчета в файл
        reporter_obj.to_file(f'{report_path_folder}/{ifc_file_name.replace('.ifc', '')}.html')  

file_path = r'c:\Users\...\Здание_1.ifc'  # Указать путь к файлу IFC
ids_path_file = r'c:\Users...\test.ids'  # Указать путь к файлу IDS
report_path_folder = r'c:\Users\...\reports'  # Папка для сохранения отчета
check_ifc_file(file_path, ids_path_file, report_path_folder)

В результате работы функции в указанной папке появится файл в формате html с отчетом по проверке.

Далее пойдет речь о готовом решении - небольшой программе для автоматического формирования отчетов по множеству моделей IFC.

Описание готового решения

Сама программа, весь исходный код и примеры выложены на github.
Ссылка на github: i-savelev/ifc_checker

Назначение и использование

Программа позволяет проверить множество IFC моделей по выбранной спецификации IDS и сохранить отдельные отчеты и сводный отчет в формате html. Программа имеет интерфейс (рис.5).

рис.5 - Интерфейс программы
рис.5 - Интерфейс программы
  1. Все модели IFC из выбранной папки будут проверены

  2. IFC будут проверены по этому файлу IDS

  3. Отдельные и сводный отчеты будут сохранены в выбранную папку

  4. После выбора папок и файлов можно запускать проверку

  5. Статус проверок будет отражен в текстовом поле, в там числе и ошибки при выполнении

Структура

Программа состоит из файлов main.py, interface.py, ifchelper.py, htmlparser.py.

main.py - файл для запуска скрипта.

interface.py - файл с классом интерфейса. Для создания интерфейса используется библиотека tkinter. Это встроенная библиотека python и не требует установки.

ifchelper.py - файл с методами для обработки ifc и ids файлов с помощью библиотеки ifcopenshell. Тут содержится метод для получения отчета по отдельной модели и несколько вспомогательных методов, которые были описаны выше.

htmlparser.py - файл с методами для обработки отчетов в формате html с помощью библиотеки BeautifulSoup. Тут содержится метод дл�� получения сводного отчета.

Запуск программы

Программу можно запустить из редактора кода после импортирования всех необходимых библиотек.

pip install ifcopenshell
pip install ifctester
pip install beautifulsoup4
pip install pystache

В репозитории также выложен исполняемый файл ifc_checker.exe, для запуска которого не требуется наличие редактора кода и установленного python.

Самостоятельно сформировать исполняемый файл можно с помощью библиотеки pyinstaller. Установка библиотеки: pip install pyinstaller. После установки библиотеки необходимо прописать в терминале редактора кода следующую команду:

pyinstaller --onefile --collect-all ifctester --collect-all ifcopenshell --collect-all bs4 --name ifc_checker --windowed main.py

Для корректной работы исполняемого файла все сторонние библиотеки нужно импортировать в сборку явно --collect-all.

Результат работы

После выбора всех необходимых файлов и папок и запуска проверки в выбранной для отчетов папке появятся отдельные отчеты по каждой модели и сводный отчет. Отчеты по моделям формируются с помощью модуля ifctester, а сводный отчет был создан мной для упрощения представления информации и быстрой навигации по отдельный отчетам. О завершении работы программы можно узнать по появлению статуса в текстовом поле.

Отчеты по моделям имеют следующее содержание (рис.6)

рис.6 - Содержание отчетов
рис.6 - Содержание отчетов
  1. Название и дата проверки

  2. Суммарное число и процент элементов, которые удовлетворяют условиям для всех требований

  3. Суммарное число и процент элементов, которые удовлетворяют условиям для отдельных требований

  4. Статус каждого условия в требовании

Отдельные условия можно развернуть и получить список элементов и статус проверки по условию (рис.7)

рис.7 - Проверки по условию для конкретных элементов
рис.7 - Проверки по условию для конкретных элементов

Сводный отчет содержит следующее (рис.8)

рис.8  - Сводный отчет
рис.8 - Сводный отчет
  1. Название проверенных моделей IFC

  2. Ссылку на полный отчёт

  3. Общий статус по всем требованиям

В качестве примера для статьи я использовал несколько моделей, которые остались у меня со времен учебы в университете и одну модель, которая устанавливается по умолчанию вместе с Revit. Для демонстрационных целей я добавил несколько параметров и настроил мэппинг согласно требованиям СПб ГАУ «Центр государственной экспертизы». Для упрощения взял файл IDS "IDS СПб ГАУ ЦГЭ (Архитектурные решения).ids" и удалил большинство требований.

Используемые в статье файлы IFC, IDS и полученные отчеты можно найти в том же github репозитории в папке samples: ifc_checker/samples.

Заключение

Формирование четких требований к моделям IFC и их последующая проверка являются ключевыми аспектами эффективного использования этого стандарта. Использование формата IDS и библиотеки ifcopenshell позволяет автоматизировать процесс валидации моделей IFC, что существенно повышает точность и скорость выполнения проверок.

Представленные в статье рекомендации и готовые решения могут стать полезными инструментами для BIM/ТИМ-специалистов, стремящихся оптимизировать свои рабочие процессы и обеспечить высокое качество создаваемых моделей.