You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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,提问作者김태헌

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 14:31:00