黃 靖, 王 斌,, 胡楷模,, 張 慧,
(1. 清華大學(xué)軟件學(xué)院,北京 100084;2. 清華大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)系,北京 100084;3. 信息系統(tǒng)安全教育部重點(diǎn)實(shí)驗(yàn)室,北京 100084;4. 清華大學(xué)信息科學(xué)與技術(shù)國(guó)家實(shí)驗(yàn)室,北京 100084)
基于DAG表示與產(chǎn)生式的IGES裝配體數(shù)據(jù)交換算法
黃 靖1, 王 斌1,3,4, 胡楷模1,2,3,4, 張 慧1,3,4
(1. 清華大學(xué)軟件學(xué)院,北京 100084;2. 清華大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)系,北京 100084;3. 信息系統(tǒng)安全教育部重點(diǎn)實(shí)驗(yàn)室,北京 100084;4. 清華大學(xué)信息科學(xué)與技術(shù)國(guó)家實(shí)驗(yàn)室,北京 100084)
初始圖形交換規(guī)范(IGES)是目前應(yīng)用最為廣泛的中性文件格式標(biāo)準(zhǔn)之一,但是相關(guān)的研究主要集中在單零件的格式轉(zhuǎn)換上面,對(duì)設(shè)計(jì)中經(jīng)常用到的裝配體的IGES格式研究較少。該文總結(jié)了常用CAD軟件中裝配體導(dǎo)出的IGES文件存儲(chǔ)格式,提出并實(shí)現(xiàn)了一種基于圖表示與產(chǎn)生式規(guī)則的IGES裝配體數(shù)據(jù)交換算法,將IGES格式的解析過(guò)程標(biāo)準(zhǔn)化,使其具有通用性和可擴(kuò)展性,并且正確性可以進(jìn)行形式化驗(yàn)證。應(yīng)用該方法,該文具體實(shí)現(xiàn)了多文件格式的裝配體IGES前置和后置處理器。在幾何造型系統(tǒng)TiGems7.0中進(jìn)行的實(shí)驗(yàn)結(jié)果表明該算法具有較快的速度,也具有較好的魯棒性。
初始圖形交換規(guī)范;裝配體;數(shù)據(jù)交換;有向無(wú)環(huán)圖;產(chǎn)生式
初始圖形交換規(guī)范(IGES)是目前應(yīng)用最為廣泛的中性文件格式標(biāo)準(zhǔn)之一。知名的CAD軟件,包括 Solidworks,Unigraphics NX(以下簡(jiǎn)稱(chēng) UGS),Pro/Engineering(以下簡(jiǎn)稱(chēng) Pro/E),CATIA等都配置了IGES的導(dǎo)入/導(dǎo)出接口。由于數(shù)據(jù)交換算法對(duì)于實(shí)現(xiàn)CAD零部件的大規(guī)模復(fù)用起著非常重要的關(guān)鍵作用,所以基于IGES標(biāo)準(zhǔn)的數(shù)據(jù)交換算法及其相關(guān)問(wèn)題在近年來(lái)也得到了廣泛研究。
然而,現(xiàn)有的大部分方法主要是針對(duì) IGES基本零部件的數(shù)據(jù)交換,以及與其相關(guān)的拓?fù)渲貥?gòu)算法、曲面縫合算法、拓?fù)涠ㄏ蛩惴ㄌ岢龅?,關(guān)于IGES裝配體導(dǎo)入導(dǎo)出的相關(guān)理論和算法仍然很少。同時(shí),由于涉及商業(yè)機(jī)密,現(xiàn)有商業(yè)軟件對(duì)其基于IGES裝配體的算法的設(shè)計(jì)原則和接口細(xì)節(jié)緘口不提。但從另外一方面來(lái)講,為方便工業(yè)界中對(duì)零部件的交互設(shè)計(jì),以及學(xué)術(shù)界中在對(duì)幾何約束求解算法的研究中借鑒成熟CAD軟件,十分有必要對(duì)IGES裝配體的數(shù)據(jù)交換模塊進(jìn)行研究和實(shí)現(xiàn)。
早期有關(guān)IGES的論文主要以介紹不斷更新的IGES標(biāo)準(zhǔn)為主,通過(guò)對(duì)IGES標(biāo)準(zhǔn)本身的分析,給業(yè)界提供一定的借鑒意義[1-3]。隨著IGES標(biāo)準(zhǔn)的不斷成熟和完善,越來(lái)越多的學(xué)者開(kāi)始研究IGES前后置處理器設(shè)計(jì)以及相應(yīng)的曲線曲面算法[4-8]。其中Kahrs等[7]描述了前置處理器設(shè)計(jì),重點(diǎn)討論了如何從IGES實(shí)體中提取有用信息,以及如何把IGES中的實(shí)體轉(zhuǎn)換到適當(dāng)?shù)淖鴺?biāo)系統(tǒng)中;Kahrs[8]在1995年分析了IGES的句法,介紹了IGES所包含的主要實(shí)體以及內(nèi)部實(shí)現(xiàn)細(xì)節(jié),并且在最后分析了前后置處理器的復(fù)雜度,為前后置處理器的設(shè)計(jì)提供了一定的理論依據(jù)。
隨著我國(guó)CAD技術(shù)的不斷發(fā)展,更多的國(guó)內(nèi)學(xué)者也針對(duì)IGES數(shù)據(jù)交換做了有益的工作。劉德智等[9]較早設(shè)計(jì)了一種基于裁剪NURBS曲面片的IGES曲面模型的前后置處理器,討論了邊界表示(B-Rep)表示的實(shí)體模型和曲面模型的相互轉(zhuǎn)換,采用基于OpenEdge結(jié)構(gòu)的曲面拓?fù)湫畔⒅亟夹g(shù)實(shí)現(xiàn)了拓?fù)渲貥?gòu);他們還對(duì)一些典型的CAD/CAM系統(tǒng)支持的IGES元素(實(shí)體)進(jìn)行了總結(jié),并給出了簡(jiǎn)略的IGES曲面模型的組織樹(shù)圖。冉紅強(qiáng)等[10]介紹了IGES后處理器設(shè)計(jì)的全過(guò)程,提出了將曲面模型轉(zhuǎn)換為實(shí)體模型的方法——以曲面拼合為核心的拓?fù)湫畔⒅貥?gòu)算法,同時(shí)引入了兩種控制曲線精度的方法。徐昕等[11]探討了用IGES文件作為數(shù)據(jù)交換文件開(kāi)發(fā)IGES后處理器,實(shí)現(xiàn)了CMM(三坐標(biāo)測(cè)量機(jī))與CAD集成的算法。
由于上述算法所針對(duì)的IGES曲面模型中不記錄零部件的拓?fù)湫畔?,所以在后置處理器處理時(shí)必須進(jìn)行相應(yīng)的拓?fù)渲貥?gòu),這需要經(jīng)過(guò)曲面拼合、拓?fù)涠ㄏ虻却罅康臄?shù)值計(jì)算,算法較為復(fù)雜,并且容易由于容差定義不一致而導(dǎo)致轉(zhuǎn)換失敗。針對(duì)這一問(wèn)題,胡楷模等[12]基于IGES5.3標(biāo)準(zhǔn),設(shè)計(jì)并實(shí)現(xiàn)了基于邊界表示(B-rep)的IGES前后置處理器,實(shí)現(xiàn)了對(duì)單零件IGES格式(包括186多面實(shí)體B-Rep格式和144曲面格式)的導(dǎo)入和導(dǎo)出算法。針對(duì)IGES標(biāo)準(zhǔn)中實(shí)體模型有可能缺少參數(shù)域的情況,他們還提出了一套用于后置處理器中的參數(shù)域重構(gòu)和修正算法[13]。
然而,上述算法和系統(tǒng)僅僅討論了基本零件(包括曲面模型和實(shí)體模型)的導(dǎo)入導(dǎo)出和系統(tǒng)實(shí)現(xiàn),并沒(méi)有涉及裝配體數(shù)據(jù)交換的相關(guān)理論和算法。截止目前查閱過(guò)的已有文獻(xiàn)中,僅有孫偉寧等[14]提出了IGES裝配體信息的提取流程,實(shí)現(xiàn)了Pro/E形式的裝配體數(shù)據(jù)導(dǎo)入。但是,其分析是基于Pro/E的單文件裝配體IGES格式的,對(duì)其他幾個(gè)軟件的IGES并未包括在內(nèi)——事實(shí)上,本文的研究表明,CAD軟件之間的裝配體IGES存儲(chǔ)格式有不小的差距;并且文獻(xiàn)[14]只實(shí)現(xiàn)了后置處理器,而沒(méi)有實(shí)現(xiàn)IGES導(dǎo)出的前置處理器。
另外,IGES標(biāo)準(zhǔn)[15]規(guī)定,聲稱(chēng)支持該標(biāo)準(zhǔn)的實(shí)現(xiàn)應(yīng)當(dāng)說(shuō)明對(duì)標(biāo)準(zhǔn)中各個(gè)實(shí)體類(lèi)型號(hào)及格式號(hào)的支持情況,但是調(diào)查表明,并沒(méi)有任何一個(gè)CAD軟件說(shuō)明支持情況的IGES用戶(hù)文檔。針對(duì)以上現(xiàn)狀,本文通過(guò)測(cè)試逆推的方法分析研究了當(dāng)前Solidworks、UGS、Pro/E、CATIA等軟件生成的IGES裝配體文件存儲(chǔ)格式。在分析的過(guò)程中,本文提出了一種基于有向無(wú)環(huán)圖(DAG)和產(chǎn)生式表示的IGES裝配體數(shù)據(jù)交換算法,通過(guò)這種表示可以形式化定義裝配體的數(shù)據(jù)結(jié)構(gòu),保證系統(tǒng)轉(zhuǎn)換理論上的完備性和實(shí)踐上的可行性。在此基礎(chǔ)上,本文基于文獻(xiàn)[12]所實(shí)現(xiàn)的單零件前后置處理器,設(shè)計(jì)和實(shí)現(xiàn)了基于IGES裝配體的前后置處理器,可以統(tǒng)一處理與上述4種商業(yè)軟件的裝配體數(shù)據(jù)交換。
一般而言,裝配體可以看作一個(gè)較為復(fù)雜的樹(shù)狀結(jié)構(gòu)。為便于討論,首先定義本文表述中常用的一些名詞。
定義1(零件) 不含任何裝配信息的基本零件,對(duì)應(yīng)普通個(gè)體或裝配樹(shù)的葉子。
定義2(裝配體) 包含一定裝配信息的零件集合,對(duì)應(yīng)裝配樹(shù)的非葉子結(jié)點(diǎn),有時(shí)也指以該結(jié)點(diǎn)為根的子樹(shù)。
定義3(組件) 零件和裝配體統(tǒng)稱(chēng)為組件,對(duì)應(yīng)裝配樹(shù)的任意結(jié)點(diǎn)。
定義4(總裝配) 裝配體中的最頂層裝配體,對(duì)應(yīng)裝配樹(shù)的根結(jié)點(diǎn)。
定義5(子裝配) 裝配體中非總裝配的裝配體,對(duì)應(yīng)裝配樹(shù)的非根且非葉結(jié)點(diǎn)。
定義6(子組件) 裝配體下屬的直接子裝配或基本零件通稱(chēng)為子組件,對(duì)應(yīng)裝配結(jié)點(diǎn)所屬的直接子結(jié)點(diǎn)。
IGES標(biāo)準(zhǔn)[15]規(guī)定,一個(gè)IGES文件按下述次序由 5個(gè)或 6個(gè)順序編號(hào)的段組成:標(biāo)志段(Flag)、開(kāi)始段(Start)、全局段(Global)、目錄條目段(Directory Entry)、參數(shù)數(shù)據(jù)段(Parameter Data)和結(jié)束段(Terminate)組成,對(duì)應(yīng)的標(biāo)識(shí)符分別為首字母F、S、G、D、P、T,其中標(biāo)志段(F)為可選。由于主要的CAD/CAM系統(tǒng)均只支持未壓縮的ASCII格式,因此一般文件不包含標(biāo)志段。開(kāi)始段(S)一般包含生成文件的前置處理器的名字,全局段(G)包含作者、時(shí)間和精度等信息,結(jié)束段(T)包含每個(gè)段的標(biāo)識(shí)符及所使用的最大序號(hào),這3個(gè)部分包含的信息與數(shù)據(jù)本身并沒(méi)有太大聯(lián)系,因此數(shù)據(jù)內(nèi)容主要包含在目錄條目段(D)和參數(shù)數(shù)據(jù)段(P)中。數(shù)據(jù)的基本單元是實(shí)體,每個(gè)實(shí)體的格式包括一個(gè)實(shí)體類(lèi)型和格式號(hào)。對(duì)每一種實(shí)體類(lèi)型來(lái)說(shuō),缺省格式號(hào)為0;某些實(shí)體有大于0的格式號(hào),用以區(qū)分附加的功能。D段和P段均是由若干實(shí)體構(gòu)成,其中D段為包含固定長(zhǎng)度的表示公共屬性的數(shù)據(jù),每個(gè)實(shí)體占兩行,第k個(gè)實(shí)體占據(jù)D段的第2k-1行和第2k行,索引值為2k-1;P段的實(shí)體則按順序和D段實(shí)體一一對(duì)應(yīng),包含該實(shí)體特有的數(shù)據(jù)。在本文中,指針即為索引,例如,“實(shí)體a具有指向?qū)嶓wb的指針”指的是“實(shí)體a的D段或P段包含實(shí)體b的D段的索引值”。
文獻(xiàn)[9]和文獻(xiàn)[14]都給出了一些CAD/CAM系統(tǒng)支持的IGES實(shí)體類(lèi)型號(hào)列表,但是均不完整。經(jīng)過(guò)詳細(xì)測(cè)試,表1給出了包含裝配體在內(nèi)的典型CAD/CAM系統(tǒng)對(duì)IGES標(biāo)準(zhǔn)支持的實(shí)體集合總結(jié)(括號(hào)內(nèi)數(shù)字表示格式號(hào),未注明格式號(hào)的為缺省值)。
IGES格式中不同的實(shí)體之間是通過(guò)指針標(biāo)號(hào)相互關(guān)聯(lián)的,如果把每個(gè)實(shí)體看成圖的頂點(diǎn),在實(shí)體的數(shù)據(jù)域中的D段指針看成是有向邊,那么就能得到一個(gè)有向無(wú)環(huán)圖。并且,由于 IGES標(biāo)準(zhǔn)的定義中不允許正向指針,即指針只能從序號(hào)大的實(shí)體指向序號(hào)小的實(shí)體,因此整個(gè) IGES文件的實(shí)體存儲(chǔ)順序?qū)嶋H上是對(duì)該圖的一種拓?fù)渑判虻姆葱蚺帕小?/p>
表1 典型CAD/CAM系統(tǒng)支持的IGES實(shí)體類(lèi)型/格式號(hào)
以圖1所示的簡(jiǎn)單裝配樹(shù)為例分析IGES標(biāo)準(zhǔn)對(duì)于裝配體格式的定義結(jié)構(gòu)。該裝配體由兩個(gè)相同的長(zhǎng)方體以及一個(gè)圓柱體構(gòu)成:首先圓柱體和其中一個(gè)長(zhǎng)方體以共面約束構(gòu)成一個(gè)子裝配,然后該子裝配和另一長(zhǎng)方體以另一共面約束構(gòu)成總裝配。該裝配體的裝配樹(shù)如圖1(b)所示。注意圖1(a)中裝配體的兩個(gè)長(zhǎng)方體用的是同一零件,且子裝配對(duì)應(yīng)的REC-CYL文件在物理上其實(shí)是不存在的。
圖1 具有3層裝配結(jié)構(gòu)的裝配樹(shù)
由于裝配體中不同子裝配有可能指向同一葉子節(jié)點(diǎn),所以本文將文獻(xiàn)[9]中的樹(shù)圖擴(kuò)展到了裝配體的有向無(wú)環(huán)圖。將圖1所示的簡(jiǎn)單裝配體用Solidworks以多文件的IGES存儲(chǔ)格式導(dǎo)出,則其實(shí)體關(guān)系所對(duì)應(yīng)的有向無(wú)環(huán)圖如圖2所示。
圖2 Solidworks導(dǎo)出的多文件IGES格式實(shí)體關(guān)系圖
在實(shí)驗(yàn)中以Solidworks為例,測(cè)試了大量裝配樹(shù)所對(duì)應(yīng)的實(shí)體關(guān)系抽象圖,同時(shí)參照 IGES的最新標(biāo)準(zhǔn)[15]中的相關(guān)定義,總結(jié)出如下兩條重要規(guī)律:
1) 相關(guān)性實(shí)例實(shí)體402的孩子總是由一系列單子圖實(shí)例實(shí)體408或408-402組合加上1個(gè)變換矩陣實(shí)體124和1個(gè)名稱(chēng)特性實(shí)體406(格式號(hào)為15)組成;
2) 單子圖實(shí)例實(shí)體408的孩子總是由1個(gè)子圖定義實(shí)體308(可能共用)和變換矩陣實(shí)體124組成。
將這些關(guān)系以產(chǎn)生式形式描述出來(lái),可以得到如下產(chǎn)生式(其中“+”表示1個(gè)或多個(gè),“?”表示0個(gè)或1個(gè)):
(1) [402] ? ([408] | ([408] [402]))+[124] [406-15]
(2) [408] ? [308]? [124]
(3) [308] ? [416]
(4) [416] ? [文件名]
(5) [406-12] ? [文件名]+
這些產(chǎn)生式就構(gòu)成了裝配體IGES文件的骨架,也是下面多文件IGES裝配體導(dǎo)出/導(dǎo)入算法的基礎(chǔ)。事實(shí)上,對(duì)于各個(gè)CAD/CAM系統(tǒng)的單文件格式,其主要思想也是相同的。
本文在前后置處理器中設(shè)計(jì)了如下內(nèi)置裝配樹(shù)數(shù)據(jù)結(jié)構(gòu):裝配體的類(lèi)是AssemblyStep,零件的類(lèi)為 PartStep,它們都是組件類(lèi)ComponentStep的子類(lèi),AssemblyStep具有一個(gè)ComponentStep指針列表指向子組件,PartStep具有一個(gè) Body的指針指向零件體內(nèi)容。每個(gè)ComponentStep都包含名稱(chēng)、文件名及一個(gè)變換矩陣Ucs。該數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)的類(lèi)圖如圖3所示。
對(duì)比實(shí)體關(guān)系圖與數(shù)據(jù)結(jié)構(gòu)類(lèi)圖,容易得到IGES標(biāo)準(zhǔn)中定義的實(shí)體與內(nèi)置數(shù)據(jù)結(jié)構(gòu)之間的對(duì)應(yīng)關(guān)系,如表2所示。
表2 實(shí)體類(lèi)型同內(nèi)置數(shù)據(jù)結(jié)構(gòu)之間的對(duì)應(yīng)關(guān)系
由于導(dǎo)出算法要有輸出,因此需要在進(jìn)行產(chǎn)生式變換的同時(shí)進(jìn)行輸出。為方便導(dǎo)出,可以把輸出看成是終止符號(hào)(用尖括號(hào)表示),則原有的產(chǎn)生式可改寫(xiě)為如下形式:
(1) [裝配體文件 D 段或 P段] ?[406-12][402]
(2) [402] ? ([408] | ([408] [402]))+[124] [406-15]<402>
(3) [408] ? [308]? [124]<408>
(4) [308] ? [416]<308>
(5) [416] ? <416>(包含[文件名])
(6) [406-12] ? <406-12>(包含[文件名]+)
(7) [406-15] ? <406-15>(包含[組件名])
(8) [124] ? <124>
Procedure Write408()
//功能:輸出408實(shí)體樹(shù)
Begin
(9) [文件名] ?
(10) [組件名] ?
在上面的產(chǎn)生式中,為滿足IGES標(biāo)準(zhǔn)規(guī)定的拓?fù)渑判虻男再|(zhì),終止符號(hào)應(yīng)放在每個(gè)產(chǎn)生式的最后,使得該實(shí)體的所有子實(shí)體均已輸出完畢之后再輸出該實(shí)體本身,如產(chǎn)生式(2)~(4)所示。
在IGES文件中,實(shí)體主要通過(guò)目錄條目段(Directory Entry)、參數(shù)數(shù)據(jù)段(Parameter Data)中的相互引用而組織起來(lái),因此,對(duì)于每項(xiàng)實(shí)體,需要同時(shí)在P段和D段添加指針。對(duì)于修改后的每項(xiàng)產(chǎn)生式,容易直接寫(xiě)出其相應(yīng)的導(dǎo)出函數(shù)。例如對(duì)于單子圖實(shí)例實(shí)體所對(duì)應(yīng)的(3)式,可以直接寫(xiě)出如下類(lèi)似后序遍歷的函數(shù):
If (PartBody已訪問(wèn)過(guò)) Then Dire308 := PartBody.Dire308;
Else Dire308 := Write308();
ent408.addPara(Dire308); //在P段添加指針
ent408.addDire(Write124()); //在D段添加指針
Return WriteEntity(ent408); //返回本408實(shí)體的指針End.
其它子過(guò)程可類(lèi)似寫(xiě)出,不再一一列舉。將所有產(chǎn)生式的導(dǎo)出函數(shù)展開(kāi),可得到基于Solidworks多文件存儲(chǔ)IGES裝配體導(dǎo)出算法,其主要流程如下:
1) 輸出標(biāo)志段(F)、開(kāi)始段(S)和全局段(G)配置全局參數(shù)到文件;
2) 遍歷裝配樹(shù)獲得所有子組件的文件名列表,輸出406-格式12實(shí)體;
3) 將總裝配設(shè)為當(dāng)前裝配;
4) 如果當(dāng)前裝配存在下一個(gè)直接子組件,將其設(shè)為當(dāng)前組件,轉(zhuǎn)到步驟5);否則轉(zhuǎn)到步驟10);
5) 如果當(dāng)前組件是零件,則轉(zhuǎn)到步驟6);否則設(shè)為當(dāng)前裝配,并轉(zhuǎn)到步驟9);
6) 如果已訪問(wèn)過(guò)零件體內(nèi)容,則添加原308實(shí)體指針到408實(shí)體,并轉(zhuǎn)到步驟8);
7) 調(diào)用單零件輸出模塊[12]輸出到相應(yīng)文件,輸出包含零件文件名的416實(shí)體,并添加指針到308實(shí)體,輸出308實(shí)體并將指針添加到408實(shí)體;
8) 輸出本零件變換矩陣生成的124實(shí)體并添加指針到408實(shí)體,輸出408實(shí)體并將指針添加到上一級(jí)402實(shí)體,轉(zhuǎn)到步驟4);
9) 輸出包含文件名的416實(shí)體(文件實(shí)質(zhì)上不存在)并添加指針到308實(shí)體,輸出308實(shí)體并添加指針到408實(shí)體,輸出本裝配變換矩陣生成的124實(shí)體并添加指針到408實(shí)體,輸出408實(shí)體并將指針添加到本級(jí) 402實(shí)體,轉(zhuǎn)到步驟4);
10) 輸出包含變換矩陣的 124實(shí)體并將指針添加到402實(shí)體,輸出包含名稱(chēng)的406實(shí)體格式15并將指針添加到402實(shí)體,輸出402實(shí)體,如果當(dāng)前裝配是總裝配,則轉(zhuǎn)到步驟11);否則將指針添加到上一級(jí)402實(shí)體并將當(dāng)前裝配設(shè)成上一級(jí)裝配,轉(zhuǎn)到步驟4);
11) 計(jì)算 P段中每個(gè)實(shí)體占用的行數(shù)并對(duì)緩沖區(qū)中D段和P段中相應(yīng)的字段進(jìn)行填充,將包含D段和P段內(nèi)容的緩沖區(qū)輸出到文件;
12) 輸出結(jié)束段(T)到文件。
在IGES文件中,所有的D段數(shù)據(jù)均在P段數(shù)據(jù)之前,而且D段實(shí)體和P段實(shí)體存在一一對(duì)應(yīng)關(guān)系。為提高輸出效率,在上述導(dǎo)出算法中,未指明輸出到文件的輸出都是指同時(shí)輸出到目錄條目段(D)和參數(shù)數(shù)據(jù)段(P)的緩沖區(qū),只有當(dāng)所有實(shí)體均已處理完成時(shí),才最終填充D段和P段相應(yīng)字段的數(shù)據(jù),并輸出到文件。
對(duì)于Solidworks的單文件格式,用同樣的分析方法可以得到表達(dá)裝配的產(chǎn)生式:
(1) [裝配體文件D段或P段] ? [總體408]
(2) [總體408] ? [308] <408>
(3) [308] ? [408]+ | [零件內(nèi)容]
(4) [408] ? [308]? [124] <408>
(5) [124] ? <124>
(6) [零件內(nèi)容] ? [186] | [144]* (進(jìn)入單零件導(dǎo)入部分)
更進(jìn)一步,還可以寫(xiě)出零件IGES格式對(duì)應(yīng)的產(chǎn)生式。鑒于本文主要研究對(duì)象是裝配體,而零件格式的導(dǎo)入/導(dǎo)出可由原有模塊實(shí)現(xiàn),這里就不一一列舉產(chǎn)生式了。
經(jīng)過(guò)測(cè)試發(fā)現(xiàn),Solidworks、UGS和 Pro/E均能讀取Solidworks的單文件格式的IGES,而CATIA讀取時(shí)會(huì)丟失層次關(guān)系,但是其原因在于CATIA本身沒(méi)有實(shí)現(xiàn)IGES的裝配層次關(guān)系導(dǎo)入與導(dǎo)出。因此只需利用 Solidworks單文件輸出IGES格式,即可實(shí)現(xiàn)各個(gè)CAD軟件能夠正確識(shí)別的IGES文件的導(dǎo)出。
在導(dǎo)入算法中,本文應(yīng)用原有的詞法分析模塊,首先將文件按相應(yīng)實(shí)體的填充定義導(dǎo)入內(nèi)存,在此基礎(chǔ)上構(gòu)造內(nèi)置裝配樹(shù),最后讀入零件內(nèi)容。算法主要流程如下:
1) 讀取標(biāo)志段(F)、開(kāi)始段(S)和全局段(G)配置全局參數(shù);
2) 將目錄條目段(D)和參數(shù)數(shù)據(jù)段(P)數(shù)據(jù)按格式讀入線性表;
3) 如果存在402實(shí)體,判斷為裝配體類(lèi)型,轉(zhuǎn)到步驟4);
否則判斷為零件類(lèi)型,調(diào)用零件讀入模塊進(jìn)行輸入,轉(zhuǎn)到步驟13);
4) 新建裝配根結(jié)點(diǎn)(總裝配)并設(shè)為當(dāng)前裝配,將文件末的402實(shí)體設(shè)為當(dāng)前402實(shí)體;
5) 如果當(dāng)前402實(shí)體存在下一個(gè)子結(jié)點(diǎn),則判斷子節(jié)點(diǎn)的類(lèi)型:
如果是124實(shí)體,則轉(zhuǎn)到步驟6);
如果是402實(shí)體,則將其設(shè)為當(dāng)前402實(shí)體并轉(zhuǎn)到步驟7);
如果是406實(shí)體,則轉(zhuǎn)到步驟10);
如果是408實(shí)體,則轉(zhuǎn)到步驟8);
否則轉(zhuǎn)到步驟11);
6) 將當(dāng)前裝配的變換矩陣Ucs根據(jù)124實(shí)體參數(shù)填充,轉(zhuǎn)回步驟5);
7) 在當(dāng)前裝配結(jié)點(diǎn)下增加一裝配子結(jié)點(diǎn)并設(shè)為當(dāng)前裝配,轉(zhuǎn)回步驟5);
8) 在當(dāng)前裝配結(jié)點(diǎn)下增加一零件子結(jié)點(diǎn)并設(shè)為當(dāng)前零件;
9) 輸入308實(shí)體并從其附屬416實(shí)體獲得文件名,判斷是否訪問(wèn)過(guò):
若未訪問(wèn)過(guò),則新建一零件體內(nèi)容對(duì)象并與當(dāng)前零件及308實(shí)體關(guān)聯(lián);
若訪問(wèn)過(guò),則將當(dāng)前零件與308實(shí)體對(duì)應(yīng)的已存在的零件體內(nèi)容對(duì)象關(guān)聯(lián);
輸入124實(shí)體,將其參數(shù)填充至當(dāng)前零件變換矩陣Ucs,轉(zhuǎn)回步驟5);
10) 輸入 406實(shí)體獲取當(dāng)前裝配名字,檢查父裝配體的其它直接子零件結(jié)點(diǎn)是否有同名的,如果同名則刪除該子零件結(jié)點(diǎn),轉(zhuǎn)回步驟5);
11) 如果當(dāng)前裝配是總裝配則繼續(xù)步驟12),否則將當(dāng)前裝配設(shè)為上一級(jí)裝配,將當(dāng)前402實(shí)體設(shè)為上一級(jí)402實(shí)體,轉(zhuǎn)回步驟5);
12) 遍歷裝配樹(shù),遇到未訪問(wèn)過(guò)的零件體內(nèi)容對(duì)象時(shí)打開(kāi)對(duì)應(yīng)文件,調(diào)用讀取單零件IGES格式的算法進(jìn)行讀入;
13) 結(jié)束輸入并顯示。
上面的流程是將一系列子過(guò)程進(jìn)行展開(kāi)之后的結(jié)果,例如步驟 5)~步驟 11)實(shí)際對(duì)應(yīng)Read402子過(guò)程,是算法的主體部分;步驟8)~ 9)對(duì)應(yīng)Read408子過(guò)程,步驟10)對(duì)應(yīng)Read406子過(guò)程。步驟5)中的判斷方式實(shí)際上對(duì)產(chǎn)生式進(jìn)行了一定程度的放寬,即允許402實(shí)體所包含的子實(shí)體以不同順序及任意數(shù)量出現(xiàn),在未來(lái),依據(jù)IGES標(biāo)準(zhǔn),我們可以導(dǎo)出更加精確的產(chǎn)生式,并對(duì)不符合產(chǎn)生式要求的實(shí)體做容錯(cuò)處理。
此外,步驟8)并不能保證當(dāng)前408實(shí)體對(duì)應(yīng)的確實(shí)是一個(gè)零件,因?yàn)樽友b配體也會(huì)產(chǎn)生一個(gè)408實(shí)體,因此步驟10)中的去重操作是必要的,它利用子裝配體的名字與其對(duì)應(yīng)的408實(shí)體的名字是相同的這一性質(zhì)將所生成的“偽”子零件刪去。
以上過(guò)程針對(duì)的是多文件格式的裝配體導(dǎo)入,如果想導(dǎo)入不同商業(yè)CAD軟件生成的單文件IGES格式的裝配體,只需根據(jù)各個(gè)軟件的存儲(chǔ)文件畫(huà)出所生成實(shí)體的有向無(wú)環(huán)圖,導(dǎo)出相應(yīng)的產(chǎn)生式,再轉(zhuǎn)化成相應(yīng)的算法即可。測(cè)試表明,Solidworks的單文件格式、UGS、Pro/E和CATIA中表示零件的實(shí)體均是“分片連續(xù)”的,描述某零件內(nèi)容的部分與該零件單獨(dú)存儲(chǔ)時(shí)的段落相差無(wú)幾,因此可重點(diǎn)關(guān)注剩余部分表示他們之間裝配關(guān)系的實(shí)體。需要注意的是,UGS與Pro/E在總裝配層級(jí)上各個(gè)組件是相互沒(méi)有顯式關(guān)聯(lián)的,即對(duì)應(yīng)的拓?fù)渑判虻氖讉€(gè)結(jié)點(diǎn)不像Solidworks一樣必定是某個(gè)實(shí)體(多文件格式中是402實(shí)體,單文件格式中是408實(shí)體),這可以通過(guò)虛擬一個(gè)總裝配結(jié)點(diǎn)來(lái)化歸為熟悉的形式。單文件格式的工作現(xiàn)已基本完成。
在清華大學(xué)計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)研究所開(kāi)發(fā)的具有我國(guó)自主知識(shí)產(chǎn)權(quán)的幾何造型系統(tǒng)TiGems7.0版本中,我們采用本文算法,設(shè)計(jì)并實(shí)現(xiàn)了基于IGES多文件形式的裝配體前后置處理器,并進(jìn)行了相應(yīng)的實(shí)驗(yàn),結(jié)果表明,該算法能夠順利實(shí)現(xiàn)和Solidworks系統(tǒng)之間的數(shù)據(jù)交換功能。
首先采用前置處理器,導(dǎo)出一個(gè)在工業(yè)界中實(shí)用的“前橋總裝”裝配體,然后用Solidworks 2007打開(kāi),其效果如圖4所示。該裝配體一共包含9個(gè)不同的零件,其中輪胎、前鋼圈等6個(gè)零件組成一個(gè)子裝配 qqzz2,而總裝中由兩個(gè)相同的子裝配qqzz2及若干其它零件組成,裝配樹(shù)一共是 3層??梢钥吹剑醒b配結(jié)構(gòu)能夠被Solidworks 2007正確識(shí)別。
為測(cè)試后置處理器的正確性,我們用Solidworks 2007生成了一個(gè)包含4層裝配關(guān)系的裝配體,并導(dǎo)出為IGES多文件格式,圖5顯示了它在TiGems 7.0中打開(kāi)的效果示意圖。該裝配包含a, b, c, e, f, g 6個(gè)零件,由一系列共面、面平行、面垂直、共軸等關(guān)系裝配而成。圖5高亮部分是被選中的由f和g組成的子裝配體。可見(jiàn),Solidworks所定義的裝配層次也能被我們的后置處理器正確處理。
圖4 “前橋總裝”的裝配體IGES文件打開(kāi)效果(左邊是其裝配樹(shù)結(jié)構(gòu))
圖5 層次為4,由6種不同零件組成的裝配體(左邊是其裝配樹(shù)結(jié)構(gòu))
我們?cè)贗ntel Pentium D CPU 2.80GHz, 2 GB內(nèi)存的臺(tái)式機(jī)上的Windows XP Professional SP3系統(tǒng)環(huán)境下,還測(cè)試了一系列其它裝配體,其導(dǎo)入時(shí)間對(duì)比如表3所示,其中最后一欄即為“前橋總裝”測(cè)試文件。
表3 多文件格式裝配體IGES文件導(dǎo)入時(shí)間對(duì)比表(單位:s)
表3中所列舉的所有測(cè)試均得到了正確的裝配樹(shù)和零件結(jié)構(gòu)。可以看到TiGems比Solidworks打開(kāi)裝配體的速度普遍要快將近一個(gè)數(shù)量級(jí)。此外測(cè)試表明,UGS和CATIA均無(wú)法打開(kāi)多文件格式的IGES裝配體文件,而Pro/E雖然能打開(kāi),并且用時(shí)和TiGems相當(dāng),但是打開(kāi)后只是把所有涉及到的零件按各自的初始坐標(biāo)羅列在界面上,相對(duì)位置信息和裝配樹(shù)信息都丟失了,在“前橋總裝”測(cè)試數(shù)據(jù)上甚至少了一個(gè)輪胎,因此這里就不將它們列入對(duì)比了。
本文提出并實(shí)現(xiàn)了一種基于DAG表示與產(chǎn)生式法的分析方法,將IGES格式的解析過(guò)程標(biāo)準(zhǔn)化。該方法與其它的實(shí)現(xiàn)相比具有以下優(yōu)點(diǎn):
1) 具有通用性和良好的可擴(kuò)展性,從短期來(lái)看IGES的其它格式均可通過(guò)類(lèi)似方法實(shí)現(xiàn),從長(zhǎng)遠(yuǎn)來(lái)看可以應(yīng)用到其它類(lèi)似IGES的格式的解析之中;
2) 產(chǎn)生式表示使得算法的正確性可以進(jìn)行形式化驗(yàn)證;
3) 實(shí)驗(yàn)結(jié)果證明該算法具有較快的速度,也具有較好的魯棒性。
目前已經(jīng)實(shí)現(xiàn)了與 Solidworks的多文件格式,以及與Solidworks、UGS、Pro/E、CATIA的單文件格式裝配體IGES格式的數(shù)據(jù)交換。
下一步的工作主要包括:
(1) 詳細(xì)測(cè)試表明,幾大商業(yè)軟件均無(wú)法在IGES中保存零件之間的裝配關(guān)系,只能保存它們之間的位置關(guān)系和層次關(guān)系。然而,IGES中確實(shí)為裝配關(guān)系的存儲(chǔ)提供了定義接口,因此,未來(lái)可以在不影響其它軟件讀取IGES格式文件的基礎(chǔ)上,嘗試實(shí)現(xiàn)基于IGES的裝配體裝配關(guān)系的保存和讀取。
(2) 現(xiàn)在缺少一個(gè)權(quán)威的IGES文件,尤其是裝配體文件的測(cè)試數(shù)據(jù)庫(kù),因此轉(zhuǎn)換的成功率、正確性和魯棒性難以得到有效的衡量。希望在未來(lái)能夠建立起一套IGES文件測(cè)試數(shù)據(jù)庫(kù)。
[1] Smith B M. IGES-initial graphics exchange specification [C]//Proceedings of Striving for Technological Excellence in Manufacturing Through Communication, Planning and Professionalism: Proceedings of 18th International Technical Conference, Dallas, TX, USA: Number Control Soc, 1981: 179-186.
[2] Liewald M H, Kennicott P R. Intersystem data transfer via IGES [J]. IEEE Computer Graphics and Applications, 1982, 2(3): 55-58, 60-63.
[3] Smith B M. IGES: A key to CAD/CAM systems integration [J]. IEEE Computer Graphics and Applications, 1983, 3(8): 78-83.
[4] Lewis J W. Interchanging spline curves using IGES [J]. Computer Aided Design, 1981, 13(6): 359-364.
[5] Wilkinson D, Hallam R. A study of product data transfer using IGES [J]. Computer-Aided Engineering Journal, 1987, 4(3): 131-136.
[6] Coles K, Hou C A. Enhancement of IGES preprocessor for data exchange [C]//Atlanta, GA, USA, 1991: 1-5.
[7] Kalta M, Davies B J. An IGES pre-processor to integrate CAD and CAPP for turned components [J]. International Journal of Advanced Manufacturing Technology, 1994, 9(5): 291-304.
[8] Kahrs M. The heart of IGES [J]. Software: Practice and Experience, 1995, 25(8): 935-946.
[9] 劉德智, 董金祥, 何志均. 基于曲面模型的IGES前后置處理器的設(shè)計(jì)[J]. 計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào), 1999, 11(2): 100 -103.
[10] 冉紅強(qiáng), 鄭國(guó)磊. 基于模型轉(zhuǎn)換的 IGES后置處理器開(kāi)發(fā)[J]. 工程圖學(xué)學(xué)報(bào), 2003, 24(4): 44-49.
[11] 徐 昕, 劉書(shū)桂. CMM/CAD集成系統(tǒng)中IGES后處理器的開(kāi)發(fā)[J]. 天津大學(xué)學(xué)報(bào)(自然科學(xué)與工程技術(shù)版), 2003, 36(1): 28-32.
[12] 胡楷模. 基于邊界表示的IGES數(shù)據(jù)交換算法的研究與實(shí)現(xiàn)[D]. 北京: 清華大學(xué), 2009.
[13] 胡楷模, 王 斌, 雍俊海. IGES邊界模型轉(zhuǎn)換中的參數(shù)域重構(gòu)與修正算法[J]. 計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào), 2009, 21(9): 1243-1250.
[14] 孫偉寧. 三維圖形瀏覽系統(tǒng)IGES后處理器的研究與實(shí)現(xiàn)[D]. 杭州: 浙江大學(xué), 2002.
[15] ANS US PRO/IPO-100-1996, Initial Graphics Exchange Specification IGES 5.3 [S].
IGES data exchange algorithm for assemblies based on DAG representation and production Rules
Huang Jing1, Wang Bin1,3,4, Hu Kaimo1,2,3,4, Zhang Hui1,3,4
( 1. School of Software, Tsinghua University, Beijing 100084, China; 2. Department of Computer Science and Technology, Tsinghua University, Beijing 100084, China; 3. Key Laboratory for Information System Security, Ministry of Education, Beijing 100084, China; 4. Tsinghua National Laboratory for Information Science and Technology, Beijing 100084, China )
The Initial Graphics Exchange Specification (IGES) is one of the most widely used neutral file standards. The related researches have mainly focused on the translation of single parts, however, few of them dealt with the IGES form for assemblies, which appear frequently in design. In this paper, we first summarize the IGES-file form of assemblies in most popular CAD software and then propose an IGES data exchange algorithm for assemblies based on Directed Acyclic Graph (DAG) Representation and Production Rules. This method standardizes the process of analysis of IGES forms, which enhances its commonality and extensibility. Moreover, the correctness of the method can be formally verified. With this method, we implement the pre-processor and post-processor for the multi-file IGES representation for assemblies. The experiments conducted in our geometry modeling system TiGems 7.0 show that the algorithm is fast and robust.
IGES; assembly; data exchange; DAG; production rules
TP 391
A
2095-302X (2012)04-0050-09
2010-07-18
黃 靖(1987-),男,福建南安人,博士研究生,主要研究方向?yàn)橛?jì)算機(jī)視覺(jué)、計(jì)算機(jī)圖形學(xué)。