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

如何修改Autodesk AggregatedView中ModelStructurePanel的节点标签?

解决Autodesk AggregatedView中ModelStructurePanel节点重命名问题

方法一:直接修改模型文档名称(最简单)

ModelStructurePanel的根节点名称默认取自模型的model.doc.name属性,该属性对应上传OSS的文件名。直接修改这个属性后刷新面板即可:

// 获取你的AggregatedView实例
const aggregatedView = this.aggregatedView;
// 获取所有视图项
const viewables = aggregatedView.getViewables();

// 遍历每个视图项对应的模型,修改根节点名称
viewables.forEach((viewable, index) => {
  const model = aggregatedView.getModel(viewable);
  // 可根据index或viewable信息设置自定义名称
  model.doc.name = `自定义模型${index + 1}`;
});

// 刷新ModelStructure面板
const modelStructureExt = this.viewer.getExtension('Autodesk.ModelStructure');
modelStructureExt.panel.refresh();

方法二:扩展ModelStructurePanel(灵活控制所有节点)

如果需要更灵活的节点名称控制(比如不同模型/节点设置不同名称),可以正确扩展面板类,重写getNodeLabel方法,同时确保替换面板后正确刷新:

class CustomModelStructurePanel extends Autodesk.Viewing.UI.ModelStructurePanel {
  constructor(container, id, title, options) {
    super(container, id, title, options);
    // 存储模型ID到自定义名称的映射
    this.customRootNames = new Map();
  }

  // 设置指定模型的根节点名称
  setModelRootName(modelId, customName) {
    this.customRootNames.set(modelId, customName);
    this.refresh();
  }

  getNodeLabel(node) {
    const model = this.viewer.model;
    const instanceTree = model.getInstanceTree();
    // 判断当前节点是否为模型根节点
    if (node.dbId === instanceTree.getRootId()) {
      const customName = this.customRootNames.get(model.id);
      if (customName) {
        return customName;
      }
    }
    // 非根节点沿用默认逻辑
    return super.getNodeLabel(node);
  }
}

// 替换默认面板
const modelStructureExt = this.viewer.getExtension('Autodesk.ModelStructure');
const customPanel = new CustomModelStructurePanel(
  this.viewer.container,
  'customModelStruct',
  '我的模型结构',
  { viewer: this.viewer }
);
modelStructureExt.setModelStructurePanel(customPanel);

// 为每个模型设置自定义根名称
const aggregatedView = this.aggregatedView;
const viewables = aggregatedView.getViewables();
viewables.forEach((viewable, index) => {
  const model = aggregatedView.getModel(viewable);
  customPanel.setModelRootName(model.id, `自定义模型${index + 1}`);
});

你之前方法的问题

  1. 第一种方法:InstanceTree确实没有setNodeName方法,因为它是只读的模型结构数据。
  2. 第二种方法:
    • 重写getNodeLabel时未区分根节点,直接返回固定值会导致所有节点名称相同。
    • 构造面板时可能缺少viewer参数,导致面板初始化异常。
    • 替换面板后未主动刷新,新的标签逻辑无法生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:15:02