劉 虹, 倪 冬, 仇 靜, 牛玉榮
(合肥工業(yè)大學(xué)機(jī)械與汽車工程學(xué)院,安徽 合肥 230009)
當(dāng)前,隨著眾多主流三維幾何造型軟件的迅速發(fā)展以及相互之間激烈的市場(chǎng)競(jìng)爭(zhēng),使原來(lái)僅有少數(shù)大型企業(yè)使用其來(lái)進(jìn)行產(chǎn)品設(shè)計(jì),逐漸發(fā)展到越來(lái)越多的中小企業(yè)也開始使用。然而,無(wú)論是大型企業(yè)還是中小企業(yè)都會(huì)存在大量的二維工程圖,如何將現(xiàn)有工程圖自動(dòng)高效的轉(zhuǎn)換為三維圖是一個(gè)難題。根據(jù)工程圖存貯方式不同,工程圖三維重建又分為兩個(gè)方向:一是如何將現(xiàn)有紙質(zhì)工程圖轉(zhuǎn)為電子圖[1],這對(duì)于具有歷史的企業(yè)是很有意義的,但工程圖樣的矢量化是一個(gè)難題,也是很費(fèi)時(shí)的過(guò)程;二是將現(xiàn)有電子工程圖(下文所提工程圖均指電子工程圖)轉(zhuǎn)為三維實(shí)體模型,雖然現(xiàn)在已經(jīng)有大量關(guān)于從二維工程圖自動(dòng)轉(zhuǎn)為三維實(shí)體模型的研究[2-4],并且也取得了顯著的成果,但往往僅限于標(biāo)準(zhǔn)三視圖和一些其他限制,并不能滿足復(fù)雜多變的實(shí)際工程圖。因此,對(duì)于現(xiàn)有工程圖的三維化仍主要依靠人工繪制,但人工繪制是一個(gè)很耗費(fèi)時(shí)間的過(guò)程,尤其是對(duì)于不熟悉該工程圖的人,這將只會(huì)事倍功半。為了尋求解決辦法,通過(guò)繪制大量工程圖的三維模型并且分析其中主要過(guò)程,找出了耗費(fèi)時(shí)間比較多并且與工程圖密切相關(guān)的一個(gè)過(guò)程——草圖建模。企業(yè)的產(chǎn)品大部分是系列化的,使用草圖建??梢詫?duì)構(gòu)成特征的曲線輪廓進(jìn)行參數(shù)化控制,便于修改,所以進(jìn)行三維建模時(shí)大多使用草圖建模。因此,只要將工程圖自動(dòng)轉(zhuǎn)化為草圖,就可以省去大量創(chuàng)建草圖的時(shí)間,從而縮短工程圖三維化的周期。雖然現(xiàn)有三維軟件自帶導(dǎo)入二維工程圖模塊,但仍然存在一些問(wèn)題。例如,UG中導(dǎo)入DWG /DXF模塊所導(dǎo)入圖不能生成模型歷史記錄,不便于修改,并且只是簡(jiǎn)單地將整個(gè)工程圖導(dǎo)入到一個(gè)平面內(nèi),沒有分割視圖和折疊視圖;SolidWorks中該模塊雖然有分割視圖和折疊視圖,但都是需要人機(jī)交互的,即選擇視圖中圖元和指定視圖平面,并不能完全自動(dòng)完成;Inventor中該模塊也需要人機(jī)交互。
針對(duì)以上問(wèn)題,提出了一種三維造型草圖生成算法,實(shí)現(xiàn)完全自主地分割視圖和折疊視圖,并在UG NX6.0中開發(fā)了基于多視圖的草圖建模模塊,解決了三維建模中因需要人工參與看圖、識(shí)圖以及繪制草圖而耗時(shí)的難題。
如今,現(xiàn)有三維幾何造型軟件功能越漸強(qiáng)大,但對(duì)于自動(dòng)地從二維工程圖轉(zhuǎn)為三維實(shí)體模型仍然存在相當(dāng)大的難度。為了能提高工程圖的三維化效率,采取了一種折中的方法,即將草圖繪制過(guò)程實(shí)現(xiàn)自動(dòng)化,并在 UG6.0環(huán)境下利用UG/OPEN API建立了三維草圖生成算法。該算法主要分4個(gè)子算法階段:
1) DXF數(shù)據(jù)信息提取階段,過(guò)濾除實(shí)體信息和圖層信息以外所有信息;
3) 折疊視圖階段,將得到的各個(gè)視圖平面法向量存入視圖類中;
4) 草圖繪制階段,調(diào)用視圖類中相關(guān)信息,繪制草圖。
接下來(lái)將對(duì)每個(gè)子算法進(jìn)行詳細(xì)的說(shuō)明,并最后通過(guò)實(shí)例驗(yàn)證算法的正確性。
現(xiàn)在放眼二維CAD市場(chǎng),Autodesk公司的AutoCAD仍然是龍頭老大,占據(jù)著很大的市場(chǎng)份額。所以,本文針對(duì)AutoCAD的圖形交換文件格式DXF進(jìn)行數(shù)據(jù)信息提取。
DXF 是Autodesk公司開發(fā)的用于AutoCAD與其它軟件之間進(jìn)行CAD數(shù)據(jù)交換的CAD數(shù)據(jù)文件格式。DXF文件的文本格式主要包括二進(jìn)制和ASCII碼兩種格式。本文采用的是較為常見的ASCII碼格式,它是由組碼和組值組成,是一種順序結(jié)構(gòu)。DXF結(jié)構(gòu)主要包括 7大段:標(biāo)題段(HEADER)、類段(CLASSES)、表段(TABLES)、塊段(BLOCKS)、實(shí)體段(ENTITIES)、對(duì)象段(OBJECTS)和文件結(jié)束(EOF)。
DXF文件中與對(duì)象形狀相關(guān)信息都在實(shí)體段,只要針對(duì)該段進(jìn)行提取就可以了。為了可以有選擇地對(duì)實(shí)體段中圖元信息提取,去除一些與對(duì)象輪廓形狀無(wú)關(guān)的信息,如中心線、軸線,同時(shí)還需要對(duì)表段中的圖層信息進(jìn)行提取。
從圖1中可以看出算法主要分兩部分:
為了這件事,我發(fā)揮自身特長(zhǎng)草書唐詩(shī)一幅,到裝裱店加急仿古精裱后如期帶去,意外的賀禮,使教師職業(yè)的妹妹格外喜愛,她表示,這是錦上添花。
1) TABLES段圖層信息讀取。利用函數(shù)ReadGroup()順序讀取組(組碼和組值),如果組值為TABLES,進(jìn)入該表段,找到圖層子類標(biāo)記AcDblayerTableRecord,讀取后面的圖層信息,放入LayerInfo類中保存,直到TABLES段結(jié)束為止。該部分主要是為了讀取圖層信息,與后面實(shí)體段匹配圖元圖層做準(zhǔn)備。
2) ENTITIES段圖元信息讀取。順序讀取組,如果組值為 ENTITIES,進(jìn)入該實(shí)體段,根據(jù)不同圖元類型,調(diào)用不同的圖元函數(shù)讀取相應(yīng)幾何信息并存入相應(yīng)圖元類中,同時(shí)用圖層信息過(guò)濾該圖元。例如,組值為 LINE,進(jìn)入該直線子段,進(jìn)行圖層信息判斷,如果該圖元的圖層相關(guān)信息與用戶界面輸入一致,再調(diào)用ReadLine()子函數(shù)讀取直線幾何信息,并存入MyLine類中,直到該段結(jié)束為止。否則,直接跳出本次循環(huán),重復(fù)以上操作。
上述算法為下面的視圖分割等提供了很好的數(shù)據(jù)接口。
目前,關(guān)于視圖分割的方法有很多。傳統(tǒng)的視圖分割算法[5]是根據(jù)角度判別法來(lái)識(shí)別視圖邊界,需要求取所有曲線的交點(diǎn),使任意兩曲線僅在端點(diǎn)相交,且要搜索邊界環(huán),處理數(shù)據(jù)量大,算法效率不高,但可以分割復(fù)雜多視圖,如圖2、圖3和圖4均可分割。劉世霞等[6]提出了坐標(biāo)投影分離算法,算法效率高,但使用范圍窄,如圖3和圖4所示情況都無(wú)法處理。還有現(xiàn)在使用比較廣泛的包圍盒分割法[7],主要是通過(guò)所有幾何圖元的外接矩形形成一個(gè)包圍盒,進(jìn)行兩兩合并,達(dá)到分割視圖的目的。該算法簡(jiǎn)單,無(wú)需求出邊界環(huán),效率高,可以處理圖2和圖3情況,但對(duì)于如圖4所示情況仍是無(wú)能為力。
圖2 初步視圖分割(一次坐標(biāo)投影法)
圖3 二次視圖分割(二次坐標(biāo)投影法)
圖4 四次視圖分割(改進(jìn)角度判別法)
上述3種算法中,只有角度判別法可以分割復(fù)雜多視圖,但效率不高;其它兩個(gè)都不能完全滿足復(fù)雜多視圖的情況,但有其各自的優(yōu)點(diǎn)。但是如果將這3種算法的優(yōu)點(diǎn)結(jié)合起來(lái),即可互補(bǔ)缺陷,適應(yīng)復(fù)雜多視圖的情況。包圍盒法比坐標(biāo)投影法所耗時(shí)間多,而對(duì)某一視圖用多次坐標(biāo)投影法也能達(dá)到大部分包圍盒法分割視圖的效果。因此,本文提出了一種視圖選擇分割法,充分結(jié)合了這3種算法的優(yōu)點(diǎn)。如圖5所示,視圖選擇分割算法流程圖。該算法的步驟主要有5個(gè):
圖5 視圖選擇分割算法流程圖
1) 初步分割視圖。坐標(biāo)投影法效率高,用于第一次對(duì)視圖進(jìn)行分割,將分割后的視圖存入視圖數(shù)組MyView中,并且記錄每個(gè)視圖的分布位置。
2) 初步視圖連續(xù)性判斷和二次視圖分割。采用坐標(biāo)投影法對(duì)一次分割后的每個(gè)視圖進(jìn)行視圖連續(xù)性檢查,判斷視圖是否分割徹底,若某一視圖內(nèi)坐標(biāo)投影線段不連續(xù),則進(jìn)行二次視圖分割,更新視圖數(shù)組MyView,并更新視圖分布位置,直到用坐標(biāo)投影法檢查所有視圖投影線段僅有一條為止,否則跳到步驟3)。
3) 二次視圖連續(xù)性判斷和三次視圖分割。采用包圍盒法檢查所有單個(gè)視圖,若經(jīng)過(guò)圖元包圍盒相容性計(jì)算后,存在超過(guò)一個(gè)視圖包圍盒,則進(jìn)行三次視圖分割,更新視圖數(shù)組MyView,并更新視圖分布位置,直到僅有一個(gè)視圖包圍盒為止,否則跳到步驟4)。
4) 視圖相鄰性判斷。將兩兩視圖進(jìn)行相鄰性判斷,如果存在不與任一視圖相鄰的視圖,則跳到步驟5)。
5) 三次分割視圖。將該視圖用改進(jìn)的角度判別法進(jìn)行分割,再將分割后視圖進(jìn)行相鄰性判斷,然后存入視圖樹中。
在算法步驟5)中所述的改進(jìn)的角度判別法,是通過(guò)改善幾何圖元求交的次數(shù),避免所有圖元之間進(jìn)行求交,來(lái)縮短角度判別法的時(shí)間。具體做法是:將視圖中的曲線按照y坐標(biāo)增大的順序排列;在未分割的曲線中選擇y值最大的曲線;將該曲線作為搜索的起點(diǎn),找出所有在該曲線最小外接矩形范圍內(nèi)的其他曲線,如果有,求出它們與該曲線的交點(diǎn),更新這些曲線,利用角度判別法生成一個(gè)二維邊界環(huán);添加所有屬于該邊界環(huán)內(nèi)的曲線到視圖類My View中,分離出視圖,將該視圖移除輸入工程圖;重復(fù)執(zhí)行上面步驟,直到輸入工程圖中不再有數(shù)據(jù)為止。
下面根據(jù)圖4的工程圖說(shuō)明視圖選擇分割算法。圖4用該算法進(jìn)行初步分割,將所有圖元投影到x軸和y軸上,得到x軸上的投影線段A0B0以及y軸上投影線段C0D0和E0F0,求出垂直分割線x0=xA0和水平分割線y0= (yD0+yE0)/2,將圖元添加到兩個(gè)視圖中;再將每個(gè)視圖中的圖元往各自的x軸和y軸投影,兩視圖 view1和view2在x軸和y軸上都僅有一條投影線段,所以不需要進(jìn)行二次分割;將這兩個(gè)視圖用包圍盒法檢查,最終只得到一個(gè)視圖包圍盒,所以不需三次分割;然后檢查所有視圖間相鄰性,發(fā)現(xiàn)視圖view1不與視圖view2相鄰,并且view2的極左切線位于view1的極左切線左邊,所以需要對(duì)view2用改進(jìn)的角度判別法進(jìn)行四次分割,從該視圖上y坐標(biāo)最大的圖元2開始,搜索視圖邊界輪廓1-2-3-4-5-6-7-8和1'-2'-3'-4'-5'-6'-7'-8'-9'-10'-11'-12'-13'-14'-15'-16',最終將視圖徹底分割,得到3個(gè)視圖view1、view2和view3,并通過(guò)再次視圖相鄰性判斷,得到具有拓?fù)浣Y(jié)構(gòu)的視圖樹,如圖6所示。很明顯,圖3用一次分割即可徹底分割視圖,而圖2則需要二次分割才能達(dá)到徹底。
圖6 視圖分割后所表示視圖樹
本視圖選擇分割法只用最多四次分割即可達(dá)到徹底分割,根據(jù)不同的視圖類型選擇不同的分割次數(shù),二次、三次或四次分割的視圖并非所有視圖,而是存在視圖不連續(xù)以及不相鄰的視圖,且根據(jù)算法各自的優(yōu)點(diǎn),對(duì)應(yīng)不同分割子算法,從而大大提高了算法的效率,完全滿足了復(fù)雜多視圖的要求。改進(jìn)的角度判別法又進(jìn)一步提高了算法的效率。
折疊視圖主要是確定視圖放置平面的坐標(biāo)系方向矩陣,找出視圖坐標(biāo)系和對(duì)象坐標(biāo)系之間的關(guān)系。由于視圖坐標(biāo)系和對(duì)象坐標(biāo)系擁有同樣的原點(diǎn),所以視圖坐標(biāo)系與對(duì)象坐標(biāo)系之間只存在關(guān)于旋轉(zhuǎn)變換[8]。而任何相鄰視圖互相垂直,它們之間存在90o角的旋轉(zhuǎn)變換,且相鄰視圖所在視圖坐標(biāo)系存在視圖對(duì)角(指視圖對(duì)切線與x軸夾角)θ的旋轉(zhuǎn)變換。
初始假設(shè)視圖樹中的根視圖的坐標(biāo)系為(x',y',z'),對(duì)應(yīng)于對(duì)象坐標(biāo)系為(u,w,-v),那么其由視圖坐標(biāo)系到對(duì)象坐標(biāo)系的放置面坐標(biāo)系方向矩陣為
而對(duì)于其他結(jié)點(diǎn)子視圖,應(yīng)用上述提出的基于相同的坐標(biāo)原點(diǎn)以及視圖對(duì)角關(guān)系的轉(zhuǎn)換矩陣A,可以通過(guò)其父視圖的坐標(biāo)系方向矩陣PB,得出任一子視圖的放置面坐標(biāo)系方向矩陣CB,其關(guān)系為
針對(duì)如圖6的視圖樹說(shuō)明視圖放置面坐標(biāo)系方向矩陣。如圖4所示,view1和view2之間的視圖對(duì)角為-90o,view2和 view3之間的視圖對(duì)角為-135 o,那么主視圖view2、俯視圖view1和輔助視圖view3的坐標(biāo)系方向矩陣2PB、1PB和3PB分別為
在前面幾個(gè)階段中,得到了草圖繪制的關(guān)鍵信息,包括視圖放置面坐標(biāo)系方向矩陣和視圖圖元幾何信息,使草圖繪制變得簡(jiǎn)單起來(lái)。在UG/Open API函數(shù)中,用UF_SKET_create_sketch和 UF_CURVE[9]分別創(chuàng)建一個(gè)視圖的草圖平面和繪制相關(guān)視圖幾何信息。圖7為用UIStyler開發(fā)的用戶界面,而圖8為圖4在該草圖模塊下運(yùn)行結(jié)果。
圖7 快速草圖模塊用戶界面
圖8 運(yùn)行圖4后得到的草圖
基于UG 所開發(fā)的快速草圖建模模塊,通過(guò)實(shí)例驗(yàn)證確實(shí)可行,彌補(bǔ)了市場(chǎng)上現(xiàn)有主流三維CAD軟件導(dǎo)入草圖模塊需要大量人機(jī)交互的缺點(diǎn),提高了草圖建模的效率,給企業(yè)節(jié)省了大量的資源??焖俨輬D生成算法可以為以后三維重建預(yù)處理提供很好的鋪墊。而對(duì)于其中關(guān)鍵的視圖分割階段,提出的視圖選擇分割算法不僅解決了現(xiàn)有視圖分割算法不能處理復(fù)雜視圖的問(wèn)題,也提高了算法的效率。
[1]成 彬, 張樹生, 石云飛. 工程圖矢量化識(shí)別技術(shù)研究綜述[J]. 工程圖學(xué)學(xué)報(bào), 2008, 29(6): 7-12.
[2]Srinivasa R B, Gurumoorthy B. Constructing a wire-frame from views on arbitrary view planes for objects with conic sections inclined to all view planes [J].Computer-Aided Design, 2011, 43(12): 1639-1653.
[3]鄭鵬飛, 林大鈞, 劉小洋, 吳志庭. 基于三視圖的實(shí)體重建技術(shù)[J]. 工程圖學(xué)學(xué)報(bào), 2011, 32(2): 49-54.
[4]傅自鋼. 基于工程圖的三維形體重建方法研究[D].長(zhǎng)沙: 中南大學(xué), 2011.
[5]Hiroshi S, David C. Gossard. Solid model input through orthographic views [J]. Computer Graphics,1983, 17(3): 243-252.
[6]Liu Shixia, Hu Shimin, Chen Yujian, Sun Jiaguang.Reconstruction of curved solids from engineering drawings [J]. Computer-Aided Design, 2001, 33(14):1059-1072.
[7]李晉芳, 施法中. 從二維視圖到三維幾何模型轉(zhuǎn)換中視圖的包圍盒分離法[J]. 計(jì)算機(jī)工程, 2004: 30(6):139-141.
[8]Lysak D B, Devaux P M, Kasturi R. View labeling for automated interpretation of engineering drawings [J].Pattern Recognition, 1995, 28(3): 393-407.
[9]莫 蓉, 常智勇, 劉紅軍, 杜 微. 圖表詳解UG NX二次開發(fā)[M]. 北京: 電子工業(yè)出版社, 2008: 47-86.