一般,基于Forge Viewer 开发的的朋友须要获取到模型的层次结构以及构件的DbId,用于在本身的流程中构造相关对象和处理。尤为DbId,大部分Forge Viewer对象的操做,参数是输入的DbId,而用来惟一肯定构件的信息是一些其它的Id,例如ExternalId。因此,有时要作ID的映射,方便前端流程中,能够更快速的找到对应的构件。前端
一些朋友喜欢在Forge Viewer加载模型( 譬如在这个事件中Autodesk.Viewing.GEOMETRY_LOADED_EVENT)来遍历Viewer.InstanceTree (instanceTree.enumNodeChildren)获取DbId。对于简单模型,这个方法可用,而对于复杂模型,将形成较长时间才能完成遍历过程,影响流程的其它工做。node
其实,在instanceTree的属性里,藏有DbId和模型节点的数组,只是没有现成的如同用户界面那样直接对应的映射表。
几个对象:segmentfault
因此,假设咱们知道一个dbId,如下代码将获得对应的节点名:数组
var dbid = 1854; var it = NOP_VIEWER.model.getData().instanceTree; var indexinNames = it.nodeAccess.dbIdToIndex[dbid]; var indexinStrings = it.nodeAccess.names[indexinNames]; var nodeMainString = it.nodeAccess.strings[indexinStrings]; var nodeSuffixString = it.nodeAccess.nameSuffixes[indexinStrings]; //最终的节点名字 var nodeFinalName = nodeMainString+nodeSuffixString;
其实,Forge Viewer API提供了一个直接的方法,经过dbId获得节点名。原理和上门是相似的。测试
var dbid = 1854; var it = NOP_VIEWER.model.getData().instanceTree; //最终的节点名字 var nodeFinalName = it.getNodeName(dbid);
反过来,假设知道了模型节点名,查询dbId,则能够先剔除后缀名,而后在it.nodeAccess.strings获得序号,接着从it.nodeAccess.names获得映射序号,最终在it.nodeAccess.dbIdToIndex获得dbId。可是:因为模型节点名是能够重复的,我还未找到一个有重复节点名的模型测试,而Forge Viewer增长一个后缀名,或许就是为了解决这种场景。有待进一步的测试。spa
在另一篇文章中,介绍了无需前端的Forge Viewer API获取模型层次结构和DbId。code