如何在Forge Viewer中实现Revit Room元素的可点击交互?
Forge Viewer 实现2D图纸中Room/Spaces可点击操作教程
1 调整模型加载配置,强制加载Room/Space数据
Revit导出的Forge模型默认不会在2D视图中加载房间、空间这类非构件类AEC数据,需要在加载模型时主动开启配置:
- 调用
loadDocumentNode接口时传入loadAllAECData: true参数,示例代码如下:
// 初始化Viewer实例 const viewer = new Autodesk.Viewing.GuiViewer3D(document.getElementById('forgeViewer')); viewer.start(); // 加载模型 Autodesk.Viewing.Document.load('你的模型URN', (doc) => { const defaultView = doc.getRoot().getDefaultGeometry(); viewer.loadDocumentNode(doc, defaultView, { *关键参数:开启全量AEC数据加载,包含Room、Space、区域等语义对象* loadAllAECData: true }).then(() => { console.log('模型加载完成,Room数据已导入Viewer'); }); }, (loadErr) => console.error('模型加载失败:', loadErr));
2 绑定点击拾取事件,获取选中的Room数据
模型加载完成后,绑定Viewer的选中事件即可监听到用户点击的Room对象:
- 监听
SELECTION_CHANGED_EVENT事件,过滤提取Room/Spaces类型构件的属性,示例代码如下:
viewer.addEventListener(Autodesk.Viewing.SELECTION_CHANGED_EVENT, (selectEvent) => { const selectedIds = selectEvent.dbIdArray; if (selectedIds.length === 0) return; // 获取选中构件的属性,过滤出Room/Spaces类型 viewer.getProperties(selectedIds[0], (propRes) => { const categoryVal = propRes.properties?.find(item => item.displayName === 'Category')?.displayValue; if (categoryVal === 'Rooms' || categoryVal === 'Spaces') { console.log('点击获取到的Room数据:', propRes); // 此处可执行后续的属性提取、数据导出、弹窗展示等自定义逻辑 } }); });
3 可选:优化拾取交互反馈
如果默认选中高亮效果不明显,可自定义Room选中后的视觉样式:
- 自定义选中高亮颜色示例:
// 设置选中高亮为半透明蓝色,透明度0.6 viewer.setSelectionColor(new THREE.Color(0, 0.5, 1), 0.6);
验证方法:若点击后无法获取Room数据,可执行代码
viewer.search('Rooms', (dbIds) => console.log('当前视图中所有Room的ID:', dbIds), null, 'Category'),确认Room数据是否已正常加载到当前视图中。
内容的提问来源于stack exchange,提问作者rchen
相关产品推荐
相关产品推荐

