如何通过API在aggregatedView中同时隔离多模型的指定DBID构件?
解决多模型场景下同时隔离指定构件的问题
问题根源在于Viewer.isolate()方法是全局生效的——每次调用都会重置整个场景的可见性状态,只保留当前传入模型的指定构件可见,所以循环调用会覆盖之前的隔离结果。要实现和手动操作一致的多模型同时隔离效果,需要直接操作Viewer的可见性管理器,针对每个模型单独控制构件可见性。
具体实现步骤:
- 先重置所有模型的可见性,确保所有构件处于默认可见状态
- 遍历每个模型,将非目标构件隐藏,只保留指定DBID的构件可见
- 统一调整视角适配所有目标构件
- 保留主题色设置逻辑
修改后的代码如下:
this.extension.viewer.clearSelection(); // 1. 重置所有模型的可见性(取消之前的隔离/隐藏状态) this.extension.viewer.impl.visibilityManager.setAllVisibility(true); const allTargetDbIds = []; // 2. 遍历每个模型,单独控制可见性 for (const [model, dbIds] of dbIdsMap.entries()) { // 获取当前模型的所有构件ID const allModelDbIds = model.getInstanceTree().getNodeDbIds(); // 计算需要隐藏的构件ID(所有ID减去目标ID) const hiddenDbIds = allModelDbIds.filter(id => !dbIds.includes(id)); // 隐藏非目标构件 model.hide(hiddenDbIds); // 记录所有目标ID用于后续视角适配 allTargetDbIds.push(...dbIds.map(id => { return { model, dbId: id }; })); // 设置主题色 dbIds.forEach(dbid => { model.setThemingColor(dbid, new THREE.Vector4(1, 0, 0, 1)); // 红色 }); } // 3. 适配所有目标构件的视角 if (allTargetDbIds.length > 0) { this.extension.viewer.fitToView(allTargetDbIds); }
关键说明
- 使用
model.hide()替代全局的isolate(),针对单个模型隐藏非目标构件,不会影响其他模型的可见性状态 visibilityManager.setAllVisibility(true)确保初始状态下所有构件可见,避免之前的状态干扰fitToView传入包含模型和DBID的数组,实现多模型目标构件的视角适配
内容的提问来源于stack exchange,提问作者김태헌
相关产品推荐
相关产品推荐

