使用 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
这个演示的主要概念是:
- 加载所有几何图形后的 Collection Floor 元素。
- 获取已收集楼层的变换边界框。
- 从变换后的边界框重建层次结构(每层的高度范围)。
- 根据目标楼层的相应高程范围值设置剖切面。
我需要使用 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
这个演示的主要概念是:
- 加载所有几何图形后的 Collection Floor 元素。
- 获取已收集楼层的变换边界框。
- 从变换后的边界框重建层次结构(每层的高度范围)。
- 根据目标楼层的相应高程范围值设置剖切面。