Есть ли способ извлечь данные геометрии XYZ из преобразованной модели Revit? - PullRequest
0 голосов
/ 25 июня 2019

Я создаю решение, которое преобразует модель Revit в формат файла IFC с использованием Autodesk Forge - Model Derivative API. Этот API передает мне файл JSON с иерархией преобразованной модели и файл JSON со всеми отдельными объектами и их свойствами.

После конвертации модели мне нужно проанализировать конкретные свойства из частей модели. Но не вся необходимая мне информация хранится в свойствах объектов. Мне также нужно использовать XYZ-координаты объектов, чтобы получить реальные результаты, но я считаю, что производный API модели не генерирует XYZ-данные.

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

https://forge.autodesk.com/en/docs/model-derivative/v2/tutorials/extract-metadata-from-source-file/

На шаге 5 этого урока вы можете увидеть данные, которые у меня есть (свойства каждого объекта).

1 Ответ

1 голос
/ 25 июня 2019

Невозможно получить данные XYZ из API-интерфейса "Производное модели" так, как вы ожидаете.

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

Есть еще два варианта, которые вы можете рассмотреть.

  • Во-первых, это использовать Automation Design для Revit API. Вы сможете создать надстройку, которая извлекает необходимые данные из безголовой среды Revit.
  • Другой вариант - запустить приложение Forge Viewer без головы и получить оттуда данные XYZ модели.

Безголовый зритель - это учебное руководство в документации Viewer API, которое вы можете просмотреть. Вот код из этого (v6) для справки.

var viewerApp; var options = { env: 'AutodeskProduction', accessToken: '' };

  var documentId = 'urn:<YOUR_URN_ID>';
  Autodesk.Viewing.Initializer(options, onInitialized);

  function onInitialized() {
    viewerApp = new Autodesk.Viewing.ViewingApplication('MyViewerDiv');
    viewerApp.registerViewer(viewerApp.k3D, Autodesk.Viewing.Viewer3D);
    viewerApp.loadDocument(documentId, onDocumentLoaded);
  }

  function onDocumentLoaded(lmvDoc) {
    var modelNodes = viewerApp.bubble.search(av.BubbleNode.MODEL_NODE); // 3D designs
    var sheetNodes = viewerApp.bubble.search(av.BubbleNode.SHEET_NODE); // 2D designs
    var allNodes = modelNodes.concat(sheetNodes);
    if (allNodes.length) {
      viewerApp.selectItem(allNodes[0].data);
      if (allNodes.length === 1){
        alert('This tutorial works best with documents with more than one viewable!');
      }
    } else {
      alert('There are no viewables for the provided URN!');
    }
  }

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

/**
   * Uses dbId element fragments to build boundingbox of element
   * @param {Array<number>} dbIds dbIds of element to find boundingBox
   * @return {THREE.Box3} dbId elements bounding box
   */
  getBoundingBox(dbIds) {
    const totalBox = new THREE.Box3();
    dbIds.forEach((dbId) => {
      const fragBox = new THREE.Box3();
      const fragIds = [];
      const instanceTree = viewer3D.model.getInstanceTree();
      instanceTree.enumNodeFragments(dbId, function(fragId) {
        fragIds.push(fragId);
      });
      const fragList = viewer3D.model.getFragmentList();
      fragIds.forEach(function(fragId) {
        fragList.getWorldBounds(fragId, fragBox);
        totalBox.union(fragBox);
      });
    });
    return totalBox;
  }

Из этого BoundingBox, который является объектом THREE.Box3, вы можете получить некоторую XYZ-информацию об элементах. Кроме того, здесь есть код, использующий «фрагменты», который позволит вам более конкретно получить различную геометрию элемента, если это более полезно для XYZ, который вам нужно определить.

...