詳細(xì)剖析了CAD的圖形交換格式———DXF文件的結(jié)構(gòu),分析了SVG文件的框架元素和圖形元素,建立了CAD中的對(duì)象、DXF文件中的實(shí)體和SVG中的元素三者之間的對(duì)應(yīng)表,并對(duì)轉(zhuǎn)換中遇到的難點(diǎn)問題提出了解決方案,最后,通過編程實(shí)現(xiàn)驗(yàn)證了方法的可行性。
引言
目前CAD技術(shù)已廣泛應(yīng)用于建筑設(shè)計(jì)、機(jī)械設(shè)計(jì)、城市規(guī)劃、交通等領(lǐng)域,由其主流軟件AutoCAD或在之基礎(chǔ)上二次開發(fā)的軟件生成的圖紙層出不窮。SVG(Scalable Vector Graphics,可縮放的矢量圖形)基于XML標(biāo)準(zhǔn),既具有開放性,文件較小,顯示放縮不損失質(zhì)量等優(yōu)點(diǎn),又有強(qiáng)大的動(dòng)畫交互功能和豐富的濾鏡效果。盡管現(xiàn)在已有一些SVG圖形的生成工具,但為了充分共享已有的CAD文件,使之能運(yùn)用于WebGIS或圖形發(fā)布,因此有必要探討將CAD文件有效地轉(zhuǎn)換為SVG文件的問題。
AutoCAD的主要圖形格式為DWG文件和DXF文件,AutoCAD公司直今未公開DWG文件格式,如要直接讀取DWG文件,就需要分析其二進(jìn)制數(shù)據(jù),破譯其格式,這種工作相對(duì)很困難。另一種方法是利用AutoCAD的二次開發(fā)技術(shù),使用如ADS、ObjectARX、VBA、Visual Lisp等開發(fā)語(yǔ)言直接訪問AutoCAD提供的一組ActiveX接口,獲取圖形文件中各個(gè)圖形對(duì)象的有用信息,然后使用SVG中相應(yīng)的元素來描述這些圖形對(duì)象。但這種方法不能完全脫離AutoCAD平臺(tái),應(yīng)用不夠靈活?,F(xiàn)在國(guó)外對(duì)DWG格式的研究也有很多,較為著名的是OpenDWG協(xié)會(huì)的ODT軟件包,該軟件包為直接操作DWG文件提供了豐富的函數(shù)。但要利用此軟件包必須是會(huì)員,并且需要繳費(fèi),在非盈利條件下可以免費(fèi)使用。DXF是AutoCAD提供的圖形交換格式,它以ASCII碼格式存儲(chǔ)文件,可以用記事本編輯,簡(jiǎn)單易讀,應(yīng)用廣泛。DXF在表現(xiàn)圖形的大小方面十分精確,本文主要探討了DXF文件轉(zhuǎn)換到SVG文件的一系列問題。
1 DXF格式剖析
DXF格式是標(biāo)記AutoCAD圖形文件中所包含的全部信息的一種表示方法,最小組成單位是組,每組占兩行,第一行是組碼,是一個(gè)整數(shù),表明了其后數(shù)據(jù)元素的類型,也指出了數(shù)據(jù)元素對(duì)于給定對(duì)象(或記錄)類型的含意;第二行是組值,數(shù)據(jù)類型根據(jù)組碼的數(shù)值可以是字符串型、整型或浮點(diǎn)數(shù)型等。一個(gè)DXF文件分為七個(gè)區(qū)域(如圖1),每個(gè)區(qū)域均由多個(gè)組組成。每個(gè)區(qū)域都是以組碼0開始,其后跟隨著字符串SECTION,接著是組碼2和表示區(qū)域名稱的字符串(例如HEADER),當(dāng)出現(xiàn)組碼0,其后跟隨字符串ENDSEC時(shí)表示該區(qū)域結(jié)束。所有區(qū)域都結(jié)束后,在DXF文件的最后是組碼0,后跟組值為字符串EOF作為文件的結(jié)束標(biāo)志。圖2是DXF文件中的HEADER區(qū)域。一個(gè)DXF文件可以只包含七個(gè)區(qū)域中的若干個(gè)區(qū)域,而不是全部區(qū)域。七個(gè)區(qū)域中,最重要的是ENTITIES區(qū)域。一個(gè)最簡(jiǎn)單的DXF文件可以只包含ENTITIES區(qū)域,而不需要包含其他任何區(qū)域,這樣就大大降低了DXF文件編寫的難度。
HEADER區(qū)域 |
CLASSES區(qū)域 |
TABLES區(qū)域 |
BLOCKS區(qū)域 |
ENTITIES區(qū)域 |
OBJECTS區(qū)域 |
THUMBNAIL IMAGE區(qū)域 |
表1 DXF文件的組織結(jié)構(gòu)
0 HEADER |
HEADER區(qū)域的開始 |
9 $<變量> <組碼> <值> |
重復(fù)每一頭部變量 |
0 ENDSEC |
HEADER區(qū)域結(jié)束 |
表2 DXF文件中的HEADER區(qū)域
DXF文件完整的組織結(jié)構(gòu)說明如下:
- HEADER區(qū)域:包含圖形的基本信息,由一個(gè)AutoCAD數(shù)據(jù)庫(kù)版本號(hào)和許多系統(tǒng)變量組成。
- CLASSES區(qū)域:包含有關(guān)應(yīng)用程序定義類的信息,這些類的實(shí)例包含在BLOCKS區(qū)域、ENTITIES區(qū)域和OBJECTS區(qū)域的數(shù)據(jù)庫(kù)中。
- TABLES區(qū)域:包含一系列符號(hào)表的定義。這些符號(hào)表包括:APP ID(應(yīng)用程序標(biāo)識(shí)表) 、BLOCK_RECORD (塊引用表) 、DIMSTYLE (標(biāo)注樣式表) 、LAYER (圖層表) 、LTYPE (線型表) 、STYLE (文本樣式表) 、UCS(用戶坐標(biāo)系表) 、VIEW (視圖表)和VPORT(視口配置表) 。
- BLOCKS區(qū)域:包括塊定義和組成圖形中每個(gè)塊引用的圖形圖元。
- ENTITIES區(qū)域:包含圖形中的所有圖形對(duì)象(包括點(diǎn)、線、面、插入塊,注記文字等實(shí)體) ,其中包括塊引用。
- OBJECTS區(qū)域:包含圖形中的非圖形對(duì)象。
- THUMBNAIL IMAGE區(qū)域:包含圖形中的預(yù)覽圖像。
2 SVG文件的結(jié)構(gòu)分析
SVG矢量圖形具有很多優(yōu)點(diǎn),與目前網(wǎng)絡(luò)流行的點(diǎn)陣圖
像格式GIF和JPEG相比, SVG能任意對(duì)圖形顯示進(jìn)行放縮
而保證圖像質(zhì)量,不會(huì)出現(xiàn)點(diǎn)陣圖常見的鋸齒邊緣,文件容量相對(duì)較小,存儲(chǔ)效率高,下載速度快;與矢量動(dòng)畫軟件Flash制作的圖形相比,也具有一些優(yōu)勢(shì),比如Flash的文件僅能用Flash軟件編輯,不利于文檔的更改和維護(hù),而SVG圖形能用任意的文本編輯工具編輯; Flash的文件與通用的標(biāo)準(zhǔn)技術(shù)間缺乏互操作性,如缺乏與HTML 頁(yè)面或CSS表單互動(dòng)的機(jī)制,而SVG能嵌入到HTML 頁(yè)面中,支持事件編程,能通過XSL或CSS的方法添加各種樣式等。
SVG是XML的擴(kuò)展,在語(yǔ)法和格式上是XML 規(guī)范的一部分,但不屬于XML 所能解釋的范疇。SVG文檔區(qū)分大小
寫,具有XML的基本屬性 :
- 所有的標(biāo)記都有開始標(biāo)記和結(jié)束標(biāo)記,否則必須注明為空標(biāo)記。空標(biāo)記用反斜杠結(jié)束,如< line / >。
- 標(biāo)記必須正確嵌套。如果一個(gè)標(biāo)記在另一個(gè)標(biāo)記中開始,那么它也必須在那個(gè)標(biāo)記中結(jié)束。
- 文檔必須只有一個(gè)根。一個(gè)< svg > < / svg > 元素包含了一個(gè)SVG文檔的所有內(nèi)容。
- 文檔應(yīng)該以XML 聲明< ? xml version = ”1. 0”? >開始。
- 文檔應(yīng)該包含一個(gè)DOCTYPE聲明, 該聲明指向一個(gè)允許元素的列表。
SVG 1. 0 文檔的DOCTYPE聲明是:
<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTDSVG1.0//EN"" http://www.w3.org/TR/2001/REC2SVG220010904/DTD/svg10.dtd">
<svg width="800" height="600" xmlns="http://www.w3.org/2000/svg">
</svg>
SVG圖形包括框架元素和圖形元素??蚣茉啬軌虬瑘D形元素和其他框架元素,如:<svg>、<g>、<defs>、<symbol>、<clipPath>、<mask>、<pattern>、<marker>、<a>和<switch>。<g>元素是編組元素,能分組圖形對(duì)象,便于管理和使用,如對(duì)組進(jìn)行變換或提供一個(gè)公共屬性。<defs>元素定義可重用部件,以后可在圖形主體中調(diào)用,這種重用技術(shù)最大限度地利用了HTTP的緩存功能,避免了數(shù)據(jù)的重復(fù)下載。調(diào)用<defs>元素定義的項(xiàng)有兩種方式,一種是定義的項(xiàng)通過其本地URL(或URI)引用;第二種是使用<use/>元素。
例如: <use xlink:href="#block1"/>
圖形元素包含路徑<path>、文字<text>、圖像<image>、<use>和六種基本形狀:矩形<rect>、圓<circle>、橢圓<ellipse>、線<line>、折線<polyline>、多邊形<polygon>,簡(jiǎn)單圖形直接由基本形狀構(gòu)建,每個(gè)基本形狀都帶有位置、大小、顏色、輪廓等屬性。復(fù)雜圖形可以用路徑<path>來描述,路徑是一系列命令,用來創(chuàng)建作為圖像一部分精確定義的形狀,該形狀可以是開放的或閉合的,并可以包含一條或多條線、曲線和線段,其中曲線可用圓弧、三次或兩次的Bezier曲線繪制。SVG提供了對(duì)嵌入圖像的支持,可以在<image>直接寫入圖像的二進(jìn)制信息,也可以鏈接指向某個(gè)圖像文件,還可以用濾鏡中的<feImage>引入外部圖像文件加以處理。SVG在字體處理上采用了CSS 2中的字體顯示核心技術(shù)Web Font,保證在任何情況下看到的字體相同。SVG通過<transform>可以實(shí)現(xiàn)坐標(biāo)轉(zhuǎn)換,實(shí)現(xiàn)圖形放縮、旋轉(zhuǎn)、鏡像、傾斜等效果。
3 DXF文件轉(zhuǎn)換為SVG文件
分析DXF文件和SVG文件,發(fā)現(xiàn)兩者在表示方式上有一定的相似之處,兩者均是文本文件,通過記錄圖形的特征數(shù)據(jù)來描述矢量圖形,比如圓,兩者均記錄了圓心、半徑等數(shù)據(jù)。但在有些圖形的描述上,記錄的特征數(shù)據(jù)是不同的,比如橢圓等。所以,實(shí)現(xiàn)CAD文件到SVG文件的轉(zhuǎn)換,不僅要分析AutoCAD中的每一類型的二維矢量圖形對(duì)象在DXF文件中的對(duì)應(yīng)實(shí)體描述,以及SVG中對(duì)應(yīng)于DXF文件中的實(shí)體的元素,而且應(yīng)針對(duì)DXF記錄的特征數(shù)據(jù)利用相應(yīng)的公式推導(dǎo)出SVG需要的數(shù)據(jù)。經(jīng)過詳細(xì)深入的分析,得到AutoCAD中的對(duì)象、DXF文件中的實(shí)體和SVG中的元素之間的對(duì)應(yīng)如表1所示。
表1 AutoCAD中的對(duì)象、DXF文件中的實(shí)體和SVG中的元素對(duì)應(yīng)表
AutoCAD中的圖形對(duì)象 | DXF文件中的實(shí)體 | SVG中對(duì)應(yīng)的元素 |
矩形、多邊形、多段線 | LWPOLYLINE | polyline |
圓 | CIRCLE | Circle |
橢圓 | ELLIPSE | ellipse、rotate |
直線 | LINE | line |
圓弧 | ARC | path |
橢圓弧 | ELLIPSE | path |
樣條曲線 | SPLINE | path |
圖塊和塊引用 | BLOCK、INSERT | defs、g、use等 |
文字 | TEXT、MTEXT | text |
圖像 | IMAGE | image |
多線 | MLINE | polyline |
圖案填充 | HATCH | defs、g、use等 |
參照線 | XLINE | line |
尺寸 | DIMENSION | defs、g、use等 |
在轉(zhuǎn)換的過程中,會(huì)遇到一些難點(diǎn),下面提出具體的解決方案:
3.1 坐標(biāo)系統(tǒng)
不管是AutoCAD中的對(duì)象還是SVG中的圖形都是通過坐標(biāo)定位的。但是兩者的坐標(biāo)系統(tǒng)是不同的, AutoCAD的世界坐標(biāo)系的原點(diǎn)在屏幕的左下角, X軸的正向朝右, Y軸的正向向上。SVG的坐標(biāo)系的原點(diǎn)在初始視口(屏幕)的左上角,X軸的正向朝右, Y軸的正向朝下。兩者均可以定義自己的坐標(biāo)系。在DXF文件向SVG文件轉(zhuǎn)換時(shí),為保證圖形顯示正確,應(yīng)將所有的圖形進(jìn)行坐標(biāo)矩陣變換。在SVG中使用下面語(yǔ)句:
<g transform="matrix(1 0 0 21 0 600)">
</g>
3.2 橢圓
由于在DXF文件中的橢圓記錄的特征數(shù)據(jù)和SVG中的橢圓元素需要的數(shù)據(jù)是不同的, DXF文件記錄了橢圓圓心、長(zhǎng)軸的端點(diǎn)(相對(duì)于圓心的相對(duì)值) 、半長(zhǎng)軸與半短軸的比例等數(shù)據(jù)。SVG中的橢圓元素需要橢圓圓心、半長(zhǎng)軸、半短軸等數(shù)據(jù)。并且AutoCAD中的橢圓的長(zhǎng)軸可以和水平軸成任意角度,但直接用SVG中的< ellip se >元素所繪的圖形只能使橢圓的長(zhǎng)軸平行于水平軸,因此,需要計(jì)算長(zhǎng)軸和水平軸所成角度,再使用旋轉(zhuǎn)變換。所以應(yīng)利用下面公式轉(zhuǎn)換:
sl = S qr( x23 x2 + y23 y2)
ss = sl3 r1
aa = A tn ( y2 / x2) 3 180 /3. 141 592 6
其中sl代表橢圓的半長(zhǎng)軸, ss代表橢圓的半短軸, aa代表橢圓的長(zhǎng)軸與水平軸的角度, x2和y2是長(zhǎng)軸的端點(diǎn)(相對(duì)于圓心的相對(duì)值) , r1是半長(zhǎng)軸與半短軸的比例。
3.3 文字
對(duì)所有圖形進(jìn)行了坐標(biāo)系統(tǒng)轉(zhuǎn)換,但文字不同于其他圖形,轉(zhuǎn)換之后會(huì)出現(xiàn)了反轉(zhuǎn),這時(shí)應(yīng)先將文字相對(duì)于原所在位置的基線進(jìn)行鏡像,這樣能保證文字按正常狀態(tài)顯示。
轉(zhuǎn)換之后,可能出現(xiàn)SVG中的中文不能顯示的情況,這是因?yàn)镾VG有3種編碼形式: iso2885921 (ASCII) 、utf28和utf216, iso2885921 (ASCII)不能直接使用漢字字符, utf28和utf216是Unicode形式的編碼, utf28支持多語(yǔ)種,每一個(gè)ASCII字符使用一個(gè)字節(jié)來表示,對(duì)于其他字符使用三個(gè)字節(jié)來表示。utf216對(duì)于任何一個(gè)字符都是使用兩個(gè)字節(jié)來表示,這兩種編碼能正常顯示漢字。在編程時(shí),如果直接寫SVG文檔,則文檔使用的是ASCII碼,所以不能正常顯示漢字。解決的方案是:
3.3.1 在SVG中,需要將中文字體名稱進(jìn)行“國(guó)際化”,即將漢字字體名稱改為英文名稱,下面是部分字體對(duì)照列表(表2) 。
表2 部分漢字字體與英文名稱對(duì)照表
英文名稱 | 漢字字體 | 英文名稱 | 漢字字體 |
FangSong_GB2312 | 仿宋_GB2312 | KaiTi_GB2312 | 楷體_GB2312 |
YouYuan | 幼圓 | LiSu | 隸書 |
SimSun | 宋體 | SimHei | 黑體 |
3.3.2 將ASCII碼的文檔轉(zhuǎn)換成Unicode編碼后寫文件。下面是VB 實(shí)現(xiàn)的代碼,將ASCII碼的文檔讀入byte 數(shù)組mem,通過StrConv( )轉(zhuǎn)換后,寫入文件。
fLength = FileLen (" c: / svg1. svg" )
ReDim mem (fLength) AsByte
Open "c: / svg1. svg" For Binary As #2
Get #2, , mem
Close #2
mem = StrConv(mem, vbUnicode, &H804)
Open svgfilename For Binary As #3
Put #3, , mem
Close #3
3.4 圓弧、橢圓弧
對(duì)于圓弧、橢圓弧等復(fù)雜圖形,在SVG中用< Path >元素
描述,其中有橢圓弧命令:
A rx ry x2axis2rotation large2arc2flag sweep2flag x y
其中, rx和ry分別是半長(zhǎng)軸和半短軸, x2axis2rotation是弧所在橢圓的X 軸與水平方向的夾角, large2arc2flag 和sweep2flag決定橢圓弧的繪制方向,如果large2arc2flag為1代表大角度弧線,為0代表小角度弧線, sweep2flag為1代表起點(diǎn)到終點(diǎn)的弧線繞橢圓中心是順時(shí)針方向,為0是逆時(shí)針方向, x和y是橢圓弧終點(diǎn)坐標(biāo)。這和DXF中的圓弧、橢圓弧描述的特征數(shù)據(jù)是不一樣的,同樣需要轉(zhuǎn)換。
3.5 圖塊
為了提高繪圖效率, AutoCAD中提供了圖塊對(duì)象。在DXF中,圖塊定義在TABLES 區(qū)域,在ENTITIES區(qū)域通過INSERT組碼存儲(chǔ)圖塊調(diào)用信息。轉(zhuǎn)換成SVG時(shí),將圖塊定義用<defs>來組織,圖塊名作為每個(gè)defs元素的ID屬性,使用<use>元素調(diào)用圖塊信息。這種方式支持圖塊的嵌套。
3.6 圖層
圖層是AutoCAD中的一種非常有用的圖形管理方式,將圖形對(duì)象分門別類放在不同的圖層中,便于用戶管理、編輯和打印。在轉(zhuǎn)換器中,實(shí)現(xiàn)了根據(jù)圖層有選擇轉(zhuǎn)換圖形,極大地增強(qiáng)了靈活性。
4 應(yīng)用實(shí)例
根據(jù)上述分析,筆者利用VB編程實(shí)現(xiàn)了二維矢量圖形從DXF文件到SVG文件的轉(zhuǎn)換,實(shí)現(xiàn)算法如下:
- 選擇DXF文件后,進(jìn)行DXF文件讀,顯示圖形所包含的所有圖層。
- 輸入目標(biāo)文件名。
- 選擇要轉(zhuǎn)換的圖層。
- 進(jìn)行DXF文件到SVG文件的轉(zhuǎn)換:
- 首先對(duì)一個(gè)臨時(shí)SVG文件進(jìn)行初始化。
- 根據(jù)從DXF文件中讀出的組碼和組值判斷對(duì)象的類型,不同類型的對(duì)象取得不同的屬性。
- 進(jìn)行必要的屬性轉(zhuǎn)換,對(duì)每個(gè)不同對(duì)象用SVG中相應(yīng)的元素來描述。
- 將轉(zhuǎn)換后的結(jié)果寫到臨時(shí)的SVG文件中。
- 將臨時(shí)的SVG文件進(jìn)行從ASCII碼到Unicode編碼的轉(zhuǎn)換。
- 將Unicode編碼以二進(jìn)制方式寫入目標(biāo)文件。

