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

初始化两个Viewer时自定义ToolbarExtension未注册的问题

问题分析与解决方案

核心原因

Autodesk Viewer的扩展注册是全局生效的,但初始化第二个Viewer实例时,自定义扩展可能还未完成全局注册,或者多实例启动时的扩展加载逻辑触发了冲突——你仅在主Viewer的初始化配置中传入扩展数组,第二个Viewer启动时,全局扩展管理器中可能还未同步到ToolbarExtension,导致加载失败。

解决方法

1. 提前全局注册扩展(关键)

将ToolbarExtension的注册代码放在所有Viewer实例初始化之前,确保两个Viewer启动时,扩展已存在于全局扩展管理器中:

// 先注册扩展,放在任何Viewer初始化代码的最前面
Autodesk.Viewing.theExtensionManager.registerExtension('ToolbarExtension', ToolbarExtension);

// 初始化主Viewer,保持原有初始化时加载扩展的方式
const mainViewer = new Autodesk.Viewing.GuiViewer3D(document.getElementById('main-viewer'));
const initOptions = {
    extensions: ['ToolbarExtension']
};
mainViewer.start(null, null, null, null, initOptions);

// 初始化第二个Viewer(不需要传入该扩展,避免不必要的加载)
const secondaryViewer = new Autodesk.Viewing.GuiViewer3D(document.getElementById('secondary-viewer'));
secondaryViewer.start();

2. 同步初始化时序(避免冲突)

如果提前注册后仍有问题,可以等待主Viewer的扩展加载完成后,再初始化第二个Viewer:

// 先注册扩展
Autodesk.Viewing.theExtensionManager.registerExtension('ToolbarExtension', ToolbarExtension);

// 按顺序初始化Viewer
async function initViewers() {
    const mainViewer = new Autodesk.Viewing.GuiViewer3D(document.getElementById('main-viewer'));
    const initOptions = { extensions: ['ToolbarExtension'] };
    await mainViewer.start(null, null, null, null, initOptions);
    
    // 主Viewer扩展加载完成后,再初始化第二个Viewer
    const secondaryViewer = new Autodesk.Viewing.GuiViewer3D(document.getElementById('secondary-viewer'));
    secondaryViewer.start();
}
initViewers();

3. 确保扩展代码的实例独立性

检查ToolbarExtension的代码,避免绑定到单一Viewer实例的全局变量,在扩展的load方法中使用传入的viewer参数:

class ToolbarExtension extends Autodesk.Viewing.Extension {
    load(viewer) {
        this.viewer = viewer; // 使用实例化时传入的viewer,而非全局变量
        // 你的工具栏按钮创建逻辑
        return true;
    }
}

内容的提问来源于stack exchange,提问作者Gustavo da Costa e Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:07:20