Autodesk Forge setNodeOff关闭所有节点

时间:2017-06-26 22:04:40

标签: autodesk-forge

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

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);
            });
}

1 个答案:

答案 0 :(得分:0)

如果您传递了父级的ID,它将关闭所有子级,这可能就是您的情况。关闭节点绝对可以正常工作,您可以在https://forge-rcdb.autodesk.io查看我的演示。

在数据库视图中选择一行或在饼图中选择一个段:

enter image description here

您需要做的是获取叶节点ID,在查看器中只有叶节点由几何体表示。

以下是从there中提取的一些ES6代码示例:

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)
  }
}