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

Forge Viewer如何针对单个模型设置Display Edges而非全局配置

Forge Viewer 不同模型差异化控制边缘显示(Display Edges)实现方案

你之前尝试的isAEC: false和直接修改hasEdges属性不生效,是因为这两个参数仅在模型加载初始化阶段生效,加载完成后修改不会触发现有渲染管线的边缘计算,且原生全局Display Edges开关优先级更高。以下是两种可行实现方案:

方案1:自定义边缘控制逻辑(推荐)

直接调用模型实例的原生边缘控制接口,覆盖全局开关逻辑:

  • 加载模型时预先标记不同模型的边缘显示需求,添加自定义配置项:
// 加载Revit建筑模型
viewer.loadDocumentNode(doc, revitViewables,{
    keepCurrentModels: true,
    placementTransform: m.matrix,
    globalOffset: {x:0,y:0,z:0},
    customEdgesEnabled: true // 标记需要开启边缘
})

// 加载场地上下文模型
viewer.loadDocumentNode(doc, contextViewables,{
    keepCurrentModels: true,
    placementTransform: m.matrix,
    globalOffset: {x:0,y:0,z:0},
    customEdgesEnabled: false // 标记需要关闭边缘
})
  • 封装独立的边缘刷新方法,替换原生全局开关的触发逻辑:
function refreshAllModelEdges() {
  const allModels = viewer.impl.modelQueue().getModels();
  allModels.forEach(model => {
    // 读取模型自定义的边缘开关配置,默认值可根据需求调整
    const needEnableEdges = model.getData().options.customEdgesEnabled ?? true;
    // 单个模型独立控制边缘显示状态
    model.setEdgesDisabled(!needEnableEdges);
  });
  // 触发视图重绘生效
  viewer.impl.invalidate(true, true, true);
}
  • 绑定Autodesk.Viewing.MODEL_LOADED_EVENT事件,所有模型加载完成后调用一次refreshAllModelEdges()即可。如果需要保留原生设置面板的Display Edges开关,劫持它的点击事件,将原生全局切换逻辑替换为调用上述自定义方法即可。

方案2:材质覆盖法

如果需要保留原生全局开关的其他逻辑,可以单独覆盖场地模型的材质属性关闭边缘:

// 拿到场地模型实例后执行
const contextModel = /* 你的场地模型实例对象 */;
viewer.modelstructure.getObjectTree(contextModel, tree => {
  // 遍历场地模型所有构件
  tree.enumNodeChildren(tree.getRootId(), dbId => {
    const curMaterial = viewer.getMaterial(dbId, contextModel);
    if (curMaterial) {
      // 禁用当前材质的边缘渲染
      curMaterial.edgeStylingDisabled = true;
      curMaterial.needsUpdate = true;
    }
  }, true);
  viewer.impl.invalidate(true, true, true);
});

注意:两种方案都需要在模型完全加载完成后执行,避免未初始化的属性访问报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:57:03