但永平,張 蕾,張國濤,楊 凱
(中原工學院 電子信息學院,河南 鄭州 450007)
AutoCAD是目前世界上最成功的CAD軟件平臺之一,它具有齊全的圖形編輯功能和直觀的系統構架,有豐富的繪圖指令、強大的編輯功能,支持多種圖形輸入、輸出設備。同時,AutoCAD具有相當的靈活性,可根據需要進行二次開發[1]。可以通過對AutoCAD的二次開發,使其更廣泛的運用于其他工藝過程中。例如,在實際的工程雕刻中,為了設計雕刻的圖形,需要在具有齊全的圖形編輯功能和直觀的系統構架的CAD軟件中編輯設計圖形,而設計好的圖形數據參數要輸出到雕刻的控制程序中,進而控制雕刻圖形。
盡管AutoCAD是一個功能很強的圖形編輯系統。但它所包含的一系列指令只能在AutoCAD狀態下工作。為使AutoCAD的圖形信息能夠讀取出來,這就需要將高級語言程序來對它進行參數提取,這實質上就是AutoCAD與高級語言的接口。AutoCAD系統提供有多種接口方式,如.SCR文件、.DXF文件、AutoLisp語言接口等[2]。本文只介紹.DXF文件接口方式。
為此,本文針對在實際的雕刻過程中為有效地讀取CAD軟件設計圖形的數據參數,對DXF文件數據格式,分析DXF文件的組成,根據DXF文件格式,通過C語言的文件管理功能,設計出了C語言與AutoCAD接口程序,在自行開發軟件與AutoCAD之間建立起了數據通道,從而實現了數據傳遞和共享。而本文所應用的雕刻控制平臺數控系統是一種新型的數控系統,它用一臺PC實現包括插補、伺服等功能在內的所有數控功能,使數控系統的結構大大簡化。這樣,一臺PC機既可用于CAD/CAM設計,又可用于控制雕刻機的運作,大大降低了整套設備的成本。基于本文設計的C語言與AutoCAD接口程序已成功應用在雕刻控制平臺數控系統,并取得了滿意的結果。
DXF是Drawing eXchange File的縮寫,意思為圖形交換文件,在工程制圖中有廣泛的應用,掌握了DXF文件的讀寫對編寫CAD軟件時的圖形信息的交換有重要意義。它有兩種格式:一種是ASCII DXF格式;一種是二進制DXF格式。ASCII DXF文件格式是ASCII文字格式的AutoCAD圖形的完整表示,這種文件格式易于被其他程序處理。二進制格式的DXF文件與ASCII格式的DXF文件包含的信息相同,但格式上二進制格式比ASCII格式更精簡,能夠節省百分之二十五的文件空間且可讀性強。
為了與其他軟件共享圖形數據,AutoCAD提供了DXF(Drawing Interchange Format)文件格式,此格式現已被廣泛使用,成為事實上的標準。通過DXF文件格式,可以使用高級語言開發程序讀取AutoCAD圖形文件,也可以創建DXF文件供AutoCAD打開。DXF一般情況下是文本文件,可以使用文本編輯器(如Windows記事本、寫字板)來查看、編輯其內容。
DXF文件是AutoCAD與外部聯系的主要接口方式,易于將AutoCAD的圖形轉換成CAD系統所能讀取的文件格式。.DXF文件是一種具有嚴格格式的順序文件.是以ASCII碼形式存放圖形信息的數據文件一個DXF文件包括了對應圖形數據庫中的所有信息。一個DXF文件可由高級語言程序生成,也可以由繪制的圖形使用DXFOUT命令生成該圖形的DXF文件。.DXF文件的實質是一組表達具體圖形的程序執行指令,只要按照格式標準調用DXF文件并按其組碼和組織執行對應的任務,即可將圖形重現。
由于DXF一般情況下是文本文件,因此DXF文件可以使用文本編輯器(如Windows記事本、寫字板)來查看、編輯其內容。用記事本打開一個DXF文件,可以發現它里面有這樣一些代碼:
0
SECTION
2
HEADER
9
$ACADVER
1
AC1015
……
即里面總是數字和字符串/數字在交替的出現。數字就叫做代碼 (通常稱為組碼),緊跟組碼數字的稱為關聯值對。DXF文件本質上由代碼及關聯值對組成。代碼(通常稱為組碼)表明其后的值的類型。使用這些組碼和值對,可以將DXF文件組織到由記錄組成的區域中,這些記錄由組碼和數據項目組成。在DXF文件,每個組碼和值各占一行。
一個完整的ASCII格式的DXF文件結構如下:
1)標題段(HEADER) 標題段包含圖形的基本信息,記錄AutoCAD系統的所有標題變量的當前值或當前狀態。標題變量記錄了AutoCAD系統的當前工作環境,如SNAP捕捉當前狀態、柵格間距式樣、當前圖層層名及線型、顏色等。
2)類段(CLASSES)類段由程序自己定義的各種類。
3)表段(TABLES)表段包含以下符號表的定義:
APPID(應用程序標識表)
BLOCK_RECORD(塊參照表)
DIMSTYLE(標注樣式表)
LAYER(圖層表)
LTYPE(線型表)
STYLE(文字樣式表)
UCS(用戶坐標系表)
VIEW(視圖表)
VPORT(視口配置表)
4)塊段(BLOCKS)塊段記錄了所用塊的塊名,當前圖層層名、塊的種類、塊的插入基點及組成該塊的所有成員。塊的種類分為圖形塊、帶有屬性的塊和無名塊3種。無名塊包括用HATCH命令生成的剖面線和用DIM命令所完成的尺寸標準。
5)實體段(ENTITIES)實體段記錄了每個實體的名稱、所在圖層及其名字、線型、顏色等。
6)對象段(OBJECTS)。包含圖形中的非圖形對象。
7)文件結束段(END OF FILE)DXF文件的結束標志。DXF 以”0”、”EOF”結束[3]。
每個段都以一個后跟字符串SECTION的組碼0開始,其后是組碼2和表示該段名稱的字符串 (例如,HEADER)。每個段都由定義其元素的組碼和值組成。每個段都以一個后跟字符串ENDSEC的組碼0結束。
有些組代碼會因表達環境的不同而有多個含義。在分析時需要根據不同的段和不同的表達而判斷[4]。表1部分常用的組代碼的含義[4],表2直線段的實體描述[5],表3圓的實體描述[5]。

