使用Autodesk Forge DataViz API将热力图映射到Revit房间时设备未映射至房间的问题求助
解决Forge DataViz热力图无法映射Revit房间的问题
你遇到的这个问题很典型——精灵能正常显示在房间内,但热力图提示设备未映射到房间,核心原因是ModelStructureInfo没有完成初始化,无法识别模型的房间结构,另外还有几个细节需要调整,我来一步步帮你解决:
关键遗漏步骤:初始化ModelStructureInfo
你的代码里创建了ModelStructureInfo但没有调用它的init()方法,这个方法会异步解析Revit模型的楼层、房间等空间结构数据,是后续generateSurfaceShadingData自动映射设备到房间的必要前提。
修复后的完整代码
我已经在你的代码里补上了关键的初始化步骤,同时加入了可选的手动关联房间的方案:
async function loadHeatmaps(model){ const dataVizExtn = await viewer.loadExtension("Autodesk.DataVisualization"); // 新增:先初始化ModelStructureInfo,加载模型的空间结构 const structureInfo = new Autodesk.DataVisualization.Core.ModelStructureInfo(model); await structureInfo.init(); // 这一步是核心!必须等待初始化完成 const devices = [ { id: "Oficina 6", name:"Oficina-", position: { x: 22.475382737884104, y: 7.4884431474006163, z: 3.0 }, sensorTypes: ["temperature", "humidity"], // 可选:如果自动映射失败,手动指定房间的dbId(替换成你实际的房间dbId) // roomId: 123 } ]; var offset = viewer.model.getGlobalOffset(); removeOffset(devices[0],offset) // 现在生成shading数据,此时structureInfo已经有房间数据了 const shadingData = await structureInfo.generateSurfaceShadingData(devices); console.log(shadingData) await dataVizExtn.setupSurfaceShading(model, shadingData); const sensorColors = [0x0000ff, 0x00ff00, 0xffff00, 0xff0000]; const sensorType = "temperature"; dataVizExtn.registerSurfaceShadingColors(sensorType, sensorColors); function getSensorValue(surfaceShadingPoint, sensorType) { const deviceId = surfaceShadingPoint.id; let sensorValue = readSensorValue(deviceId, sensorType); const maxSensorValue = getMaxSensorValue(sensorType); const minSensorValue = getMinSensorValue(sensorType); sensorValue = (sensorValue - minSensorValue) / (maxSensorValue - minSensorValue); return clamp(sensorValue, 0.0, 1.0); } const floorName = "01 - Entry Level"; dataVizExtn.renderSurfaceShading(floorName, sensorType, getSensorValue); } function removeOffset(pos, offset) { pos.position.x = pos.position.x - offset.x; pos.position.y = pos.position.y - offset.y; pos.position.z = pos.position.z - offset.z; }
额外排查点
如果补上初始化后还是有问题,可以检查这几点:
- 坐标精度与位置:DataViz通过射线检测判断点属于哪个房间,尝试微调设备的z坐标(比如取房间的平均高度,或者上下移动几厘米),避免点刚好落在房间边界上导致检测失败。
- 验证房间数据:在
init()后打印structureInfo.floors和structureInfo.rooms,确认模型的房间结构是否正确加载,比如:console.log("Loaded floors:", structureInfo.floors); console.log("Loaded rooms:", structureInfo.rooms); - 手动关联房间:如果自动映射一直失败,可以通过
viewer.search("Oficina 6")找到对应房间的dbId,然后给device加上roomId属性,强制将设备关联到该房间。
内容的提问来源于stack exchange,提问作者Sebastian Ciocarlan
相关产品推荐
相关产品推荐

