请问如何在 Forge Viewer 里获取2D构件的包围匡(bounding box)?

您好,我在获取2D图纸构件的包围框遇到的困难,我试了通过 GetNodeBox()API来获取包围框,但它回传的值都是 0,但这个方法在 3D 模型是没有问题的。下面是我们使用的部份代码:

var model = this.viewer.model;    
var it = model.getData().instanceTree;
var tmpBox = new Float32Array(6);

it.enumNodeChildren(it.getRootId(), function (dbId) {                
    console.log("Node ID" + dbId);
    it.getNodeBox(dbId, tmpBox);
}, true);

console.log( tmpBox ); //!<< 这里输出是 0,0,0,0,0,0

请问有没有其他方法可以做到我们想要的结果呢?

阅读 3.5k
1 个回答

获取 2D 图纸构件包围框的方法跟 3D 模型的不太一样,下面是样例(从 Viewer3D.js 里头截取来的):

function find2DBounds( fragList, fragId, dbId, bc ) {
    const mesh = fragList.getVizmesh( fragId );
    const vbr = new Autodesk.Viewing.Private.VertexBufferReader( mesh.geometry );
    vbr.enumGeomsForObject( dbId, bc );
}

function get2DBounds( dbId, model ) {
    const it = model.getData().instanceTree;
    const fragList = model.getFragmentList();

    let bounds = new THREE.Box3();
    let bc = new Autodesk.Viewing.Private.BoundsCallback( bounds );
    const dbId2fragId = model.getData().fragments.dbId2fragId;
    const fragIds = dbId2fragId[dbId];

    if( Array.isArray( fragIds ) ) {
        for( let i = 0; i < fragIds.length; i++ ) {
            find2DBounds( fragList, fragIds[i], dbId, bc );
        }
    } else if( typeof fragIds === 'number' ) {
        find2DBounds( fragList, fragIds, dbId, bc );
    }

    return bc.bounds;
}

// 包围匡
cosnt bondingBox = get2DBounds( dbId, viewer.model );
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题