Autodesk Forge Viewer热力图失效及房间结构获取问题咨询
问题解决方案
一、从Revit模型中获取房间结构
- 检查Revit源文件:确保模型内的房间已完成面积计算——Revit中未计算的房间,导出时不会被纳入转换结果。
- 修改模型转换参数:除
generateMasterViews外,必须添加extractRoomGeometry: true以提取房间几何信息,完整转换任务JSON如下:
{ "input": { "urn": "<<URN>>" }, "output": { "formats": [ { "type": "svf", "views": ["2d", "3d"], "advanced": { "generateMasterViews": true, "extractRoomGeometry": true } } ] } }
- 在正确时机获取房间数据:必须等模型几何完全加载后,再实例化
ModelStructureInfo。可通过监听GEOMETRY_LOADED_EVENT事件实现:
viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, async () => { const structureInfo = new Autodesk.DataVisualization.Core.ModelStructureInfo(viewer.model); const rooms = await structureInfo.queryRooms(); // 直接获取所有房间列表 console.log('房间数据:', rooms); });
二、确保精灵与房间绑定
- 匹配房间DBID:通过
queryRooms()获取的房间对象包含dbId属性,将io.mocked.js中传感器的objectId替换为对应房间的dbId。 - 校准传感器位置:若传感器位置偏差,可通过房间包围盒计算中心点,将传感器坐标设为房间中心:
const targetRoom = rooms.find(room => room.name === 'Living Room'); const roomBbox = targetRoom.getBoundingBox(); const roomCenter = new THREE.Vector3().copy(roomBbox.min).add(roomBbox.max).multiplyScalar(0.5); // 将roomCenter的x/y/z值替换到对应传感器的location中
- 关联传感器与房间:通过房间名称或ID匹配对应传感器数据,确保渲染精灵时,每个房间绑定正确的传感器信息。
三、获取房间边界显示热力图
- 提取房间边界:每个房间对象提供
getBoundary()方法,可直接获取房间的平面边界(返回THREE.Shape对象):
const roomBoundary = targetRoom.getBoundary(); // 获取目标房间的边界多边形
- 初始化热力图数据:遍历房间列表,收集每个房间的边界与对应传感器数值,传入热力图组件:
const heatmapSource = rooms.map(room => { const matchedSensor = sensorData.find(sensor => sensor.name === room.name); return { shape: room.getBoundary(), value: matchedSensor ? matchedSensor.value : 0 // 替换为实际传感器数值 }; }); // 将heatmapSource传入热力图扩展的配置参数
- 排查显示异常:若热力图仍不显示,检查以下几点:
- 模型转换时是否开启
extractRoomGeometry: true - 热力图的Z轴偏移是否合理(避免被模型遮挡)
- 每个房间是否都关联了有效的数值数据
- 模型转换时是否开启
内容的提问来源于stack exchange,提问作者AliHamza365
相关产品推荐
相关产品推荐

