使用 Autodesk Forge 从 IFC 文件获取几何数据(尺寸)

Get geometry data (dimensions) from an IFC file using Autodesk Forge

我需要使用 Autodesk Forge 从 IFC 文件中获取尺寸,以便计算建筑(建筑楼层)的面积、质量和其他属性。 Autodesk Forge 可以做到这一点吗?

不幸的是,据我所知,Forge Viewer 会将任何支持的几何表示转换为基于网格的表示,因此您无法从 Forge Viewer 片段中获得任何可靠信息。

如果您的原始源模型来自任何受支持的 BIM 软件,则 IFC 文件中的每个元素都应具有包含面积、质量和建筑物楼层(级别)数据的属性,您可以通过查看器 API 读取这些属性:

  • viewer.search(text, onSuccessCallback, onErrorCallback, attributeNames)
  • viewer.model.getBulkProperties(dbIds, options, onSuccessCallback, onErrorCallback)

这些API的组合用法:

viewer.search('Steel', 
    function( dbIds ){
       viewer.model.getBulkProperties(dbIds, ['Mass'],
       function(elements){
         var totalMass = 0;
         for(var i=0; i<elements.length; i++){
           totalMass += elements[i].properties[0].displayValue;
         }
         console.log(totalMass);
       })
    }, null, ['Material'])

然而,

您可以通过访问 Forge Viewer 片段的网格数据来计算面积、体积和质量。 Here是一篇介绍如何访问mesh的博客,主要内容如下。这些代码用于从展平数组重建三角形网格的关系:

var fragProxy = viewer.impl.getFragmentProxy(
  viewer.model,
  fragId);

var renderProxy = viewer.impl.getRenderProxy(
  viewer.model,
  fragId);

fragProxy.updateAnimTransform();

var matrix = new THREE.Matrix4();
fragProxy.getWorldMatrix(matrix);

var geometry = renderProxy.geometry;

var attributes = geometry.attributes;

var vA = new THREE.Vector3();
var vB = new THREE.Vector3();
var vC = new THREE.Vector3();

if (attributes.index !== undefined) {

  var indices = attributes.index.array || geometry.ib;
  var positions = geometry.vb ? geometry.vb : attributes.position.array;
  var stride = geometry.vb ? geometry.vbstride : 3;
  var offsets = geometry.offsets;

  if (!offsets || offsets.length === 0) {

    offsets = [{start: 0, count: indices.length, index: 0}];
  }

  for (var oi = 0, ol = offsets.length; oi < ol; ++oi) {

    var start = offsets[oi].start;
    var count = offsets[oi].count;
    var index = offsets[oi].index;

    for (var i = start, il = start + count; i < il; i += 3) {

      var a = index + indices[i];
      var b = index + indices[i + 1];
      var c = index + indices[i + 2];

      vA.fromArray(positions, a * stride);
      vB.fromArray(positions, b * stride);
      vC.fromArray(positions, c * stride);

      vA.applyMatrix4(matrix);
      vB.applyMatrix4(matrix);
      vC.applyMatrix4(matrix);
    }
  }
} else {

  var positions = geometry.vb ? geometry.vb : attributes.position.array;
  var stride = geometry.vb ? geometry.vbstride : 3;

  for (var i = 0, j = 0, il = positions.length; i < il; i += 3, j += 9) 
  {

    var a = i;
    var b = i + 1;
    var c = i + 2;

    vA.fromArray(positions, a * stride);
    vB.fromArray(positions, b * stride);
    vC.fromArray(positions, c * stride);

    vA.applyMatrix4(matrix);
    vB.applyMatrix4(matrix);
    vC.applyMatrix4(matrix);
  }
}

此外,

有一个很棒的演示展示了如何按建筑楼层拆分模型(级别:https://forge-rcdb.autodesk.io/configurator?id=5a7185a92a0a7aeb152725d5

它的源代码放在这里:https://github.com/Autodesk-Forge/forge-rcdb.nodejs/tree/master/src/client/viewer.components/Viewer.Extensions.Dynamic/Viewing.Extension.LevelFilter

这个演示的主要概念是:

  1. 加载所有几何图形后的 Collection Floor 元素。
  2. 获取已收集楼层的变换边界框。
  3. 从变换后的边界框重建层次结构(每层的高度范围)。
  4. 根据目标楼层的相应高程范围值设置剖切面。