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

如何获取Model Viewer中可见对象的dbId?

获取Forge Viewer中仅可见对象的dbId

以下是能准确获取当前可见对象dbId的方法,解决你遇到的现有方案失效问题:

问题根源

之前的方案存在两个核心缺陷:

  1. 未考虑**隔离(isolate)**操作的影响:使用viewer.isolate()隐藏的节点不会被getHiddenNodes()捕获,但实际这些节点是不可见的。
  2. 忽略了父节点隐藏的继承性:如果父节点被隐藏,子节点即使未被直接隐藏,也会处于不可见状态,但这类子节点不会出现在getHiddenNodes()列表中。

解决方案代码

function getVisibleDbIds(viewer) {
  const instanceTree = viewer.model.getData().instanceTree;
  const allDbIds = [];
  // 枚举模型中所有节点的dbId
  instanceTree.enumNodeChildren(instanceTree.getRootId(), dbId => {
    allDbIds.push(dbId);
  }, true);

  const hiddenNodes = viewer.getHiddenNodes();
  const isolatedNodes = viewer.getIsolatedNodes();

  return allDbIds.filter(dbId => {
    // 1. 排除自身被直接隐藏的节点
    if (hiddenNodes.includes(dbId)) {
      return false;
    }
    // 2. 排除父节点被隐藏的节点(继承不可见)
    let parentId = instanceTree.getParentId(dbId);
    while (parentId) {
      if (hiddenNodes.includes(parentId)) {
        return false;
      }
      parentId = instanceTree.getParentId(parentId);
    }
    // 3. 如果有隔离操作,仅保留被隔离的节点
    if (isolatedNodes.length > 0 && !isolatedNodes.includes(dbId)) {
      return false;
    }
    return true;
  });
}

使用说明

调用该函数时传入当前Viewer实例,即可返回所有当前可见对象的dbId列表:

const visibleDbIds = getVisibleDbIds(viewer);
console.log(visibleDbIds);

这个方法覆盖了直接隐藏、父节点继承隐藏、隔离操作三种导致节点不可见的场景,能准确筛选出真正在视图中可见的对象。

内容的提问来源于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.07 16:27:21