<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Евгений Тесёлкин</title><generator>teletype.in</generator><description><![CDATA[BIM / VDC Management

Блоги:
habr.com/users/esteselkin
dzen.ru/esteselkin]]></description><image><url>https://img4.teletype.in/files/70/1c/701cd177-02b6-4af9-a1a0-ba680d74bedb.png</url><title>Евгений Тесёлкин</title><link>https://teletype.in/@esteselkin</link></image><link>https://teletype.in/@esteselkin?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=esteselkin</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/esteselkin?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/esteselkin?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Tue, 21 Apr 2026 14:44:05 GMT</pubDate><lastBuildDate>Tue, 21 Apr 2026 14:44:05 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@esteselkin/automatization-revit-navisworks</guid><link>https://teletype.in/@esteselkin/automatization-revit-navisworks?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=esteselkin</link><comments>https://teletype.in/@esteselkin/automatization-revit-navisworks?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=esteselkin#comments</comments><dc:creator>esteselkin</dc:creator><title>Способ автоматизации процесса получения BIM-моделей с Revit Server и последующей сборкой в Navisworks. Подробный гайд.</title><pubDate>Sun, 17 Mar 2024 18:14:22 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/a9/f4/a9f4eed1-a5b4-403a-a47d-e51519fdffb3.png"></media:content><category>BIM</category><description><![CDATA[<img src="https://img4.teletype.in/files/b6/89/b6895e1b-8052-4a47-856e-f75d2c0518d6.jpeg"></img>Одной из операционных задач BIM-отдела является подготовка и формирование BIM-моделей проприетарных форматов для последующего использования в тех или иных целях. На примере работы с программными продуктами Autodesk — Revit и Navisworks, подразумевается определённая логика разбивки и хранения разных форматов: RVT, NWC, NWF и NWD. Работая над крупными проектами, включающие в себя разные разделы проектной документации, корпуса зданий и секций, встаёт вопрос о единой структуре и правилах формирования файлов. В этой статье, на простом примере проекта, рассмотрен один из вариантов по автоматизации формирования BIM-моделей проекта, от пакетного экспорта файлов RVT с Revit Server до размещения соответствующих файлов разных форматов по нужным...]]></description><content:encoded><![CDATA[
  <nav>
    <ul>
      <li class="m_level_1"><a href="#046a">Введение.</a></li>
      <li class="m_level_1"><a href="#eKCm">1. Экспорт с Revit Server</a></li>
      <li class="m_level_2"><a href="#jPBg">1.1. Экспорт через eTransmit</a></li>
      <li class="m_level_2"><a href="#3UOO">1.2. Экспорт при помощи Batch файла</a></li>
      <li class="m_level_1"><a href="#pLHh">2. Получение NWC файлов и создание сводных моделей NWD, NWF</a></li>
      <li class="m_level_2"><a href="#7bBr">2.1. Создание скрипта для генерации NWC и создания сводной модели NWD</a></li>
      <li class="m_level_2"><a href="#bGWM">2.2. Первичное создание сводной модели NWF и финальная проверка всего процесса.</a></li>
      <li class="m_level_1"><a href="#2I9d">3. Заключение</a></li>
    </ul>
  </nav>
  <figure id="uUXM" class="m_column">
    <img src="https://img4.teletype.in/files/b6/89/b6895e1b-8052-4a47-856e-f75d2c0518d6.jpeg" width="1440" />
    <figcaption>Обложка</figcaption>
  </figure>
  <h2 id="046a">Введение.</h2>
  <p id="KWFL">Одной из операционных задач <a href="https://ru.wikipedia.org/wiki/BIM" target="_blank">BIM</a>-отдела является подготовка и формирование BIM-моделей проприетарных форматов для последующего использования в тех или иных целях. На примере работы с программными продуктами Autodesk — Revit и Navisworks, подразумевается определённая логика разбивки и хранения разных форматов: <em><strong>RVT</strong>, <strong>NWC</strong>, <strong>NWF</strong></em> и <em><strong>NWD</strong></em>. Работая над крупными проектами, включающие в себя разные <a href="https://www.consultant.ru/document/cons_doc_LAW_75048/cae383069aa05e04750eb0df525a6c535460cc1a/" target="_blank">разделы проектной документации</a>, корпуса зданий и секций, встаёт вопрос о единой структуре и правилах формирования файлов. В этой статье, на простом примере проекта, рассмотрен один из вариантов по автоматизации формирования BIM-моделей проекта, от пакетного экспорта файлов <strong><em>RVT</em></strong> с Revit Server до размещения соответствующих файлов разных форматов по нужным директориям и формированию сводной модели <strong><em>NWD</em></strong>.</p>
  <figure id="miWX" class="m_column">
    <img src="https://img3.teletype.in/files/2e/75/2e75631a-4c2a-4a6c-9609-62f58eae001a.jpeg" width="6560" />
    <figcaption>Рис. 01. Основной пайплайн процесса Revit Server — RVT — NWC — NWD — NWF</figcaption>
  </figure>
  <p id="LsVu">Поэтапные действия <em>пайплайна</em> при помощи <code>.bat</code> файлов:</p>
  <ol id="2EHa">
    <li id="wSu5">Пакетный экспорт Revit моделей с <strong>Revit Server</strong>;</li>
    <li id="GfXt">Создание списка всех Revit моделей с их путями в файле <strong><em>TXT</em></strong>;</li>
    <li id="z2JF">Генерация <strong><em>NWC</em></strong> файлов;</li>
    <li id="UAnk">Создание (<em>обновление при последующих итерациях</em>) сводной модели <strong><em>NWD</em></strong>;</li>
    <li id="eRJy">Перенос (<em>обновление с заменой при последующих итерациях</em>) <strong><em>NWC </em></strong>файлов в папку <strong>03.NWC</strong>;</li>
    <li id="OfWX">Первичное создание сводного файла <strong><em>NWF </em></strong>с последующим добавлением всех <strong><em>NWC </em></strong>файлов;</li>
    <li id="MIk3">Итерационный запуск <code>.bat</code> файлов с актуализацией вышеперечисленных пунктов.</li>
  </ol>
  <p id="sNph">Но, обо всём по порядку.</p>
  <h2 id="eKCm">1. Экспорт с Revit Server</h2>
  <p id="uvUx">На сколько мне известно, есть два основных решения пакетного экспорта моделей с Revit Server, не прибегая к программированию и API. Через стандартную утилиту <a href="https://help.autodesk.com/view/RVT/2023/ENU/?guid=GUID-77F62A96-8A61-4539-9664-0DD0AB08B6ED" target="_blank">RevitServerTool</a> и при помощи плагина <a href="https://help.autodesk.com/view/RVT/2023/ENU/?guid=GUID-2317F99F-070C-4D05-A37B-5D9488B35376" target="_blank">eTransmit</a>, поставляющийся с установкой Revit.</p>
  <h3 id="jPBg">1.1. Экспорт через eTransmit</h3>
  <p id="ai0a">Не буду подробно расписывать этот способ, так как о нём уже упоминал в одной из статей на <a href="https://dzen.ru/a/Y-3u8JfIwUZfU9It" target="_blank">Dzen</a>. Но напомню в двух словах о процессе, поскольку в eTransmit нельзя выбрать несколько моделей с Revit Server, то основной смысл заключается в том, чтобы связать(<em>залинковать</em>) все актуальные модели в <strong>Базовом файле</strong> и именно его выбирать при экспорте через eTransmit, установив галку в поле &quot;Добавить файлы&quot; — &quot;Связанные Revit модели&quot;.</p>
  <p id="vm81">Плюсы и минусы такого подхода:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="4B9D">Плюсы:</p>
    <ul id="k8gk">
      <li id="7OcW">Возможность сделать предварительную настройку перед экспортом, удалив всё ненужное и неиспользуемое в моделях;</li>
      <li id="FHb6">Сохранение модели для передачи, предназначенной для совместно работы. Корректная передача заказчику и другим заинтересованным лицам;</li>
      <li id="61hF">Пакетный экспорт моделей по нажатию <em>одной кнопки.</em></li>
    </ul>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="jxt2">Минусы:</p>
    <ul id="FhJn">
      <li id="nALY">Нужно всегда держать в актуальном состоянии связи в <strong>Базовом файле</strong> (<em>если речь идёт о Revit Server</em>);</li>
      <li id="qIKI">Проставленная галка у &quot;Связанные Revit модели&quot; <em>тянет </em>за собой все связанные модели всех связанных моделей в <strong>Базовом файле</strong>. Если есть подгруженные в какие-либо разделы моделей локальные связи, то они так же будут участвовать в процессе извлечения и при успешном исполнении попадут в результирующую директорию;</li>
      <li id="tblq">При экспорте создаётся папка со всеми моделями. Нет возможности жёстко зашить пути для экспорта в зависимости от раздела, корпуса и т.д.</li>
    </ul>
  </section>
  <h3 id="3UOO">1.2. Экспорт при помощи Batch файла</h3>
  <p id="HU1K">В качестве основного инструмента рассмотрим подробнее этот вариант.</p>
  <p id="Lalw">При установке Revit утилита командной строки <strong>RevitServerTool</strong>, упомянутая выше, устанавливается автоматически. Находится по пути &quot;<em>C:\Program Files\Autodesk\Revit 20<strong>XX</strong>\RevitServerToolCommand</em>&quot; и используется для автоматизации создания локальных моделей на основе Revit Server. </p>
  <figure id="haMN" class="m_column">
    <img src="https://img1.teletype.in/files/84/10/8410cb70-a0a2-49fe-9b0f-fd4df1c09cf6.png" width="1320" />
    <figcaption>Рис. 02. Структура проекта на Revit Server.</figcaption>
  </figure>
  <p id="vct5">В качестве примера представлена упрощённая структура проекта. На Revit Server есть четыре директории с моделями:</p>
  <ul id="6pij">
    <li id="ZFFM"><strong>00.COORDINATION</strong> — Модели Базового и Разбивочных файлов;</li>
    <li id="uoCl"><strong>01.ARCH</strong> — Архитектурные модели;</li>
    <li id="u3tf"><strong>02.STR</strong> — Модели Конструктивных решений;</li>
    <li id="FImf"><strong>03.HVAC</strong> — Модели раздела Отопления и Вентиляции.</li>
  </ul>
  <p id="X2JI">Папочная структура на локальном компьютере имеет аналогичную группировку для упрощения.</p>
  <figure id="Ds7g" class="m_column">
    <img src="https://img1.teletype.in/files/40/fc/40fc9a43-5d88-452f-b442-0d398fd404cf.png" width="504" />
    <figcaption>Рис. 03. Верхне уровневая локальная папочная структура и содержимое 02.RVT</figcaption>
  </figure>
  <p id="iAnX">RVT-модели, содержимое папок с Revit Server, нам необходимо скачивать(<em>экспортировать</em>) к себе на локальный компьютер или сервер. Для этого следует воспользоваться возможностями <strong>RevitServerTool</strong> и создать исполняющий <a href="https://en.wikipedia.org/wiki/Batch_file" target="_blank">Batch File</a>. Синтаксис кода:</p>
  <pre id="AGNZ" data-lang="shell">RevitServerTool createLocalRVT &lt;model path&gt; [-server &lt;server name&gt;] [-destination &lt;path&gt;] [-overwrite]</pre>
  <ul id="UNBT">
    <li id="urf5"><code>RevitServerTool</code> — Отображение справки служебной команды;</li>
    <li id="2fXc"><code>L | createLocalRVT</code> — Создание локальной модели на основе указанной серверной модели;</li>
    <li id="6Row"><code>&lt;model path&gt;</code> — Путь модели на Revit Server;</li>
    <li id="fPT4"><code>[-s | -server &lt;server name&gt;]</code> — Имя адреса Revit Server или IP (<em>обязательный аргумент</em>);</li>
    <li id="dxFO"><code>[-d | -destination &lt;path&gt;]</code> — Конечный путь, куда сохраняем модель;</li>
    <li id="6gRf"><code>[-o | -overwrite]</code> — Перезаписывание файла модели, если он уже существует.</li>
  </ul>
  <p id="o0SD"><strong>Batch file</strong> — это текстовый файл, содержащий последовательность команд для поочередного исполнения и для его создания можно воспользоваться простым блокнотом, но для более удобной работы, лучшим решением будет <a href="https://notepad-plus-plus.org/downloads/" target="_blank">Notepad++</a>.</p>
  <p id="lv1v">Открываем Notepad++ и вписываем команды для экспорта моделей из нашего примера:</p>
  <pre id="uJ5j" data-lang="shell">:: COORDINATION
