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

Autodesk Forge Viewer:更早触发事件及元素过滤优化方案咨询

解决Forge Viewer自定义过滤的早触发及性能优化问题

一、更早触发的事件选择

你当前依赖的OBJECT_TREE_CREATED_EVENT确实需要等待整个模型层级树构建完成才会触发,大模型下耗时较长。可以尝试以下更早的事件:

  • Autodesk.Viewing.MODEL_ROOT_LOADED_EVENT:模型根节点加载完成时触发,此时模型的基础结构与属性数据库已初始化,尽管部分几何可能仍在加载,但已可获取模型实例、执行属性查询及可见性设置操作。若过滤依赖子节点属性,可结合进度事件判断加载状态。
  • Autodesk.Viewing.DATA_LOADED_EVENT:模型元数据(属性、层级原始数据)加载完成时触发,这是元数据就绪的最早时机。你可在此事件中提前解析过滤规则、准备待显示/隐藏的元素ID列表,再监听GEOMETRY_LOADED_EVENT(几何片段加载完成)批量设置可见性,无需等待整个对象树构建完成。
  • Autodesk.Viewing.PROGRESS_UPDATE_EVENT:监听模型加载进度,当进度达到阈值(如90%)时尝试执行过滤,适合对实时性要求高的场景,但需处理重复触发的问题。

注意:使用这些早于OBJECT_TREE_CREATED_EVENT的事件时,需先判断viewer.model是否存在、目标元素是否已被Viewer注册,避免空引用错误。

二、更优的过滤实现方式

直接调用hideAll()加show()在大模型下效率极低,推荐以下高效方案:

1. 利用VisibilityManager批量操作

Viewer的viewer.impl.visibilityManager支持批量设置元素可见性,比逐个调用show()/hide()高效得多:

// 假设已获取待显示元素ID列表:visibleDbIds
const visibilityManager = viewer.impl.visibilityManager;
// 先隐藏所有元素
visibilityManager.hideAll();
// 批量显示目标元素
visibilityManager.show(viewer.model, visibleDbIds);

2. 使用原生setFilter方法

Viewer内置过滤功能,通过viewer.setFilter()可基于属性或自定义规则快速过滤元素:

// 示例:过滤类型为"Pipe"的元素
viewer.setFilter((dbId) => {
  const props = viewer.getProperties(dbId);
  return props.type === "Pipe";
});
// 应用过滤规则
viewer.applyFilter();

该方式会自动处理可见性,且内部做了性能优化,适配大模型场景。

3. 基于片段(Fragment)的直接操作

模型中每个元素对应一个或多个Fragment,直接操作Fragment可见性是性能最优的方式:

const model = viewer.model;
const fragList = model.getFragmentList();
// 先隐藏所有片段
for (let i = 0; i < fragList.getCount(); i++) {
  fragList.setVisibility(i, false);
}
// 显示目标元素对应的片段
const visibleDbIds = [/* 你的目标ID列表 */];
visibleDbIds.forEach(dbId => {
  const fragIds = model.getFragmentList().fragments.dbId2fragId[dbId];
  if (fragIds) {
    fragIds.forEach(fragId => {
      fragList.setVisibility(fragId, true);
    });
  }
});
// 刷新视图
viewer.impl.invalidate(true);

此方式跳过Viewer上层封装,性能最优,但需处理dbId与fragId的映射关系。

4. 借助PropertyFilterExtension

若为基于属性的过滤,Viewer官方扩展Autodesk.Viewing.Extensions.Core.PropertyFilterExtension提供了现成的UI与过滤逻辑,启用并配置即可:

// 加载扩展
viewer.loadExtension('Autodesk.Viewing.Extensions.Core.PropertyFilterExtension').then(ext => {
  // 配置过滤规则:筛选"Category"等于"Structural Column"的元素
  ext.setFilter({
    filterType: 'and',
    conditions: [
      {
        property: 'Category',
        operator: '=',
        value: 'Structural Column'
      }
    ]
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:05:13