Найти в Дзене
Хроники Георга

В мире open-source. Xbim Toolkit. Часть 1. Краткое введение в пакет (Xbim Essentials, Xbim Xplorer)

Введение: данная статья откроет серию статей по работе с открытыми форматами данных - представление геометрии в 3D. Пока что я планирую говорить только об IFC, но в перспективе - затронуть тот же City GML. В рамках данной статьи мы рассмотрим набор решений от команды Xbim по работе с IFC-файлами (создание/чтение/визуализация). Первая часть будет посвящена простой операции - чтению (парсингу) файла IFC, извлечению метрик и взаимодействию с вьювером файла - Xbim Xplorer. 1. Общая информация XBim toolkit - это набор инструментов по работе в том числе с файлами IFC. Группа репозиториев с открытым исходным кодом (в основном, на C# ) представлены под профилем команды на GitHub. Официальный сайт со Справкой и описанием находится здесь. Нас с вами в рамках вводного части будет интересовать 2 набора - это Xbim.Essentials и Xbim.Geometry. Оба из них, для удобства, приведены как Nuget-пакеты, устанавливаемых в среде VS. Также они доступны и как самостоятельные репозитории с кодом. Вообще говоря,
Оглавление

Введение: данная статья откроет серию статей по работе с открытыми форматами данных - представление геометрии в 3D. Пока что я планирую говорить только об IFC, но в перспективе - затронуть тот же City GML. В рамках данной статьи мы рассмотрим набор решений от команды Xbim по работе с IFC-файлами (создание/чтение/визуализация). Первая часть будет посвящена простой операции - чтению (парсингу) файла IFC, извлечению метрик и взаимодействию с вьювером файла - Xbim Xplorer.

Официальный логотип https://docs.xbim.net/img/xBim_toolkit_logo.png
Официальный логотип https://docs.xbim.net/img/xBim_toolkit_logo.png

1. Общая информация

XBim toolkit - это набор инструментов по работе в том числе с файлами IFC.

Группа репозиториев с открытым исходным кодом (в основном, на C# ) представлены под профилем команды на GitHub.

Группа репозиториев от XBimTeam
Группа репозиториев от XBimTeam

Официальный сайт со Справкой и описанием находится здесь. Нас с вами в рамках вводного части будет интересовать 2 набора - это Xbim.Essentials и Xbim.Geometry. Оба из них, для удобства, приведены как Nuget-пакеты, устанавливаемых в среде VS. Также они доступны и как самостоятельные репозитории с кодом. Вообще говоря, нам можно загрузить третий набор XbimWindowsUI - это десктопный вьювер файлов IFC с выводом ошибок при обработке файла (на C# WPF)

1. IFC viewer (XbimWindowsUI)

Начнем мы, правда, не с программной части - а со сборки WPF-приложения по визуализации IFC-файлов. Схема простая - копируем себе репозиторий, собираем решение, подгрузив недостающие пакеты через Nuget package manager и запускаем само приложение:

XbimWindowsUI\Output\Debug\net472\XbimXplorer.exe
Вид приложения версии 5.1.0.0 (от января 2021 г.)
Вид приложения версии 5.1.0.0 (от января 2021 г.)
В качестве импортируемых файлов она содержит не только IFC, но и ряд его полу-официальных представлений (в виде IfcXml и IfcZip), а также в виде внутреннего формата xBIM
В качестве импортируемых файлов она содержит не только IFC, но и ряд его полу-официальных представлений (в виде IfcXml и IfcZip), а также в виде внутреннего формата xBIM

Сейчас мы просто импортируем в среду вьювера файл IFC для небольшого квартала, с которым, к слову, будем работать и далее, но уже программно:

Вид загруженной сборки
Вид загруженной сборки
Сразу сохраним файл во внутренний формат XBIM для удобства открытия впоследствии (это не бинарный формат, а "закрытый" текстовой)
Сразу сохраним файл во внутренний формат XBIM для удобства открытия впоследствии (это не бинарный формат, а "закрытый" текстовой)

Несмотря на видимое отсутствие элементов управления, они у нас есть при раскрытии меню View:

Группа опций
Группа опций

Интерес представляет лог программы (Information Log) с перечнем истории чтения файла. Если при чтении (инициализации) файла появятся проблемы, они будут отражены в списке красными/оранжевыми цветами

Лог при нормальной загрузке файла
Лог при нормальной загрузке файла
Лог при ошибке загрузки данных (мои эксперименты по программной генерации файлов)
Лог при ошибке загрузки данных (мои эксперименты по программной генерации файлов)

Также есть встроенный "скриптовый" язык команд.

Возможность ввода и исполнения команд по приложенной справке
Возможность ввода и исполнения команд по приложенной справке

Отдельные элементы геометрии можно изолировать/скрывать:

Скрываем рельефную подложку
Скрываем рельефную подложку

Также есть ряд настроек к камере и точки взгляда:

Группа настроек для положения камеры
Группа настроек для положения камеры

Тем не менее, на большой сборке он довольно сильно тормозит, поэтому мы лучше будем комбинировать ПО для просмотра, используя в качестве другого - BIM Vision.

Вид файла в среде BIM Vision
Вид файла в среде BIM Vision

Чтобы исключить вероятность эффекта "занятого файла", я пересохраню вид в во внутреннем формате BVF (BIM Vision).

2. Читаем IFC-файл и выводим метрики по нему

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

В качестве анализируемого файла будем использовать пример выше. Он был выгружен не совсем корректно (как одно здание IFCBUILDING) и множество прочих IfcBuildingElementProxy-элементов и форм типа IfcSlab без свойств + элемент рельефа в составе IfcSite.

2.1 Подготавливаем среду

Нативно с файлом (см. выше) мы познакомились, теперь пора взглянуть на него изнутри. Для этого создаем, к примеру, простое консольное приложение на .NET Framework (я буду использовать 4.8) и загружаем туда в качестве Nuget-пакетов пару сборок

Загружаем Xbim Essentials
Загружаем Xbim Essentials
Соглашаясь с лицензионным соглашением
Соглашаясь с лицензионным соглашением

Пока нам этого будет достаточно (визуализировать результаты мы будем позже - подгружая иную сборку Xbim.Geometry).

Далее я создам для удобства новый класс с публичным статическим методом, который вызову с главного метода Main (в рамках текущего консольного приложения).

Далее в созданном файле добавляем серию ссылок на пространства имён пакета XBim Essentials. Перечень ссылок можно взять с примера исходного кода, к примеру, отсюда. В силу того, что работать мы будем с файлами IFC в спецификации 2х3, скорректируем представленные в ссылке выше ссылки:

Меняем ссылочные типы
Меняем ссылочные типы
Вид настроенной среды
Вид настроенной среды

2.2 Читаем IFC-файл

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

Вызываем метод для открытия файла IFC. Для удобства, путь к файлу я оформил в виде отдельной переменной
Вызываем метод для открытия файла IFC. Для удобства, путь к файлу я оформил в виде отдельной переменной

В качестве тестового захода давайте сосчитаем число всех окон в файле IFC. Для этого в нашем вьювере (XBimXplorer/BIM Vision) выделим элемент окна и посмотрим, какое IFC-представление ему соответствует - IfcWindow.

Смотрим на элемент Ifc для представления "окна"
Смотрим на элемент Ifc для представления "окна"

Теперь, зная, какой элемент необходимо искать, сформируем запрос вида "model.Instances.OfType<IfcWindow>();" то есть обратимся к нашей открытой IFC-модели, и возьмем метод Instances.OfType<***>, где *** - наименование нашего IFC-элемента.

Примечание: Пакет XBim использует встроенные инструменты поиска .NET - LINQ. Насчет этого есть отдельная хорошая статья, показывающая прирост производительности применяя LINQ на сложных структурах.

Структура запроса
Структура запроса
Структура метода Main (добавил запись и вывод времени исполнения кода). шаблон взял отсюда https://www.cyberforum.ru/csharp-beginners/thread12473.html
Структура метода Main (добавил запись и вывод времени исполнения кода). шаблон взял отсюда https://www.cyberforum.ru/csharp-beginners/thread12473.html

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

Число окон в модели = 175 шт.
End of code!
RunTime 00:00:08.16

Отлично! Теперь рассмотрим более сложную операцию, а именно, получим набор информации о поверхности в составе IfcSite, но сперва посмотрим, к какому типу оно относится:

Выделенное - "поверхность" типа IfcEnity
Выделенное - "поверхность" типа IfcEnity
Тоже самое, но в среде Xbim Xplorer
Тоже самое, но в среде Xbim Xplorer

Примечание: вообще говоря, чтобы понять логику работы пакета XBim Essentialists удобно использовать XBim Xplorer в связке с ним.

Интересуемая нас поверхность - это нечто иное как тип Representation (то, чем IfcSite геометрически представлен).

Смотрим, чем представлен IfcSite геометрически
Смотрим, чем представлен IfcSite геометрически
Доходим в конце концов до самой поверхности - элемента IfcShapeRepresentation
Доходим в конце концов до самой поверхности - элемента IfcShapeRepresentation

А теперь попробуем сделать тоже самое, но из-под кода:

Выбор геометрического представления через код
Выбор геометрического представления через код

Примечание: как правило, Ifc-файлы формируются по жёсткой схеме, поэтому искать нужные параметры по значениям - это логичный путь действий.

Как видно из времени работы кода, запросы к файлу занимают значительное время (у нас много геометрии) и логичным путем было бы удаление лишней геометрии - но здесь эта операция невозможна/затруднена, ввиду наличия большого числа взаимосвязанных элементов, во всяком случае реализовать это у меня не получилось, поэтому смиряемся со скоростью экспорта и работаем как есть.

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

Как можно заметить из Xplorer - в нашем геометрическом представлении поверхности минимум свойств, и отбирать оттуда особо и нечего, поэтому давайте лучше посмотрим на свойства одной из стен. В качестве примера я использовал пример отсюда.

Обратимся к свойствам данной стены
Обратимся к свойствам данной стены

Инициализируем данный объект по его параметру GlobalId из-под кода и проверим по номеру элемента, действительно ли это тот элемент:

Проверяем факт выбора того элемента
Проверяем факт выбора того элемента

Группа свойств лежит в категории "IsDefinedBy" (также называется и метод API); сформируем набор свойств у стены следующей конструкцией:

var wallProps = selWall.IsDefinedBy.OfType<IIfcRelDefinesByProperties>().Where(a => a.RelatingPropertyDefinition is IIfcPropertySet).SelectMany(r =((IIfcPropertySet)r.RelatingPropertyDefinition).HasProperties).OfType<IIfcPropertySingleValue>();
Результат запроса свойств у стены
Результат запроса свойств у стены

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

Выводы:

В данной статье мы начали знакомиться с пакетом Xbim Essentials, который предоставляет инструменты по чтению/записи/редактированию IFC файлов (и, при помощи другим пакетов от Xbim - по визуализации элементов, просмотре в Web-среде и пр.).

В вводной части мы попробовали частично проанализировать один из IFC-файлов и получить информацию о свойствах отдельных его элементов, используя как вспомогательное решение - Xbim Xplorer, содержащий по большей части, те же наименования методов, что и в пакете Essentials.

В следующей части мы попробуем сгенерировать файл вручную с представлением поверхности в рамках элемента IfcSite.

Не пропускайте публикации, подписывайтесь на Telegram-канал с тизерами статей.