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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:25:05