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
相关产品推荐
相关产品推荐