RevitServerTool L &quot;PROJ\00.COORDINATION\PROJ-ORG-B01_03-FM.rvt&quot; -s IP-address -d &quot;O:\BIM\02.RVT\00.COORDINATION/&quot; -o
RevitServerTool L &quot;PROJ\00.COORDINATION\PROJ-ORG-B01-BF.rvt&quot; -s IP-address -d &quot;O:\BIM\02.RVT\00.COORDINATION/&quot; -o
RevitServerTool L &quot;PROJ\00.COORDINATION\PROJ-ORG-B02-BF.rvt&quot; -s IP-address -d &quot;O:\BIM\02.RVT\00.COORDINATION/&quot; -o
RevitServerTool L &quot;PROJ\00.COORDINATION\PROJ-ORG-B03-BF.rvt&quot; -s IP-address -d &quot;O:\BIM\02.RVT\00.COORDINATION/&quot; -o
:: ARCH
RevitServerTool L &quot;PROJ\01.ARCH\PROJ-ORG-B01-ARCH.rvt&quot; -s IP-address -d &quot;O:\BIM\02.RVT\01.ARCH/&quot; -o
RevitServerTool L &quot;PROJ\01.ARCH\PROJ-ORG-B02-ARCH.rvt&quot; -s IP-address -d &quot;O:\BIM\02.RVT\01.ARCH/&quot; -o
RevitServerTool L &quot;PROJ\01.ARCH\PROJ-ORG-B03-ARCH.rvt&quot; -s IP-address -d &quot;O:\BIM\02.RVT\01.ARCH/&quot; -o
:: STR
RevitServerTool L &quot;PROJ\02.STR\PROJ-ORG-B01-STR.rvt&quot; -s IP-address -d &quot;O:\BIM\02.RVT\02.STR/&quot; -o
RevitServerTool L &quot;PROJ\02.STR\PROJ-ORG-B02-STR.rvt&quot; -s IP-address -d &quot;O:\BIM\02.RVT\02.STR/&quot; -o
RevitServerTool L &quot;PROJ\02.STR\PROJ-ORG-B03-STR.rvt&quot; -s IP-address -d &quot;O:\BIM\02.RVT\02.STR/&quot; -o
:: HVAC
RevitServerTool L &quot;PROJ\03.HVAC\PROJ-ORG-B01-HVAC.rvt&quot; -s IP-address -d &quot;O:\BIM\02.RVT\03.HVAC/&quot; -o
RevitServerTool L &quot;PROJ\03.HVAC\PROJ-ORG-B02-HVAC.rvt&quot; -s IP-address -d &quot;O:\BIM\02.RVT\03.HVAC/&quot; -o
RevitServerTool L &quot;PROJ\03.HVAC\PROJ-ORG-B03-HVAC.rvt&quot; -s IP-address -d &quot;O:\BIM\02.RVT\03.HVAC/&quot; -o</pre>
  <p id="z9cm">В примере выше мы указываем пути моделей на Revit Server и говорим создать локальную модель <code>L</code> для каждой, указывая свой адрес Revit Server  <code>-s IP-address</code> и скачиваем к себе на локальный компьютер &quot;<em>O:\BIM\..</em>&quot; с перезаписью <code>-o</code> файлов модели, если они уже есть. </p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="NlLE">Примечание.</p>
    <p id="7yvV">Конечный путь заканчивается символом &quot;<strong>/</strong>&quot; что означает — скачать модель с исходным именем в указанную директорию. Многие дублируют имя модели с расширением как в примере с указанием пути на Revit Server, но этого делать необязательно, используя упомянутый знак <em>слэш</em>. Бывает необходимо скачать RVT-модель с изменённым именем, тогда в конечном пути следует указать новое имя с расширением:</p>
    <p id="bHIt"><code>&lt;model path&gt;</code> — <code>&quot;PROJ\00.COORDINATION\PROJ-ORG-B01_03-FM.rvt&quot;</code></p>
    <p id="9PP7"><code>destination &lt;path&gt;</code> — <code>&quot;O:\BIM\02.RVT\00.COORDINATION\NewName.rvt&quot;</code></p>
  </section>
  <p id="Tw27">Команды <code>::</code> или <code>REM </code>позволяют закомментировать строки. Скрипт их не выполняет и используются они в данном случае для визуального удобства и группировки.</p>
  <p id="TSb0">Если в строках присутствует <a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0" target="_blank">Кириллица</a>, то необходимо поменять кодировку на <strong>OEM 866</strong></p>
  <figure id="M9IZ" class="m_column">
    <img src="https://img4.teletype.in/files/bf/17/bf17d925-2b05-4e6b-b6f6-e62a525ed399.png" width="924" />
    <figcaption>Рис. 04. Смена кодировки на OEM 866, если используется Кириллица.</figcaption>
  </figure>
  <p id="FtCC">Далее сохраняем файл по пути &quot;<em>C:\Program Files\Autodesk\Revit 20<strong>XX</strong>\RevitServerToolCommand</em>&quot; с расширением <em><strong>Batch file</strong></em>. </p>
  <p id="ADxi">Запускать скрипт следует именно из директории &quot;<em>C:\Program Files\Autodesk\Revit 20<strong>XX</strong>\RevitServerToolCommand</em>&quot; с <strong>полным доступом</strong> на права.</p>
  <p id="M95E">Также стоит уточнить, что структура проекта может быть любой — разбита на разделы проектной документации, на корпуса зданий и т.д., это не столь важно, в <strong><em>Batch</em></strong> файле вы указываете необходимые вам пути для сохранения моделей куда нужно, в зависимости от группировки.</p>
  <p id="yLD4">Краткая демонстрация результата:</p>
  <figure id="XQhK" class="m_column">
    <img src="https://img2.teletype.in/files/9d/ca/9dca1119-a6ee-4f3f-ad30-c7009e02f12f.gif" width="1280" />
    <figcaption>Рис. 05. Результат работы Batch скрипта для экспорта моделей с Revit Server.</figcaption>
  </figure>
  <p id="XFZB">Плюсы и минусы такого подхода:</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="IlcO">Плюсы:</p>
    <ul id="uDoy">
      <li id="4NPR">Скорость сохранения моделей, как правило, быстрее по сравнению с eTransmit;</li>
      <li id="L9D4">Если моделей много, то можно разбить на разные файлы и скачивать модели частями в зависимости от необходимости;</li>
      <li id="xsa0">Модель сохраняется по конечному пути, без создания дополнительной папки, как в случае с eTransmit.</li>
      <li id="Kiip">Процесс можно автоматизировать по расписанию, без необходимости вручную запускать <strong><em>Batch</em></strong> файл.</li>
    </ul>
  </section>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="nvur">Минусы:</p>
    <ul id="yWuP">
      <li id="ORjc">Нет предварительной подчистки модели по сравнению с eTransmit;</li>
      <li id="jniW">Нужно всегда держать в голове актуальную информацию по составу моделей, что бы внести корректировки в <strong><em>Batch</em></strong> файл.</li>
    </ul>
  </section>
  <figure id="gL1x" class="m_column">
    <img src="https://img3.teletype.in/files/ef/61/ef61993c-5c49-4cb0-b460-ce9b91468a65.png" width="1413" />
    <figcaption>Рис. 06. Итоговый результат — все RVT-модели в своих папках.</figcaption>
  </figure>
  <p id="EsEJ">Теперь, когда мы получили RVT-модели с Revit Server приступим к следующему этапу нашего <em>пайплайна</em>.</p>
  <h2 id="pLHh">2. Получение NWC файлов и создание сводных моделей NWD, NWF</h2>
  <p id="Ufpl">Напомню вкратце, основной процесс по работе с Revit и Navisworks в части формирования сводных моделей. Вначале необходимо получить <strong><em>NWC</em></strong> файлы из файлов <strong><em>RVT</em></strong>, далее создать сводный файл <strong><em>NWF</em></strong> куда в последствии подгружаем файлы <strong><em>NWC</em></strong> и дополнительно сохраняем сводную модель в формате <strong><em>NWD</em></strong> для передачи заказчику или подрядчикам. Порядок действий может незначительно меняться, кому как удобнее. При всём этом обилии форматов не плохо было бы их раскидать по нужным местам. Отдельно хранить файлы <strong>NWC</strong>, в папке <strong>03.NWC</strong> в нашем случае, которые там будут систематически обновляться скриптом. В другом месте формировать сводную модель <strong><em>NWF</em></strong> для работы с коллизиями, поисковыми наборами и т.д. и отдельно иметь место для хранения актуальной сводной модели в формате <strong>NWD</strong> у которой иные цели.</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="EuWv">Примечание.</p>
    <p id="YrQ4">Можно обойтись и без такой раздельной структуры, но с ней будет гораздо удобнее, если в проекте подразумевается несколько корпусов здания, которые имеет смысл делить и соответственно у каждого из них будут самостоятельные сводные модели <strong><em>NWF</em></strong> и <strong><em>NWD</em></strong></p>
  </section>
  <figure id="D6gj" class="m_column">
    <img src="https://img3.teletype.in/files/6f/12/6f12735a-4631-4033-9354-1ad0a24314ff.png" width="1072" />
    <figcaption>Рис. 07. Второй основной этап процесса. Генерация NWC и создание NWF, NWD моделей.</figcaption>
  </figure>
  <p id="0tGo">Бóльшую часть действий можно и нужно автоматизировать. Создадим скрипт <strong><em>Batch</em></strong> файла для реализации этой задачи.</p>
  <h3 id="7bBr">2.1. Создание скрипта для генерации NWC и создания сводной модели NWD</h3>
  <p id="wEoe">Для задачи автоматизации выделил отдельную папку <strong>05.Automation</strong> в которой будут храниться исполняющий <strong><em>Batch</em></strong> файл, журнал событий (<em>log</em>) и сгенерированный файл <strong><em>TXT</em></strong> со списком RVT-моделей, о котором ещё расскажу. </p>
  <p id="C2K7">Полностью готовый код выглядит так:</p>
  <pre id="JnIf" data-lang="shell">:: Encoding for Cyrillic
CHCP 65001 &gt; NUL
:: Getting all .rvt files from a folder and subfolders and creating a list of RVT-models in .txt format
DIR /b/s &quot;O:\BIM\02.RVT\*.rvt&quot; | findstr /i/v/r &quot;BF FM \.[0-9][0-9][0-9][0-9]\.&quot; &gt; &quot;List RVT-models.txt&quot;

:: Launching the FileToolsTaskRunner utility to generate .nwv files according to the list of .txt RVT-models created above. Additionally, a federated .nwd model and a .log file is created
start /wait &quot;Navisworks Batch Utility&quot; &quot;C:\Program Files\Autodesk\Navisworks Manage 2023\FileToolsTaskRunner.exe&quot; /i &quot;O:\BIM\05.Automation\List RVT-models.txt&quot; /of &quot;O:\BIM\01.FM NWD\PROJ-ORG-B01_03-FM.nwd&quot; /log &quot;O:\BIM\05.Automation\Log.log&quot;

