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

