切换Revit模型视图/几何后Autodesk.AEC.LevelsExtension报错
解决Autodesk Viewer中切换Revit视图后LevelsExtension重复面板报错问题
问题原因
初始化Viewer时直接加载Autodesk.AEC.LevelsExtension,切换模型/视图时,扩展不会自动销毁旧模型对应的Levels面板,导致DOM中存在多个LevelsPanel-*元素。hover旧面板时,因关联的模型已卸载,触发报错。
解决方案
手动管理Autodesk.AEC.LevelsExtension的生命周期,在切换模型前卸载旧扩展并清理残留UI,模型加载完成后重新加载扩展。
修改后的完整代码
const initViewer = () => { return new Promise((resolve, reject) => { var options = { env: 'AutodeskProduction2', api: 'derivativeV2_EU', getAccessToken, }; Autodesk.Viewing.Initializer(options, () => { const config = { extensions: [ 'Autodesk.DocumentBrowser' // 移除LevelsExtension的自动加载 ], }; const container = document.getElementById('viewer'); const viewer = new Autodesk.Viewing.GuiViewer3D(container, config); viewer.start(); // 监听模型卸载事件,兜底清理扩展 viewer.addEventListener(Autodesk.Viewing.MODEL_UNLOADED_EVENT, () => { unloadLevelsExtension(viewer); }); resolve(viewer); }); }); }; const unloadLevelsExtension = (viewer) => { const levelsExt = viewer.getExtension('Autodesk.AEC.LevelsExtension'); if (levelsExt) { // 卸载扩展触发内部清理 viewer.unloadExtension('Autodesk.AEC.LevelsExtension'); // 清理DOM中残留的Levels面板 const oldPanels = document.querySelectorAll('[id^="LevelsPanel-"]'); oldPanels.forEach(panel => panel.remove()); } }; const loadModel = (viewer, model, index) => { // 切换模型前先卸载旧扩展 unloadLevelsExtension(viewer); const onDocumentLoadSuccess = (doc) => { const geometries = doc.getRoot().search({ type: 'geometry' }); doc.downloadAecModelData(); const onModelLoadSuccess = () => { // 模型加载完成后加载Levels扩展 viewer.loadExtension('Autodesk.AEC.LevelsExtension') .catch(err => console.error('加载Levels扩展失败:', err)); }; viewer.loadDocumentNode(doc, geometries[index], { createWireframe: false, applyScaling: 'm', isAEC: true, }).then(onModelLoadSuccess); }; Autodesk.Viewing.Document.load( 'urn:' + model.urn, onDocumentLoadSuccess, onDocumentLoadFailure ); };
关键说明
- 延迟扩展加载:不在Viewer初始化时自动加载LevelsExtension,改为模型加载完成后手动加载,确保扩展与当前模型绑定。
- 主动卸载清理:切换模型前调用
unloadLevelsExtension,卸载旧扩展并删除DOM中残留的面板元素,避免重复。 - 事件兜底:监听
MODEL_UNLOADED_EVENT,确保无论通过何种方式卸载模型,都能触发扩展清理逻辑。
内容的提问来源于stack exchange,提问作者Maryam
相关产品推荐
相关产品推荐