:: Variables are set for the source path, for the destination path and for generating files  
set &quot;source_folder=O:\BIM\02.RVT&quot;
set &quot;destination_folder=O:\BIM\03.NWC&quot;
set &quot;file_format=*.nwc&quot;
:: Loop through the source path, extracting files of the required format and moving them to the final path
for /r &quot;%source_folder%&quot; %%G in (%file_format%) do (
move &quot;%%G&quot; &quot;%destination_folder%&quot;
)</pre>
  <p id="iSZO">Теперь разберём его подробнее.</p>
  <p id="yA6f">Как и в примере выше, если используется Кириллица в именах и путях файлов, то нужно менять кодировку:</p>
  <pre id="z4dM" data-lang="shell">CHCP 65001 &gt; NU</pre>
  <p id="B8AB">Следующая команда проходит по всем файлам формата <strong><em>RVT</em></strong> в папке <strong>02.RVT</strong> и её вложенным папкам, после чего создаёт список найденных файлов с их путями в отдельном файле <strong><em>TXT</em></strong> в той же папке:</p>
  <pre id="bjLA" data-lang="shell">DIR /b/s &quot;O:\BIM\02.RVT\*.rvt&quot; &gt; &quot;List RVT-models.txt&quot;</pre>
  <p id="wkQQ">Этот список нужен для генерации <strong><em>NWC</em></strong> файлов при помощи утилиты <a href="https://help.autodesk.com/view/NAV/2023/ENU/?guid=GUID-3EC4C7E0-479C-42FD-88CB-1FC46AD0D08E" target="_blank">FileToolsTaskRunner</a>, которая устанавливается с Navisworks.</p>
  <p id="YOqy">Можно сразу доработать код, исключив из поиска модели <strong>Разбивочного</strong> и <strong>Базовых файлов</strong>, за ненадобностью в сводных моделях Navisworks, а также потенциальные копии RVT-моделей, где в постфиксе имён добавляется &quot;<em>.001&quot;</em>; &quot;<em>.002&quot;</em> и т.д.</p>
  <figure id="BHnw" class="m_column">
    <img src="https://img2.teletype.in/files/13/0d/130df042-abe4-43fe-93de-13678078b9c7.png" width="748" />
    <figcaption>Рис. 08. Исключение из поиска Базового и Разбивочных файлов вместе с потенциальными копиями RVT-моделей.</figcaption>
  </figure>
  <p id="vmQl">Добавим команду  <code>findstr</code> с сопутствующими параметрами <code>/i/v/r</code>, значение которых можно узнать <a href="https://learn.microsoft.com/ru-ru/windows-server/administration/windows-commands/findstr" target="_blank">тут</a> и указываем <a href="https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F" target="_blank">регулярное выражение</a> для исключения копий:</p>
  <pre id="V808" data-lang="shell">DIR /b/s &quot;O:\BIM\02.RVT\*.rvt&quot; | findstr /i/v/r &quot;BF FM \.[0-9][0-9][0-9][0-9]\.&quot; &gt; &quot;List RVT-models.txt&quot;</pre>
  <p id="P28q">В кавычках сочетание символов по которым исключаем поиск файлов и синтаксис регулярного выражения.</p>
  <p id="wWjg">В качестве теста можно запустить команду и убедиться что создаётся файл <strong><em>TXT</em></strong> со списком путей моделей:</p>
  <figure id="7X7d" class="m_column">
    <img src="https://img4.teletype.in/files/bc/c7/bcc7d299-8092-4a4b-a6fd-02af9354cffa.gif" width="1478" />
    <figcaption>Рис. 09. Создание списка моделей с их путями в файле TXT.</figcaption>
  </figure>
  <p id="Hhr6">Далее добавим команду вызова <a href="https://help.autodesk.com/view/NAV/2023/ENU/?guid=GUID-3EC4C7E0-479C-42FD-88CB-1FC46AD0D08E" target="_blank">Navisworks Batch Utility</a>, но при помощи командной строки и утилиты FileToolsTaskRunner:</p>
  <pre id="lrKx" data-lang="shell">start /wait &quot;Navisworks Batch Utility&quot; &quot;C:\Program Files\Autodesk\Navisworks Manage 2023\FileToolsTaskRunner.exe&quot; /i &quot;O:\BIM\05.Automation\List RVT-models.txt&quot; /of &quot;O:\BIM\01.FM NWD\PROJ-ORG-B01_03-FM.nwd&quot; /log &quot;O:\BIM\05.Automation\Log.log&quot;</pre>
  <p id="JEKu">Аналог команды Batch Utility из интерфейса Navisworks, который уже упоминался в другой статье на <a href="https://dzen.ru/a/Y_TGSbWZNx-pvBYO" target="_blank">Dzen</a>.</p>
  <p id="uRIw">В команде выше мы:</p>
  <ul id="eJsr">
    <li id="RR7m">Указываем путь до утилиты FileToolsTaskRunner, чтобы её запустить;</li>
    <li id="K7Y1">Ссылаемся на ранее созданный список <strong><em>TXT</em></strong> с моделями, по которому будет происходить генерация <strong><em>NWC</em></strong> файлов;</li>
    <li id="5bAR">Далее создаём сводную модель <strong><em>NWD</em></strong>, сохраняя по пути &quot;<em>O:\BIM\01.FM NWD\</em>&quot; с именем PROJ-ORG-B01_03-FM<strong>.nwd</strong>;</li>
    <li id="8oPd">Параллельно создаётся журнал событий (<em>log</em>), в той же папке, где можно отслеживать исполнение действий по моделям.</li>
  </ul>
  <p id="0Oq4">Смотрим результат:</p>
  <figure id="gOnl" class="m_column">
    <img src="https://img1.teletype.in/files/81/aa/81aa328b-e4a2-4a49-aee7-c6ff3e886cbb.gif" width="1481" />
    <figcaption>Рис. 10. Генерация NWC файлов, журнала событий и сводной модели NWD.</figcaption>
  </figure>
  <p id="ITNO">Осталось перемещать созданные <strong><em>NWC</em></strong> файлы в папку <strong>03.NWC</strong> откуда впоследствии они будут подгружаться в <em><strong>NWF</strong></em> файл.</p>
  <p id="IgFJ">Для этого задаем три переменные:</p>
  <ul id="lOqD">
    <li id="iRTU"><code>set &quot;source_folder=O:\BIM\02.RVT&quot;</code> с указанием директории, откуда берём файлы <strong><em>NWC</em></strong>;</li>
    <li id="HAf3"><code>set &quot;destination_folder=O:\BIM\03.NWC&quot;</code> с указанием папки куда переносим/заменяем <strong><em>NWC</em></strong> файлы;</li>
    <li id="gLjf"><code>set &quot;file_format=*.nwc&quot;</code> с указанием нужного формата, который переносим — <strong><em>NWC</em></strong>.</li>
  </ul>
  <p id="e0vf">И добавляем кусок кода с циклом для перебора:</p>
  <pre id="Go3d" data-lang="shell">set &quot;source_folder=O:\BIM\02.RVT&quot;
set &quot;destination_folder=O:\BIM\03.NWC&quot;
set &quot;file_format=*.nwc&quot;

for /r &quot;%source_folder%&quot; %%G in (%file_format%) do (
move &quot;%%G&quot; &quot;%destination_folder%&quot;
)</pre>
  <p id="1DMN">Теперь сгенерированные файлы <strong><em>NWC</em></strong> будут автоматический перемещаться в нужное нам место.</p>
  <figure id="Ocb8" class="m_column">
    <img src="https://img4.teletype.in/files/79/a5/79a5cd69-6a46-4399-bb77-69188857fe87.gif" width="1478" />
    <figcaption>Рис. 11. Перемещение NWC файлов.</figcaption>
  </figure>
  <p id="zhOj">Создадим сводную модель <strong><em>NWF</em></strong> и посмотрим итоговый результат.</p>
  <h3 id="bGWM">2.2. Первичное создание сводной модели NWF и финальная проверка всего процесса.</h3>
  <p id="lTss">Для нового проекта, одноразовой акцией, является создание сводной модели <strong><em>NWF</em></strong>. В последующих итерациях нам достаточно очередной раз эту сводную модель, где будет обновление данных, если <strong><em>NWC</em></strong> файлы были обновлены.</p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="hC7R">Примечание.</p>
    <p id="5xJn">Сводную модель <strong><em>NWF</em></strong> мы также можем зашить в код и создавать автоматически, но в этом нет необходимости, так как в файле <strong><em>NWF</em></strong> хранятся ссылки на файлы <strong><em>NWC</em></strong>, которые обновляются каждый раз при последующих открытиях модели <strong><em>NWF</em></strong>. Помимо прочего, в этой модели ведётся работа с матрицей коллизий, симуляции строительства и т.д., то есть эти наработки будут пропадать, если заново обновлять <strong><em>NWF</em></strong> файл.</p>
  </section>
  <p id="qik6">Поэтому просто создадим файл с именем PROJ-ORG-B01_03-FM<strong>.nwf</strong> в папке <strong>04.NWF</strong> и добавим в неё все файлы <strong><em>NWC</em></strong> из папки <strong>03.NWF</strong>, после первого исполнения нашего скрипта. </p>
  <p id="ZR4k">По итогу мы имеем всего два <strong>Batch</strong> файла для запуска, которые экспортируют все RVT-модели с Revit Server, затем генерируют <strong><em>NWC</em></strong> файлы с перемещением в нужную область, создают сводную модель <strong><em>NWD</em></strong> и соответственно авто обновляется сводная <em>рабочая</em> модель <strong><em>NWF</em></strong>.</p>
  <p id="3XtL">Демонстрация исполнения всего процесса:</p>
  <figure id="ySGl" class="m_column">
    <img src="https://img2.teletype.in/files/9a/16/9a16ea8e-0c03-4c48-8a3d-654b29ed704d.gif" width="1474" />
    <figcaption>Рис. 12. Итоговая демонстрация процесса.</figcaption>
  </figure>
  <p id="qneR">Используя подобный подход под каждый проект можно быстро получать актуальные BIM-модели, формировать сводные файлы и разом структурировать данные.</p>
  <h2 id="2I9d">3. Заключение</h2>
  <p id="ot8z">Возможно подход не идеален и может показаться на первый взгляд не простым, но если разобраться и потратить какое-то время, то выясниться, что это гораздо лучше, чем делать часть работы в ручную или пренебрегать структурированием. Использование удобных интерфейсов программ мне нравится куда больше, но ты либо упираешься в ограничение самой программы, либо прибегаешь к помощи программистов, если сам таким не являешься. А подход из статьи может использовать абсолютно каждый и гибко настраивать под себя. Необязательно для этого уметь программировать. Поскольку, разбираться с синтаксисом команд для <strong>Batch</strong> файлов, то ещё &quot;<em>удовольствие</em>&quot;, вы можете обратиться за помощью к Сhat-GPT, если вам требуется модификация скрипта конкретно для ваших рабочих процессов, с чем он прекрасно справиться.</p>
  <p id="0f0C">Как вы решаете подобные задачи и какими инструментами пользуетесь?</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@esteselkin/collision-report-powerbi</guid><link>https://teletype.in/@esteselkin/collision-report-powerbi?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=esteselkin</link><comments>https://teletype.in/@esteselkin/collision-report-powerbi?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=esteselkin#comments</comments><dc:creator>esteselkin</dc:creator><title>Визуальный и интерактивный отчёт матрицы коллизий из Autodesk Navisworks в Microsoft Power BI</title><pubDate>Wed, 01 Nov 2023 13:42:09 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/c0/2c/c02ca351-1589-4fcc-b99f-0e4dbfa8f3e6.png"></media:content><category>Power BI</category><description><![CDATA[<img src="https://img1.teletype.in/files/08/96/08963f9d-3a8e-4116-bbea-f6b891652107.jpeg"></img>В архитектурно-строительной сфере с появлением BIM-технологий всё больше приходится работать с данными, анализировать их и визуализировать для наглядности и понимания. При проектировании зданий и сооружений большое внимание уделяется качеству проектных решений, в том числе предотвращению коллизий на строительной площадке. Работая с BIM-моделями(упрощённо: 3D-модель с атрибутивной информацией элементов) мы можем более качественно и заблаговременно получать информацию о потенциальных коллизиях. Полученные данные необходимо анализировать и принимать в работу, а также визуализировать для донесения более широкому кругу людей, в том числе.]]></description><content:encoded><![CDATA[
  <h2 id="idyL">Введение</h2>
  <p id="F7mO">В архитектурно-строительной сфере с появлением <a href="https://ru.wikipedia.org/wiki/BIM#:~:text=BIM%20(%D0%B0%D0%BD%D0%B3%D0%BB.,%D0%B8%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85%20%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%20%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0." target="_blank">BIM-технологий</a> всё больше приходится работать с данными, анализировать их и визуализировать для наглядности и понимания. При проектировании зданий и сооружений большое внимание уделяется качеству проектных решений, в том числе предотвращению коллизий на строительной площадке. Работая с BIM-моделями(<em>упрощённо: 3D-модель с атрибутивной информацией элементов</em>) мы можем более качественно и заблаговременно получать информацию о потенциальных коллизиях. Полученные данные необходимо анализировать и принимать в работу, а также визуализировать для донесения более широкому кругу людей, в том числе. </p>
  <p id="POCi">Эта статья является более расширенной версией <a href="https://dzen.ru/a/YqIFvz6GLCUihUdZ?share_to=link" target="_blank">поста с Dzen</a> про формирование динамической матрицы коллизий. Судя по обратной связи, многим не хватило более подробного раскрытия процесса импорта и преобразования отчёта <strong>.xml</strong> в <strong>Power BI</strong> и дальнейшая работа с данными. В этой статье я постараюсь дать более подробный гайд, но также освещу весь процесс начиная с формирования <a href="https://help.autodesk.com/view/NAV/2021/ENU/?guid=GUID-D4B6B835-499E-4C10-BA70-46353B90A0D0" target="_blank">поисковых наборов</a> (<em>Search Sets</em>) в <a href="https://www.autodesk.com/products/navisworks/overview" target="_blank">Autodesk Navisworks</a> для более целостной картины.</p>
  <p id="4utF">В конце должны получить примерно такой результат:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="F0oZ" class="m_original">
      <img src="https://img2.teletype.in/files/57/80/5780d88c-45e5-4a81-8d34-be2c09713ea6.gif" width="678" />
      <figcaption>Финальный результат в Power BI</figcaption>
    </figure>
  </section>
  <h2 id="oRZR">Подготовка проверок на коллизии в Autodesk Navisworks</h2>
  <h3 id="WarO">Создание поисковых наборов</h3>
  <p id="iHYm">Прежде чем проверять <a href="https://ru.wikipedia.org/wiki/BIM" target="_blank">BIM-модель</a> на коллизии в <strong>Navisworks</strong>, необходимо создать <strong>поисковые наборы</strong> для более гибкой и качественной проверки. Поскольку, практически любой <a href="https://hh.ru/article/305116" target="_blank">BIM-специалист</a> знает, как создавать их, то заострять внимание на этом не буду и в качестве примера возьму уже преднастроенные поисковые наборы.</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="1UX8" class="m_original">
      <img src="https://img3.teletype.in/files/ab/88/ab881ca6-7a69-41c3-9a19-5505156333c0.png" width="1367" />
      <figcaption>Пример структуры &quot;Поисковых наборов&quot;</figcaption>
    </figure>
  </section>
  <h3 id="nk0U">Формирование отчёта проверок</h3>
  <p id="v8DN">Для получения и подготовки отчёта переходим на вкладку <strong>Clash Detective</strong> и формируем проверки на коллизии. В зависимости от требований и регламентов структура будет отличаться.</p>
  <p id="0Ovw">Нажимаем <strong>Запустить проверку</strong> и видим некоторую информацию о конфликтах<em>(коллизиях)</em> и их количестве:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="kwEH" class="m_column">
      <img src="https://img2.teletype.in/files/5d/d2/5dd201cc-78d6-47de-b19d-42f5bb5afd96.png" width="1367" />
      <figcaption>Настройка и результат проверки на коллизии</figcaption>
    </figure>
  </section>
  <p id="3rQ1">После чего переходим на вкладку <strong>Отчёт</strong></p>
  <h3 id="KEJB">Экспорт отчёта в XML</h3>
  <p id="Z5mX">Перед экспортом отчёта, для упрощения в данном случае, в поле <strong>Содержимое </strong>оставим выборку только у пункта <strong><em>Сводка</em> </strong>и в поле <em><strong>Включить эти статусы:</strong></em> уберём всю выборку, нам нужна только общая информация о количестве коллизий в каждой проверки, без детализации. <strong><em>Тип отчёта</em></strong> — Все тесты (совм.); <strong><em>Формат отчёта</em></strong> — XML.</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="FGun" class="m_column">
      <img src="https://img3.teletype.in/files/ac/19/ac19d96c-49a2-4834-b6cc-e4374d3dd0f6.png" width="811" />
      <figcaption>Преднастройка экспорта Отчёта</figcaption>
    </figure>
  </section>
  <p id="fmIJ">В итоге получаем файл отчёта в <strong>.xml </strong>формате.</p>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="8af7">Примечание: <br />Для более подробной информации по работе с коллизиями, необходимо выбирать дополнительные пункты, в зависимости от нужных вам данных, которые планируете использовать в работе. Повторюсь, в примере они все убраны для упрощения, так как версионность проверок учитываться не будет.</p>
  </section>
  <h3 id="ZpkX">Структура XML отчёта</h3>
  <p id="FEze"><strong>XML</strong> (от англ. e<strong>X</strong>tensible <strong>M</strong>arkup <strong>L</strong>anguage) — «расширяемый <a href="https://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%82%D0%BA%D0%B8" target="_blank">язык разметки</a>» и прежде чем идти дальше, необходимо изучить/освежить знания о структуре XML. Вкратце об XML можно почитать <a href="https://xml.readthedocs.io/xml-intro.html" target="_blank">тут</a>. Некоторая выдержка из источника:</p>
  <blockquote id="AsAo">XML документ должен содержать корневой элемент. Этот элемент является «родительским» для всех других элементов.<br /><br />Все элементы в XML документе формируют иерархическое дерево. Это дерево начинается с корневого элемента и разветвляется на более низкие уровни элементов. <br /><br />Все элементы могут иметь подэлементы (дочерние элементы):</blockquote>
  <pre id="GSIG" data-lang="xml">&lt;корневой&gt;
   &lt;потомок&gt;
     &lt;подпотомок&gt;.....&lt;/подпотомок&gt;
   &lt;/потомок&gt;
