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

您的位置:網站首頁 > CAD新聞

CAD文件轉換為SVG文件的探討

時間:2011-08-17 10:15:40 來源:未知

詳細剖析了CAD的圖形交換格式———DXF文件的結構,分析了SVG文件的框架元素和圖形元素,建立了CAD中的對象、DXF文件中的實體和SVG中的元素三者之間的對應表,并對轉換中遇到的難點問題提出了解決方案,最后,通過編程實現驗證了方法的可行性。

引言

  目前CAD技術已廣泛應用于建筑設計、機械設計、城市規劃、交通等領域,由其主流軟件AutoCAD或在之基礎上二次開發的軟件生成的圖紙層出不窮。SVG(Scalable Vector Graphics,可縮放的矢量圖形)基于XML標準,既具有開放性,文件較小,顯示放縮不損失質量等優點,又有強大的動畫交互功能和豐富的濾鏡效果。盡管現在已有一些SVG圖形的生成工具,但為了充分共享已有的CAD文件,使之能運用于WebGIS或圖形發布,因此有必要探討將CAD文件有效地轉換為SVG文件的問題。

  AutoCAD的主要圖形格式為DWG文件和DXF文件,AutoCAD公司直今未公開DWG文件格式,如要直接讀取DWG文件,就需要分析其二進制數據,破譯其格式,這種工作相對很困難。另一種方法是利用AutoCAD的二次開發技術,使用如ADS、ObjectARX、VBA、Visual Lisp等開發語言直接訪問AutoCAD提供的一組ActiveX接口,獲取圖形文件中各個圖形對象的有用信息,然后使用SVG中相應的元素來描述這些圖形對象。但這種方法不能完全脫離AutoCAD平臺,應用不夠靈活。現在國外對DWG格式的研究也有很多,較為著名的是OpenDWG協會的ODT軟件包,該軟件包為直接操作DWG文件提供了豐富的函數。但要利用此軟件包必須是會員,并且需要繳費,在非盈利條件下可以免費使用。DXF是AutoCAD提供的圖形交換格式,它以ASCII碼格式存儲文件,可以用記事本編輯,簡單易讀,應用廣泛。DXF在表現圖形的大小方面十分精確,本文主要探討了DXF文件轉換到SVG文件的一系列問題。

1 DXF格式剖析

  DXF格式是標記AutoCAD圖形文件中所包含的全部信息的一種表示方法,最小組成單位是組,每組占兩行,第一行是組碼,是一個整數,表明了其后數據元素的類型,也指出了數據元素對于給定對象(或記錄)類型的含意;第二行是組值,數據類型根據組碼的數值可以是字符串型、整型或浮點數型等。一個DXF文件分為七個區域(如圖1),每個區域均由多個組組成。每個區域都是以組碼0開始,其后跟隨著字符串SECTION,接著是組碼2和表示區域名稱的字符串(例如HEADER),當出現組碼0,其后跟隨字符串ENDSEC時表示該區域結束。所有區域都結束后,在DXF文件的最后是組碼0,后跟組值為字符串EOF作為文件的結束標志。圖2是DXF文件中的HEADER區域。一個DXF文件可以只包含七個區域中的若干個區域,而不是全部區域。七個區域中,最重要的是ENTITIES區域。一個最簡單的DXF文件可以只包含ENTITIES區域,而不需要包含其他任何區域,這樣就大大降低了DXF文件編寫的難度。

 HEADER區域
 CLASSES區域
 TABLES區域
 BLOCKS區域
 ENTITIES區域
 OBJECTS區域
 THUMBNAIL IMAGE區域

表1 DXF文件的組織結構

0
SECTION
2

HEADER

 HEADER區域的開始
 9
$<變量>
<組碼>
<值>
 重復每一頭部變量
 0
ENDSEC
 HEADER區域結束

表2 DXF文件中的HEADER區域

  DXF文件完整的組織結構說明如下:

  • HEADER區域:包含圖形的基本信息,由一個AutoCAD數據庫版本號和許多系統變量組成。
  • CLASSES區域:包含有關應用程序定義類的信息,這些類的實例包含在BLOCKS區域、ENTITIES區域和OBJECTS區域的數據庫中。
  • TABLES區域:包含一系列符號表的定義。這些符號表包括:APP ID(應用程序標識表) 、BLOCK_RECORD (塊引用表) 、DIMSTYLE (標注樣式表) 、LAYER (圖層表) 、LTYPE (線型表) 、STYLE (文本樣式表) 、UCS(用戶坐標系表) 、VIEW (視圖表)和VPORT(視口配置表) 。
  • BLOCKS區域:包括塊定義和組成圖形中每個塊引用的圖形圖元。
  • ENTITIES區域:包含圖形中的所有圖形對象(包括點、線、面、插入塊,注記文字等實體) ,其中包括塊引用。
  • OBJECTS區域:包含圖形中的非圖形對象。
  • THUMBNAIL IMAGE區域:包含圖形中的預覽圖像。

