Мне нужно получить размеры из файла IFC с помощью Autodesk Forge, чтобы я мог рассчитать площадь, массу и другие свойства здания (этаж здания). Это возможно с Autodesk Forge?
К сожалению, Forge Viewer преобразует любое поддерживаемое геометрическое представление в основанное на Mesh, как я знаю, поэтому вы не смогли получить какую-либо достоверную информацию из фрагментов Forge Viewer.
Если ваша необработанная исходная модель взята из любого поддерживаемого программного обеспечения BIM, каждый элемент в файле IFC должен иметь свойства, содержащие данные о площади, массе и ярусе здания (уровне), и вы можете прочитать эти свойства через API-интерфейсы Viewer:
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. Вот это блог, показывающий, как получить доступ к сетке, и его ключевое содержание показано ниже. Эти коды используются для восстановления отношения треугольной сетки из уплощающих массивов:
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
Основные понятия этой демонстрации:
Других решений пока нет …