&lt;/корневой&gt;</pre>
  <p id="k2Gt">Похожую структуру мы увидим, если откроем наш отчёт в <a href="https://code.visualstudio.com/" target="_blank">VS Code</a>, например, или <a href="https://notepad-plus-plus.org/" target="_blank">Notepad++</a></p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="CZK5" class="m_column">
      <img src="https://img2.teletype.in/files/93/b2/93b2ce1e-2035-4baa-a121-9952b54a1dc6.png" width="1201" />
      <figcaption>XML отчёт матрицы коллизий из Navisworks в VS Code</figcaption>
    </figure>
  </section>
  <p id="DtuI">Для дальнейшей работы с импортом и преобразованием в Power BI, нам достаточно обобщённо понимать эту иерархию и вложенность. По сути, в элементах <code>&lt;clashtest&gt;...&lt;/clashtest&gt;</code> записаны наши проверки из Navisworks:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="gMzh" class="m_column">
      <img src="https://img1.teletype.in/files/ce/5e/ce5ea410-a21f-4ccd-9497-51b985092d6a.png" width="2560" />
      <figcaption>Пример одной проверки. Сопоставление проверки из Navisworks в XML-отчёте</figcaption>
    </figure>
  </section>
  <p id="Jz2n">На иллюстрации выше показана одна из проверок и как она выглядит в XML-структуре с минимальным набором информации.</p>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="OAuK">Примечание:<br />Поисковые наборы, о которых шла речь вначале, формируются по такому же принципу. Соответственно, создав <strong>поисковый набор</strong>, вы можете экспортировать его в <strong>.xml</strong> и посмотреть, как там устроено <em>под капотом</em>, что-то поменять и импортировать обратно в Navisworks, получив новый набор. Отсюда вытекает, что формировать поисковые наборы (<em>особенно когда их много</em>) можно и вне интерфейса Navisworks, но это уже тема для отдельной статьи.</p>
  </section>
  <h2 id="9OpZ">Формирование отчёта в Power BI</h2>
  <h3 id="ZgzI"><strong>Связь с источником данных — импорт отчёта XML</strong></h3>
  <p id="rgUG">Устанавливаем <a href="https://powerbi.microsoft.com/desktop" target="_blank">Microsoft Power BI</a>, если его нет и запускаем программу. Далее устанавливаем связь с источником данных или другими словами — импортируем, ранее подготовленный <strong>.xml</strong> отчёт.</p>
  <p id="b3Gm">Нажимаем на текст<strong> Получение данных из другого источника</strong> и в выпадающем окне выбираем нужный формат — <strong>XML</strong></p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="goRD" class="m_column">
      <img src="https://img2.teletype.in/files/94/1d/941d400c-59e9-46ea-9858-6541b1376b8d.png" width="1839" />
      <figcaption>Первоначальный импорт .xml отчёта в Power BI</figcaption>
    </figure>
  </section>
  <p id="ANgI">Пройдёт процесс подключения к источнику и появится окно с таблицей, состоящей из нескольких ячеек. Тут нам уже важно понимать содержимое, так как судя по обратной связи из <a href="https://dzen.ru/a/YqIFvz6GLCUihUdZ?share_to=link" target="_blank">первоначальной статьи</a>, вопрос многих BIM-специалистов был в преобразовании таблицы и дальнейшая работа с ней.</p>
  <p id="vwiq">Если мы вернёмся к <strong>.xml</strong> отчёту в текстовом редакторе и сопоставим с появившейся таблицей, то заметим в ней верхнеуровневый элемент <code>&lt;batchtest&gt;&lt;/batchtest&gt;</code> и некоторые атрибуты <code>units=&quot;m&quot; filename=&quot;&quot; filepath=&quot;&quot;</code> из корневого элемента <code>&lt;exchange&gt;&lt;/exchange&gt;</code>.</p>
  <p id="zUIl">Начальный фрагмент XML-структуры из <strong>.xml</strong> отчёта:</p>
  <pre id="c4Ty" data-lang="xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;

&lt;exchange xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; units=&quot;m&quot; filename=&quot;&quot; filepath=&quot;&quot;&gt;
  &lt;batchtest name=&quot;Report&quot; internal_name=&quot;Report&quot; units=&quot;m&quot;&gt;
    &lt;clashtests&gt;
      &lt;clashtest name=&quot;АИ1 Стены-АИ1 Стены&quot; test_type=&quot;hard&quot; status=&quot;ok&quot; tolerance=&quot;0.010&quot; merge_composites=&quot;0&quot;&gt;
        &lt;linkage mode=&quot;none&quot;/&gt;
        &lt;left&gt;
