是否有一种方法可以从转换后的Revit模型中提取XYZ几何数据



我正在创建一个解决方案,该解决方案将修订模型转换为IFC文件格式,使用Autodesk Forge -Model derivative API。此API递给我一个带有转换模型层次结构的JSON文件,以及一个带有所有独立对象及其属性的JSON文件。

转换模型后,我需要分析模型部分的特定属性。但是,并非我需要的所有信息都存储在对象的属性中。我还需要使用对象的XYZ坐标来获得真实的结果,但我相信模型导数API不会生成XYZ数据。

我已经搜索了对象的所有属性,以查看与其他对象相比,它们是否包含有关其位置的任何类型的数据,但它们不包含该信息。我搜索了其他方法来从修订中提取几何形状/坐标,但还没有找到真正的解决方案。

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

在本教程的步骤5中,您可以看到我拥有的数据(每个对象的属性(。

无法按照您希望的方式从模型导数API获取XYZ数据。

我还会说,如果您想转换为 ifc ,则在模型派生式API中已经有一个转换服务。但是,如果您确实需要自定义文件格式,则可以在下面获得XYZ。

您可以考虑其他两个选择。

  • 一个是将设计自动化用于修订API。您将能够制作一个从无头修订环境中提取所需数据的附加内容。
  • 另一个选择是启动无头锻造查看器并从那里获取模型的XYZ数据。

无头查看器是您可以查看的查看器API文档中的一个教程。这是该代码(v6(供参考。

var ViewerApp;var选项= {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;
  }

从这个边界箱,即三个box3对象,您可以获取有关元素的一些XYZ信息。另外,这里有"片段"的代码,可以使您更具体地获得不同的元素几何形状,如果您需要定义的XYZ更有用。

最新更新