无法在IOS UIWebView Forge查看器中获取2D元素的边界框

时间:2018-01-15 14:10:06

标签: javascript ios autodesk-forge forge

我使用下面的代码来获取2D元素的边界框。

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;
}


var model = this.viewer.model; 
 var modelData = model.getData();
 var itree = modelData.instanceTree;
itree.enumNodeChildren(itree.getRootId(), function (dbId) {   
// Here you go
cosnt bondingBox = get2DBounds( dbId, viewer.model );

}

此代码在浏览器中正确显示,并为2D元素获取正确的边界框。 但是当我尝试通过IOS在浏览器中执行此代码时,我没有获得2D元素的边界框。

通过IOS使用上述代码的过程: - 在IOS中设计UIWebView - 嵌入html页面 - 将上面的java脚本代码嵌入到html页面中 - 获取2D工作表的所有元素ID。 - 为使用上述代码的人获取边界框。

观察到所有2D实体的边界框都是无穷大。

请告诉我这些方法有什么问题?

1 个答案:

答案 0 :(得分:0)

这可能是查看器内部API的问题。我在我们的内部案例系统中记录了LMV-3154请求,让我们的工程团队分配时间进行调查。可能需要时间来弄清楚发生了什么。您可以将请求ID发送到forge.help@autodesk.com以跟踪将来的更新。

对由此造成的任何不便表示歉意。

<强>更新

LMV-3154的修复程序自v4.2.2发布以来,这是更新的代码。使用此修补程序,您必须将use2dInstancing传递给VertexBufferReader以避免iOS上的无限边界问题。

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

function get2DBounds( dbId, model, useInstancing ) {
    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, useInstancing, bc );
        }
    } else if( typeof fragIds === 'number' ) {
        find2DBounds( fragList, fragIds, dbId, useInstancing, bc );
    }

    return bc.bounds;
}

let use2dInstancing = viewer.impl.use2dInstancing;
// Here you go
let bondingBox = get2DBounds( 5314, viewer.model, use2dInstancing );