...</pre>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="PtFb" class="m_column">
      <img src="https://img4.teletype.in/files/fe/28/fe289efc-35a7-45bd-9172-5600eee44877.png" width="1839" />
      <figcaption>Первичное преобразование .xml в Power BI</figcaption>
    </figure>
  </section>
  <p id="LJkj">Мы понимаем, что нужная информация лежит <em>внутри </em>иерархии и её необходимо достать/преобразовать в нужный нам табличный вид для последующей работы с данными. Жмём <strong>Преобразовать данные</strong></p>
  <h3 id="X2Qe">Настройка представления таблицы. Редактор Power Query</h3>
  <p id="jyjF">Попадаем в <a href="https://learn.microsoft.com/ru-ru/power-bi/transform-model/desktop-query-overview#power-query-editor" target="_blank">Редактор Power Query</a> для последующего преобразования и подготовки данных.</p>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="nd6M">Примечание:<a href="https://learn.microsoft.com/ru-ru/power-query/power-query-what-is-power-query" target="_blank"><br />Power Query</a> — это модуль преобразования данных и подсистемы подготовки данных. Power Query поставляется с графическим интерфейсом для получения данных из источников и редактора Power Query для применения преобразований. </p>
  </section>
  <p id="w22n">Теперь предстоит добраться до нужной информации и для этого мы <em>проваливаемся </em>внутри структуры до нужного уровня вложенности. В столбце <strong><em>batchtest </em></strong>нажимаем на значение ячейки <strong><em>Table</em></strong>, потом<strong><em> clashtests</em></strong> — <strong><em>Table</em></strong> и т.д., как в примере:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="J1wv" class="m_column">
      <img src="https://img2.teletype.in/files/58/fb/58fbc28c-48c0-4792-a1a7-cfda2964b311.gif" width="1935" />
      <figcaption>Проваливание внутри уровней</figcaption>
    </figure>
  </section>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="r7H0" class="m_column">
      <img src="https://img2.teletype.in/files/1f/53/1f53a629-2933-4aab-a2ed-3136887bcab3.gif" width="1009" />
      <figcaption>Проваливание внутри уровней —  крупнее</figcaption>
    </figure>
  </section>
  <p id="F2lc">Слева в поле <strong>Запросы </strong>видны наши источники данных, а в поле <strong>Параметры запроса </strong>вкладки <strong>Свойства </strong>и <strong>Применённые шаги</strong>, где мыможем откатиться назад (<em>на один или несколько уровней</em>) либо всё сбросить и вернуться к первоначальному виду.</p>
  <p id="Psuf">В новом табличном представлении уже видим столбцы <strong>Attribute:name</strong> и <strong>Attribute:tolerance </strong>со знакомыми названиями проверок на коллизии и их допусками, которые изначально формировали в Navisworks.</p>
  <p id="Ihbr">Далее, нужно извлечь из столбца <strong>summary </strong>вложенные значения с количеством найденных коллизий, а именно <strong>Attribute:total</strong> и изменить тип значений на <strong>Целое число</strong>, нажав <em>ПКМ </em>по заголовку столбца:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="Aup7" class="m_column">
      <img src="https://img1.teletype.in/files/43/1e/431e50c3-6b4b-42ec-a207-11a28ad89298.gif" width="1935" />
      <figcaption>Извлечение значений Attribute:total из summary</figcaption>
    </figure>
  </section>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="qJSh" class="m_column">
      <img src="https://img4.teletype.in/files/77/c4/77c428b2-61d1-45ef-94e2-d43926ad9e24.gif" width="919" />
      <figcaption>Извлечение значений Attribute:total из summary — крупнее</figcaption>
    </figure>
  </section>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="dd7J">Примечание:<br />В дальнейшем, если вы планируете <em>поставить на рельсы</em> процесс сбора проверок на коллизии, отслеживать изменения и статусы и выводить эти отчёты в Power BI, то процедура преобразования будет немного другая, потому нужны будут и другие статусы — <em><strong>new</strong></em>, <em><strong>active</strong></em>, <em><strong>reviewed </strong></em>и т.д.</p>
  </section>
  <p id="mAxm">Также следует <em>разбить </em>столбец <strong>Attribute:name</strong> на два, тем самым разделив левую часть проверки (<em>А</em>) и правую (<em>B</em>). Для последующего представления в матрице:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="unnv" class="m_original">
      <img src="https://img3.teletype.in/files/67/da/67da6b11-6083-4bbe-b90b-103d89bfbe67.jpeg" width="750" />
      <figcaption>Иллюстрация матрицы</figcaption>
    </figure>
  </section>
  <p id="IZKw">Для этого, в интерфейсе Редактора Power Query есть функция <strong>Разделить столбец</strong>. Поскольку в наименованиях моих проверок есть понятный разделить в виде символа - д<em>ефис</em>, то делить, я буду по нему (<em>у вас может быть другой</em>).</p>
  <p id="ycRq">Выделяем нужный столбец, кликнув на заголовок: <strong>Разделить столбец</strong> — <strong>по разделителю</strong> — выбираем знак в выпадающем списке, либо <em><strong>Пользовательский</strong></em>:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="aTE2" class="m_column">
      <img src="https://img4.teletype.in/files/37/69/37698edb-894f-43f2-a82d-fa1b51f8c877.png" width="1681" />
      <figcaption>Деление столбца по разделителю</figcaption>
    </figure>
  </section>
  <p id="MoJ3">В результате получится два столбца — <em>левая(А) </em>и <em>правая(B)</em> проверки. <strong>Attribute:name.1</strong> и <strong>Attribute:name.2</strong></p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="oqe7" class="m_column">
      <img src="https://img1.teletype.in/files/00/0c/000c1364-ed35-46a9-a7d3-9b64efaea7e9.png" width="1394" />
      <figcaption>Результат деления столбца Attribute:name</figcaption>
    </figure>
  </section>
  <p id="ZZA3">Жмём <strong>Закрыть и применить</strong> в верхнем левом углу и переходим к последнему шагу в части подготовки данных — группировка всех проверок в соответствующие разделы проектной документации: АР, КР, ОВ и т.д., чтобы выводить общие показатели по ним. </p>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="PfXk">Примечание:<br />Если вы формируете проверки в Navisworks по принципу &quot;<em>модель на модель</em>&quot; или &quot;<em>раздел на раздел</em>&quot;, а не разделяете их более подробно на наборы как в примере статьи, то следующий шаг по группировкам для вас может быть не актуален.</p>
  </section>
  <p id="m2ae">После того, как вышли из режима редактирования запроса, попадаем в главную рабочую область Power BI, которую рассмотрим чуть позже. В левой части окна есть три иконки: <strong>Представление отчёта</strong> (<em>область в который мы находимся сейчас</em>), <strong>Представление таблицы</strong> и <strong>Представление модели</strong>. </p>
  <p id="KtSe">Выбираем <strong>Представление таблицы</strong> и видим знакомую нам табличку, но уже без верхнеуровневых столбцов, в которые можно <em>провалиться</em>.</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="lz0K" class="m_column">
      <img src="https://img4.teletype.in/files/76/91/76915da0-7d51-4417-9be7-6db63e9a54c8.gif" width="1151" />
      <figcaption>Вкладка <strong>Представление таблиц</strong></figcaption>
    </figure>
  </section>
  <p id="V3hD">Выделяем первый столбец с заголовком <strong>Attribute:name.1</strong> и группируем его, нажимая на инструмент <strong>Группы данных</strong> — <strong>Создать группы данных</strong>. Тут немного ручной работы, но довольно быстрой и понятной. В окне <strong>Группы</strong> в левой колонке находятся <strong>Несгруппированные значения</strong>, которые необходимо сгруппировать, переместив в правую колонку и задав логическое имя группе. Алгоритм действий прост — выделяем через <em>SHIFT</em> все нужные наборы (<em>идентифицируя по префиксу в данном случае АИ.., АР.., ВК.., и т.д.</em>) жмём <strong>Группировать</strong>, два раза кликаем <em>ЛКМ </em>на сформированный заголовок группы, чтобы сразу переименовать в понятный раздел.</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="wQxI" class="m_column">
      <img src="https://img2.teletype.in/files/58/4a/584ab1f4-30b5-49d2-bddf-48b4ef94c228.gif" width="1507" />
      <figcaption>Группировка данных</figcaption>
    </figure>
  </section>
  <p id="Vjkj">Соответственно, таким же образом поступаем и со вторым столбцом <strong>Attribute:name.2.</strong> На выходе должны сформироваться два дополнительных столбца с постфиксом <strong><em>(группы)</em></strong> в конце таблицы.</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="21qt" class="m_column">
      <img src="https://img2.teletype.in/files/d5/b5/d5b58d70-ab77-4dc1-87be-84a3ee5d4d70.png" width="1864" />
      <figcaption>Результат группировки в виде дополнительных столбцов</figcaption>
    </figure>
  </section>
  <p id="c385">Именно этими значениями в дальнейшем мы будем оперировать и выводить на финальный отчёт в матрице коллизий. </p>
  <p id="y6iT">Переходим обратно в основную рабочую область — <strong>Представление отчёта</strong>.</p>
  <h3 id="kUqI">Рабочая область Power BI и подготовка отчёта</h3>
  <p id="BEwu">Вкратце опишу основные области, с которыми будем работать:</p>
  <ol id="sjXG">
    <li id="CmOw"><a href="https://learn.microsoft.com/ru-ru/power-bi/create-reports/desktop-report-view" target="_blank">Представление отчёта</a> или рабочая область с отчётами, уже знакомая вкладка — именно тут мы размещаем и компонуем наши графики, чарты и т.д., вследствие чего формируем финальные <a href="https://learn.microsoft.com/en-us/power-bi/create-reports/service-dashboards" target="_blank">Дашборды</a>.</li>
    <li id="G0i4"><a href="https://learn.microsoft.com/ru-ru/power-bi/visuals/power-bi-report-visualizations" target="_blank">Визуализация</a> — поле с преднастройками по типам отчётов, последующая визуальная постобработка и всё, что с этим связано.</li>
    <li id="saB6"><a href="https://learn.microsoft.com/en-us/power-bi/transform-model/desktop-field-list" target="_blank">Данные</a> — поле с источниками данных, в нашем случае преобразованная таблица с вложенным списком, по сути, столбцы.</li>
  </ol>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="5Cpn" class="m_column">
      <img src="https://img4.teletype.in/files/f5/78/f578829e-ee9c-4d8f-8179-e265f2c0a55e.png" width="1903" />
      <figcaption>Основные области для работы в Power BI</figcaption>
    </figure>
  </section>
  <p id="Vtnn">Теперь из области <strong>Данные</strong> выбираем нужные пункты (<em>столбцы с данными</em>) и уже видим, как формируется простая таблица. Далее выбираем визуальный элемент<em> — <strong>Матрица </strong></em>в поле <strong>Визуализации</strong> и получаем уже нужную нам матрицу коллизий. </p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="LAl8" class="m_column">
      <img src="https://img1.teletype.in/files/86/83/8683b0a7-1614-4462-809f-31ed8c861bec.gif" width="1903" />
      <figcaption>Формирование отчёта</figcaption>
    </figure>
  </section>
  <p id="UgL1">Сразу можно ещё скорректировать ячейку в верхнем левом углу. Сейчас там <strong>Attribute:name.1 (группы)</strong>, а мы хотим написать &quot;Раздел&quot;, для обозначения аббревиатур в заголовках вертикальной и горизонтальной линиях. Для этого в поле <strong>Визуализации </strong>под заголовком <strong><em>Строки </em></strong>наводим на плашку с именем <strong>Attribute:name.1 (группы)</strong> в область стрелки и в выпадающем списке выбираем <strong>&quot;</strong><em>Переименовать для этого визуального элемента</em>&quot;.</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="8Icp" class="m_column">
      <img src="https://img2.teletype.in/files/53/06/5306df86-c771-49fe-8b8b-0811d5be599f.gif" width="1902" />
      <figcaption>Переименование столбца со значениями</figcaption>
    </figure>
  </section>
  <p id="ZoLa">Осталось только поработать над визуальной частью и дополнительно, как вариант, добавить отчёт с установленными допусками проверок на коллизии между разделами.</p>
  <h3 id="46of">Финальная настройка визуально-интерактивной матрицы коллизий</h3>
  <p id="yifT">Выделяем отчёт и переходим на появившуюся вкладку <strong>Форматирование визуального элемента</strong> в поле <strong>Визуализации</strong>.</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="XGFx" class="m_column">
      <img src="https://img3.teletype.in/files/a4/a5/a4a5a960-7f98-4c8e-ab10-fa31dd886294.gif" width="1510" />
      <figcaption>Вкладка <em>— </em>Форматирование визуального элемента</figcaption>
    </figure>
  </section>
  <p id="o407">Детально рассматривать все настройки не буду, покажу несколько, в качестве примера, чтобы получить более менее приемлемый вид. </p>
  <ul id="NY0T">
    <li id="8CpL">Предустановка стилей <em>—</em> минимальный,</li>
    <li id="Ec4j">Можно добавить горизонтальные и вертикальные сетки и вывести их в белый цвет,</li>
    <li id="I0rj">Отцентрируем заголовки и значения в ячейках,</li>
    <li id="gwxw">Добавим цвет фона у ячеек со значениями,</li>
    <li id="Yopk">Немного увеличить строки в размере</li>
    <li id="9NjB">Выведем <strong>Подсказки </strong>во второй вкладке <strong>Общий</strong>, чтобы при наведении на любую ячейку всплывало окошко с дополнительной информацией,</li>
    <li id="xOLN">Добавить название таблицы с сопутствующими настройками,</li>
    <li id="Zsva">И так далее по вкусу.</li>
  </ul>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="P1yv" class="m_column">
      <img src="https://img1.teletype.in/files/8b/31/8b31080f-f090-4eda-9788-4a5906120c44.gif" width="1647" />
      <figcaption>Настройки по визуальной части в качестве примера</figcaption>
    </figure>
  </section>
  <p id="I5DP">Отдельно следует выделить плашку под названием <strong>Элементы ячейки</strong>, где имеет смысл применить параметры к цвету фона и закрашивать ячейки в зависимости от их значений. Тем самым визуально, сразу становится понятен проблемный и критический пул коллизий по количеству, касательно разделов.</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="Mnbo" class="m_column">
      <img src="https://img3.teletype.in/files/e1/d7/e1d73b49-4d68-4ac0-b52a-baa3113fe38a.gif" width="1647" />
      <figcaption>Применение параметров к элементам ячейки</figcaption>
    </figure>
  </section>
  <p id="aDaS">Разобраться с настройками визуальной части не составит большого труда, учитывая, что инструментарий тут достаточно топорный и не так много возможностей настройки стандартных визуальных элементов. Либо я не знаю многих нюансов и приёмов в прикладном плане, что больше походит на правду.</p>
  <p id="XkPn">По итогу, после ряда манипуляций получаем подобный результат:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="7mYo" class="m_column">
      <img src="https://img1.teletype.in/files/47/76/47763c96-7100-4e6e-b11d-d072dc2306f3.png" width="722" />
      <figcaption>Один из возможных примеров матрицы коллизий в PowerBI</figcaption>
    </figure>
  </section>
  <p id="jvD0">Таблицы интерактивные и мы можем взаимодействовать со строками, столбцами и ячейками, фокусируясь на них.</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="tym0" class="m_original">
      <img src="https://img2.teletype.in/files/52/9e/529ec6b3-d5ec-4de1-8da4-5d7cb5e92a05.gif" width="740" />
      <figcaption>Интерактивность таблицы и фокусировка</figcaption>
    </figure>
  </section>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="8c6n">Примечание:<br />В финальной таблице добавил недостающую проверку ЭОМ - ЭОМ и убрал нули, через применение параметров к цвету шрифта в области<strong> Элементы ячейки</strong>, вкладки <strong>Визуальный элемент</strong>.</p>
  </section>
  <p id="Rh5j">Для обновления данных перезаписываем отчёт <strong>.xml</strong> из Navisworks и обновляем в Power BI: вкладка <strong>Главная </strong>— поле <strong>Запросы </strong>— кнопка <strong>Обновить</strong>, таблица скорректируется, если были изменения.</p>
  <h2 id="vt4i"><strong>Заключение</strong></h2>
  <p id="gIHh">В статье рассмотрен относительно упрощённый пример формирования матрицы коллизий в <strong>Power BI</strong>. Если подключить дополнительные атрибуты при экспорте отчёта в <strong>XML </strong>из <strong>Navisworks</strong>, то можно пойти дальше и вести временную шкалу проверок, получать метрики по исправленным и добавленным коллизиям и т.д., но основная цель статьи — более подробно раскрыть процесс импорта и преобразования <strong>XML </strong>данных в <strong>Power BI</strong> для BIM-специалистов. Если остались вопросы — пишите.</p>
  <p id="ulbN">Спасибо за внимание.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@esteselkin/ifc-js</guid><link>https://teletype.in/@esteselkin/ifc-js?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=esteselkin</link><comments>https://teletype.in/@esteselkin/ifc-js?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=esteselkin#comments</comments><dc:creator>esteselkin</dc:creator><title>Создаём с нуля своё BIM-приложение для просмотра моделей IFC формата в браузере на основе open-source библиотеки IFC.js</title><pubDate>Mon, 04 Sep 2023 15:31:42 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/89/e3/89e34b6b-11db-4c22-bb6b-498f8a540ba2.png"></media:content><category>BIM Services</category><description><![CDATA[<img src="https://img1.teletype.in/files/c9/44/c944ba86-2fe8-4e0e-a9a9-111c22d1a387.png"></img>Приложение, о котором пойдёт речь, применимо в архитектурно-строительной области. С развитием информационных технологий, технологий строительства и производства, а также экономической составляющей, появилась необходимость в более эффективном и комплексном подходах в управлении инвестиционно-строительными проектами, что поспособствовало появлению и формированию ТИМ BIM-технологии.]]></description><content:encoded><![CDATA[
  <h2 id="q9t3">Введение</h2>
  <p id="fLON">Приложение, о котором пойдёт речь, применимо в архитектурно-строительной области. С развитием информационных технологий, технологий строительства и производства, а также экономической составляющей, появилась необходимость в более эффективном и комплексном подходах в управлении инвестиционно-строительными проектами, что поспособствовало появлению и формированию <s>ТИМ</s> <a href="https://ru.wikipedia.org/wiki/BIM#:~:text=BIM%20(%D0%B0%D0%BD%D0%B3%D0%BB.,%D0%B8%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85%20%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%20%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0." target="_blank">BIM-технологии</a>.</p>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <ul id="fReO">
      <li id="4B0W"><strong>BIM</strong> (<em>англ. Building Information Model или Информационное моделирование строительных объектов</em>) — это объектно-ориентированная модель строительного объекта, как правило, в трёхмерном представлении, элементы которой содержат данные геометрических, физических и функциональных характеристик будущего здания или сооружения.</li>
      <li id="z0lU"><strong>BIM-технология </strong>— организованный процесс, в результате которого формируется BIM-модель, отвечающая задачам и потребностям конкретной стадии жизненного цикла здания или сооружения.</li>
    </ul>
  </section>
  <p id="Y9K4">Основным популяризатором и разработчиком программ в области BIM, принято считать компанию <a href="https://www.autodesk.com/" target="_blank">Autodesk </a>с их приложениями для <strong>AEC </strong>(<em>Architecture, Engineering, and Construction</em>) индустрии — <a href="https://www.autodesk.com/products/revit" target="_blank">Revit</a>, <a href="https://www.autodesk.com/products/navisworks" target="_blank">Navisworks</a>, <a href="https://construction.autodesk.com/" target="_blank">ACC </a>(<em>Autodesk Construction Cloud, ex-<strong>BIM360</strong></em>) и др., но в последнее время, активно набирает обороты <a href="https://isicad.ru/ru/articles.php?article_num=21381" target="_blank">недовольство пользователей продуктов Autodesk</a>, аргументируя это стагнацией в части разработки нового полезного функционала и недоработки существующего, при этом явным повышением цен на программное обеспечение. Ещё одной проблемой, является замкнутая экосистема Autodesk и их закрытый формат данных (<em>Closed BIM</em>), работая с которым, ты ограничен в действиях и вынужден оставаться в контуре Autodesk. На примере Revit и <a href="https://aps.autodesk.com/" target="_blank">Autodesk Platform Services</a>, ex-<strong>Forge</strong>.</p>
  <p id="lbZW">По мере развития BIM-технологии и нежеланием быть зависимым от больших корпораций, свою популярность приобрела концепция <a href="https://www.buildingsmart.org/about/openbim/" target="_blank">OpenBIM</a> и сопутствующий ей <a href="https://ru.wikipedia.org/wiki/Industry_Foundation_Classes" target="_blank">IFC</a> формат.</p>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <ul id="TKA8">
      <li id="0UvW"><strong>Open BIM</strong> — подход к объединению проектов зданий и сооружений в согласованную модель. Методология, позволяющая участникам проектирования коммуницировать, невзирая на используемое программное обеспечение.</li>
      <li id="xvGM"><strong>IFC</strong> (<em>Industry Foundation Classes</em>) — открытый стандарт для формата представления данных BIM. Формат файлов разработан <a href="https://www.buildingsmart.org/" target="_blank">buildingSMART </a><em>(International Alliance for Interoperability, IAI</em>) для упрощения взаимодействия в строительной сфере и приведению к <em>общему знаменателю</em>.</li>
    </ul>
  </section>
  <p id="g92J">С тенденцией перехода сервисов в облачные решения, начали появляться <a href="https://en.wikipedia.org/wiki/Open_source#:~:text=Open%20source%20is%20source%20code,model%20that%20encourages%20open%20collaboration." target="_blank">open-source</a> библиотеки или бесплатные программы по работе с BIM-моделями в web, такие, как <a href="https://xeokit.io/" target="_blank">xeokit</a>, <a href="https://ifcquery.com/" target="_blank">IFC++</a>, <a href="http://ifcopenshell.org/" target="_blank">IfcOpenShell</a> и др., а соответственно и BIM-стартапы, преследующие цели <strong>OpenBIM </strong>или закрывающие конкретные задачи. Одну из таких библиотек мы и рассмотрим, развернув на её основе простое BIM-решение для просмотра модели IFC формата.</p>
  <h2 id="a9P5">Библиотека IFC.js</h2>
  <p id="Wlm5"><a href="https://ifcjs.github.io/info/" target="_blank">IFC.js</a> — это библиотека JavaScript для работы с моделями IFC в браузере. Она полностью бесплатная и распространяется по свободной лицензии MIT.</p>
  <figure id="qDKn" class="m_column">
    <img src="https://img1.teletype.in/files/c9/44/c944ba86-2fe8-4e0e-a9a9-111c22d1a387.png" width="933" />
    <figcaption>IFC.js</figcaption>
  </figure>
  <p id="xmWt">Идейным создателем и одним из разработчиков библиотеки <strong>IFC.js</strong>, является <a href="https://es.linkedin.com/in/antonio-gonz%C3%A1lez-viegas-8b2326151" target="_blank">Antonio González Viegas</a> — BIM software developer. И в качестве предпосылки для создания этого open-source решения и его описания, приведу вольный перевод с его слов:</p>
  <blockquote id="HN1l">Сектор <strong>AEC</strong> традиционно был рынком нескольких богатых ресурсами игроков. Крупные компании годами создавали свои собственные продукты: миллионы строк кода, решающие проблемы и в конечном итоге составляют приложения для реализации BIM и которые мы знаем из повседневной жизни.<br /><br />Проблема в этой ситуации заключается в том, что новым разработчикам и компаниям очень трудно предлагать свои идеи и конкурировать на равных условиях на этом рынке. И получается, что доступ к &quot;высшей лиге&quot; имеют те, кто может себе это позволить.<br /><br />Это не относится к таким секторам, как видеоигры, где существует множество инструментов и технологий (<em>видеоигровых движков</em>), которые позволяют любому создать продукт высокого уровня с минимальными затратами времени и ресурсов. Было бы здорово иметь то же самое в секторе <strong>AEC</strong>?<br /><br />Вот почему мы запустили <strong>IFC.js</strong>. Вместо того чтобы создавать решение для реализации технологии BIM и продавать его как продукт, мы делаем его свободно доступным, чтобы каждый мог создавать свои собственные BIM-продукты высокого уровня. Таким образом, мы все можем конкурировать на рынке программного обеспечения с одним и тем же инструментом, где каждый может предложить свои идеи по улучшению. <br /><br /><strong>IFC.js</strong> — молодой проект, который развивается и растет с каждым днем. Наша цель — позволить каждому разрабатывать программное обеспечение BIM с такой же легкостью, с какой разрабатываются видеоигры. <strong>IFC.js</strong> бесплатен, у него нет владельца, и любой может использовать его или участвовать в проекте.</blockquote>
  <p id="yHQF">Как вы уже возможно поняли, преследуется концепция <strong>Open BIM</strong>, противопоставляя решение тяжеловесным и закрытым проприетарным программам. <strong>IFC.js</strong> даёт возможность BIM-специалистам или разработчикам из других сфер создавать свои <strong>собственные BIM-решения</strong>, решающие их бизнес-задачи внутри компаний или же создавать свои коммерческие BIM-стартапы. В этом плане, лицензия <strong>IFC.js</strong> даёт полную свободу действий. Библиотека предназначена для всех, кто хочет разрабатывать BIM-приложения, будь то разработчики, создающие сервисы для строительной отрасли, так и архитекторы совместно с другими специалистами.</p>
  <h3 id="gA0b">Структура IFC.js</h3>
  <p id="xVfo">В связи с тем, что <strong>IFC.js</strong> большая, мульти-язычная библиотека (<em>C++, TypeScript JavaScript и т.д.</em>) и держать её в одном репозитории было бы сложно и громоздко, её разбили на три основные части:</p>
  <ul id="V6JB">
    <li id="djGq"><a href="https://github.com/IFCjs/web-ifc" target="_blank">web-ifc</a> — ядро библиотеки: IFC парсер, написанный с нуля на языке C и скомпилирован через <a href="https://emscripten.org/" target="_blank">Emscripten </a>в <a href="https://webassembly.org/" target="_blank">WebAssembly</a>. Этот репозиторий инкапсулирует сложность чтения файлов IFC и загрузки их данных в память. <a href="http://xn--%20-%20https-rck4byd4brd//ifcjs.github.io/web-ifc/demo/" target="_blank">Demo</a></li>
  </ul>
  <figure id="DD69" class="m_column">
    <img src="https://img4.teletype.in/files/b6/fb/b6fbb54d-2b06-4161-ad53-e3ac33c7725a.png" width="2560" />
    <figcaption>web-ifc</figcaption>
  </figure>
  <ul id="gVR7">
    <li id="yPey"><a href="https://github.com/IFCjs/web-ifc-three" target="_blank">web-ifc-three</a> — эта библиотека адаптирует web-ifc к <a href="https://threejs.org" target="_blank">Three.js</a>, создавая оптимизированную 3D-сцену, в которой пользователи могут напрямую взаимодействовать с IFC. Эта библиотека является официальным IFC загрузчиком в Three.js. Благодаря этому, приложения BIM можно создавать с помощью Three.js всего за пару строк кода. <a href="https://ifcjs.github.io/web-ifc-three/example/" target="_blank">Demo</a></li>
  </ul>
  <figure id="m8LG" class="m_column">
    <img src="https://img3.teletype.in/files/2c/a7/2ca7f347-6dbc-490d-81d0-83353e9e1173.gif" width="2560" />
    <figcaption>web-ifc-three</figcaption>
  </figure>
  <ul id="Oq4o">
    <li id="1m5I"><a href="https://github.com/IFCjs/web-ifc-viewer" target="_blank">web-ifc-viewer</a> — это решение для просмотра IFC в браузере со множеством примеров того, что можно сделать с помощью <strong>IFC.js</strong>. Навигация по сценам, изменение материалов, выбор элементов по нажатию на них, планы разрезов и т. д. В этом <a href="https://github.com/IFCjs/web-ifc-viewer" target="_blank">репозитории</a> есть пример всех этих функций, поэтому его можно повторно использовать в открытых приложениях BIM из коробки. <a href="https://ifcjs.github.io/web-ifc-viewer/example/index" target="_blank">Demo</a></li>
  </ul>
  <figure id="0ezT" class="m_column">
    <img src="https://img2.teletype.in/files/d8/7b/d87bf71f-69a5-40fd-92b9-2d6f79e24e66.gif" width="2560" />
    <figcaption>web-ifc-viewer</figcaption>
  </figure>
  <p id="nHsy">Каждая последующая часть зависит от предыдущей, в такой последовательности: <strong>web-ifc</strong> — <strong>web-ifc-three</strong> — <strong>web-ifc-viewer</strong></p>
  <h3 id="obychenie">Обучение</h3>
  <p id="wfxs">На данный момент, проводятся два курса <a href="https://courses.ifcjs.io/?_gl=1*8cx4fx*_ga*MzU1NTM0Mjk3LjE2ODUwOTY5MTY.*_ga_8KJ1XPV561*MTY5MTE1NjA1MC40LjEuMTY5MTE1NjA1OC4wLjAuMA.." target="_blank">IFC.js crash course и Advanced BIM frontend course</a> по работе с их библиотекой в web. Курс <a href="https://opencollective.com/ifcjs/projects/ifcjs-crash-course/contribute/crash-course-44166" target="_blank">IFC.js crach cource</a>, как заявляет создатель, подходит для начального уровня и обучение ведётся с нуля, но под конец, как по мне, без хорошей базы в программировании будет тяжеловато.</p>
  <h3 id="programma_podderjki">Программа поддержки</h3>
  <p id="chfX">В целях ускорения разработки проекта, а так же его улучшения — команда <strong>IFC.js </strong>реализовала <a href="https://bounties.ifcjs.io/" target="_blank">программу поддержки</a>, где даёт возможность заработать сообществу, принося свой вклад в проект. Если вкратце, то формируются <a href="https://airtable.com/embed/shrD7oOspTUpElFX9/tblKwrKdBmdTG2L3I?backgroundColor=orange&viewControls=on" target="_blank">карточки с разного рода заданиями</a>, например исправление бага или реализации инструментов, таких как проверка на коллизии, формирование планов, разрезов и т.д.</p>
  <h2 id="6vDq">Разработка BIM-сервиса для просмотра IFC формата</h2>
  <p id="tHBK">Создание BIM-приложения с <strong>IFC.js</strong> довольно простое, как указано на сайте с <a href="https://ifcjs.github.io/info/docs/Hello%20world" target="_blank">документацией</a>. Последующий урок взят оттуда в качестве вольного перевода, с некоторыми сокращениями, отклонениями и комментариями. Развёрнутое демо-приложение находиться <a href="https://ifcjs.github.io/hello-world/examples/web-ifc-three/helloworld/" target="_blank">тут</a>. Для выполнения следующих шагов необходим <a href="https://nodejs.org/ru" target="_blank">Node.js</a> и любая <a href="https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8" target="_blank">IDE</a>, но в статье я буду использовать <a href="https://code.visualstudio.com/" target="_blank">VS Code</a> в качестве среды разработки и расширение <a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.live-server" target="_blank">Live Preview</a> в части локального сервера, не разворачивая Node.js. И если у вас нет файлов IFC, вы можете их скачать <a href="https://github.com/IFCjs/test-ifc-files" target="_blank">отсюда</a>.</p>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="lLhT">Для работы с IFC.js требуются базовые знания веб-разработки (<em>HTML, CSS, JavaScript</em>) и библиотеки Three.js</p>
  </section>
  <h3 id="Sx4Y">Установка библиотек</h3>
  <p id="FjVm">Вначале, создаём пустую папку и запускаем менеджер пакетов<strong> <a href="https://www.npmjs.com/" target="_blank">npm</a> </strong>с помощью команды <code>npm init</code>. Будет создан файл <code>package.json</code>, содержащий некоторые данные, такие как имя проекта, версия, описание, команды и зависимости. </p>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="QxPP">Все вышеперечисленные свойства можно сразу заполнить, либо прожав <code>Enter</code> и использовать значения по умолчанию.</p>
    <figure id="JLPz" class="m_original">
      <img src="https://img2.teletype.in/files/de/66/de66ad79-b2a3-4793-aca6-3bb445541a43.gif" width="1280" />
      <figcaption>Инициализация проекта</figcaption>
    </figure>
  </section>
  <p id="J2aA">Кроме того, при помощи <strong>npm </strong>необходимо установить следующие зависимости: модуль <strong>web-ifc-three</strong> (<em>с ним ставится и Three.js</em>), входящий в <strong>IFC.js</strong> и <a href="https://rollupjs.org/" target="_blank">rollup.js</a> в качестве сборщика проекта для JavaScript.</p>
  <pre id="mIq0" data-lang="shell">    //Install IFC.js
    npm i web-ifc-three

    // Install a bundler: we will use rollup.js for this guide
    npm i rollup --save-dev
    npm i @rollup/plugin-node-resolve --save-dev</pre>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="FeSt">Сразу можно проверить наличие в <code>package.json</code> файле свойство <code>&quot;type&quot;: &quot;module&quot;</code> и добавить его, если оно отсутствует.</p>
    <figure id="L1xR" class="m_original">
      <img src="https://img2.teletype.in/files/1e/26/1e261e31-6290-4f3d-9561-365129c6ca23.png" width="495" />
      <figcaption>Структура файла <code>package.json</code></figcaption>
    </figure>
  </section>
  <p id="kqPL">Следующим шагом, будет создание HTML файла с именем<code>index.html</code> в качестве основного документа приложения. HTML будет иметь:</p>
  <ul id="SECi">
    <li id="zzQ5"><strong>canvas </strong>элемент, используемый для рендеринга сцены Three.js;</li>
    <li id="JrdO"><strong>input </strong>элемент, который будет открывать файлы IFC с нашего компьютера в приложении.</li>
    <li id="noFo">Тэг <strong>script</strong>, ссылающийся на файл <code>bundle.js</code>, представляющий собой сборку приложения, которую мы создадим дальше с помощью <strong>rollup</strong>.</li>
  </ul>
  <pre id="YLyz" data-lang="html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;/&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;/&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;/&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;styles.css&quot;/&gt;
    &lt;title&gt;Document&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;input type=&quot;file&quot; name=&quot;load&quot; id=&quot;file-input&quot;/&gt;
    &lt;canvas id=&quot;three-canvas&quot;&gt;&lt;/canvas&gt;
    &lt;script src=&quot;bundle.js&quot;&gt;&lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre>
  <h3 id="CryV"></h3>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="6FkD">Для удобства импорта нашей будущей IFC-модели для тэга <code>&lt;input&gt;</code> можно добавить атрибут <code>accept=&quot;.ifc&quot;</code> и видеть только файлы с расширением <code>.ifc</code> в директории, откуда загружаем модель.</p>
  </section>
  <h3 id="0n6e">Добавление стилей</h3>
  <p id="QAZe">Создаём CSS файл <code>styles.css</code>, где произведём <a href="https://habr.com/ru/articles/45296/" target="_blank">сброс стилей</a>, сделаем наш <strong>canvas</strong> на весь экран и зададим свойства нашей будущей кнопки для загрузки IFC-модели:</p>
  <pre id="kln4" data-lang="css">* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html,
