如何获取Model Viewer中可见对象的dbId?
获取Forge Viewer中仅可见对象的dbId
以下是能准确获取当前可见对象dbId的方法,解决你遇到的现有方案失效问题:
问题根源
之前的方案存在两个核心缺陷:
- 未考虑**隔离(isolate)**操作的影响:使用
viewer.isolate()隐藏的节点不会被getHiddenNodes()捕获,但实际这些节点是不可见的。 - 忽略了父节点隐藏的继承性:如果父节点被隐藏,子节点即使未被直接隐藏,也会处于不可见状态,但这类子节点不会出现在
getHiddenNodes()列表中。
解决方案代码
function getVisibleDbIds(viewer) { const instanceTree = viewer.model.getData().instanceTree; const allDbIds = []; // 枚举模型中所有节点的dbId instanceTree.enumNodeChildren(instanceTree.getRootId(), dbId => { allDbIds.push(dbId); }, true); const hiddenNodes = viewer.getHiddenNodes(); const isolatedNodes = viewer.getIsolatedNodes(); return allDbIds.filter(dbId => { // 1. 排除自身被直接隐藏的节点 if (hiddenNodes.includes(dbId)) { return false; } // 2. 排除父节点被隐藏的节点(继承不可见) let parentId = instanceTree.getParentId(dbId); while (parentId) { if (hiddenNodes.includes(parentId)) { return false; } parentId = instanceTree.getParentId(parentId); } // 3. 如果有隔离操作,仅保留被隔离的节点 if (isolatedNodes.length > 0 && !isolatedNodes.includes(dbId)) { return false; } return true; }); }
使用说明
调用该函数时传入当前Viewer实例,即可返回所有当前可见对象的dbId列表:
const visibleDbIds = getVisibleDbIds(viewer); console.log(visibleDbIds);
这个方法覆盖了直接隐藏、父节点继承隐藏、隔离操作三种导致节点不可见的场景,能准确筛选出真正在视图中可见的对象。
内容的提问来源于stack exchange,提问作者Gustavo da Costa e Silva
相关产品推荐
相关产品推荐

