鍍金池/ 問答/云計(jì)算  網(wǎng)絡(luò)安全  HTML/ 請問如何在 Forge Viewer 里獲取2D構(gòu)件的包圍匡(bounding

請問如何在 Forge Viewer 里獲取2D構(gòu)件的包圍匡(bounding box)?

您好,我在獲取2D圖紙構(gòu)件的包圍框遇到的困難,我試了通過 GetNodeBox()API來獲取包圍框,但它回傳的值都是 0,但這個(gè)方法在 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

請問有沒有其他方法可以做到我們想要的結(jié)果呢?

回答
編輯回答
妖妖

獲取 2D 圖紙構(gòu)件包圍框的方法跟 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 );
2017年1月15日 11:48