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

Forge Viewer多模型场景下同时隔离多个模型指定dbid的实现问题

问题原因
  • Forge Viewer多模型场景下,每个模型的dbid是独立分配的,不存在跨模型通用的dbid,同一个externalId在不同模型中对应的dbid完全不同。
  • 原有代码仅获取了当前激活模型(viewer.model)的externalId与dbid映射表,所有模型隔离时都复用这一份映射的dbid,无法匹配其他模型的正确构件,因此会出现仅单个模型隔离生效的问题。
修复方案

修改逻辑为遍历每个模型时单独查询该模型自身的externalId映射,匹配对应dbid后再执行隔离操作,修复后代码如下:

function getExternalIds(model: any): Promise<Record<string, number>> {
  return new Promise(function(resolve, reject) {
    model.getExternalIdMapping(resolve, reject);
  });
}

async function isolateAndColorObject(
  viewer: any,
  externalIds?: string[],
  color?: THREE.Color
) {
  // 无传入externalId时重置所有模型的隔离状态
  if (!externalIds?.length) {
    viewer.isolate(0);
    return;
  }
  // 逐个处理所有加载的模型
  for (const model of viewer.getAllModels()) {
    // 获取当前模型独有的externalId映射表
    const modelIdMap = await getExternalIds(model);
    // 筛选当前模型中匹配的dbid,过滤不存在的id
    const targetDbIds = externalIds.map(id => modelIdMap[id]).filter(Boolean);
    // 仅对当前模型执行隔离
    viewer.isolate(targetDbIds, model);
    // 若需要上色可启用下方逻辑
    if (color) {
      viewer.setThemingColor(targetDbIds, color, model);
    }
  }
}

// 调用方式保持不变
isolateAndColorObject(viewer, [
  "5aa7c220-434e-47ec-966b-7aa35a5327a9-001c988b",
  "5cd83cb7-08c9-4bb2-bf3a-523af6622a4f-000e9567",
  "4845d7d6-c3ba-433c-9418-acbdb1ff7e5f-0011d9e2",
  "7e6d9dcb-b26f-4e71-9eb2-3169d28411da-001e3370",
]);
可选优化

如果加载的模型数量较多,可将每个模型的externalId映射表缓存到全局变量中,避免每次调用函数都重复查询映射,提升执行性能。

内容的提问来源于stack exchange,提问作者Abed Aarabi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:48:01