Введение
В архитектурно-строительной сфере с появлением BIM-технологий всё больше приходится работать с данными, анализировать их и визуализировать для наглядности и понимания. При проектировании зданий и сооружений большое внимание уделяется качеству проектных решений, в том числе предотвращению коллизий на строительной площадке. Работая с BIM-моделями мы можем более качественно и заблаговременно получать информацию о потенциальных коллизиях. Полученные данные необходимо анализировать и принимать в работу, а также визуализировать для донесения более широкому кругу людей, в том числе.
Эта статья является более расширенной версией поста с Dzen про формирование динамической матрицы коллизий. Судя по обратной связи, многим не хватило более подробного раскрытия процесса импорта и преобразования отчёта .xml в Power BI и дальнейшая работа с данными. В этой статье я постараюсь дать более подробный гайд, но также освещу весь процесс начиная с формирования поисковых наборов (Search Sets) в Autodesk Navisworks для более целостной картины.
В конце должны получить примерно такой результат:
![Финальный результат в Power BI Финальный результат в Power BI](https://habrastorage.org/getpro/habr/upload_files/861/e77/3c2/861e773c22906b41546b003782f94fb9.gif)
Подготовка проверок на коллизии в Autodesk Navisworks
Создание поисковых наборов
Прежде чем проверять BIM-модель на коллизии в Navisworks, необходимо создать поисковые наборы для более гибкой и качественной проверки. Поскольку, практически любой BIM-специалист знает, как создавать их, то заострять внимание на этом не буду и в качестве примера возьму уже преднастроенные поисковые наборы.
![Пример структуры "Поисковых наборов" Пример структуры "Поисковых наборов"](https://habrastorage.org/getpro/habr/upload_files/d08/d9d/5b7/d08d9d5b741b9fe5b21b29b4537a8572.png)
Формирование отчёта проверок
Для получения и подготовки отчёта переходим на вкладку Clash Detective и формируем проверки на коллизии. В зависимости от требований и регламентов структура будет отличаться.
Нажимаем Запустить проверку и видим некоторую информацию о конфликтах(коллизиях) и их количестве:
![Настройка и результат проверки на коллизии Настройка и результат проверки на коллизии](https://habrastorage.org/getpro/habr/upload_files/fb7/673/cb7/fb7673cb73d6a18055e415335b08796e.png)
После чего переходим на вкладку Отчёт
Экспорт отчёта в XML
Перед экспортом отчёта, для упрощения в данном случае, в поле Содержимое оставим выборку только у пункта Сводка и в поле Включить эти статусы: уберём всю выборку, нам нужна только общая информация о количестве коллизий в каждой проверки, без детализации. Тип отчёта — Все тесты (совм.); Формат отчёта — XML.
![Преднастройка экспорта Отчёта Преднастройка экспорта Отчёта](https://habrastorage.org/getpro/habr/upload_files/f0f/00c/bb6/f0f00cbb678606bfa4e9d484407febfc.png)
В итоге получаем файл отчёта в .xml формате.
Примечание:
Для более подробной информации по работе с коллизиями, необходимо выбирать дополнительные пункты, в зависимости от нужных вам данных, которые планируете использовать в работе. Повторюсь, в примере они все убраны для упрощения, так как версионность проверок учитываться не будет.
Структура XML отчёта
XML (от англ. eXtensible Markup Language) — «расширяемый язык разметки» и прежде чем идти дальше, необходимо изучить/освежить знания о структуре XML. Вкратце об XML можно почитать тут. Некоторая выдержка из источника:
XML документ должен содержать корневой элемент. Этот элемент является «родительским» для всех других элементов.
Все элементы в XML документе формируют иерархическое дерево. Это дерево начинается с корневого элемента и разветвляется на более низкие уровни элементов.
Все элементы могут иметь подэлементы (дочерние элементы):
<корневой>
<потомок>
<подпотомок>.....</подпотомок>
</потомок>
</корневой>
Похожую структуру мы увидим, если откроем наш отчёт в VS Code, например, или Notepad++
![XML отчёт матрицы коллизий из Navisworks в VS Code XML отчёт матрицы коллизий из Navisworks в VS Code](https://habrastorage.org/getpro/habr/upload_files/403/1cd/50c/4031cd50c0db99138c35b5766d86e0ac.png)
Для дальнейшей работы с импортом и преобразованием в Power BI, нам достаточно обобщённо понимать эту иерархию и вложенность. По сути, в элементах <clashtest>...</clashtest>
записаны наши проверки из Navisworks:
![Пример одной проверки. Сопоставление проверки из Navisworks в XML-отчёте Пример одной проверки. Сопоставление проверки из Navisworks в XML-отчёте](https://habrastorage.org/getpro/habr/upload_files/790/7d6/943/7907d69430ec28fd977e3393ce966704.png)
На иллюстрации выше показана одна из проверок и как она выглядит в XML-структуре с минимальным набором информации.
Примечание:
Поисковые наборы, о которых шла речь вначале, формируются по такому же принципу. Соответственно, создав поисковый набор, вы можете экспортировать его в .xml и посмотреть, как там устроено под капотом, что-то поменять и импортировать обратно в Navisworks, получив новый набор. Отсюда вытекает, что формировать поисковые наборы (особенно когда их много) можно и вне интерфейса Navisworks, но это уже тема для отдельной статьи.
Формирование отчёта в Power BI
Связь с источником данных — импорт отчёта XML
Устанавливаем Microsoft Power BI, если его нет и запускаем программу. Далее устанавливаем связь с источником данных или другими словами — импортируем, ранее подготовленный .xml отчёт.
Нажимаем на текст Получение данных из другого источника и в выпадающем окне выбираем нужный формат — XML
![Первоначальный импорт .xml отчёта в Power BI Первоначальный импорт .xml отчёта в Power BI](https://habrastorage.org/getpro/habr/upload_files/29d/a46/acb/29da46acb5ca740c72f1dbe6c2c88e4f.png)
Пройдёт процесс подключения к источнику и появится окно с таблицей, состоящей из нескольких ячеек. Тут нам уже важно понимать содержимое, так как судя по обратной связи из первоначальной статьи, вопрос многих BIM-специалистов был в преобразовании таблицы и дальнейшая работа с ней.
Если мы вернёмся к .xml отчёту в текстовом редакторе и сопоставим с появившейся таблицей, то заметим в ней верхнеуровневый элемент <batchtest></batchtest>
и некоторые атрибуты units="m" filename="" filepath=""
из корневого элемента <exchange></exchange>
.
Начальный фрагмент XML-структуры из .xml отчёта:
<?xml version="1.0" encoding="UTF-8" ?>
<exchange xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" units="m" filename="" filepath="">
<batchtest name="Report" internal_name="Report" units="m">
<clashtests>
<clashtest name="АИ1 Стены-АИ1 Стены" test_type="hard" status="ok" tolerance="0.010" merge_composites="0">
<linkage mode="none"/>
<left>
...
![Первичное преобразование .xml в Power BI Первичное преобразование .xml в Power BI](https://habrastorage.org/getpro/habr/upload_files/f3e/ab1/741/f3eab1741681f05150a732611d462a2b.png)
Мы понимаем, что нужная информация лежит внутри иерархии и её необходимо достать/преобразовать в нужный нам табличный вид для последующей работы с данными. Жмём Преобразовать данные.
Настройка представления таблицы. Редактор Power Query
Попадаем в Редактор Power Query для последующего преобразования и подготовки данных.
Примечание:
Power Query — это модуль преобразования данных и подсистемы подготовки данных. Power Query поставляется с графическим интерфейсом для получения данных из источников и редактора Power Query для применения преобразований.
Теперь предстоит добраться до нужной информации и для этого мы проваливаемся внутри структуры до нужного уровня вложенности. В столбце batchtest нажимаем на значение ячейки Table, потом clashtests — Table и т.д., как в примере:
![Проваливание внутри уровней Проваливание внутри уровней](https://habrastorage.org/getpro/habr/upload_files/f9c/706/c36/f9c706c36731f6d9cf23690325bd52f8.gif)
![Проваливание внутри уровней — крупнее Проваливание внутри уровней — крупнее](https://habrastorage.org/getpro/habr/upload_files/016/975/ff4/016975ff44943b3575ca98cc98f19970.gif)
Слева в поле Запросы видны наши источники данных, а в поле Параметры запроса вкладки Свойства и Применённые шаги, где мы можем откатиться назад (на один или несколько уровней) либо всё сбросить и вернуться к первоначальному виду.
В новом табличном представлении уже видим столбцы Attribute:name и Attribute:tolerance со знакомыми названиями проверок на коллизии и их допусками, которые изначально формировали в Navisworks.
Далее, нужно извлечь из столбца summary вложенные значения с количеством найденных коллизий, а именно Attribute:total и изменить тип значений на Целое число, нажав ПКМ по заголовку столбца:
![Извлечение значений Attribute:total из summary Извлечение значений Attribute:total из summary](https://habrastorage.org/getpro/habr/upload_files/48c/e8b/698/48ce8b69812e2ebefb171a556fd554ed.gif)
![Извлечение значений Attribute:total из summary — крупнее Извлечение значений Attribute:total из summary — крупнее](https://habrastorage.org/getpro/habr/upload_files/849/6ba/be4/8496babe455be7963fc707906880de4c.gif)
Примечание:
В дальнейшем, если вы планируете поставить на рельсы процесс сбора проверок на коллизии, отслеживать изменения и статусы и выводить эти отчёты в Power BI, то процедура преобразования будет немного другая, потому нужны будут и другие статусы — new, active, reviewed и т.д.
Также следует разбить столбец Attribute:name на два, тем самым разделив левую часть проверки (А) и правую (B). Для последующего представления в матрице:
![Иллюстрация матрицы Иллюстрация матрицы](https://habrastorage.org/getpro/habr/upload_files/6fd/ec2/8aa/6fdec28aa7a64a660d5dffec5cd58605.png)
Для этого, в интерфейсе Редактора Power Query есть функция Разделить столбец. Поскольку в наименованиях моих проверок есть понятный разделить в виде символа - дефис, то делить, я буду по нему (у вас может быть другой).
Выделяем нужный столбец, кликнув на заголовок: Разделить столбец — по разделителю — выбираем знак в выпадающем списке, либо Пользовательский:
![Деление столбца по разделителю Деление столбца по разделителю](https://habrastorage.org/getpro/habr/upload_files/218/e92/08c/218e9208cc891c19c69dd1ac67d82d0c.png)
В результате получится два столбца — левая(А) и правая(B) проверки. Attribute:name.1 и Attribute:name.2
![Результат деления столбца Attribute:name Результат деления столбца Attribute:name](https://habrastorage.org/getpro/habr/upload_files/23e/76d/e2c/23e76de2c50a5b9a13b3df3ed4f96390.png)
Жмём Закрыть и применить в верхнем левом углу и переходим к последнему шагу в части подготовки данных — группировка всех проверок в соответствующие разделы проектной документации: АР, КР, ОВ и т.д., чтобы выводить общие показатели по ним.
Примечание:
Если вы формируете проверки в Navisworks по принципу "модель на модель" или "раздел на раздел", а не разделяете их более подробно на наборы как в примере статьи, то следующий шаг по группировкам для вас может быть не актуален.
После того, как вышли из режима редактирования запроса, попадаем в главную рабочую область Power BI, которую рассмотрим чуть позже. В левой части окна есть три иконки: Представление отчёта (область в который мы находимся сейчас), Представление таблицы и Представление модели.
Выбираем Представление таблицы и видим знакомую нам табличку, но уже без верхнеуровневых столбцов, в которые можно провалиться.
![Вкладка Представление таблиц Вкладка Представление таблиц](https://habrastorage.org/getpro/habr/upload_files/09e/62b/df4/09e62bdf40cdc672904cddb100fab314.gif)
Выделяем первый столбец с заголовком Attribute:name.1 и группируем его, нажимая на инструмент Группы данных — Создать группы данных. Тут немного ручной работы, но довольно быстрой и понятной. В окне Группы в левой колонке находятся Несгруппированные значения, которые необходимо сгруппировать, переместив в правую колонку и задав логическое имя группе. Алгоритм действий прост — выделяем через SHIFT все нужные наборы (идентифицируя по префиксу в данном случае АИ.., АР.., ВК.., и т.д.) жмём Группировать, два раза кликаем ЛКМ на сформированный заголовок группы, чтобы сразу переименовать в понятный раздел.
![Группировка данных Группировка данных](https://habrastorage.org/getpro/habr/upload_files/81e/370/8ff/81e3708ff6097efae1977a14fa5ae541.gif)
Соответственно, таким же образом поступаем и со вторым столбцом Attribute:name.2. На выходе должны сформироваться два дополнительных столбца с постфиксом (группы) в конце таблицы.
![Результат группировки в виде дополнительных столбцов Результат группировки в виде дополнительных столбцов](https://habrastorage.org/getpro/habr/upload_files/d4f/04f/a42/d4f04fa426a6662a6eccd8ad916a3c0f.png)
Именно этими значениями в дальнейшем мы будем оперировать и выводить на финальный отчёт в матрице коллизий.
Переходим обратно в основную рабочую область — Представление отчёта.
Рабочая область Power BI и подготовка отчёта
Вкратце опишу основные области, с которыми будем работать:
Представление отчёта или рабочая область с отчётами, уже знакомая вкладка — именно тут мы размещаем и компонуем наши графики, чарты и т.д., вследствие чего формируем финальные Дашборды.
Визуализация — поле с преднастройками по типам отчётов, последующая визуальная постобработка и всё, что с этим связано.
Данные — поле с источниками данных, в нашем случае преобразованная таблица с вложенным списком, по сути, столбцы.
![Основные области для работы в Power BI Основные области для работы в Power BI](https://habrastorage.org/getpro/habr/upload_files/e61/e8e/8e2/e61e8e8e2fa5e54146fc461114bed48c.png)
Теперь из области Данные выбираем нужные пункты (столбцы с данными) и уже видим, как формируется простая таблица. Далее выбираем визуальный элемент — Матрица в поле Визуализации и получаем уже нужную нам матрицу коллизий.
![Формирование отчёта Формирование отчёта](https://habrastorage.org/getpro/habr/upload_files/960/776/437/960776437d744e967c20668f5c22e15a.gif)
Сразу можно ещё скорректировать ячейку в верхнем левом углу. Сейчас там Attribute:name.1 (группы), а мы хотим написать "Раздел", для обозначения аббревиатур в заголовках вертикальной и горизонтальной линиях. Для этого в поле Визуализации под заголовком Строки наводим на плашку с именем Attribute:name.1 (группы) в область стрелки и в выпадающем списке выбираем "Переименовать для этого визуального элемента".
![Переименование столбца со значениями Переименование столбца со значениями](https://habrastorage.org/getpro/habr/upload_files/de3/fce/b9f/de3fceb9f1606df3f2ec3524f0e9e5d5.gif)
Осталось только поработать над визуальной частью и дополнительно, как вариант, добавить отчёт с установленными допусками проверок на коллизии между разделами.
Финальная настройка визуально-интерактивной матрицы коллизий
Выделяем отчёт и переходим на появившуюся вкладку Форматирование визуального элемента в поле Визуализации.
![Вкладка — Форматирование визуального элемента Вкладка — Форматирование визуального элемента](https://habrastorage.org/getpro/habr/upload_files/6fd/68d/163/6fd68d1634cb966f262b708e0196eb97.gif)
Детально рассматривать все настройки не буду, покажу несколько, в качестве примера, чтобы получить более менее приемлемый вид.
Предустановка стилей — минимальный,
Можно добавить горизонтальные и вертикальные сетки и вывести их в белый цвет,
Отцентрируем заголовки и значения в ячейках,
Добавим цвет фона у ячеек со значениями,
Немного увеличить строки в размере
Выведем Подсказки во второй вкладке Общий, чтобы при наведении на любую ячейку всплывало окошко с дополнительной информацией,
Добавить название таблицы с сопутствующими настройками,
И так далее по вкусу.
![Настройки по визуальной части в качестве примера Настройки по визуальной части в качестве примера](https://habrastorage.org/getpro/habr/upload_files/998/ede/79d/998ede79de16ff882d0a6000d5efa635.gif)
Отдельно следует выделить плашку под названием Элементы ячейки, где имеет смысл применить параметры к цвету фона и закрашивать ячейки в зависимости от их значений. Тем самым визуально, сразу становится понятен проблемный и критический пул коллизий по количеству, касательно разделов.
![Применение параметров к элементам ячейки Применение параметров к элементам ячейки](https://habrastorage.org/getpro/habr/upload_files/518/11d/9a1/51811d9a15aebdaf74cd2b3efa28f284.gif)
Разобраться с настройками визуальной части не составит большого труда, учитывая, что инструментарий тут достаточно топорный и не так много возможностей настройки стандартных визуальных элементов. Либо я не знаю многих нюансов и приёмов в прикладном плане, что больше походит на правду.
По итогу, после ряда манипуляций получаем подобный результат:
![Один из возможных примеров матрицы коллизий в PowerBI Один из возможных примеров матрицы коллизий в PowerBI](https://habrastorage.org/getpro/habr/upload_files/efd/a8a/c47/efda8ac47c954d591734a6c92ee14d3e.png)
Таблицы интерактивные и мы можем взаимодействовать со строками, столбцами и ячейками, фокусируясь на них.
![Интерактивность таблицы и фокусировка Интерактивность таблицы и фокусировка](https://habrastorage.org/getpro/habr/upload_files/34f/ace/4d0/34face4d04a029a2f1364872cfca9493.gif)
Примечание:
В финальной таблице добавил недостающую проверку ЭОМ - ЭОМ и убрал нули, через применение параметров к цвету шрифта в области Элементы ячейки, вкладки Визуальный элемент.
Для обновления данных перезаписываем отчёт .xml из Navisworks и обновляем в Power BI: вкладка Главная — поле Запросы — кнопка Обновить, таблица скорректируется, если были изменения.
Заключение
В статье рассмотрен относительно упрощённый пример формирования матрицы коллизий в Power BI. Если подключить дополнительные атрибуты при экспорте отчёта в XML из Navisworks, то можно пойти дальше и вести временную шкалу проверок, получать метрики по исправленным и добавленным коллизиям и т.д., но основная цель статьи — более подробно раскрыть процесс импорта и преобразования XML данных в Power BI для BIM-специалистов. Если остались вопросы — пишите.
Спасибо за внимание.