Получить данные геометрии (размеры) из файла IFC с помощью Autodesk Forge - PullRequest
0 голосов
/ 14 мая 2018

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

1 Ответ

0 голосов
/ 16 мая 2018

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

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

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

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