無需instanceTree.enumNodeChildren獲取模型中對象的DbId

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

  • instanceTree.nodeAccess.dbIdToIndex 含有全部dbId。不過這個數組是一個map,是dbId和instanceTree.nodeAccess.names數組的對應關係
  • instanceTree.nodeAccess.names存放查詢節點名字的序號
  • instanceTree.nodeAccess.strings存放模型節點的名字,若是有特殊的後綴,則後綴須要從instanceTree.nodeAccess.nameSuffixes中拿到。例如本例中的 Surface[105545],中括號就是特殊的後綴
  • instanceTree.nodeAccess.nameSuffixes,節點的特殊後綴

圖片描述

因此,假設咱們知道一個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

相關文章
相關標籤/搜索