You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

切换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
    );
};

关键说明

  1. 延迟扩展加载:不在Viewer初始化时自动加载LevelsExtension,改为模型加载完成后手动加载,确保扩展与当前模型绑定。
  2. 主动卸载清理:切换模型前调用unloadLevelsExtension,卸载旧扩展并删除DOM中残留的面板元素,避免重复。
  3. 事件兜底:监听MODEL_UNLOADED_EVENT,确保无论通过何种方式卸载模型,都能触发扩展清理逻辑。

内容的提问来源于stack exchange,提问作者Maryam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:40:26