К сожалению, 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
Основными концепциями этой демонстрации являются:
- Сбор элементов пола после загрузки всех геометрий.
- Получение преобразованных ограничивающих рамок собранных полов.
- Перестроить иерархию уровней (диапазоны высот каждого этажа) из их преобразованных ограничивающих рамок.
- Установить плоскости сечения с соответствующими значениями диапазонов высот целевого этажа.