Forge Viewer加载Zip关联模型时fitToView与getBoundingBox异常
Forge Viewer聚合模型fitToView失效及dbId异常问题
环境
- Forge Viewer v7.115.0(基于THREE.WebGLRenderer 71)
- 模型:Zip包上传的Revit关联模型(根模型+链接模型)
viewer.getAllModels()返回1个聚合模型
问题
调用viewer.utilities.getBoundingBox(false)时,不同对象返回完全相同的全模型边界框,而非单个对象的边界:
- 对象dbId 12515:min(-18.39, -18.09, -7.28),max(18.39, 18.09, 7.28)
- 对象dbId 12513:min(-18.39, -18.09, -7.28),max(18.39, 18.09, 7.28)
导致调用fitToView()时无法缩放到目标对象,始终定位到全模型范围。
已尝试方案
- 结合选择调用边界框与缩放:
var boundingBox = viewer.utilities.getBoundingBox(false); viewer.navigation.fitBounds(true, boundingBox);
结果:所有对象返回相同的全模型边界框
- 检查实例树中dbId是否存在:
var tree = model.getInstanceTree(); var nodeExists = tree.nodeAccess.dbIdToIndex[dbId] !== undefined;
结果:nodeExists = false——选中的dbId不在实例树中
- 枚举对象片段:
tree.enumNodeFragments(dbId, function(fragId) { ... }, true);
结果:回调未执行,未找到任何片段
- 遍历所有模型:
var allModels = viewer.getAllModels(); // 返回1个模型
结果:检查该聚合模型,dbId仍不在其实例树中
- 直接调用
fitToView():
viewer.fitToView(dbIds, model);
结果:无法正确缩放到单个对象
观察结果
- 对象可正常选中,出现在
viewer.getSelection()结果中 - 选中对象的GUID各不相同
viewer.getSelection()返回的dbId看似正确,但这些dbId不存在于model.getInstanceTree().nodeAccess.dbIdToIndex中- 模型片段列表可用,但
enumNodeFragments()无结果
疑问
- 为何选中的dbId不存在于模型实例树中?
- 如何获取Zip上传的关联/聚合模型中单个对象的正确边界框?
- 是否有其他API可解决该场景下的边界框获取问题?
- 该问题是否需要在模型转换阶段修复?
更新:关联模型的dbId差异
代码执行时获取的dbId [12515]:
{ "dbId": [12515], "properties": [], "externalId": "b8dbee8b-ebcc-47f4-b313-b0253be8aac5-00275887" }
Viewer中选中对象后调用getProperties()获取的dbId [12516]:
{ "dbId": [12516], "properties": [], "externalId": "4f59b7db-1832-40c1-9ab9-c16952cd6d07-0027a560/b8dbee8b-ebcc-47f4-b313-b0253be8aac5-00275887" }
使用dbId 12516可正常与Viewer对象交互,但12515不行。注意12515的externalId与12516的externalId后半部分完全匹配。
内容的提问来源于stack exchange,提问作者Sean Fitz
相关产品推荐
相关产品推荐

