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