使用Autodesk Forge Viewer加载Navisworks文件时遇TypeError问题
问题分析
你遇到的TypeError: Cannot read properties of null (reading 'getNamedViews')错误,根源是手动构造Navisworks模型的加载参数(svfUrl和modelOptions)时,未适配Navisworks转换后的SVF结构,导致Viewer内部尝试访问一个不存在的对象。Revit、FBX等格式的模型结构与Navisworks不同,因此不会触发该问题。
解决方案
改用Viewer官方推荐的loadDocumentNode方法加载模型,该方法会自动适配不同格式模型的加载逻辑,无需手动构造路径和参数。修改后的代码如下:
const lunchViewer = (urn) => { var options = { env: 'AutodeskProduction', getAccessToken: getForgeToken, }; var documentId = 'urn:' + urn; window.Autodesk.Viewing.Initializer(options, () => { window.Autodesk.Viewing.Document.load( documentId, onDocumentLoadSuccess, onDocumentLoadFailure ); }); }; const onDocumentLoadSuccess = (doc) => { // 获取默认几何视图,替代手动搜索更可靠 const initGeom = doc.getRoot().getDefaultGeometry(); if (!initGeom) { console.error('Document contains no geometries.'); return; } const viewerDiv = document.getElementById('viewer'); const config = { extensions: [ 'Autodesk.DocumentBrowser', 'Autodesk.Viewing.MarkupsCore', ], }; // 使用公共GuiViewer3D类,避免私有API兼容性问题 const viewer = new window.Autodesk.Viewing.GuiViewer3D( viewerDiv, config ); // 初始化Viewer并检查结果 const startedCode = viewer.start(); if (startedCode > 0) { console.error('Failed to initialize viewer', startedCode); return; } // 用loadDocumentNode加载模型,自动处理参数 viewer.loadDocumentNode(doc, initGeom) .then(onLoadModelSuccess) .catch(onLoadModelError); };
关键修改点
- 用
doc.getRoot().getDefaultGeometry()替代手动搜索geometries,更准确获取模型的默认视图节点 - 替换私有类
window.Autodesk.Viewing.Private.GuiViewer3D为公共的window.Autodesk.Viewing.GuiViewer3D,规避私有API的兼容性风险 - 移除手动构造
svfUrl和modelOptions的代码,改用viewer.loadDocumentNode方法加载模型,该方法会自动处理不同格式模型的加载参数与逻辑 - 增加Viewer初始化的错误判断(
viewer.start()的返回值)
多模型加载与视图切换
若需加载多个模型,重复调用viewer.loadDocumentNode加载其他模型的视图节点即可。切换已加载模型的视图时,可通过两种方式实现:
- 获取模型的命名视图:
model.getNamedViews(),再调用viewer.setView(view)完成切换 - 使用已加载的
Autodesk.DocumentBrowser扩展,该扩展内置视图切换功能,无需额外开发
内容的提问来源于stack exchange,提问作者Maryam
相关产品推荐
相关产品推荐