body {
  overflow: hidden;
}

#three-canvas {
  position: fixed;
  top: 0;
  left: 0;
  outline: none;
}

#file-input {
  z-index: 1;
  position: absolute;
}</pre>
  <h3 id="v5Kz">Сборка проекта</h3>
  <p id="Iv3c">Далее, создадим файл конфигурации с именем <code>rollup.config.js</code>, который будет включать в себя ссылки на ранее установленные дополнения.</p>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="BOSO"><strong>Rollup </strong>— популярная библиотека пакетов. К примеру, это сборщик, используемый Three.js. Чтобы узнать больше, ознакомьтесь с <a href="https://rollupjs.org/introduction/" target="_blank">документацией</a>.</p>
  </section>
  <pre id="1zoT" data-lang="javascript">import resolve from &quot;@rollup/plugin-node-resolve&quot;;

export default {
  input: &quot;app.js&quot;,
  output: [
    {
      format: &quot;esm&quot;,
      file: &quot;bundle.js&quot;,
    },
  ],
  plugins: [resolve()],
};</pre>
  <p id="dmj0">Также, в файле <code>package.json</code> изменим команды в области <code>scripts</code> для удобного управления <em>объединением/сборки</em> проекта. В каждой команде необходимо указать относительный путь к файлу конфигурации <strong>rollup</strong>.</p>
  <ul id="zyvg">
    <li id="VnST"><code>npm run build</code> объединит проект и создаст файл с именем <code>bundle.js</code> в корневом каталоге проекта.</li>
    <li id="b4gI"><code>npm run watch</code> активирует режим просмотра, автоматически обновляя этот файл каждый раз, когда мы вносим и сохраняем изменения в код.</li>
  </ul>
  <pre id="WtLV" data-lang="javascript">{
  &quot;name&quot;: &quot;example&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;description&quot;: &quot;-&quot;,
  &quot;main&quot;: &quot;app.js&quot;,
  &quot;scripts&quot;: {
    &quot;build&quot;: &quot;rollup -c ./rollup.config.js&quot;,
    &quot;watch&quot;: &quot;rollup -w -c ./rollup.config.js&quot;
  },
  &quot;author&quot;: &quot;&quot;,
  &quot;license&quot;: &quot;ISC&quot;,
  &quot;devDependencies&quot;: {
    &quot;@rollup/plugin-node-resolve&quot;: &quot;^11.2.1&quot;,
    &quot;rollup&quot;: &quot;^2.45.2&quot;
  },
  &quot;dependencies&quot;: {
    &quot;three&quot;: &quot;^0.128.0&quot;,
    &quot;web-ifc-three&quot;: &quot;0.0.102&quot;
  }
}</pre>
  <h3 id="NM2A">WebAssembly</h3>
  <p id="2zUn">Далее, необходимо скопировать файл <code>web-ifc.wasm</code> в директорию проекта. Найти его можно по пути <em>node_modules\web-ifc</em> и <em>с</em>копировать куда угодно, впоследствии указав на него путь, но в примере он будет размещен в корне проекта.</p>
  <figure id="9WUo" class="m_column">
    <img src="https://img2.teletype.in/files/d4/47/d4476b70-78ef-4133-9cc7-163da17f9226.png" width="271" />
    <figcaption>Копирование файла web-ifc.wasm</figcaption>
  </figure>
  <p id="2w8a">Этот файл необходим, так как содержит скомпилированную C++ логику модуля <strong>web-ifc</strong>, являющемся ядром <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7" target="_blank">парсинга</a> для чтения и записи IFC файлов.</p>
  <h3 id="jnLe">Создание и настройка 3D сцены</h3>
  <p id="Ceaa">Наконец, мы создадим JavaScript файл для нашего приложения. Разместить его можно где-угодно и задать произвольно имя, главное отразить это в файле <code>rollup.config.js</code>. В примере это будет <code>app.js</code> в корне проекта.</p>
  <p id="sMqQ">Базовая 3D-сцена Three.js</p>
  <pre id="czHC" data-lang="javascript">import { AmbientLight, AxesHelper, DirectionalLight, GridHelper, PerspectiveCamera, Scene, WebGLRenderer } from &quot;three&quot;;
