原創(chuàng)|3D產(chǎn)品功能介紹|編輯:何家巧|2021-12-01 15:42:38.023|閱讀 177 次
概述:這是兩部分文章中的第一部分,我們將在其中開發(fā)一種通用算法,用于遍歷 HOOPS Exchange 中實(shí)現(xiàn)的對象層次結(jié)構(gòu)。遍歷對象層次結(jié)構(gòu)是幾乎每個工作流程的重要且無處不在的部分。我們在這里描述的算法可以在Exchange Toolkit 中找到。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
這是兩部分文章中的第一部分,我們將在其中開發(fā)一種通用算法,用于遍歷 HOOPS Exchange 中實(shí)現(xiàn)的對象層次結(jié)構(gòu)。遍歷對象層次結(jié)構(gòu)是幾乎每個工作流程的重要且無處不在的部分。我們在這里描述的算法可以在Exchange Toolkit 中找到。
HOOPS Exchange 是一個軟件開發(fā)工具包,它可以幫助應(yīng)用程序開發(fā)人員讀取各種標(biāo)準(zhǔn)和專有 3D 文件格式,例如 STL、OBJ、STEP、IGES、SolidWorks 和 CATIA。除了 3D 幾何之外,HOOPS Exchange 還提供對裝配樹的訪問,裝配樹是由設(shè)計師創(chuàng)作的 3D 數(shù)據(jù)的邏輯結(jié)構(gòu)。
用于表示復(fù)雜 3D 數(shù)據(jù)集的數(shù)據(jù)結(jié)構(gòu)具有層次關(guān)系。例如,在使用 HOOPS Exchange 加載文件后,您將獲得一個A3DAsmModelFile對象。這個“頂級”對象由一個或多個裝配節(jié)點(diǎn)組成,存儲為 C 風(fēng)格 A3DAsmProductOccurence對象數(shù)組。此外,這些裝配節(jié)點(diǎn)對象是遞歸的。也就是說, anA3DAsmProductOccurence可以包含一個“子”A3DAsmProductOccurrence對象數(shù)組和/或A3DAsmPartDefinition代表 3D 部件的 。
通過檢查HOOPS Exchange B-Rep 數(shù)據(jù)中存在的拓?fù)鋵ο螅梢钥吹綄ο笾g層次關(guān)系的其他示例。在這個經(jīng)典場景中,我們發(fā)現(xiàn) A3DTopoBrepData 包含一個 A3DTopoConnexes 數(shù)組,其中包含一個 A3DTopoShell 對象數(shù)組。殼包含面,其中包含循環(huán),包含共邊,包含邊,最終包含頂點(diǎn)。
到目前為止,我們已經(jīng)確定對象之間的層次關(guān)系在 HOOPS Exchange 中普遍存在,并且需要一種用于遍歷對象的通用算法。
我們的目標(biāo)是創(chuàng)建一個通用的算法,它需要兩個輸入--一個任意類型的 "擁有 "對象和一個類型指定器。這個算法的返回值應(yīng)該是一個對象的集合,所有的對象都是指定的子類型,這些對象是由擁有對象直接或通過中間對象隱含地?fù)碛小N覀儗⒎植綄?shí)現(xiàn)這一目標(biāo)。
首先,我們需要一個函數(shù)來返回直接包含在父級中的對象。例如,要檢索殼內(nèi)的所有面,我們將編寫如下函數(shù):
這個函數(shù)體是一個模式,對層次結(jié)構(gòu)中的每個對象都會重復(fù)。正如你所看到的,這有點(diǎn)冗長,而且不是很通用。
如果我們使用ExhangeToolkit.h 中提供的數(shù)據(jù)訪問工具,我們可以將代碼大幅簡化為更易于管理的內(nèi)容:
除了更容易管理之外,這個實(shí)現(xiàn)也不容易出錯。
為了使其更加通用,我們可以利用A3DTopoShell和A3DTopoFace都是同一類型(void)的別名這一事實(shí)。由于這段代碼是 "以Exchange為中心 "的,我們可以用A3DEntity替換參數(shù)類型和返回類型。這個類型表示Exchange中的基本類型,也是對void類型的別名。
在做了這個改變之后,我們的函數(shù)簽名開始看起來更通用:
作為下一步,我們可以修改這個函數(shù)以接受任何類型的父類,并通過切換實(shí)體類型返回子類集合。
函數(shù)getFaceLoops將像getShellFaces那樣實(shí)現(xiàn)。你會注意到,我們把std::vector換掉了,用ts3d::EntityArray代替了它。它們是等效的類型,這一變化進(jìn)一步有利于簡潔和可維護(hù)性。
switch語句只實(shí)現(xiàn)了上述兩種情況,所以它只處理兩種Exchange對象類型。它可以被擴(kuò)展到處理Exchange架構(gòu)中使用的所有對象類型。要做到這一點(diǎn),我們需要為每種類型的對象聲明一個獨(dú)特的函數(shù),并幫助它返回其中可用的子對象。這將導(dǎo)致大量的代碼,即使我們做了所有的修改,使其更加簡潔(并且不容易出錯)。
我們可以使用函數(shù)對象和無序哈希來管理這種大規(guī)模的代碼擴(kuò)展。
讓我們分兩步來看看這組變化。
仍然只關(guān)注我們到目前為止所引用的兩種對象類型,通過使用函數(shù)對象和無序散列,我們可以將getChildren函數(shù)重寫如下。
我們繼續(xù)關(guān)注
處理新類型現(xiàn)在可以分兩步完成,首先,添加一個 get 函數(shù),然后在父對象類型(鍵)的無序散列中添加一個條目,與 get 函數(shù)(值)配對。但現(xiàn)實(shí)是一旦我們完全實(shí)現(xiàn)了這個功能,就幾乎沒有人會直接使用各個 get 功能。
使用lambdas,我們還可以消除獨(dú)立的 get 函數(shù),進(jìn)一步減少我們必須編寫(和維護(hù))的代碼行數(shù)。為了代碼清晰,我們還添加了一些換行符。
如果您一直在關(guān)注,那么您應(yīng)該對最后一個代碼片段會感到滿意。您應(yīng)該明白,在這個片段中,我們正在構(gòu)建一個靜態(tài)無序哈希,它允許我們按 Exchange 對象類型查找函數(shù)對象。在這個片段中,我們只用兩個對象類型的兩個 getter 填充無序散列,并理解一個完整的實(shí)現(xiàn)將包括所有對象類型的所有 getter。
完整實(shí)現(xiàn)getChildren本身就很有用。但我們可以做得更多,讓它變得更好。例如,如果我們查看 A3DAsmProductOccurrence,我們會注意到我們的函數(shù)可能返回不同類型的孩子。該功能可以返回的類型的孩子A3DAsmProductOccurrence,A3DAsmPartDefinition,A3DMkpView,A3DGraphCamera,或 A3DMkpAnnotationEntity。如果我們允許函數(shù)的使用者指定他們想要哪種類型的子對象,這將更加通用(和有用)。讓我們實(shí)現(xiàn)getChildren它來處理我們剛剛描述的情況。再次理解,一個完整的實(shí)現(xiàn)將包括所有父對象類型,以及所有可能類型的子對象的 getter。在這里,我們只展示代表整體的一小部分。
想象一下,如果直接跳到這個實(shí)現(xiàn)。這會有點(diǎn)壓倒性,而且肯定會令人困惑。但我們已經(jīng)采取了一系列合乎邏輯的步驟來實(shí)現(xiàn)這一目標(biāo)。那么,我們有什么?
我們已經(jīng)(部分)實(shí)現(xiàn)了一個函數(shù),該函數(shù)接受一個任意父對象 (ntt ) 和一個所需的子對象類型 (child_type)。在內(nèi)部,該函數(shù)由一個靜態(tài)映射 ( _getterMapByParentType )組成,它允許我們按父類型查找所需的 getter 函數(shù),然后按所需的子類型查找。我添加了一些注釋以使構(gòu)造函數(shù)的結(jié)構(gòu)更具可讀性。
現(xiàn)在,想象一下這個結(jié)構(gòu)完全填充了所有可能類型的子項的所有 Exchange 對象類型和 getter 函數(shù)。不要將其視為功能,而是將其視為數(shù)據(jù)模型。它是一個數(shù)據(jù)模型,表達(dá)了 HOOPS Exchange 中存在的完整父子關(guān)系集!或許你可以看到我們的發(fā)展方向。
我們已經(jīng)建立了一種簡潔的方法來促進(jìn) Exchange 使用的對象層次結(jié)構(gòu)以及允許我們遍歷它的嵌入式功能。
在第 2 部分中,我們將深入研究使用我們剛剛創(chuàng)建的數(shù)據(jù)模型智能導(dǎo)航層次結(jié)構(gòu)的算法,幫助使用者從給定的父對象獲取任意類型的后代。
點(diǎn)擊,了解HOOPS更多詳情。
慧都科技是Tech Soft 3D-Hoops在中國區(qū)的唯一增值服務(wù)商,提供Hoops試用,咨詢,銷售,技術(shù)支持,售后,擁有工業(yè)3D解決方案,如果您對此感興趣,歡迎電話咨詢:400-700-1020
↓ ↓ ↓ 掃碼關(guān)注“HOOPS”微信公眾號,及時獲取更多技術(shù)資訊 ↓ ↓ ↓
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn