如何通过Autodesk Forge Viewer的lockExplode实现按楼层爆炸模型?
解决Autodesk Forge Viewer按楼层爆炸模型的问题
核心思路
要实现仅楼层层级爆炸、内部构件保持不动,关键是批量锁定目标楼层下的所有子构件,让爆炸操作只作用于楼层节点本身。步骤如下:
- 定位目标楼层的节点ID
- 批量获取该楼层下所有构件的DBID集合
- 调用
lockExplode锁定这些构件,再开启爆炸模式
具体代码修改
1. 添加获取楼层子构件DBID的工具函数
在main.js中新增以下函数,用于遍历模型层级,收集指定楼层下的所有构件DBID:
// 获取指定楼层下所有构件的DBID function getFloorComponentDbids(model, targetFloorNames) { const instanceTree = model.getInstanceTree(); const componentDbids = new Set(); // 递归遍历节点,收集叶子节点(构件)的DBID function traverseNodes(nodeId) { const childCount = instanceTree.getChildCount(nodeId); if (childCount === 0) { componentDbids.add(nodeId); return; } // 遍历子节点 instanceTree.enumNodeChildren(nodeId, (childId) => { traverseNodes(childId); }); } // 遍历根节点,匹配目标楼层名称 instanceTree.enumNodeChildren(instanceTree.getRootId(), (nodeId) => { instanceTree.getNodeName(nodeId, (nodeName) => { if (targetFloorNames.includes(nodeName)) { traverseNodes(nodeId); } }); }); return Array.from(componentDbids); }
2. 在模型加载完成后执行锁定与爆炸
修改模型加载后的逻辑,替换原有的单个DBID锁定逻辑:
// 监听模型几何加载完成事件(确保模型层级已可用) viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, () => { const currentModel = viewer.model; // 替换为你模型中的楼层名称,比如['BASEMENT', 'GROUND'] const targetFloors = ['BASEMENT', 'GROUND']; // 获取目标楼层下所有构件的DBID const floorComponents = getFloorComponentDbids(currentModel, targetFloors); // 锁定这些构件,爆炸时不移动 viewer.lockExplode(floorComponents, true, currentModel); // 设置爆炸比例(数值越大,爆炸程度越高,按需调整) viewer.setExplodeScale(1.2); });
3. 辅助调试:确认楼层节点名称
如果不确定模型中楼层节点的准确名称,可添加以下函数打印所有节点信息:
// 打印模型所有节点的ID和名称,用于确认楼层名称 function printAllModelNodes(model) { const instanceTree = model.getInstanceTree(); function traverse(nodeId) { instanceTree.getNodeName(nodeId, (name) => { console.log(`节点ID: ${nodeId}, 名称: ${name}`); }); instanceTree.enumNodeChildren(nodeId, traverse); } traverse(instanceTree.getRootId()); } // 在模型加载完成后调用 // printAllModelNodes(currentModel);
关键注意事项
- 确保
targetFloors中的名称与模型中楼层节点的名称完全匹配(区分大小写) lockExplode必须在爆炸模式开启前调用,或调用后重新设置爆炸比例才会生效- 若楼层节点不是根节点的直接子节点,需修改
getFloorComponentDbids中的遍历逻辑,改为递归查找所有层级中的目标楼层节点
内容的提问来源于stack exchange,提问作者voltus
相关产品推荐
相关产品推荐

