王 超,沈良朵
(1.浙江海洋大學(xué)海洋工程裝備學(xué)院,浙江舟山 316022;2.大連海事大學(xué)航海學(xué)院,遼寧大連 116023)
Auto CAD 是國(guó)際上廣為流行的繪圖工具,憑借其良好的用戶界面,通過(guò)交互菜單或命令行方式可根據(jù)需要快速畫(huà)出由基本線單元構(gòu)成的圖形。MATLAB 擁有強(qiáng)大的數(shù)學(xué)函數(shù)庫(kù),可輕松繪制各種由復(fù)雜函數(shù)控制的數(shù)學(xué)圖形。如何實(shí)現(xiàn)AutoCAD 和MATLAB 兩者高效交互是本文所要研究和解決的問(wèn)題。和平安等[1]借助Excel 實(shí)現(xiàn)了兩者簡(jiǎn)單交互,但其方式繁瑣、占用內(nèi)存高且容易出錯(cuò),完全依靠手動(dòng)操作。賀云花[2]提出了利用SCR 腳本實(shí)現(xiàn)二維曲線、三維曲線的轉(zhuǎn)換以及初步提到利用DXF 文件實(shí)現(xiàn)簡(jiǎn)單的二維曲線的繪制。王蔚[3]利用MATLAB 生成的SCR 腳本文件實(shí)現(xiàn)了AutoCAD 中復(fù)雜曲線/曲面的繪制。于志偉等[4]受以上文獻(xiàn)的啟發(fā),集合不同方法的優(yōu)勢(shì),通過(guò)MATLAB 直接編寫(xiě)DXF 文件來(lái)實(shí)現(xiàn)復(fù)雜曲線、曲面和文字組織等繪制以及通過(guò)DXF 和STL 讀取函數(shù)來(lái)讀取AutoCAD 中的二維和三維圖像信息并繪制。本文利用承載AutoCAD 重要的數(shù)據(jù)交換功能的DXF 和STL 文件,實(shí)現(xiàn)了AutoCAD 及MATLAB 高效交互,以充分結(jié)合二者的優(yōu)勢(shì),快速繪制所需的復(fù)雜圖形。
DXF 文件是AutoCAD 中的圖形交換文件。作為一種開(kāi)放的矢量格式,分為ASII 格式和二進(jìn)制格式;前者可讀性優(yōu)秀同時(shí)占用的空間相對(duì)較大;后者讀取性略差但勝在讀取速度快且占用內(nèi)存小。DXF 文件的組成單位為“組”,一個(gè)“組”代碼和一個(gè)“組值”構(gòu)成一個(gè)“組”,每個(gè)“組”代碼和“組值”各單獨(dú)占用一行,用以指定之后的值的類型以及用途。多個(gè)組組成“段”,每個(gè)段的開(kāi)頭是以組碼“0”和字符串“SECTION”,之后是組碼“2”和表示段名的字符串。段的中間,可以使用組碼和值定義段中的元素。段的結(jié)尾,可以使用組碼“0”和字符串“ENDSEC”來(lái)定義。
STL 文件是在計(jì)算機(jī)圖形應(yīng)用系統(tǒng)中用來(lái)表示三角形網(wǎng)格的一種文件形式,其格式簡(jiǎn)單,應(yīng)用廣泛,是計(jì)算機(jī)圖形學(xué)處理CG,數(shù)字幾何處理如CAD,數(shù)字幾何工業(yè)應(yīng)用如3D 打印機(jī)支持的最常見(jiàn)文件格式。STL 文件分為二進(jìn)制格式和ASCII 明碼格式,只能用來(lái)表示封閉的面或者體。ASCII 碼格式的STL 文件每一行以1 個(gè)或2 個(gè)關(guān)鍵字開(kāi)頭,逐行給出三角面片幾何信息。Auto CAD 三維實(shí)體文件可以轉(zhuǎn)化為STL 格式文件,用于和其他軟件如MATLAB 之間的交互。
實(shí)現(xiàn)AutoCAD 讀取MATLAB 圖形文件,首先要讓MATLAB 生成AutoCAD 可識(shí)別的DXF 文件,如圖1 所示。MATLAB 對(duì)于DXF 的編寫(xiě)需要用到dxflib 庫(kù),dxflib 是一個(gè)用于讀寫(xiě)AutoCAD(R)DXF 文件的開(kāi)源C+庫(kù)。它提供了讀取和寫(xiě)入許多基本實(shí)體的功能,以及有關(guān)層和塊的信息。dxflib 是一個(gè)狀態(tài)庫(kù),即在不被更改的情況下它能保留某些參數(shù)值在不同函數(shù)的后續(xù)調(diào)用。
圖1 CAD 讀取MATLAB 圖形文件過(guò)程Fig.1 The process of reading matlab graphics files with Auto CAD
利用dxflib 庫(kù)可建立生成DXF 文件的接口程序,可通過(guò)其主要的功能函數(shù)實(shí)現(xiàn)特定操作,如通過(guò)dxf_open 函數(shù)新建一個(gè)dxf 文件,通過(guò)dxf_close 函數(shù)關(guān)閉編寫(xiě)完成的dxf 文件,通過(guò)dxf_set 函數(shù)設(shè)置dxf文件的屬性(層數(shù),顏色等),通過(guò)dxf_polyline、dxf_polymesh、dxf_point 等函數(shù)分別實(shí)現(xiàn)對(duì)應(yīng)折線、多邊形網(wǎng)格、點(diǎn)等功能的操作。
實(shí)現(xiàn)MATLAB 讀取AutoCAD 圖形文件,首先要將二維AutoCAD 圖形文件另存為DXF 文件,三維AutoCAD 圖形文件轉(zhuǎn)化為STL 文件。然后需解析DXF 和STL 文件中的各種基本的幾何圖形數(shù)據(jù),包括點(diǎn)、線段、多段線、圓弧、圓和各種基本三維實(shí)體等,其過(guò)程分別如圖2 和圖3 所示。
圖2 MATLAB 讀取二維Auto CAD 圖形文件過(guò)程Fig.2 The process of reading two-dimensional Auto CAD graphics files with MATLAB
圖3 MATLAB 讀取三維Auto CAD 圖形文件過(guò)程Fig.3 The process of reading 3D Auto CAD graphics files with MATLAB
AutoCAD 對(duì)不同類型的MATLAB 圖形文件的讀取需要借助dxf_函數(shù)創(chuàng)建的DXF 圖形文件。DXF 文件能夠被AutoCAD 直接打開(kāi),包括但不限于三維基本體、多邊形網(wǎng)格以及彩色多邊形網(wǎng)格圖像等。
2.1.1 三維基本體讀取
復(fù)雜曲線、曲面的創(chuàng)建離不開(kāi)基元,通過(guò)DXF 文件接口程序可以得到自己想要的各種基元圖像,如球體,四面體,六面體等。在MATLAB 中運(yùn)行接口程序,實(shí)例如下:
生成的dxf 文件用Auto CAD 打開(kāi)后如圖4 所示。
圖4 AutoCAD 打開(kāi)由MATLAB 生成的基元圖像Fig.4 Opening the primitive image generated by MATLAB with AutoCAD
2.1.2 多邊形網(wǎng)格圖像讀取
多邊形網(wǎng)格的創(chuàng)建需要用到dxf_polyline 函數(shù),它可以利用MATLAB 的矩陣數(shù)據(jù)創(chuàng)建多個(gè)面的dxf 數(shù)據(jù),并且允許為每個(gè)面指定顏色(1 個(gè)面只能指定1 個(gè)顏色)。以MATLAB 最經(jīng)典的peaks 函數(shù)為例,在MATLAB中運(yùn)行接口程序:
在這個(gè)程序中需要使用surf2patch 函數(shù)將圖像的幾何形狀和顏色數(shù)據(jù)轉(zhuǎn)換為補(bǔ)片格式。輸出fvc 是包含面、頂點(diǎn)以及顏色數(shù)據(jù)的結(jié)構(gòu)體,可以將此結(jié)構(gòu)體直接傳遞給patch 命令。利用這些矩陣數(shù)據(jù)來(lái)構(gòu)建多邊形網(wǎng)格圖形。這里默認(rèn)顏色為黃色,如圖5 所示。
圖5 AutoCAD 打開(kāi)由MATLAB 生成的peaks 圖像Fig.5 Opening the image of peaks generated by MATLAB with AutoCAD
2.1.3 彩色多邊形網(wǎng)格圖像創(chuàng)建
很多時(shí)候利用到多邊形網(wǎng)格的時(shí)候,是需要給不同的高度或者區(qū)域區(qū)分顏色的,所以彩色多邊形網(wǎng)格的創(chuàng)建就尤為必要。DXF 原本是不支持surf2patch 函數(shù)的顏色輸出類型的,即逐頂點(diǎn)顏色矩陣。因此,需要通過(guò)z 坐標(biāo)來(lái)實(shí)現(xiàn)不同高度的顏色區(qū)分。通過(guò)給每個(gè)面的矩陣都準(zhǔn)備好相應(yīng)的顏色,并將原本DXF 不支持的RGB 顏色方案通過(guò)dxf_rgb2aci 函數(shù)轉(zhuǎn)化為aci 著色方案,就可以實(shí)現(xiàn)彩色多邊形網(wǎng)格的繪制。同樣以peaks 函數(shù)為例,在MATLAB 中運(yùn)行如下接口程序生成dxf 文件,結(jié)果如圖6 所示。
圖6 AutoCAD 環(huán)境下的彩色多邊形網(wǎng)格圖像Fig.6 Color polygon mesh image in AutoCAD environment
配置顏色后的圖像相比純色的圖像更加形象且獲得的信息也更多,配合AutoCAD 進(jìn)行編輯的能力也更出色,真正意義實(shí)現(xiàn)了AutoCAD 和MATLAB 通過(guò)DXF 文件共同編輯復(fù)雜圖像的目標(biāo),將MATLAB 強(qiáng)大的函數(shù)功能和AutoCAD 出色的圖形編輯相結(jié)合。
MATLAB 讀取Auto CAD 圖形文件時(shí)需要利用多種不同的函數(shù),對(duì)應(yīng)不同種類的AutoCAD 圖形文件輸出格式。不同類型、維度的CAD 圖形不能一概而論,必須輸出為適當(dāng)類型的圖形文件才能被MATLAB對(duì)應(yīng)的函數(shù)讀取。下文介紹了比較典型的2 種案例。
2.2.1 基本圖元讀取
將二維Auto CAD 圖形文件另存為DFX 文件,利用dxf2mat 函數(shù)可讀取DXF 文件中基本圖元數(shù)據(jù),包括直線、多段線、圓或圓弧等,一旦識(shí)別DXF 文件中的基本圖元信息,則可利用MATLAB 相應(yīng)的繪圖命令快速得到與DXF 文件一致的圖形,如圖7 所示。
圖7 MATLAB 讀取Auto CAD 基本圖元Fig.7 Reading basic elements from AutoCAD with MATLAB
2.2.2 三維實(shí)體讀取
將三維Auto CAD 圖形文件轉(zhuǎn)化為STL 文件,利用stlread 函數(shù)可讀取STL 文件中的三角面片的幾何信息,一旦識(shí)別STL 文件中的信息,則可利用MATLAB 相應(yīng)的繪圖命令快速得到與STL 文件一致的圖像,如圖8 所示。
圖8 MATLAB 讀取Auto CAD 三維實(shí)體Fig.8 Reading 3D entity from AutoCAD with MATLAB
相較于AutoCAD,MATLAB 讀取后的三維實(shí)體曲面不那么圓潤(rùn),線條感更足;但是相對(duì)的,其讀取的平面也更加平滑,肉眼幾乎看不見(jiàn)類似鋸齒。側(cè)面反映了MATLAB 的特點(diǎn),即通過(guò)參數(shù)繪制圖形,在處理此類規(guī)則圖形時(shí)占據(jù)巨大優(yōu)勢(shì)。MATLAB 將圖形的每個(gè)圖形元素(如坐標(biāo)軸、曲線、文字等)看做一個(gè)獨(dú)立的對(duì)象,系統(tǒng)給每個(gè)對(duì)象分配一個(gè)句柄,可以通過(guò)句柄對(duì)該圖形元素進(jìn)行操作,而不影響其他部分。
本文以DXF 和STL 圖形處理文件為媒介,實(shí)現(xiàn)了AutoCAD 和MATLAB 的數(shù)據(jù)高效互通,將兩者的優(yōu)勢(shì)相結(jié)合共同繪圖,從而實(shí)現(xiàn)1+1 大于2 的效應(yīng)。對(duì)于既有線性元素,又有函數(shù)元素構(gòu)成的復(fù)雜圖形,本方法將大幅提高繪圖效率并實(shí)現(xiàn)精準(zhǔn)繪圖。