Forge Viewer仅显示部分元素求助:禁用父元素显示子元素默认行为
Disable Default Parent-Child Visibility Behavior in Autodesk Viewer
Problem Context
我基于IFC实现了一套复杂的模型元素过滤逻辑,示例的元素层级如下:
ID IfcType Description -------------------------------------------------------- 1 IfcFooting Base 2 > IfcBuildingElementPart Insulation 3 > IfcBuildingElementPart Reinforced Concrete
这个过滤逻辑会筛选出包含子元素「Reinforced Concrete」的IfcFooting元素,最终返回ID 1和3。但当我用以下代码在Viewer中展示过滤结果时:
viewer3d.impl.visibilityManager.hide(rootId, model); $.each(selection, function (k, v) { viewer3d.impl.visibilityManager.show(v, model); });
调用show显示ID 1时,Viewer会默认把ID 1、2、3都显示出来。我需要关掉这个默认行为——只显示子元素3,但又不能从过滤结果里去掉ID 1,该怎么处理?
Solution
嘿,这个问题我之前也踩过坑!Viewer的visibilityManager默认就是会递归处理目标元素的所有子元素,不过有两种靠谱的方法能实现你的需求:
1. 用setNodeVisibility单独控制元素(推荐)
Viewer的底层API提供了setNodeVisibility方法,它可以单独设置某一个节点的可见性,不会触发父子元素的递归变更。你可以这么修改代码:
// 先隐藏所有元素 viewer3d.impl.visibilityManager.hide(rootId, model); // 遍历过滤结果,只处理需要显示的元素 $.each(selection, function (k, v) { // 只对ID为3的元素设置可见 if (v === 3) { viewer3d.impl.setNodeVisibility(v, true, model); } // ID1保留在过滤结果里,但保持隐藏状态就行 });
这样既满足了“过滤结果不能忽略ID1”的要求,又能只显示你需要的子元素3。
2. 临时禁用递归行为
如果你需要更灵活的控制,可以临时修改visibilityManager的递归设置,用完再恢复:
// 先保存默认的递归配置 const originalRecursive = viewer3d.impl.visibilityManager.recursive; // 关掉递归,让show/hide只作用于当前元素 viewer3d.impl.visibilityManager.recursive = false; // 隐藏所有元素 viewer3d.impl.visibilityManager.hide(rootId, model); // 遍历过滤结果设置可见性 $.each(selection, function (k, v) { viewer3d.impl.visibilityManager.show(v, model); }); // 恢复默认的递归设置,避免影响后续操作 viewer3d.impl.visibilityManager.recursive = originalRecursive;
这种方式下,调用show(1)只会显示ID1本身,不会带出2和3;再调用show(3)就只会显示3,刚好符合你的需求。
另外补充个小提醒:如果你的业务逻辑只是需要保留ID1在过滤结果中,但不需要显示它,那其实直接在设置可见性时跳过ID1,只处理ID3就可以了,没必要额外操作ID1的状态~
内容的提问来源于stack exchange,提问作者swalter88
相关产品推荐
相关产品推荐