2 SVG文件的結構分析

  SVG矢量圖形具有很多優點,與目前網絡流行的點陣圖
像格式GIF和JPEG相比, SVG能任意對圖形顯示進行放縮
而保證圖像質量,不會出現點陣圖常見的鋸齒邊緣,文件容量相對較小,存儲效率高,下載速度快;與矢量動畫軟件Flash制作的圖形相比,也具有一些優勢,比如Flash的文件僅能用Flash軟件編輯,不利于文檔的更改和維護,而SVG圖形能用任意的文本編輯工具編輯; Flash的文件與通用的標準技術間缺乏互操作性,如缺乏與HTML 頁面或CSS表單互動的機制,而SVG能嵌入到HTML 頁面中,支持事件編程,能通過XSL或CSS的方法添加各種樣式等。

  SVG是XML的擴展,在語法和格式上是XML 規范的一部分,但不屬于XML 所能解釋的范疇。SVG文檔區分大小
寫,具有XML的基本屬性 :

  1. 所有的標記都有開始標記和結束標記,否則必須注明為空標記。空標記用反斜杠結束,如< line / >。
  2. 標記必須正確嵌套。如果一個標記在另一個標記中開始,那么它也必須在那個標記中結束。
  3. 文檔必須只有一個根。一個< svg > < / svg > 元素包含了一個SVG文檔的所有內容。
  4. 文檔應該以XML 聲明< ? xml version = ”1. 0”? >開始。
  5. 文檔應該包含一個DOCTYPE聲明, 該聲明指向一個允許元素的列表。

  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圖形包括框架元素和圖形元素。框架元素能夠包含圖形元素和其他框架元素,如:<svg>、<g>、<defs>、<symbol>、<clipPath>、<mask>、<pattern>、<marker>、<a>和<switch>。<g>元素是編組元素,能分組圖形對象,便于管理和使用,如對組進行變換或提供一個公共屬性。<defs>元素定義可重用部件,以后可在圖形主體中調用,這種重用技術最大限度地利用了HTTP的緩存功能,避免了數據的重復下載。調用<defs>元素定義的項有兩種方式,一種是定義的項通過其本地URL(或URI)引用;第二種是使用<use/>元素。

  例如: <use xlink:href="#block1"/>

  圖形元素包含路徑<path>、文字<text>、圖像<image>、<use>和六種基本形狀:矩形<rect>、圓<circle>、橢圓<ellipse>、線<line>、折線<polyline>、多邊形<polygon>,簡單圖形直接由基本形狀構建,每個基本形狀都帶有位置、大小、顏色、輪廓等屬性。復雜圖形可以用路徑<path>來描述,路徑是一系列命令,用來創建作為圖像一部分精確定義的形狀,該形狀可以是開放的或閉合的,并可以包含一條或多條線、曲線和線段,其中曲線可用圓弧、三次或兩次的Bezier曲線繪制。SVG提供了對嵌入圖像的支持,可以在<image>直接寫入圖像的二進制信息,也可以鏈接指向某個圖像文件,還可以用濾鏡中的<feImage>引入外部圖像文件加以處理。SVG在字體處理上采用了CSS 2中的字體顯示核心技術Web Font,保證在任何情況下看到的字體相同。SVG通過<transform>可以實現坐標轉換,實現圖形放縮、旋轉、鏡像、傾斜等效果。

3 DXF文件轉換為SVG文件

  分析DXF文件和SVG文件,發現兩者在表示方式上有一定的相似之處,兩者均是文本文件,通過記錄圖形的特征數據來描述矢量圖形,比如圓,兩者均記錄了圓心、半徑等數據。但在有些圖形的描述上,記錄的特征數據是不同的,比如橢圓等。所以,實現CAD文件到SVG文件的轉換,不僅要分析AutoCAD中的每一類型的二維矢量圖形對象在DXF文件中的對應實體描述,以及SVG中對應于DXF文件中的實體的元素,而且應針對DXF記錄的特征數據利用相應的公式推導出SVG需要的數據。經過詳細深入的分析,得到AutoCAD中的對象、DXF文件中的實體和SVG中的元素之間的對應如表1所示。

表1 AutoCAD中的對象、DXF文件中的實體和SVG中的元素對應表

 AutoCAD中的圖形對象 DXF文件中的實體   SVG中對應的元素
 矩形、多邊形、多段線  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等

  在轉換的過程中,會遇到一些難點,下面提出具體的解決方案:

3.1 坐標系統

  不管是AutoCAD中的對象還是SVG中的圖形都是通過坐標定位的。但是兩者的坐標系統是不同的, AutoCAD的世界坐標系的原點在屏幕的左下角, X軸的正向朝右, Y軸的正向向上。SVG的坐標系的原點在初始視口(屏幕)的左上角,X軸的正向朝右, Y軸的正向朝下。兩者均可以定義自己的坐標系。在DXF文件向SVG文件轉換時,為保證圖形顯示正確,應將所有的圖形進行坐標矩陣變換。在SVG中使用下面語句:

