【问题标题】:How can I get locations of model from 2D view with Autodesk Forge API?如何使用 Autodesk Forge API 从 2D 视图中获取模型的位置?
【发布时间】:2019-01-29 20:12:22
【问题描述】:

我可以在 3D 视图中获取带边界框的位置,但在 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);
    }
  });
}

【问题讨论】:

    标签: autodesk-forge


    【解决方案1】:

    如果您参考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);
    }
    

    【讨论】:

    • 感谢您的信赖。我得到了对象的正确位置!
    猜你喜欢
    • 2018-01-29
    • 1970-01-01
    • 2017-08-14
    • 2020-04-10
    • 2021-04-29
    • 2020-03-09
    • 2021-02-21
    • 2020-06-07
    • 2020-11-18
    相关资源
    最近更新 更多