原創|行業資訊|編輯:吳秋紅|2024-01-22 14:55:29.100|閱讀 78 次
概述:這是兩部分文章中的第一部分,我們將在其中開發一種通用算法,用于遍歷 HOOPS Exchange 中實現的對象層次結構。遍歷對象層次結構是幾乎每個工作流程的重要且無處不在的部分。我們在這里描述的算法可以在Exchange Toolkit 中找到。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
這是兩部分文章中的第一部分,我們將在其中開發一種通用算法,用于遍歷 HOOPS Exchange 中實現的對象層次結構。遍歷對象層次結構是幾乎每個工作流程的重要且無處不在的部分。我們在這里描述的算法可以在Exchange Toolkit 中找到。
HOOPS Exchange 是一個軟件開發工具包,它可以幫助應用程序開發人員讀取各種標準和專有 3D 文件格式,例如 STL、OBJ、STEP、IGES、SolidWorks 和 CATIA。除了 3D 幾何之外,HOOPS Exchange 還提供對裝配樹的訪問,裝配樹是由設計師創作的 3D 數據的邏輯結構。
用于表示復雜 3D 數據集的數據結構具有層次關系。例如,在使用 HOOPS Exchange 加載文件后,您將獲得一個A3DAsmModelFile對象。這個“頂級”對象由一個或多個裝配節點組成,存儲為 C 風格 A3DAsmProductOccurence對象數組。此外,這些裝配節點對象是遞歸的。也就是說, anA3DAsmProductOccurence可以包含一個“子”A3DAsmProductOccurrence對象數組和/或A3DAsmPartDefinition代表 3D 部件的 。
通過檢查HOOPS Exchange B-Rep 數據中存在的拓撲對象,可以看到對象之間層次關系的其他示例。在這個經典場景中,我們發現 A3DTopoBrepData 包含一個 A3DTopoConnexes 數組,其中包含一個 A3DTopoShell 對象數組。殼包含面,其中包含循環,包含共邊,包含邊,最終包含頂點。
到目前為止,我們已經確定對象之間的層次關系在 HOOPS Exchange 中普遍存在,并且需要一種用于遍歷對象的通用算法。
我們的目標是創建一個通用的算法,它需要兩個輸入--一個任意類型的 "擁有 "對象和一個類型指定器。這個算法的返回值應該是一個對象的集合,所有的對象都是指定的子類型,這些對象是由擁有對象直接或通過中間對象隱含地擁有。我們將分步實現這一目標。
首先,我們需要一個函數來返回直接包含在父級中的對象。例如,要檢索殼內的所有面,我們將編寫如下函數:
這個函數體是一個模式,對層次結構中的每個對象都會重復。正如你所看到的,這有點冗長,而且不是很通用。
如果我們使用ExhangeToolkit.h 中提供的數據訪問工具,我們可以將代碼大幅簡化為更易于管理的內容:
除了更容易管理之外,這個實現也不容易出錯。
為了使其更加通用,我們可以利用A3DTopoShell和A3DTopoFace都是同一類型(void)的別名這一事實。由于這段代碼是 "以Exchange為中心 "的,我們可以用A3DEntity替換參數類型和返回類型。這個類型表示Exchange中的基本類型,也是對void類型的別名。
在做了這個改變之后,我們的函數簽名開始看起來更通用:
作為下一步,我們可以修改這個函數以接受任何類型的父類,并通過切換實體類型返回子類集合。
函數getFaceLoops將像getShellFaces那樣實現。你會注意到,我們把std::vector換掉了,用ts3d::EntityArray代替了它。它們是等效的類型,這一變化進一步有利于簡潔和可維護性。
switch語句只實現了上述兩種情況,所以它只處理兩種Exchange對象類型。它可以被擴展到處理Exchange架構中使用的所有對象類型。要做到這一點,我們需要為每種類型的對象聲明一個獨特的函數,并幫助它返回其中可用的子對象。這將導致大量的代碼,即使我們做了所有的修改,使其更加簡潔(并且不容易出錯)。
我們可以使用函數對象和無序哈希來管理這種大規模的代碼擴展。讓我們分兩步來看看這組變化。仍然只關注我們到目前為止所引用的兩種對象類型,通過使用函數對象和無序散列,我們可以將getChildren函數重寫如下:
我們繼續關注處理新類型現在可以分兩步完成,首先,添加一個 get 函數,然后在父對象類型(鍵)的無序散列中添加一個條目,與 get 函數(值)配對。但現實是一旦我們完全實現了這個功能,就幾乎沒有人會直接使用各個 get 功能。
使用lambdas,我們還可以消除獨立的 get 函數,進一步減少我們必須編寫(和維護)的代碼行數。為了代碼清晰,我們還添加了一些換行符。
如果您一直在關注,那么您應該對最后一個代碼片段會感到滿意。您應該明白,在這個片段中,我們正在構建一個靜態無序哈希,它允許我們按 Exchange 對象類型查找函數對象。在這個片段中,我們只用兩個對象類型的兩個 getter 填充無序散列,并理解一個完整的實現將包括所有對象類型的所有 getter。
完整實現getChildren本身就很有用。但我們可以做得更多,讓它變得更好。例如,如果我們查看 A3DAsmProductOccurrence,我們會注意到我們的函數可能返回不同類型的孩子。該功能可以返回的類型的孩子A3DAsmProductOccurrence,A3DAsmPartDefinition,A3DMkpView,A3DGraphCamera,或 A3DMkpAnnotationEntity。如果我們允許函數的使用者指定他們想要哪種類型的子對象,這將更加通用(和有用)。讓我們實現getChildren它來處理我們剛剛描述的情況。再次理解,一個完整的實現將包括所有父對象類型,以及所有可能類型的子對象的 getter。在這里,我們只展示代表整體的一小部分。
想象一下,如果直接跳到這個實現。這會有點壓倒性,而且肯定會令人困惑。但我們已經采取了一系列合乎邏輯的步驟來實現這一目標。那么,我們有什么?
我們已經(部分)實現了一個函數,該函數接受一個任意父對象 (ntt ) 和一個所需的子對象類型 (child_type)。在內部,該函數由一個靜態映射 ( _getterMapByParentType )組成,它允許我們按父類型查找所需的 getter 函數,然后按所需的子類型查找。我添加了一些注釋以使構造函數的結構更具可讀性。
現在,想象一下這個結構完全填充了所有可能類型的子項的所有 Exchange 對象類型和 getter 函數。不要將其視為功能,而是將其視為數據模型。它是一個數據模型,表達了 HOOPS Exchange 中存在的完整父子關系集!或許你可以看到我們的發展方向。
我們已經建立了一種簡潔的方法來促進 Exchange 使用的對象層次結構以及允許我們遍歷它的嵌入式功能。
在第 2 部分中,我們將深入研究使用我們剛剛創建的數據模型智能導航層次結構的算法,幫助使用者從給定的父對象獲取任意類型的后代。
除了上述信息之外,技術還提供對各種其他相關信息的訪問,例如構造幾何、面名稱、坐標系、圖層/過濾器設置和用戶定義的屬性等。如果您還想了解HOOPS Exchange相關的更多信息,歡迎咨詢專線:18166486035(微信同號)
慧都科技是Tech Soft 3D-HOOPS在中國區的唯一增值服務商,負責試用,咨詢,銷售,技術支持,售后,旨在為企業提供一站式的3D開發解決方案。如果您的企業目前也有、的需求,歡迎咨詢在線客服申請3D 輕量化引擎的60天免費試用。
↓↓掃碼添加客服微信,及時獲取“HOOPS技術”支持↓↓
經過10余年的經驗沉淀,慧都3D研發團隊推出了一系列的工業3D解決方案,包括BIM解決方案、PDM解決方案、CAE解決方案、機器人運動仿真解決方案、協同設計解決方案、3D打印解決方案,詳情請點擊此處了解。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn