Получить данные геометрии (размеры) из файла IFC с помощью Autodesk Forge

Мне нужно получить размеры из файла IFC с помощью Autodesk Forge, чтобы я мог рассчитать площадь, массу и другие свойства здания (этаж здания). Это возможно с Autodesk Forge?

1

Решение

К сожалению, 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

Фильтр уровня forge-rcdb

Его исходный код помещен здесь: https://github.com/Autodesk-Forge/forge-rcdb.nodejs/tree/master/src/client/viewer.components/Viewer.Extensions.Dynamic/Viewing.Extension.LevelFilter

Основные понятия этой демонстрации:

  1. Коллекция элементов пола после загрузки всех геометрий.
  2. Получить трансформированные ограничивающие коробки собранных полов.
  3. Перестройте иерархию уровней (диапазоны высот каждого этажа) из их преобразованных ограничивающих рамок.
  4. Установите плоскости среза с соответствующими значениями диапазона высот целевого этажа.
2

Другие решения

Других решений пока нет …