【问题标题】:Is there a way to extract the XYZ geometry data from a converted Revit model?有没有办法从转换后的 Revit 模型中提取 XYZ 几何数据?
【发布时间】:2019-11-07 00:08:17
【问题描述】:

我正在创建一个使用 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 步中,您可以看到我拥有的数据(每个对象的属性)。

【问题讨论】:

  • 您想要 ICF?还是说国际金融公司?
  • 对不起,我是说国际金融公司!已编辑。
  • 因此您可以使用模型导数(PostJob Endpoint)直接翻译到 IFC。有“转换为 OBJ”的教程,您几乎可以更改 OBJ -> IFC。你试过吗?
  • 我已经这样做了!我使用模型衍生 API 检索模型的层次结构和属性。也许我没有说得太清楚,但我的意思是在我的问题的第一句话中说明这一点。我的问题的主要部分是从模型的对象中检索 XYZ 坐标,因为属性不包含它们。
  • 哦,好的,我明白了。我不认为你可以通过 Model Derivative API 获得对象的 XYZ 坐标(虽然不是 100% 肯定)。您可以在使用 GeometryGymIFC 等 IFC API 库进行翻译后查看 IFC 文件。也许有人会插话,可以提供更多帮助!

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


【解决方案1】:

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

我还要说,如果您希望转换为 IFC,Model Derivative API 中已经有一个转换服务。但是,如果您真的需要自定义文件格式,下面是获取 XYZ 的方法。

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

  • 一,是使用Design Automation for Revit API。您将能够制作一个插件,从无头 Revit 环境中提取所需数据。
  • 另一种选择是启动无头 Forge Viewer 并从那里获取模型的 XYZ 数据。

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

var viewerApp; 变量选项 = { 环境:“欧特克生产”, 访问令牌:'' };

  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 更有用,则可以让您更具体地获得不同的元素几何形状。

【讨论】:

  • 我不确定是否可以将其用于我自己的目的,因为我正在为我的项目创建一个 ASP.NET 核心 API。所以我需要能够在 C# 中检索 XYZ 坐标,我认为我不能在这种情况下使用 Autodesk Viewer 或 ThreeJS。
猜你喜欢
  • 2021-12-29
  • 2017-07-07
  • 2023-01-02
  • 2022-01-18
  • 2019-08-23
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多