В сфере строительного проектирования все больше места занимают технологии информационного моделирования (ТИМ). Главным форматом обмена данных в ТИМ является формат 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/ТИМ-специалистов, стремящихся оптимизировать свои рабочие процессы и обеспечить высокое качество создаваемых моделей.

Комментарии (0)