<g transform="matrix(1 0 0 21 0 600)">
</g>

3.2 橢圓

  由于在DXF文件中的橢圓記錄的特征數據和SVG中的橢圓元素需要的數據是不同的, DXF文件記錄了橢圓圓心、長軸的端點(相對于圓心的相對值) 、半長軸與半短軸的比例等數據。SVG中的橢圓元素需要橢圓圓心、半長軸、半短軸等數據。并且AutoCAD中的橢圓的長軸可以和水平軸成任意角度,但直接用SVG中的< ellip se >元素所繪的圖形只能使橢圓的長軸平行于水平軸,因此,需要計算長軸和水平軸所成角度,再使用旋轉變換。所以應利用下面公式轉換:

sl = S qr( x23 x2 + y23 y2)
ss = sl3 r1
aa = A tn ( y2 / x2) 3 180 /3. 141 592 6

  其中sl代表橢圓的半長軸, ss代表橢圓的半短軸, aa代表橢圓的長軸與水平軸的角度, x2和y2是長軸的端點(相對于圓心的相對值) , r1是半長軸與半短軸的比例。

3.3 文字

  對所有圖形進行了坐標系統轉換,但文字不同于其他圖形,轉換之后會出現了反轉,這時應先將文字相對于原所在位置的基線進行鏡像,這樣能保證文字按正常狀態顯示。

  轉換之后,可能出現SVG中的中文不能顯示的情況,這是因為SVG有3種編碼形式: iso2885921 (ASCII) 、utf28和utf216, iso2885921 (ASCII)不能直接使用漢字字符, utf28和utf216是Unicode形式的編碼, utf28支持多語種,每一個ASCII字符使用一個字節來表示,對于其他字符使用三個字節來表示。utf216對于任何一個字符都是使用兩個字節來表示,這兩種編碼能正常顯示漢字。在編程時,如果直接寫SVG文檔,則文檔使用的是ASCII碼,所以不能正常顯示漢字。解決的方案是:

  3.3.1 在SVG中,需要將中文字體名稱進行“國際化”,即將漢字字體名稱改為英文名稱,下面是部分字體對照列表(表2) 。

表2 部分漢字字體與英文名稱對照表

 英文名稱  漢字字體  英文名稱  漢字字體
 FangSong_GB2312  仿宋_GB2312  KaiTi_GB2312  楷體_GB2312
 YouYuan  幼圓  LiSu  隸書
 SimSun  宋體  SimHei  黑體

  3.3.2 將ASCII碼的文檔轉換成Unicode編碼后寫文件。下面是VB 實現的代碼,將ASCII碼的文檔讀入byte 數組mem,通過StrConv( )轉換后,寫入文件。

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 圓弧、橢圓弧

  對于圓弧、橢圓弧等復雜圖形,在SVG中用< Path >元素
描述,其中有橢圓弧命令:

A rx ry x2axis2rotation large2arc2flag sweep2flag x y

  其中, rx和ry分別是半長軸和半短軸, x2axis2rotation是弧所在橢圓的X 軸與水平方向的夾角, large2arc2flag 和sweep2flag決定橢圓弧的繪制方向,如果large2arc2flag為1代表大角度弧線,為0代表小角度弧線, sweep2flag為1代表起點到終點的弧線繞橢圓中心是順時針方向,為0是逆時針方向, x和y是橢圓弧終點坐標。這和DXF中的圓弧、橢圓弧描述的特征數據是不一樣的,同樣需要轉換。

3.5 圖塊

  為了提高繪圖效率, AutoCAD中提供了圖塊對象。在DXF中,圖塊定義在TABLES 區域,在ENTITIES區域通過INSERT組碼存儲圖塊調用信息。轉換成SVG時,將圖塊定義用<defs>來組織,圖塊名作為每個defs元素的ID屬性,使用<use>元素調用圖塊信息。這種方式支持圖塊的嵌套。

3.6 圖層

  圖層是AutoCAD中的一種非常有用的圖形管理方式,將圖形對象分門別類放在不同的圖層中,便于用戶管理、編輯和打印。在轉換器中,實現了根據圖層有選擇轉換圖形,極大地增強了靈活性。

4 應用實例

  根據上述分析,筆者利用VB編程實現了二維矢量圖形從DXF文件到SVG文件的轉換,實現算法如下:

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

 

圖1 通過轉換器轉換后得到的SVG圖形

圖1 通過轉換器轉換后得到的SVG圖形

 

5 結語

  本文詳細剖析了DXF文件的結構,并且分析了SVG文件的基本要素和框架要素,建立了CAD中的對象、DXF文件中的實體和SVG中的元素三者之間的對應表,并對轉換中遇到的坐標系統轉換、文字顯示、圖塊、復雜圖形的顯示等多個問題提出了解決方案,最后,通過VB編程實現驗證了方法的可行性。這種轉換方法完全不依賴于AutoCAD平臺,靈活高效,具有一定的實用價值。