圖1 通過轉(zhuǎn)換器轉(zhuǎn)換后得到的SVG圖形
5 結(jié)語(yǔ)
本文詳細(xì)剖析了DXF文件的結(jié)構(gòu),并且分析了SVG文件的基本要素和框架要素,建立了CAD中的對(duì)象、DXF文件中的實(shí)體和SVG中的元素三者之間的對(duì)應(yīng)表,并對(duì)轉(zhuǎn)換中遇到的坐標(biāo)系統(tǒng)轉(zhuǎn)換、文字顯示、圖塊、復(fù)雜圖形的顯示等多個(gè)問題提出了解決方案,最后,通過VB編程實(shí)現(xiàn)驗(yàn)證了方法的可行性。這種轉(zhuǎn)換方法完全不依賴于AutoCAD平臺(tái),靈活高效,具有一定的實(shí)用價(jià)值。
相關(guān)文章
- 2021-09-08BIM技術(shù)叢書Revit軟件應(yīng)用系列Autodesk Revit族詳解 [
- 2021-09-08全國(guó)專業(yè)技術(shù)人員計(jì)算機(jī)應(yīng)用能力考試用書 AutoCAD2004
- 2021-08-30從零開始AutoCAD 2014中文版機(jī)械制圖基礎(chǔ)培訓(xùn)教程 [李
- 2021-08-30從零開始AutoCAD 2014中文版建筑制圖基礎(chǔ)培訓(xùn)教程 [朱
- 2021-08-30電氣CAD實(shí)例教程AutoCAD 2010中文版 [左昉 等編著] 20
- 2021-08-30電影風(fēng)暴2:Maya影像實(shí)拍與三維合成攻略PDF下載
- 2021-08-30高等院校藝術(shù)設(shè)計(jì)案例教程中文版AutoCAD 建筑設(shè)計(jì)案例
- 2021-08-29環(huán)境藝術(shù)制圖AutoCAD [徐幼光 編著] 2013年P(guān)DF下載
- 2021-08-29機(jī)械A(chǔ)utoCAD 項(xiàng)目教程 第3版 [繆希偉 主編] 2012年P(guān)DF
- 2021-08-29機(jī)械制圖與AutoCAD [李志明 主編] 2014年P(guān)DF下載