表1 常用組代碼的含義Tab.1 Meaning of comm on group of code

表2 直線段的實體描述數據Tab.2 Entity describe data of a line segment

表3 圓的實體描述數據Tab.3 Entity description data of round
從DXF文件中檢索,當檢索到某個段時就轉到那個段的處理程序去處理。如檢索到HEADER段就轉入HEADER段的處理程序去處理。

圖1 DXF文件處理流程Fig.1 Flow chart DXF file handling
圖形的大部分信息都在實體ENTITIES段中,因此讀取實體段的內容很重要。讀取實體段的數據首先要考慮讀取數據的存儲方式,然后再進行后一步的處理或存入數據文件中。此處用鏈表結構來存儲。
各個實體的數據分成兩塊:公共數據塊和特殊數據塊。公共數據塊存儲每個實體都具有特征參數,如所在圖層,實體標識,線型名……。
特殊數據塊存儲每個實體特有的數據,如實體LINE,它里面有兩個端點的坐標值;實體CIRCLE中有圓心坐標值和半徑值等。
單個實體的數據處理方法:讀取一個實體的數據首先根據組碼“0”后的實體標識字符串來確定其為哪一種實體,然后再根據這個實體的具體情況來讀取數據。
AutoCAD實體種類很多,每種實體對應一個接口函數,因此,接口程序包含的函數很多。本文僅以直線度和圓為例說明接口程序的設計方法。
為了方便引用,用結構體函數來定義直線和圓。本文目的是將讀取到的DXF文件中的直線和圓的信息,顯示在屏幕上。
1)直線段的接口程序 讀取直線的函數原型定義為:
typedef struct tagLine{
float x1,y1,z1;
float x2,y2,z2;
}LINE;
其中 x1,y1,z1 為直線的起點坐標,x2,y2,z2 為直線的終點坐標。在函數體中調用文件輸入輸出函數,按照表2示直線段的格式,若讀取到組代碼為“0”且組值為LINE時,將組代碼“10”,“20”,“30”后的起點坐標分別寫到 x1,y1,z1 里;最后將組代碼“11”,“21”,“31”后的終點坐標分別寫到 x2,y2,z2中。
2)圓的接口程序 讀取圓的函數原型定義為:
typedef struct tagCircle{
float x,y,z;
float r;
}CIRCLE;
其中x,y,z為圓心坐標,r為圓的半徑。在函數體中調用文件輸入輸出函數,按照表3圓的格式,若讀取到組代碼為“0”且組值為 CIRCLE 時,將組代碼“10”,“20”,“30”后的圓心坐標分別讀到 x,y,z里;最后將組代碼“40”后的圓的半徑讀到 r中[6]。
本接口程序比較復雜,在合計時將程序分為主程序和兩個子程序來設計。主程序為整個程序的核心部分,它的主要功能是從DXF文件中讀取組代碼和組值,并將直線的起點及終點坐標和圓的圓心坐標及半徑值讀取出來,并存入指針中。兩個子程序分別是直線和圓的顯示程序,直線顯示子程序的功能是顯示所打開DXF文件中直線的條數,每條直線的起點X坐標、起點Y坐標、起點Z坐標、終點X坐標、終點Y坐標、終點Z坐標。圓的顯示子程序的功能是顯示所打開DXF文件中圓的個數,每個圓的圓心X坐標、圓心Y坐標、圓心Z坐標以及圓的半徑值。
調用接口程序來讀取DXF文件中圖形信息,要有一定的順序。圖2給出了讀取DXF文件中圖形信息的過程,具體步驟如下:
第一步:以“讀”的方式打開一個文本文件,并獲得文件指針dxf。
FILE*dxf; /*定義文件指針dxf*/
dxf=fopen(filename,“r”);/* 打開文件,并獲得文件指針 */

