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

Forge聚合视图双击设备获父ID异常及事件调用技术咨询

关于Forge聚合视图双击获取对象ID异常及事件调用的解决方案

问题背景

使用Forge多模型聚合视图时,单击设备可正常获取对应对象ID,但双击设备时返回的是父对象ID(例如选中“AHU-B04IT-09A”(ID:23611),双击得到父ID 23613),尝试自定义双击函数后问题仍存在。


问题1:解决双击获取ID异常的方案

方案1:拦截原生双击事件,手动获取精确选中对象

Forge聚合视图的双击默认行为可能触发父层级选中逻辑,可通过以下步骤处理:

  • 临时禁用视图原生双击选中行为,处理完成后恢复
  • 监听画布dblclick事件,用viewer.clientToWorld获取双击位置的精确对象:
viewer.canvas.addEventListener('dblclick', (e) => {
    // 临时禁用默认选中逻辑
    viewer.setSelectionEnabled(false);
    const screenPoint = { x: e.clientX, y: e.clientY };
    const hitTestResult = viewer.clientToWorld(screenPoint.x, screenPoint.y);
    if (hitTestResult) {
        const targetDbId = hitTestResult.dbId;
        // 此处获取的是双击位置的精确对象ID,而非父ID
        console.log('双击选中对象ID:', targetDbId);
        // 可选:手动设置视图选中状态
        viewer.select(targetDbId);
    }
    // 恢复默认选中逻辑
    viewer.setSelectionEnabled(true);
});

方案2:修正聚合视图选中优先级

在AGGREGATE_SELECTION_CHANGED_EVENT回调中过滤选中对象,取最底层的子对象而非父对象:

viewer.addEventListener(Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT, (event) => {
    const selectedIds = event.selections.flatMap(item => item.dbIdArray);
    // 遍历选中ID,找到层级最深的对象
    const getDeepestObject = (ids) => {
        let deepestId = null;
        let maxDepth = -1;
        const instanceTree = viewer.model.getInstanceTree();
        ids.forEach(id => {
            const node = instanceTree.getNode(id);
            const depth = instanceTree.getNodeDepth(node);
            if (depth > maxDepth) {
                maxDepth = depth;
                deepestId = id;
            }
        });
        return deepestId;
    };
    const targetId = getDeepestObject(selectedIds);
    if (targetId) {
        console.log('最终选中对象ID:', targetId);
    }
});

问题2:能否在按钮点击事件中调用AGGREGATE_SELECTION_CHANGED_EVENT

可以手动触发该事件,只需构造符合格式的事件参数:

// 绑定按钮点击事件
document.getElementById('your-target-button').addEventListener('click', () => {
    const targetDbId = 23611; // 目标对象ID
    // 构造匹配事件格式的参数
    const eventData = {
        selections: [{
            model: viewer.model,
            dbIdArray: [targetDbId],
            selectionType: Autodesk.Viewing.SelectionType.DATABASE_ID
        }]
    };
    // 手动触发事件
    viewer.dispatchEvent(new CustomEvent(Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT, { detail: eventData }));
});

注意:手动触发前需确保目标对象已加载到视图中,否则事件可能无法正常生效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:41:26