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

时间:2019-06-25 07:46:45

标签: asp.net autodesk-forge revit autodesk-model-derivative

我正在创建一个使用Autodesk Forge-模型衍生API将revit模型转换为IFC文件格式的解决方案。该API向我提供了一个具有转换后的模型层次结构的JSON文件,以及一个包含所有单独的对象及其属性的JSON文件。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

无法按照您希望的方式从Model Derivative API获取XYZ数据。

我还要说的是,如果您希望转换为 IFC ,则在Model Derivative API中已经有针对该转换的服务。但是,如果您确实需要自定义文件格式,请按以下方法获取XYZ。

尽管您可以考虑其他两个选项。

  • 一种是使用Design Automation for Revit API。您将能够创建一个Addin,从无头的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!');
    }
  }

访问查看器后,下面是一些代码,您可以通过我成功使用的dbId获取一个或多个元素的边界框。

/**
   * 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;
  }

从此THound.Box3对象的BoundingBox中,可以获得有关元素的XYZ信息。另外,这里有使用“片段”的代码,如果您需要定义的XYZ更有用,则可以更具体地获得不同的元素几何。