2017-03-17 71 views
0

我有一个要求遍历模型树,并在每个节点执行一些业务逻辑,我想知道是否有任何帮助方法,我可以使用,这将有助于通过节点移动。比如广度优先搜索或深度优先搜索甚至简单的获取节点的孩子和父母的方法?在模型树中漫步的任何辅助方法?

另外寻找叶节点的方法将会非常有用。 (如果可能,这将是很好的,如果这些提供的JavaScript而不是ES6,我知道Phillipe Leefsma有一篇博客文章,有一段代码查找叶节点,但它是在ES6中,我不能似乎得到它转换回Javascript)

任何帮助,非常感谢。

回答

1

让所有的孩子得到实例树和节点的方法是 instanceTree.enumNodeChildren(node, callback)其中所有的孩子dbids都在回调中。

要通过树遍历,先拿到instancee树和根ID:

var instanceTree = viewer.model.getData().instanceTree; 
var rootId = this.rootId = instanceTree.getRootId(); 

那么最好的办法是使用广度优先搜索:

function getAlldbIds (rootId) { 
    var alldbId = []; 
    if (!rootId) { 
     return alldbId; 
    } 
    var queue = []; 
    queue.push(rootId); 
    while (queue.length > 0) { 
     var node = queue.shift(); 
     alldbId.push(node); 
     instanceTree.enumNodeChildren(node, function(childrenIds) { 
      queue.push(childrenIds); 
     }); 
    } 
    return alldbId; 
} 

您可以修改你的方法优化性能。

阅读更多关于它的地方:https://forge.autodesk.com/cloud_and_mobile/2015/12/select-all-elements-in-the-viewer-with-view-and-data-api-with-javascript.html