import { OrbitControls } from &quot;three/examples/jsm/controls/OrbitControls.js&quot;;

//Creates the Three.js scene
const scene = new Scene();

//Object to store the size of the viewport
const size = {
  width: window.innerWidth,
  height: window.innerHeight,
};

//Creates the camera (point of view of the user)
const aspect = size.width / size.height;
const camera = new PerspectiveCamera(75, aspect);
camera.position.z = 15;
camera.position.y = 13;
camera.position.x = 8;

//Creates the lights of the scene
const lightColor = 0xffffff;

const ambientLight = new AmbientLight(lightColor, 0.5);
scene.add(ambientLight);

const directionalLight = new DirectionalLight(lightColor, 1);
directionalLight.position.set(0, 10, 0);
directionalLight.target.position.set(-5, 0, 0);
scene.add(directionalLight);
scene.add(directionalLight.target);

//Sets up the renderer, fetching the canvas of the HTML
const threeCanvas = document.getElementById(&quot;three-canvas&quot;);
const renderer = new WebGLRenderer({
  canvas: threeCanvas,
  alpha: true,
});

renderer.setSize(size.width, size.height);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));

//Creates grids and axes in the scene
const grid = new GridHelper(50, 30);
scene.add(grid);

const axes = new AxesHelper();
axes.material.depthTest = false;
axes.renderOrder = 1;
scene.add(axes);

//Creates the orbit controls (to navigate the scene)
const controls = new OrbitControls(camera, threeCanvas);
controls.enableDamping = true;
controls.target.set(-2, 0, 0);

//Animation loop
const animate = () =&gt; {
  controls.update();
  renderer.render(scene, camera);
  requestAnimationFrame(animate);
};

animate();

//Adjust the viewport to the size of the browser
window.addEventListener(&quot;resize&quot;, () =&gt; {
  size.width = window.innerWidth;
  size.height = window.innerHeight;
  camera.aspect = size.width / size.height;
  camera.updateProjectionMatrix();
  renderer.setSize(size.width, size.height);
});</pre>
  <h3 id="JH5m">Загрузка IFC файлов</h3>
  <p id="WgFZ">В завершении мы будем использовать <strong>IFC.js</strong> для загрузки IFC файлов. Создадим экземпляр загрузчика и событие, когда пользователь загружает IFC файл с помощью элемента ввода <code>&lt;input&gt;</code></p>
  <pre id="jukQ" data-lang="javascript">import { IFCLoader } from &quot;web-ifc-three/IFCLoader&quot;;

// Sets up the IFC loading
const ifcLoader = new IFCLoader();

