我想看一级黄色大片_久久亚洲国产精品一区二区_久久精品免视看国产明星_91久久青青青国产免费

您的位置:網(wǎng)站首頁(yè) > CAD新聞

CAD文件轉(zhuǎn)換為SVG文件的探討

時(shí)間:2011-08-17 10:15:40 來源:未知

詳細(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
SECTION
2

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的基本屬性 :

  1. 所有的標(biāo)記都有開始標(biāo)記和結(jié)束標(biāo)記,否則必須注明為空標(biāo)記。空標(biāo)記用反斜杠結(jié)束,如< line / >。
  2. 標(biāo)記必須正確嵌套。如果一個(gè)標(biāo)記在另一個(gè)標(biāo)記中開始,那么它也必須在那個(gè)標(biāo)記中結(jié)束。
  3. 文檔必須只有一個(gè)根。一個(gè)< svg > < / svg > 元素包含了一個(gè)SVG文檔的所有內(nèi)容。
  4. 文檔應(yīng)該以XML 聲明< ? xml version = ”1. 0”? >開始。
  5. 文檔應(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)算法如下:

  1. 選擇DXF文件后,進(jìn)行DXF文件讀,顯示圖形所包含的所有圖層。
  2. 輸入目標(biāo)文件名。
  3. 選擇要轉(zhuǎn)換的圖層。
  4. 進(jìn)行DXF文件到SVG文件的轉(zhuǎn)換:
  1. 首先對(duì)一個(gè)臨時(shí)SVG文件進(jìn)行初始化。
  2. 根據(jù)從DXF文件中讀出的組碼和組值判斷對(duì)象的類型,不同類型的對(duì)象取得不同的屬性。
  3. 進(jìn)行必要的屬性轉(zhuǎn)換,對(duì)每個(gè)不同對(duì)象用SVG中相應(yīng)的元素來描述。
  4. 將轉(zhuǎn)換后的結(jié)果寫到臨時(shí)的SVG文件中。
  5. 將臨時(shí)的SVG文件進(jìn)行從ASCII碼到Unicode編碼的轉(zhuǎn)換。
  6. 將Unicode編碼以二進(jìn)制方式寫入目標(biāo)文件。

 

圖1 通過轉(zhuǎn)換器轉(zhuǎn)換后得到的SVG圖形

圖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à)值。