Forge Viewer API:多模型视图中实现类似isolate的无匹配模型处理
解决方案
要实现无匹配对象的模型呈现类似isolate的半透明效果,你可以通过设置模型所有对象的透明度来模拟,替代直接隐藏或错误隔离无关对象。核心思路是:当模型无匹配结果时,将其所有对象的透明度调整为与isolate一致的半透明值(默认0.3),同时保持对象可见;有匹配结果时正常调用isolate。
修正后的代码
// 用于记录需要恢复透明度的模型及对应dbIds,避免切换搜索条件后残留效果 let transparentModels = []; function objectIsolation(searchTerm, allModelInstances) { // 重置之前的半透明设置,恢复默认状态 transparentModels.forEach(item => { viewer.setOpacity(item.dbIds, 1, item.model); viewer.show(item.dbIds, item.model); }); transparentModels = []; // 遍历所有模型逐一处理 allModelInstances.forEach(modelInstance => { modelInstance.search(searchTerm, dbIds => { if (!dbIds.length) { // 获取当前模型的所有dbIds const allDbIds = modelInstance.getObjectTree().getAllDbIds(); // 设置半透明(与isolate默认半透明值一致) viewer.setOpacity(allDbIds, 0.3, modelInstance); // 确保对象可见,避免之前的隐藏操作影响 viewer.show(allDbIds, modelInstance); // 记录该模型的信息,用于后续重置 transparentModels.push({ model: modelInstance, dbIds: allDbIds }); } else { // 正常隔离当前模型的匹配对象 viewer.isolate(dbIds, modelInstance); } }); }); }
关键说明
- 状态重置:每次执行筛选前,先恢复之前设置过半透明的模型,避免切换搜索条件后残留半透明效果。
- 半透明设置:使用
viewer.setOpacity将无匹配模型的所有对象透明度设为0.3(与Forge Viewer默认的isolate半透明效果一致),同时调用viewer.show确保对象可见,避免完全隐藏。 - 高效获取所有dbIds:通过
modelInstance.getObjectTree().getAllDbIds()快速获取模型所有对象ID,比search('*')性能更优。
内容的提问来源于stack exchange,提问作者Luksa
相关产品推荐
相关产品推荐

