Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 是否有方法从转换后的Revit模型中提取XYZ几何图形数据?_Asp.net_Autodesk Forge_Revit_Autodesk Model Derivative - Fatal编程技术网

Asp.net 是否有方法从转换后的Revit模型中提取XYZ几何图形数据?

Asp.net 是否有方法从转换后的Revit模型中提取XYZ几何图形数据?,asp.net,autodesk-forge,revit,autodesk-model-derivative,Asp.net,Autodesk Forge,Revit,Autodesk Model Derivative,我正在创建一个解决方案,使用Autodesk Forge-model Derivative API将revit模型转换为IFC文件格式。这个API提供给我一个JSON文件,其中包含转换模型的层次结构,以及一个JSON文件,其中包含所有单独的对象及其属性 转换模型后,我需要分析模型部分的特定属性。但并不是我需要的所有信息都存储在对象的属性中。我还需要使用对象的XYZ坐标来获得实际结果,但我相信模型派生API不会生成XYZ数据 我已经搜索了对象的所有属性,以查看它们是否包含与其他对象相比的有关其位置

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

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

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


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

无法按照您希望的方式从模型派生API中获取XYZ数据

我还想说,如果您希望转换为IFC,那么在模型衍生API中已经有了转换服务。但如果您真的需要自定义文件格式,下面是如何获得XYZ

有两个选项,尽管你可以考虑。

  • 一是使用Revit API的设计自动化。您可以创建一个加载项,从无头Revit环境中提取所需的数据
  • 另一个选项是启动headless Forge Viewer并从中获取模型的XYZ数据
headless viewer是查看器API文档中的一个教程,您可以查看它。以下是来自it(v6)的代码,以供参考

var-viewerApp; 变量选项={ 环境:“AutodeskProduction”, accessToken:“” };

var documentId='urn:';
Autodesk.Viewing.Initializer(选项,初始化);
函数初始化(){
viewerApp=新的Autodesk.Viewing.ViewingApplication(“MyViewerDiv”);
viewerApp.registerViewer(viewerApp.k3D,Autodesk.Viewing.Viewer3D);
viewerApp.loadDocument(documentId,onDocumentLoaded);
}
已加载文档的函数(lmvDoc){
var modelNodes=viewerApp.bubble.search(av.BubbleNode.MODEL_NODE);//三维设计
var sheetNodes=viewerApp.bubble.search(av.BubbleNode.SHEET_节点);//二维设计
var allNodes=modelNodes.concat(sheetNodes);
if(allNodes.length){
viewerApp.selectItem(所有节点[0]。数据);
if(allNodes.length==1){
警报('本教程最适用于具有多个可视对象的文档!');
}
}否则{
警报('提供的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;
  }
/**
*使用dbId元素片段构建元素的边界框
*@param{Array}dbIds要查找边界框的元素的dbIds
*@return{THREE.Box3}dbId元素边界框
*/
getBoundingBox(dbIds){
const totalBox=new THREE.Box3();
dbIds.forEach((dbId)=>{
const fragBox=new THREE.Box3();
常数fragIds=[];
const instanceTree=viewer3D.model.getInstanceTree();
instanceTree.enumNodeFragments(dbId,函数(fragId){
弗雷吉德推(弗雷吉德);
});
const fragList=viewer3D.model.getFragmentList();
forEach(函数(fragId){
fragList.getWorldBounds(fragId,fragBox);
totalBox.union(fragBox);
});
});
返回totalBox;
}

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

您想要ICF吗?或者你是说IFC?对不起,我是说IFC!编辑它。所以您可以使用modelderivative(作业后端点)直接转换为IFC。这里有“翻译成OBJ”的教程,你几乎可以更改OBJ->IFC。你试过了吗?我已经试过了!我使用模型派生API检索模型的层次结构和属性。也许我没有说得太清楚,但我想在问题的第一句话中说明这一点。我的问题的主要部分是从模型的对象中检索XYZ坐标,因为属性不包含它们。我不认为您可以通过模型派生API获得这样的对象的XYZ坐标(尽管不是100%确定)。您可以在使用诸如GeometryGymIFC之类的IFC API库对IFC文件进行转换后再阅读它。也许有人会插话,可以帮上更多的忙!我不确定是否可以将其用于我自己的目的,因为我正在为我的项目创建一个ASP.NET核心API。因此,我需要能够检索C#中的XYZ坐标,并且我不认为我可以在该上下文中使用Autodesk Viewer或ThreeJS。
/**
   * 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;
  }