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
相关产品推荐
相关产品推荐

