一般,基於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