尚仕波 袁 華 朱 震
(天地科技股份有限公司,北京100013)
DXF(Drawing Exchange File)文件是AutoCAD軟件系統(tǒng)用于與其他CAD/CAM系統(tǒng)及應(yīng)用程序間的圖形信息交換文件,其結(jié)構(gòu)既嚴(yán)密又易于讀取,已經(jīng)成為了一種標(biāo)準(zhǔn)數(shù)據(jù)接口,在數(shù)控加工領(lǐng)域得到了廣泛的應(yīng)用[1]。許多學(xué)者就DXF文件的基本結(jié)構(gòu)、常用DXF組碼的意義及DXF文件中圖元信息的提取算法作了大量的研究,采用在所有段中檢索與目標(biāo)組碼相匹配組值的方法得到需要的圖元數(shù)據(jù),解決了DXF文件在不同CAD應(yīng)用程序間的數(shù)據(jù)交換問題[2]。但是,DXF文件不同的段之間可能包含相同的組碼,在所有段中檢索將會(huì)得到多余的圖元信息。另外在繪圖過程中,繪制人員由于不良的繪圖習(xí)慣或其他原因,圖形中可能產(chǎn)生圖元重復(fù)或圖元交叉的情況,這些錯(cuò)誤在圖形顯示和打印時(shí)難被發(fā)現(xiàn),在路徑規(guī)劃時(shí)甚至造成無法求解,而這方面的研究還不多見[3-4]。本文就DXF文件中圖元的提取及DXF圖形的優(yōu)化等問題進(jìn)行了研究,完善DXF圖元的提取算法并提出了對(duì)DXF數(shù)據(jù)源在數(shù)控加工前進(jìn)行優(yōu)化的設(shè)想。
DXF文件的最小組成單位是組,一個(gè)DXF文件由多個(gè)組組成,每個(gè)組占兩行。第一行為組碼(GROUP VALUE),是一個(gè)整數(shù);第二行為組值(GROUP VALUE),數(shù)據(jù)類型取決于組碼的數(shù)值。DXF文件分成很多段(SECTION),每個(gè)段由多個(gè)組組成。每個(gè)段均由組值為字符串SECTION的0組開始,接著是組碼為2組值為段名的2組,最后以組值為ENDSEC的0組表示該段結(jié)束。所有段結(jié)束后,以組值為EOF(End Of File)的0組結(jié)束。DXF文件一般由以下6段組成:HEADER(標(biāo)題段)、CLASSES(類段)、TABLES(表段)、BLOCKS(塊段)、ENTITIES(實(shí)體段)、OBJECTS(對(duì)象段)。當(dāng)將預(yù)覽圖像與DXF文件一同保存時(shí),文件還存在 THUMBNAILIMAGE(圖片預(yù)覽段)[5]。
CAD軟件系統(tǒng)為了便于用戶管理圖形和表達(dá)機(jī)械零件的結(jié)構(gòu),增加了線型及圖層等功能。繪制的圖形除了確定圖元所需的坐標(biāo)信息外,還包括圖元的圖層、線型及線寬等信息。而實(shí)際加工時(shí),只需要確定圖元的坐標(biāo)信息,這些數(shù)據(jù)都保存在ENTITIES(實(shí)體段)中。當(dāng)圖形輸出DXF格式時(shí),通常將BLOCK(塊)打散變成獨(dú)立的圖元,然后對(duì)整個(gè)圖形輸出為DXF格式[6]。
為了提高讀取效率,算法只對(duì)ENTITIES段進(jìn)行讀取。從組值為ENTITIES的行開始直到讀取到組值為OBJEC的行,對(duì)ENTITIES段中組碼為0的組進(jìn)行檢測(cè)并提取圖元信息。其中包括線段、圓弧及矩形等CAD系統(tǒng)的常用命令,讀取流程如圖1所示。
在一個(gè)計(jì)算機(jī)圖形系統(tǒng)中,基本幾何元素有點(diǎn)、線段和圓(圓周和圓弧段)。在圖形的相互關(guān)系處理中,點(diǎn)實(shí)際上不獨(dú)立構(gòu)成圖形的某一部分(只是作為一種標(biāo)識(shí)),因此,基本幾何元素只是線段和圓(弧)兩種,用這兩種基本幾何元素描述所有圖形。在AutoCAD等繪圖軟件中,雖然繪制圖形的命令很多,但繪制的圖形均可以采用線段和圓弧來描述。在數(shù)控加工系統(tǒng)中,待加工的圖形可以描述為包含1個(gè)外環(huán)、零個(gè)或多個(gè)內(nèi)環(huán)的連通域,不存在孤立的圖元[7]。
但在DXF數(shù)據(jù)源的繪制過程中,由于圖層、線型及線寬的應(yīng)用,圖形中粗線覆蓋細(xì)線或?qū)嵕€覆蓋虛線的錯(cuò)誤非常常見,繪圖者很難在圖形繪制的過程中發(fā)現(xiàn)圖元間的重合,這些重合的圖元在顯示屏或打印出的圖紙中也發(fā)現(xiàn)不出來,而這些重合的圖元在進(jìn)行數(shù)控加工的路徑規(guī)劃時(shí)變成孤立的圖元,不滿足加工的要求。另外,由于CAD系統(tǒng)的精度設(shè)置及繪圖過程中自動(dòng)捕捉功能的應(yīng)用,在兩個(gè)圖元的連接點(diǎn)處會(huì)出現(xiàn)交叉的情況,細(xì)微的交叉在圖形的繪制及輸出過程中也難發(fā)現(xiàn),圖形的交叉部分將會(huì)造成加工過程中的過切現(xiàn)象。另外,DXF文件中的圖元按照?qǐng)D形的繪制順序進(jìn)行存儲(chǔ),在顯示屏上和打印的圖紙中并不需要考慮圖元的順序,但在數(shù)控加工中,加工路徑為一條連續(xù)的有向線段。然而圖形的繪制者并未考慮到加工的需求,因此輸出的DXF文件在路徑規(guī)劃前需要進(jìn)行有序化及單向化。
對(duì)于平面圖形的基本圖元線段和圓弧兩種,由于圓弧圖元的判定問題可以通過線段插補(bǔ)或按照弧所對(duì)應(yīng)的弦考慮,因此本文只討論線段圖元的優(yōu)化問題。
2.2.1 圖元的描述
圖形中的線段圖元按照其所在的直線進(jìn)行判斷,具有相交、平行和重合3種關(guān)系。設(shè)直線通過點(diǎn)P1(x1,y1)和P2(x2,y2),則直線方程可以表示為
式(1)為直線的兩點(diǎn)式方程。令A(yù)=(y2-y1)、B=(x1-x2)、C=-(A·x1+B·y1),將式(1)轉(zhuǎn)換為直線的標(biāo)準(zhǔn)方程,即:
其中直線的法向量n=(A,B)。
2.2.2 線段關(guān)系的判斷
根據(jù)線段所在的直線方程,首先通過兩線段所在直線法向量的叉積和常量C判斷兩條直線間的關(guān)系重合、平行或相交,再對(duì)相交直線的進(jìn)一步判斷線段是否相交[8]。由于圖形在繪制過程中一般不會(huì)出現(xiàn)多余的平行線段錯(cuò)誤,且出錯(cuò)后也便于修改,所以本文不討論平行線錯(cuò)誤的情形,只討論環(huán)上相鄰邊的交叉錯(cuò)誤和重合錯(cuò)誤。假設(shè)環(huán)上相鄰兩邊的4個(gè)頂點(diǎn)P1(x1,y1)、P2(x2,y2)、P3(x3,y3)、P4(x4,y4)構(gòu)成線段P1P2、P3P4,判斷算法的偽代碼如下:
(1)線段所在的直線相交
當(dāng)|n1×n2|≠0時(shí),線段所在的直線相交,但P1P2、P3P4是否交叉需要作進(jìn)一步的判斷。首先采用線段的包絡(luò)矩形進(jìn)行快速排斥試驗(yàn)。如圖2a所示,當(dāng)線段的包絡(luò)矩形沒有重疊區(qū)域時(shí),線段沒有交點(diǎn);當(dāng)線段的包絡(luò)矩形有重疊區(qū)域時(shí),線段是否交叉需要進(jìn)一步判斷,如圖2b、c所示。
判斷算法的偽代碼如下:
如圖3所示,當(dāng)線段相交時(shí)二者互相跨立對(duì)方,線段的兩個(gè)端點(diǎn)分別位于另一條線段兩側(cè),可以構(gòu)造新的向量來確定線段之間的關(guān)系。首先判斷線段P3P4是否跨立P1P2:在圖3a中,P1P3和P1P4在P1P2的同側(cè),(P1P2×P1P3)·(P1P2×P1P4)>0;在圖3b中,(P1P2×P1P3)·(P1P2×P1P4)<0,線段P3P4跨立P1P2;同理判斷P1P2是否跨立P3P4。當(dāng)P1P2與P3P4互相跨立時(shí),判斷出圖形中存在線段交叉。
判斷算法的偽代碼如下:
(2)線段所在的直線重合
當(dāng)|n1×n2|=0且C1=C2,線段所在的直線重合,可通過包容性試驗(yàn)進(jìn)一步檢查線段是否重合,即通過比較x方向或y方向的坐標(biāo)值進(jìn)行判斷,如圖4所示。
判斷算法的偽代碼如下:
圖元錯(cuò)誤消除后,在路徑規(guī)劃前需要對(duì)單個(gè)圖元進(jìn)行有序化成環(huán)處理。首先對(duì)無序圖元進(jìn)行分別成環(huán),采用比較圖元的頂點(diǎn)坐標(biāo)的方法把孤立的圖元連接成環(huán),然后按環(huán)的正方向進(jìn)行圖元的排序。當(dāng)圖形中所有的環(huán)都識(shí)別后,通過包絡(luò)矩形法識(shí)別出內(nèi)環(huán)和外環(huán),從而得到由一個(gè)外環(huán)、零個(gè)或多個(gè)內(nèi)環(huán)構(gòu)成的連通區(qū)域[9]。滿足了熱切割等數(shù)控加工圖形的路徑規(guī)劃要求[10]。
2.3.1 有序化成環(huán)處理
算法的偽代碼如下:
2.3.2 內(nèi)外環(huán)識(shí)別
在環(huán)的識(shí)別算法中,已經(jīng)把圖形中的所有圖元按環(huán)存儲(chǔ)在一個(gè)集合中,根據(jù)包絡(luò)矩形大小進(jìn)一步判別出內(nèi)外環(huán),包絡(luò)矩形最大的環(huán)屬于外環(huán)。因?yàn)閮?nèi)環(huán)總是在外環(huán)內(nèi)部且不相交,因此只判斷包絡(luò)矩形的一個(gè)坐標(biāo)分量的最大值或最小值即可。算法描述如下:
根據(jù)算法,通過C#編程實(shí)現(xiàn)了含有一個(gè)字符‘A’的內(nèi)環(huán)的判別,如圖5所示。字符‘A’的內(nèi)外環(huán)按照環(huán)的正方向進(jìn)行了有序化成環(huán)處理。
本文研究了DXF格式數(shù)據(jù)源在數(shù)控系統(tǒng)中路徑規(guī)劃前的優(yōu)化問題,為DXF數(shù)據(jù)源的優(yōu)化提供了可供借鑒和參考的內(nèi)容,得到的主要結(jié)論有:
(1)DXF文件由含有不同圖形信息的組構(gòu)成,只對(duì)包含圖元幾何信息的ENTITIES段進(jìn)行讀取解決了其他讀取算法存在的讀取多余圖元信息的問題。
(2)圖形中的圖元重復(fù)或圖元交叉的情況會(huì)影響路徑規(guī)劃的求解。以直線圖元為例,通過對(duì)直線的法向量和常量進(jìn)行快速排斥試驗(yàn)和跨立試驗(yàn)找出圖形中的交叉錯(cuò)誤、包容性試驗(yàn)消除重合錯(cuò)誤得到優(yōu)化的圖元信息。
(3)路徑規(guī)劃的本質(zhì)是環(huán)間連線的最優(yōu)化求解。對(duì)優(yōu)化的圖元進(jìn)行有序化并進(jìn)行內(nèi)外環(huán)識(shí)別,解決偏移補(bǔ)償?shù)惹疤幚韱栴}。
[1]陳太喜.低成本、便攜式的EPS快速成形系統(tǒng)[J].工程設(shè)計(jì)學(xué)報(bào),2008,15(5):319-323.
[2]夏濤.基于DXF文件的接口設(shè)計(jì)及兩點(diǎn)最短路徑的求?。跩].儀器儀表用戶,2006,13(1):89-90.
[3]孫海波.EPS快速成形系統(tǒng)最短切割路徑的求解[J].工程圖學(xué)學(xué)報(bào),2008,6:108-112.
[4]龔清洪.基于DXF的繪圖軌跡優(yōu)化及仿真系統(tǒng)研究[D].西安:西北工業(yè)大學(xué),2006.
[5]郭朝勇.AutoCAD R14(中文版)二次開發(fā)技術(shù)[M].北京:清華大學(xué)出版社,1999.
[6]李海峰.火焰切割機(jī)床自動(dòng)編程系統(tǒng)開發(fā)[J].水利電力機(jī)械,2003,25(5):40-42.
[7]何援軍.計(jì)算機(jī)圖形學(xué)[M].北京:機(jī)械工業(yè)出版社,2006.
[8]潘金貴.現(xiàn)代計(jì)算機(jī)常用數(shù)據(jù)結(jié)構(gòu)和算法[M].南京:南京大學(xué)出版社,1994.
[9]劉會(huì)霞.鈑金件數(shù)控激光切割割嘴路徑優(yōu)化[J].計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào),2004,16(5):60-665.
[10]李艷華.慢速走絲線切割加工自動(dòng)編程系統(tǒng)的研究[D].哈爾濱:哈爾濱工業(yè)大學(xué),2006.