Autodesk Forge setNodeOff 关闭所有节点

Autodesk Forge setNodeOff turns all nodes off

当我传递要关闭的 dbId 数组时,查看器会关闭我模型中的每个节点。

Autodesk.Viewing.Viewer3D.prototype.turnOff = function(dbIds) {
        var node;

        $(dbIds)
            .each(function(index, item) {
                node = viewer.model.getData().instanceTree.nodeAccess.nodes[item];

                viewer.impl.visibilityManager.setNodeOff(node, true);
            });
}

如果您传递父级的 ID,它将关闭其所有子级,这可能就是您的情况。关闭节点肯定没问题,你可以看看我在 https://forge-rcdb.autodesk.io.

的演示

Select数据库视图中的一行或饼图中的一个段:

你需要做的是获取叶节点id,只有叶节点在查看器中用几何表示。

这是一些 ES6 代码示例,摘自 there:

static getLeafNodes (model, dbIds) {

  return new Promise((resolve, reject)=>{

    try {

      const instanceTree = model.getData().instanceTree

      dbIds = dbIds || instanceTree.getRootId()

      const dbIdArray = Array.isArray(dbIds) ? dbIds : [dbIds]

      let leafIds = []

      const getLeafNodesRec = (id) => {

        var childCount = 0;

        instanceTree.enumNodeChildren(id, (childId) => {

          getLeafNodesRec(childId)

          ++childCount
        })

        if (childCount == 0) {

          leafIds.push(id)
        }
      }

      for (var i = 0; i < dbIdArray.length; ++i) {

        getLeafNodesRec(dbIdArray[i])
      }

      return resolve(leafIds)

    } catch(ex){

      return reject(ex)
    }
  })
}

static async isolateFull (viewer, dbIds = [], model = null) {

  try {

    model = model || viewer.activeModel || viewer.model

    viewer.isolate(dbIds)

    const targetIds = Array.isArray(dbIds) ? dbIds : [dbIds]

    const targetLeafIds = await ViewerToolkit.getLeafNodes(
      model, targetIds)

    const leafIds = await ViewerToolkit.getLeafNodes (model)

    const leafTasks = leafIds.map((dbId) => {

      return new Promise((resolveLeaf) => {

        const show = !targetLeafIds.length  ||
          targetLeafIds.indexOf(dbId) > -1

        viewer.impl.visibilityManager.setNodeOff(
          dbId, !show)

        resolveLeaf()
      })
    })

    return Promise.all(leafTasks)

  } catch (ex) {

    return Promise.reject(ex)
  }
}