const input = document.getElementById(&quot;file-input&quot;);
input.addEventListener(
  &quot;change&quot;,
  (changed) =&gt; {
    const file = changed.target.files[0];
    var ifcURL = URL.createObjectURL(file);
    ifcLoader.load(ifcURL, (ifcModel) =&gt; scene.add(ifcModel));
  },
  false
);</pre>
  <p id="yxfS">Готовый app.js файл будет так:</p>
  <pre id="0DIv" data-lang="javascript">import {
  AmbientLight,
  AxesHelper,
  DirectionalLight,
  GridHelper,
  PerspectiveCamera,
  Scene,
  WebGLRenderer,
} from &quot;three&quot;;
import { OrbitControls } from &quot;three/examples/jsm/controls/OrbitControls.js&quot;;
import { IFCLoader } from &quot;web-ifc-three/IFCLoader&quot;;


//Creates the Three.js scene
const scene = new Scene();

//Object to store the size of the viewport
const size = {
  width: window.innerWidth,
  height: window.innerHeight,
};

//Creates the camera (point of view of the user)
const aspect = size.width / size.height;
const camera = new PerspectiveCamera(75, aspect);
camera.position.z = 15;
camera.position.y = 13;
camera.position.x = 8;

//Creates the lights of the scene
const lightColor = 0xffffff;

const ambientLight = new AmbientLight(lightColor, 0.5);
scene.add(ambientLight);

const directionalLight = new DirectionalLight(lightColor, 1);
directionalLight.position.set(0, 10, 0);
directionalLight.target.position.set(-5, 0, 0);
scene.add(directionalLight);
scene.add(directionalLight.target);

//Sets up the renderer, fetching the canvas of the HTML
const threeCanvas = document.getElementById(&quot;three-canvas&quot;);
const renderer = new WebGLRenderer({
  canvas: threeCanvas,
  alpha: true,
});

renderer.setSize(size.width, size.height);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));

//Creates grids and axes in the scene
const grid = new GridHelper(50, 30);
scene.add(grid);

const axes = new AxesHelper();
axes.material.depthTest = false;
axes.renderOrder = 1;
scene.add(axes);

//Creates the orbit controls (to navigate the scene)
const controls = new OrbitControls(camera, threeCanvas);
controls.enableDamping = true;
controls.target.set(-2, 0, 0);

//Animation loop
const animate = () =&gt; {
  controls.update();
  renderer.render(scene, camera);
  requestAnimationFrame(animate);
};

animate();

//Adjust the viewport to the size of the browser
window.addEventListener(&quot;resize&quot;, () =&gt; {
  size.width = window.innerWidth;
  size.height = window.innerHeight;
  camera.aspect = size.width / size.height;
  camera.updateProjectionMatrix();
  renderer.setSize(size.width, size.height);
});

// Sets up the IFC loading
const ifcLoader = new IFCLoader();

const input = document.getElementById(&quot;file-input&quot;);
input.addEventListener(
  &quot;change&quot;,
  (changed) =&gt; {
    const file = changed.target.files[0];
    var ifcURL = URL.createObjectURL(file);
    ifcLoader.load(ifcURL, (ifcModel) =&gt; scene.add(ifcModel));
  },
  false
);tURL(file);
    ifcLoader.load(ifcURL, (ifcModel) =&gt; scene.add(ifcModel));
  },
  false
);</pre>
  <p id="g4Rw">И если всё настроенное корректно, то после вызова команды <code>npm run build</code> мы можем собрать и запустить наше приложение, запустив расширение <strong>Live Preview</strong>, которое мы устанавливали ранее, с адресом <a href="http://127.0.0.1:3000" target="_blank">http://127.0.0.1:3000</a> в браузере или открыть <code>index.html</code> в папке проекта.</p>
  <figure id="rOyM" class="m_column">
    <img src="https://img1.teletype.in/files/ce/d3/ced3ff2c-64c4-4024-9b9e-b40e8a8a795c.gif" width="1405" />
    <figcaption>Сборка и запуск приложения</figcaption>
  </figure>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="6JiR" class="m_16x9">
      <iframe src="https://ifcjs.github.io/hello-world/examples/web-ifc-three/helloworld/"></iframe>
      <figcaption>Финальный результат. Можете загрузить свою IFC-модель</figcaption>
    </figure>
  </section>
  <figure id="pEmW" class="m_16x9">
    <iframe src="https://ifcjs.github.io/ifcjs-crash-course/exercises/WIV/hello-world/"></iframe>
    <figcaption>В качестве примера — простая модель с пометками и атрибутивной информацией элементов.</figcaption>
  </figure>
  <h2 id="RUjf">Заключение</h2>
  <p id="JLZ6">Библиотека <strong>IFC.js</strong> действительно молодой проект и развивается довольно быстро, но уже сейчас даёт возможность реализовывать полноценные BIM-приложения. В связи с последними тенденциями и активным интересом в сторону подхода <strong>Open BIM</strong> — <strong>IFC.js</strong> прокладывает отличный путь для развития сервисов в строительной индустрии. Вокруг проекта уже сформировалось значительное комьюнити к которому можно присоединиться в <a href="https://discord.com/invite/D79ZSGtt" target="_blank">Discord</a>. </p>
  <p id="y5Da">20-ого сентября состоится <a href="https://thatopen.com/" target="_blank">масштабное мероприятие</a> проекта <strong>IFC.js</strong> с множеством новостей, улучшением и заменой некоторых компонентов библиотеки, а также многое другое.</p>
  <h3 id="HiNm">P.S. </h3>
  <p id="R9lE">Я старался максимально сократить и упростить вводную часть, в том числе с определениями и понятиями, на сколько смог. Возможно, некоторые моменты могут быть не до конца понятными или раскрытыми. В свою очередь, я старался сделать акцент больше на технической части, но при этом добавив контекста для читателей не из архитектурно-строительной сферы.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@esteselkin/arcol</guid><link>https://teletype.in/@esteselkin/arcol?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=esteselkin</link><comments>https://teletype.in/@esteselkin/arcol?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=esteselkin#comments</comments><dc:creator>esteselkin</dc:creator><title>Arcol — Figma для Архитекторов. Обзор нового BIM-стартапа — SketchUp и Revit в браузере.</title><pubDate>Tue, 22 Aug 2023 13:32:12 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/24/35/2435a074-f3c7-4292-9bce-37625d627eee.png"></media:content><category>BIM Services</category><description><![CDATA[<img src="https://img1.teletype.in/files/01/67/0167c7ce-9ed5-4801-8c87-8ad68d45a4aa.png"></img>Arcol.io — облачный веб-сервис для концептуального проектирования и формирования чертежей, созданный специально для архитекторов.]]></description><content:encoded><![CDATA[
  <p id="2ii3"><a href="https://www.arcol.io/" target="_blank">Arcol.io</a> — облачный веб-сервис для концептуального проектирования и формирования чертежей, созданный специально для архитекторов.</p>
  <figure id="2Kr6" class="m_column">
    <img src="https://img1.teletype.in/files/01/67/0167c7ce-9ed5-4801-8c87-8ad68d45a4aa.png" width="1800" />
    <figcaption>Cover</figcaption>
  </figure>
  <p id="UkEc">За развитием <strong>Arcol </strong>я слежу уже относительно давно. Примерно год назад записался в лист ожидания, а в этом месяце вышла публичная beta-версия.</p>
  <p id="9Mu0">Основной целью команды является переосмысление процессов проектирования и объединение разных ПО (<em>Miro, Bluebeam, Sketchup, Revit и д. р.</em>) в единый сервис для совместной работы над проектом. И судя по <a href="https://medium.com/@PaulO_Carroll/collaboration-in-aec-adbb90193594" target="_blank">манифесту </a>основателя сервиса, Arcol пытается воссоздать Revit в облачном исполнении, но более простой и удобный в использовании. Не зря UX/UI-дизайн взят за основу из популярной программы для дизайнеров — <a href="https://figma.com/" target="_blank">Figma</a></p>
  <figure id="WNP4" class="m_column">
    <img src="https://img3.teletype.in/files/6c/32/6c320e73-781f-496f-b1a4-7a467bd871ca.png" width="1800" />
    <figcaption>Интерфейс и рабочее окно Arcol</figcaption>
  </figure>
  <h2 id="interfeiis">Интерфейс</h2>
  <p id="813l">По структуре интерфейс максимально схож с Figma или аналогом Figma в 3D — <a href="https://spline.design/" target="_blank">Spline</a></p>
  <figure id="bYLp" class="m_column">
    <img src="https://img4.teletype.in/files/f8/87/f8878a56-1859-4ca2-ba11-e2478100728e.png" width="1800" />
    <figcaption>Интерфейс Arcol</figcaption>
  </figure>
  <h3 id="mEzV">Основные области интерфейса:</h3>
  <ol id="U8Bw">
    <li id="Ge1F"><strong>Панель инструментов</strong> — делится на вкладки <strong>Design </strong>и <strong>Construct</strong>. В первом случае работа с эскизными линиями и поверхностями, которые в последствии можно выдавливать инструментом <strong>Push/Pull</strong>. Во вкладке <strong>Construct</strong> присутствуют уже более привычные инструменты для 3D-проектирования — <em>Стены</em>, <em>Двери </em>и <em>Окна</em></li>
    <li id="49fT"><strong>Диспетчер проекта</strong> с разбивкой на <strong>Виды </strong>(<em>Viewes - создание планов, фасадов и т.д.</em>) и <strong>Доски </strong>(<em>Boards - формирование листов с видами</em>)</li>
    <li id="87iv"><strong>Структура проекта</strong> с разбивкой по уровням и вложенности элементов модели</li>
    <li id="MYmU"><strong>Панель свойств и параметров</strong> где также находится панель со <strong>Слоями</strong> (<em>Layers</em>)</li>
  </ol>
  <figure id="EE5u" class="m_column">
    <img src="https://img4.teletype.in/files/7c/1a/7c1aba91-bfc6-46fe-b3ae-0966a0e051ed.gif" width="1800" />
    <figcaption>Создание стен, дверей и окон</figcaption>
  </figure>
  <h2 id="kommynikaciya_i_sovmestnaya_rabota">Коммуникация и совместная работа</h2>
  <p id="6VYe">В <strong>Arcol </strong>можно оставлять комментарии прямо внутри проекта и вести реестр всех замечаний. В режиме реального времени видно курсоры коллег, работающие совместно с вами над проектом.</p>
  <figure id="cjd1" class="m_column">
    <img src="https://img1.teletype.in/files/84/05/8405e32c-2d14-4706-8e07-031825223e78.gif" width="1800" />
  </figure>
  <h2 id="rejim_markup">Режим Markup</h2>
  <p id="7aFA">Режим Markup — некий симбиоз <a href="https://www.figma.com/figjam/team-collaboration/" target="_blank">Figma Jam</a> и <a href="https://miro.com/" target="_blank">Miro</a>. В режиме Markup можно рисовать и оставлять всяческие аннотации поверх проекта. После чего формируется реестр с видами и пометками для дальнейшей коммуникации среди участников проекта</p>
  <figure id="gorA" class="m_column">
    <img src="https://img1.teletype.in/files/49/f0/49f0d6c5-a80b-4277-8614-65b4737fb2a4.gif" width="1800" />
    <figcaption>Режим Markup</figcaption>
  </figure>
  <h2 id="geopozicionirovanie_i_kontekst">Геопозиционирование и контекст</h2>
  <p id="UBkd">В <strong>Arcol </strong>есть возможность выбрать адрес и размер границы участка (<em>по умолчанию 500м</em>) подгрузить его и автоматически получить объём окружающей застройки.</p>
  <figure id="X01H" class="m_column">
    <img src="https://img4.teletype.in/files/ff/a6/ffa60885-4f79-4370-802e-b367fd2ab8b5.gif" width="1200" />
    <figcaption>Геопозиционирование и формирование окружающей застройки</figcaption>
  </figure>
  <h2 id="formirovanie_listov">Формирование листов</h2>
  <p id="gA6j">В диспетчере проекта в поле <strong>Boards </strong>создаются чертёжные листы с видами проекта.</p>
  <figure id="6o9T" class="m_column">
    <img src="https://img2.teletype.in/files/d0/26/d026ec5b-13c7-450a-806a-0ed145bfc745.gif" width="1800" />
    <figcaption>Формирование чертёжных видов</figcaption>
  </figure>
  <h2 id="v_zaklyuchenii">В заключении</h2>
  <p id="Skyu">С остальными функциями и возможностями можно ознакомится на практике или изучив документацию <a href="https://docs.arcol.io/" target="_blank">https://docs.arcol.io/</a></p>
  <p id="4Ux2">На данный момент продукт ещё сыроват и полноценно программу для 3D-проектирования пока не заменяет, но сам проект уже весьма интересный, по крайней мере как идея, и многообещающий. Остаётся пожелать только успехов в развитии! А мы со своей стороны будем пристально следить за релизами и обновлениями.</p>

]]></content:encoded></item></channel></rss>