Как получить местоположения модели из 2D-вида с помощью Autodesk Forge API? - PullRequest
0 голосов
/ 29 января 2019

Я могу получить местоположения с ограничивающим прямоугольником в 3D-виде, но не могу получить правильные местоположения в 2D-виде.

Код для получения ограничивающего прямоугольника следующий.

После получения ограничивающего прямоугольникаЯ вычисляю и получаю центральную точку коробки.Когда я использую этот код для 2D-вида, импортированного из Revit, я получаю неправильное значение.

Как правильно определить местоположение 2D-объекта?

static getWorldBoundingBox(model, dbId) {
  return new Promise(async (resolve, reject) => {
    try {
      var fragIds = await ViewerToolkit.getFragIds(model, dbId);
      if (!fragIds.length) {
        return reject('No geometry, invalid dbId?');
      }
      var fragList = model.getFragmentList();
      var fragbBox = new THREE.Box3();
      var nodebBox = new THREE.Box3();
      fragIds.forEach(function(fragId) {
        fragList.getWorldBounds(fragId, fragbBox);
        nodebBox.union(fragbBox);
      });
      return resolve(nodebBox);
    } catch (ex) {
      return reject(ex);
    }
  });
}

1 Ответ

0 голосов
/ 29 января 2019

Если вы ссылаетесь на исходный код viewer.impl.fitToView(), есть пара функций, которые он использует для вычисления ограничивающих рамок, вот часть кода:

function getObjectBound2D(viewer, objectId) {
var model = viewer.model;
// This doesn't guarantee that an object tree will be created but it will be pretty likely
var bounds, bc, i;
if (model.is2d()) {
    bounds = new THREE.Box3();
    // move this next one up into the calling method
    bc = new avp.BoundsCallback(bounds);

    var dbId2fragId = model.getData().fragments.dbId2fragId;

    var fragIds = dbId2fragId[objectId];
    // fragId is either a single vertex buffer or an array of vertex buffers
    if (Array.isArray(fragIds)) {
        for (var j = 0; j < fragIds.length; j++) {
            // go through each vertex buffer, looking for the object id
            find2DBounds(model, fragIds[j], objectId, bc);
        }
    } else if (typeof fragIds === 'number') {
        // go through the specific vertex buffer, looking for the object id
        find2DBounds(model, fragIds, objectId, bc);
    }

    // should have some real box at this point; check
    if (!bounds.empty()) {
        return bounds;
    }
}

function find2DBounds(model, fragId, dbId, bc) {
    var mesh = model.getFragmentList().getVizmesh(fragId);
    var vbr = new avp.VertexBufferReader(mesh.geometry);
    vbr.enumGeomsForObject(dbId, bc);
}

function find2DLayerBounds(model, fragId, bc) {
    var mesh = model.getFragmentList().getVizmesh(fragId);
    var vbr = new avp.VertexBufferReader(mesh.geometry);
    var visibleLayerIds = that.getVisibleLayerIds();
    vbr.enumGeomsForVisibleLayer(visibleLayerIds, bc);
}
...