圖2 讀取DXF文件中圖形信息流程圖Fig.2 Flow chart Read DXF files,graphics information
第二步:從文本中讀取字符
fscanf(dxf,"%f",&code);/* 存放組碼值 */
fscanf(dxf,"%d",&value);/* 存放字符串 */
第三步:讀取幾何信息
if(code==0&&strcmp(codevalue,"LINE")==0);/* 讀取直線的信息*/
if(code==0&&strcmp(codevalue,"CIRCLE")==0); /* 讀取圓的信息*/
第四步:顯示子程序
void print1(EntityData*entity1);/* 直線的顯示子程序 */void print2(EntityData*entity2);/* 圓的顯示子程序 */
第五步:調用子程序
第六步:關閉文本文件。
fclose(dxf); /* 關閉文件 */
此外 DXF以”0”、”EOF”結束,因此在函數中可用 exit(0)、return(0)來表示文件結束。
而 feof(dxf);用來檢查文件是否結束,遇文件結束符(0或者EOF)返回非零值,否則返回0[7]。
在AutoCAD中所畫的圖形(注意:本設計只適用于直線和圓,因此所畫的圖形只能是直線或者是圓)如圖3所示。

圖3 AutoCAD中的自定義圖形Fig.3 AutoCAD custom graphics
在如圖2所示的命令行中輸入DXFOUT,則系統會自動生成一個DXF文件,自行命名該DXF文件,將該文件保存在程序生成的可執行文件所在的文件夾中(可執行文件被系統自動放在debug文件夾中)。
再打開可執行文件,即可看到如圖4所示的結果。

