Введение: данная статья откроет серию статей по работе с открытыми форматами данных - представление геометрии в 3D. Пока что я планирую говорить только об IFC, но в перспективе - затронуть тот же City GML. В рамках данной статьи мы рассмотрим набор решений от команды Xbim по работе с IFC-файлами (создание/чтение/визуализация). Первая часть будет посвящена простой операции - чтению (парсингу) файла IFC, извлечению метрик и взаимодействию с вьювером файла - Xbim Xplorer.
1. Общая информация
XBim toolkit - это набор инструментов по работе в том числе с файлами IFC.
Группа репозиториев с открытым исходным кодом (в основном, на C# ) представлены под профилем команды на GitHub.
Официальный сайт со Справкой и описанием находится здесь. Нас с вами в рамках вводного части будет интересовать 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
Сейчас мы просто импортируем в среду вьювера файл IFC для небольшого квартала, с которым, к слову, будем работать и далее, но уже программно:
Несмотря на видимое отсутствие элементов управления, они у нас есть при раскрытии меню View:
Интерес представляет лог программы (Information Log) с перечнем истории чтения файла. Если при чтении (инициализации) файла появятся проблемы, они будут отражены в списке красными/оранжевыми цветами
Также есть встроенный "скриптовый" язык команд.
Отдельные элементы геометрии можно изолировать/скрывать:
Также есть ряд настроек к камере и точки взгляда:
Тем не менее, на большой сборке он довольно сильно тормозит, поэтому мы лучше будем комбинировать ПО для просмотра, используя в качестве другого - BIM Vision.
Чтобы исключить вероятность эффекта "занятого файла", я пересохраню вид в во внутреннем формате BVF (BIM Vision).
2. Читаем IFC-файл и выводим метрики по нему
В качестве официальной справки будем отталкиваться от трех источников:
- Набор примеров исходного кода
В качестве анализируемого файла будем использовать пример выше. Он был выгружен не совсем корректно (как одно здание IFCBUILDING) и множество прочих IfcBuildingElementProxy-элементов и форм типа IfcSlab без свойств + элемент рельефа в составе IfcSite.
2.1 Подготавливаем среду
Нативно с файлом (см. выше) мы познакомились, теперь пора взглянуть на него изнутри. Для этого создаем, к примеру, простое консольное приложение на .NET Framework (я буду использовать 4.8) и загружаем туда в качестве Nuget-пакетов пару сборок
Пока нам этого будет достаточно (визуализировать результаты мы будем позже - подгружая иную сборку Xbim.Geometry).
Далее я создам для удобства новый класс с публичным статическим методом, который вызову с главного метода Main (в рамках текущего консольного приложения).
Далее в созданном файле добавляем серию ссылок на пространства имён пакета XBim Essentials. Перечень ссылок можно взять с примера исходного кода, к примеру, отсюда. В силу того, что работать мы будем с файлами IFC в спецификации 2х3, скорректируем представленные в ссылке выше ссылки:
2.2 Читаем IFC-файл
Переходим теперь непосредственно к обработке IFC-файла. В общем случае, для внесения изменений в файл рекомендуется создавать блок XbimEditorCredentials, где указывать параметры редактора и приложения. Данные параметры указываются опционально как второй аргумент в методе по открытию/создания файла.
В качестве тестового захода давайте сосчитаем число всех окон в файле IFC. Для этого в нашем вьювере (XBimXplorer/BIM Vision) выделим элемент окна и посмотрим, какое IFC-представление ему соответствует - IfcWindow.
Теперь, зная, какой элемент необходимо искать, сформируем запрос вида "model.Instances.OfType<IfcWindow>();" то есть обратимся к нашей открытой IFC-модели, и возьмем метод Instances.OfType<***>, где *** - наименование нашего IFC-элемента.
Примечание: Пакет XBim использует встроенные инструменты поиска .NET - LINQ. Насчет этого есть отдельная хорошая статья, показывающая прирост производительности применяя LINQ на сложных структурах.
Теперь запустим код и в консоль выведется следующее значение:
Число окон в модели = 175 шт.
End of code!
RunTime 00:00:08.16
Отлично! Теперь рассмотрим более сложную операцию, а именно, получим набор информации о поверхности в составе IfcSite, но сперва посмотрим, к какому типу оно относится:
Примечание: вообще говоря, чтобы понять логику работы пакета XBim Essentialists удобно использовать XBim Xplorer в связке с ним.
Интересуемая нас поверхность - это нечто иное как тип Representation (то, чем IfcSite геометрически представлен).
А теперь попробуем сделать тоже самое, но из-под кода:
Примечание: как правило, 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.