我使用下面的代码来获取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实体的边界框都是无穷大。
请告诉我这些方法有什么问题?
答案 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 );