Forge Viewer加载部分BIM360 Revit模型调用Autodesk.AEC.ViewportsExtension无法获取视口问题
问题排查方向与解决方案
1. 确认当前加载的Viewable类型
Autodesk.AEC.ViewportsExtension的getViewports方法仅对Revit导出的2D图纸视图(Sheet View)有效,普通3D视图、楼层平面视图、立面视图、剖面视图均不包含视口数据,调用该方法会返回空数组。- 如果你需要在非图纸视图场景下实现3D/2D坐标转换,直接使用Viewer内置的
viewer.worldToClient(worldPoint)方法即可,无需依赖该扩展。
2. 检查Revit到BIM360的发布配置
- 发布到BIM360时如果采用了自定义发布流程、精简导出参数,会默认关闭视口元数据的导出,即使是图纸视图也无法返回视口数据。
- 排查方案:在Revit端发布视图集时,确认「导出图纸时包含视口元数据」选项处于开启状态,使用BIM360默认发布流程不会关闭该选项。
3. 优化代码调用逻辑与时机
- 原代码直接取下标0的逻辑缺少空判断,且未保证扩展加载、AEC元数据解析完成后再调用,调整后的参考代码如下:
// 异步加载扩展并获取视口转换矩阵 async function getViewportTransform() { // 确保扩展加载完成 const viewportExt = await viewer.loadExtension("Autodesk.AEC.ViewportsExtension"); // 获取视口数组后先判断长度,避免空指针异常 const viewports = viewportExt.getViewports(viewer.model); if (viewports.length > 0) { const viewport = viewports[0]; return viewport.get3DTo2DMatrix(viewer.model.getUnitScale()); } console.warn("当前视图无可用视口数据,建议使用viewer.worldToClient实现坐标转换"); return null; }
- 调用该方法的时机需要在Viewer的
MODEL_LOADED事件触发之后执行,确保模型元数据已完全加载。
内容的提问来源于stack exchange,提问作者Christopher Git Daniel
相关产品推荐
相关产品推荐