圖4 接口程序生成的可執行文件打開后的界面Fig.4 Interface chart of interface program to generate the executable file to open
接下來可以根據界面上的提示進行操作。界面提示“請輸入文件名:”,我們可以輸入一個DXF文件的文件名,然后按回車鍵。
如果文件不能正常打開,界面上將會出現打開文件失敗,如果能正常打開,界面上將會出現正在讀取文件…。
并且界面將會顯示所打開DXF文件中直線的條數,每條直線的起點X坐標、起點Y坐標、起點Z坐標、終點X坐標、終點Y坐標、終點Z坐標以及所打開DXF文件中圓的個數,每個圓的圓心X坐標、圓心Y坐標、圓心Z坐標、圓的半徑坐標。
在界面上輸入我們所用例子的DXF文件名后,按回車,將會顯示如圖5所示。

圖5 接口程序的實例顯示結果Fig.5 Results of interface program examples show
該運行窗口中顯示了直線的個數和它們的各個起點和終點坐標以及圓的個數和它們各個圓心坐標和半徑值。并且與該DXF文件以記事本打開后的文件中所顯示的直線和圓的個數及坐標相對應,由此可見本軟件是成功的。
根據DXF文件格式,借助于C語言的文件管理功能,設計出了接口程序。在自行開發軟件與AutoCAD之間建立起了數據通道,把AutoCAD中的數據提取出來。在數控加工中應用課提高設計效率,縮短設計周期。
通過該軟件可以將在AutoCAD中所畫的圖形的信息(直線的起點和終點坐標,圓的圓心坐標和半徑)提取出來,然后通過一個數控程序將坐標信息傳遞給數控機床,數控機床[8-9]就能夠加工成和在AutoCAD中所畫的圖形一致的圖案。
這樣就省去了數控編程來實現加工的麻煩,提高了生產效率。
[1]宋耀增.AutoCAD DXF文件 C語言函數庫的研制[J].燕山大學學報,1998,22(4):304-309.SONG Yao-zeng.AutoCAD DXF file Clanguage function library development[J].Journal of Yanshan University,1998,2(4):304-309.
[2]竇憲民.AutoCAD接口技術研究[J].鄭州輕工業學院學報:自然科學,2002,17(2):86-88.DOU Xian-min.AutoCAD interface technology research[J].Zhengzhou Light Industry University:Natural Science,2002,17(2):86-88.
[3]陶元芳.C語言命令文件式參數繪圖函數集[J].太原重型機械學院學報,2002,23(2):107-112.TAO Yuan-fang.C language command file type parameter drawing function set[J].Taiyuan heavy machinery institute journal,2002,23(2):107-112.
[4]張金萍.DXF接口文件在復雜圖形數控加工中的應用[J].沈陽化工學院學報,2004,18(2):152-159.ZHANG Jin-ping.DXF interface files in nc machining of complex graphics application[J].Shenyang Institute of Chemical Journal,2004,18(2):152-159.
[5]鄧燕.AutoCAD2004中文版基礎與實例教程[M].北京:電子工業出版社,2004.
[6]譚浩強.C語言程序設計[M].3版.北京:清華大學出版社,2005.
[7]夏云龍.VC++深入詳解[M].北京:電子工業出版社,2008.
[8]王瀟.數控機床大推力永磁同步直線電機控制方法 [J].電子科技,2011(6):124-126.WANGXiao.Study on the control of the high thrust permanent magnet liner synchronous motor used in the numerical control machine[J].Electronic Science and Technology,2011(6):124-126.
[9]李周平.基于直線電機的數控機床驅動控制技術[J].現代電子技術,2012(3):158-160.LI Zhou-ping.Drive control technology of numerical control machine based on linear motor[J].Modern Electronics Technique,2012(3):158-160.