AutoCAD作為計算機輔助設計軟體,其檔案儲存方式仍是採用二進位制0、1的方式進行儲存,在該軟體設計之初即定義了dwg檔案各結構部分的表示內容和表示方法、即首先制定了生成圖形和解析圖形的協議,雖然AutoCAD的原始碼並未開放,但是仍然有跡可循。
以下摘錄對AutoCAD的dwg格式檔案的研究內容:
AutoCAD軟體是中國目前最流行的微機軟體包之一,DWG檔案為Auto Desk公司推出的圖形格式檔案,可以理解成由點、線、面等構成的圖形資料庫。其複雜性主要來自由物件的多樣性及屬性的複雜性。比如圖形、線形、樣式的關聯。一個DWG圖紙檔案由圖紙資訊和各種圖元物件組成。分為無圖形表示類和有圖形表示類。有圖形表示類物件以塊表方式存放;無圖形表示類包括圖層、線形。DWG檔案內容可以分為四個部分:(一)索引部;(二)環境部;(三)實體部;(四)名錶部。
(一) 索引部
索引部主要是由Auto CAD的版本資訊及各部的首地址、各分表的首地址、長度及個數等資訊構成,從DWG檔案中的#0000-#0050H。
#00-#13 Char*20 AutoCAD版本資訊
#14-#17 int *4 實體部首址
#18-#1F int *4 名錶部首址
#1C-#1F int *4 圖塊定義首址
#20-#23 int *4 圖塊定義長度
#24-#27 int *4 檔案總長度
#28-#2B int *4 常數
1、 圖塊描述段:
#2C-#2D int *2 圖塊名長度(25H)
#2E-#2F int *2 圖塊個數
#30-#31 int *2 標識數
#32-#35 int *2 圖塊名錶首址
2、 層描述段:
#36-#37 int *2 層名長度(25H)
#38-#39 int *2 層的個數
#3A-#3B int *2 標識數
#3C-#3F int *2 層名錶首址
3、 字型描述段:
#40-#41 int *2 字型名長度(C2H)
#42-#43 int *2 字型個數
#44-#45 int *2 標識數
#46-#49 int *2 字型名錶首址
4、 線形描述段:
#4A-#4B int *2 線型名長度(BBH)
#4C-#4D int *2 線型個數
#4E-#4F int *2 標識數
#50-#53 int *4 線型名錶首址
5、 檢視描述段:
#54-#55 int *2 檢視名長度(5BH)
#56-#57 int *2 檢視個數
#58-#59 int *2 標識數
#5A-#5D int *4 檢視名錶首址
6、 各個地址間的關係:
實體部首址=索引部長度+標題部長度
表部首址=實體部首址+實體部總長度
塊實體首址=表部首址+表部總長度
檔案總長度=塊實體首址+塊實體部總長度
(二) 環境部
該部給出了系統變數,屬性設定及當前狀態等資訊,它位於DWG檔案的#005E-#03EEH。
#05E-#075 INSBASE real*24
#076-#077 實體個數 int *2
#078-#08F EXTININ real*24
#090-#0A7 EXTMAX real*24
#0A8-#0B7 LIMMIN real*16
#0B8-#0C7 LIMMIX real*16
#0C8-#0DF VIEWCTR real*24
#0E0-#0E7 VIEWSIZE real*8
#0E8-#0E9 SNAPNODE int*2
#0EA-#0F9 SNAPUNIT int*16
#0FA-#109 SNAPBASE real*16
#10A-#111 SNAPANC int *8
#112-#113 SNAPSTYL int *2
#114-#115 SNAPISOPAIR int *2
#116-#117 GRIDNODE int *2
#118-#127 GRIDUNIT int *2
#128-#129 ORTHOMODE int *2
#12A-#12B REGENNODE int *2
#12C-#12D FILEMODE int *2
#12E-#12F QTEXTMODE int *2
#130-#131 DRAGMODE int *2
#132-#139 LTSCALE int *8
#13A-#141 TEXTSIZE real*8
#142-#149 TRACEWID real*8
#14A-#14B CLAYER real*2
#14C-#163
#164-#165 LUNITS int*2
#166-#167 LUPREC int *2
#168-#169 AXISMODE int *2
#16A-#179 AXISUNIT int *16
#17A-#191 SKETCHINC real * 8
#182-#189 FILLETRAD real * 8
#18A-#18B AUNITS int *2
#18C-#18D AUPREC int *2
#18E-#18F
#190-#191 OSMODE int *2
#192-#193 ATTMODE int *2
#194-#1A2 MENU char *15
#1A3-#1AA DIMSCALE real*8
#1AB-#1B2 DIMASZ real*8
#1B3-#1BA DIMEXO real*8
#1BB-#1C2 DIMDLI real*8
#1C3-#1C4 DIMEXE real*8
#1CB-#1D2 DIMTP real*8
#1D3-#1DA DIMTN real*8
#1DB-#1E2 DIMTXT real*8
#1E3-#1EA DIMCEN real*8
#1E8-#1F2 DIMTSZ real*8
#1F3 DIMTOL int *1
#1F4 DIMLIN int *1
#1F5 DIMTIH int *1
#1F6 DIMTOH int *1
#1F7 DIMSE1 int *1
#1F8 DIMSE2 int *1
#1F9 DIMTAD int *1
#1FA-#228
#229-#230 ELEVATION real*8
#234-#238 THICHNESS real*8
#239-#250 VIEWDIR real*24
#251-#2B2 圖形顯示說明
#2E3-#2E4 BLIPMODE int *2
#2E5-#3EE 備用
(三) 實體部
該部給出了所有圖形實體的描述,圖形實體又分為簡單圖形實體和複雜圖形實體。簡單圖形實體是點、直線等基本圖形。複雜圖形實體指多線段、圖塊等由基本圖形實體所組成的圖形。
圖形的大部分資訊都在實體部段中,因此讀取實體段的內容很重要。讀取實體段的資料首先要考慮讀取資料的儲存方式,然後再進行後一步的處理或存入資料檔案中。此處用連結串列結構來儲存。各個實體的資料分成兩塊:公共資料塊和特殊資料塊。公共資料塊儲存每個實體都具有特徵引數,如所在圖層,實體標識,線型名等。特殊資料塊儲存每個實體特有的資料,如實體LINE,它裡面有兩個端點的座標值;實體CIRCLE中有圓心座標值和半徑值等
每一個圖形實體都有描述段,他由描述首部和描述內容兩部分所組成,描述首部的格式是固定的,描述內容各不相同。描述首部格式:
(1) LINE實體
標識數為01H,描述段長度為28H。
#00-#07 描述首部
#08-#17 起點座標值 real *16
#18-#27 終點座標值 real *16
(2) POINT實體
標識數為02H,描述段長度為18H
#08-#17 點的座標值 real*16
(3) CIRCLE實體
標識數為03H,描述段長度為20H
#08-#17 圓心座標值 real*16
#18-#1F 圓的半徑 real*8
(4) SHAPE實體
標識數為04H,描述段長度可變
#08-#17 插入座標值 real*16
#18-#1F 型體高度 real*8
#20 型體號 real*8
#21-#28 插入角度(可省略) real*8
若描述首部中的屬性字第0位為1,讀值存在,否則預設值為0
#29 型體檔案號(可省) int*1
若描述首部中的屬性字第1位為1,讀值存在,否則預設值為0
(5) TEXT實體
標識數為07H,描述段長度可變
#08-#17 文字頭的座標值 real*16
#18-#1F 字元高度 real*8
#20-#21 字串長度 into*2
#22 字串 char*256
# 字元創旋轉角 real*8
(6) ARC實體
標識數為08H,描述段長度為30H
#18-#1F 半徑 real*8
#20-#27 起始角 real*8
#28-#2F 終止角 real*8
(7) TRACE實體
標識數為09H,描述段長度為48H
#08-#17 第一點座標值 real*16
#18-#1F 第二點座標值 real*16
#28-#37 第三點座標值 real*16
#38-#47 第四點座標值 real*16
(8) SOLID實體
標識數為0BH,描述段長度為48H
複雜圖形實體:
在DWG檔案中,複雜圖形實體指重複圖形、圖塊和多段連線實體,它們都是有不止一個標識數的實體。
(1) 重複圖形實體
重複圖形指某些簡單圖形的重複排列,它的描述由三部分組成,開始實體、簡單圖形實體和結束實體。
(a)開始實體
標識數為06H,描述段長度為08H,格式同描述首部。
(b)結束實體
標識數為07H,描述段長度為1CH。
#08-#09 重複行數 int *2
#0A-#0B 重複列數 int*2
#14-#1B 重複行距 real*8
#14-#1B 重複列距 real*8
(2) 實體圖塊
圖塊實體就是將某些簡單圖形實體看作一個整體,他的描述由三部分組成,BLOCK(圖塊開始)實體,簡單圖形實體和圖塊結束實體。
(a) BLOCK實體
標識數為0CH,描述段長度為08H,格式同描述首部
(b)圖塊結束實體
標識數為0CH,描述段長度為18H。
#08-#17 基點座標值 real*16
(3) POLYLINE實體
多段連線指直線和圓弧所組合的曲線,它的描述也由三部分組成:POLYINE(多段連線)實體、結點實體和結束實體。
(a) POLYLINE實體
標識數為8013H,描述段長度可變
#08 狀態值(可省) int*1
(若屬性字第0位為1,該值存在,否則為0)
數值0,正常;數值1 封閉;數值2 擬合
#09-#10 起始寬度(可省)
#11-#18 終止寬度(可省)
(b) 結點實體
標識數為14H,描述長度可變
#08-#17 結點座標值
#18-#1F 結點起始寬度
#20-#27 結點終止寬度
#28-#2F 凹凸值
#30 結點狀態
#31--#38 光滑切線方向
(c) 結束實體
標識數為11H,描述段長度為12H
#08-#11 開始實體的首址
(四) 名錶部
該部給出了所有有名實體的描述,有名實體具體指圖塊名、LAYER圖層名、字型格式名、型體檔名,線型名和檢視名
(1) 圖塊名
圖塊名錶的首地址存在於DWG檔案的#32-#35H中,描述段的長度為25H,其格式為:
#00 標識 int *1
#01-#20 名字 char *32
#21-#24 地址 int *4
(2) 層名
層名錶的首地址存於DWG檔案的#3C-#3FH中。描述段長度為25H.
在對DWG檔案進行解析的過程中需要什麼資訊就可以在相應的段中尋找。例如你需要得到DWG檔案的直線就可以去實體部段裡取LINE實體對應的起點座標和重點座標屬性,構造出自定義直線類,其他類似。
AutoCAD作為計算機輔助設計軟體,其檔案儲存方式仍是採用二進位制0、1的方式進行儲存,在該軟體設計之初即定義了dwg檔案各結構部分的表示內容和表示方法、即首先制定了生成圖形和解析圖形的協議,雖然AutoCAD的原始碼並未開放,但是仍然有跡可循。
以下摘錄對AutoCAD的dwg格式檔案的研究內容:
AutoCAD軟體是中國目前最流行的微機軟體包之一,DWG檔案為Auto Desk公司推出的圖形格式檔案,可以理解成由點、線、面等構成的圖形資料庫。其複雜性主要來自由物件的多樣性及屬性的複雜性。比如圖形、線形、樣式的關聯。一個DWG圖紙檔案由圖紙資訊和各種圖元物件組成。分為無圖形表示類和有圖形表示類。有圖形表示類物件以塊表方式存放;無圖形表示類包括圖層、線形。DWG檔案內容可以分為四個部分:(一)索引部;(二)環境部;(三)實體部;(四)名錶部。
(一) 索引部
索引部主要是由Auto CAD的版本資訊及各部的首地址、各分表的首地址、長度及個數等資訊構成,從DWG檔案中的#0000-#0050H。
#00-#13 Char*20 AutoCAD版本資訊
#14-#17 int *4 實體部首址
#18-#1F int *4 名錶部首址
#1C-#1F int *4 圖塊定義首址
#20-#23 int *4 圖塊定義長度
#24-#27 int *4 檔案總長度
#28-#2B int *4 常數
1、 圖塊描述段:
#2C-#2D int *2 圖塊名長度(25H)
#2E-#2F int *2 圖塊個數
#30-#31 int *2 標識數
#32-#35 int *2 圖塊名錶首址
2、 層描述段:
#36-#37 int *2 層名長度(25H)
#38-#39 int *2 層的個數
#3A-#3B int *2 標識數
#3C-#3F int *2 層名錶首址
3、 字型描述段:
#40-#41 int *2 字型名長度(C2H)
#42-#43 int *2 字型個數
#44-#45 int *2 標識數
#46-#49 int *2 字型名錶首址
4、 線形描述段:
#4A-#4B int *2 線型名長度(BBH)
#4C-#4D int *2 線型個數
#4E-#4F int *2 標識數
#50-#53 int *4 線型名錶首址
5、 檢視描述段:
#54-#55 int *2 檢視名長度(5BH)
#56-#57 int *2 檢視個數
#58-#59 int *2 標識數
#5A-#5D int *4 檢視名錶首址
6、 各個地址間的關係:
實體部首址=索引部長度+標題部長度
表部首址=實體部首址+實體部總長度
塊實體首址=表部首址+表部總長度
檔案總長度=塊實體首址+塊實體部總長度
(二) 環境部
該部給出了系統變數,屬性設定及當前狀態等資訊,它位於DWG檔案的#005E-#03EEH。
#05E-#075 INSBASE real*24
#076-#077 實體個數 int *2
#078-#08F EXTININ real*24
#090-#0A7 EXTMAX real*24
#0A8-#0B7 LIMMIN real*16
#0B8-#0C7 LIMMIX real*16
#0C8-#0DF VIEWCTR real*24
#0E0-#0E7 VIEWSIZE real*8
#0E8-#0E9 SNAPNODE int*2
#0EA-#0F9 SNAPUNIT int*16
#0FA-#109 SNAPBASE real*16
#10A-#111 SNAPANC int *8
#112-#113 SNAPSTYL int *2
#114-#115 SNAPISOPAIR int *2
#116-#117 GRIDNODE int *2
#118-#127 GRIDUNIT int *2
#128-#129 ORTHOMODE int *2
#12A-#12B REGENNODE int *2
#12C-#12D FILEMODE int *2
#12E-#12F QTEXTMODE int *2
#130-#131 DRAGMODE int *2
#132-#139 LTSCALE int *8
#13A-#141 TEXTSIZE real*8
#142-#149 TRACEWID real*8
#14A-#14B CLAYER real*2
#14C-#163
#164-#165 LUNITS int*2
#166-#167 LUPREC int *2
#168-#169 AXISMODE int *2
#16A-#179 AXISUNIT int *16
#17A-#191 SKETCHINC real * 8
#182-#189 FILLETRAD real * 8
#18A-#18B AUNITS int *2
#18C-#18D AUPREC int *2
#18E-#18F
#190-#191 OSMODE int *2
#192-#193 ATTMODE int *2
#194-#1A2 MENU char *15
#1A3-#1AA DIMSCALE real*8
#1AB-#1B2 DIMASZ real*8
#1B3-#1BA DIMEXO real*8
#1BB-#1C2 DIMDLI real*8
#1C3-#1C4 DIMEXE real*8
#1CB-#1D2 DIMTP real*8
#1D3-#1DA DIMTN real*8
#1DB-#1E2 DIMTXT real*8
#1E3-#1EA DIMCEN real*8
#1E8-#1F2 DIMTSZ real*8
#1F3 DIMTOL int *1
#1F4 DIMLIN int *1
#1F5 DIMTIH int *1
#1F6 DIMTOH int *1
#1F7 DIMSE1 int *1
#1F8 DIMSE2 int *1
#1F9 DIMTAD int *1
#1FA-#228
#229-#230 ELEVATION real*8
#234-#238 THICHNESS real*8
#239-#250 VIEWDIR real*24
#251-#2B2 圖形顯示說明
#2E3-#2E4 BLIPMODE int *2
#2E5-#3EE 備用
(三) 實體部
該部給出了所有圖形實體的描述,圖形實體又分為簡單圖形實體和複雜圖形實體。簡單圖形實體是點、直線等基本圖形。複雜圖形實體指多線段、圖塊等由基本圖形實體所組成的圖形。
圖形的大部分資訊都在實體部段中,因此讀取實體段的內容很重要。讀取實體段的資料首先要考慮讀取資料的儲存方式,然後再進行後一步的處理或存入資料檔案中。此處用連結串列結構來儲存。各個實體的資料分成兩塊:公共資料塊和特殊資料塊。公共資料塊儲存每個實體都具有特徵引數,如所在圖層,實體標識,線型名等。特殊資料塊儲存每個實體特有的資料,如實體LINE,它裡面有兩個端點的座標值;實體CIRCLE中有圓心座標值和半徑值等
每一個圖形實體都有描述段,他由描述首部和描述內容兩部分所組成,描述首部的格式是固定的,描述內容各不相同。描述首部格式:
(1) LINE實體
標識數為01H,描述段長度為28H。
#00-#07 描述首部
#08-#17 起點座標值 real *16
#18-#27 終點座標值 real *16
(2) POINT實體
標識數為02H,描述段長度為18H
#00-#07 描述首部
#08-#17 點的座標值 real*16
(3) CIRCLE實體
標識數為03H,描述段長度為20H
#00-#07 描述首部
#08-#17 圓心座標值 real*16
#18-#1F 圓的半徑 real*8
(4) SHAPE實體
標識數為04H,描述段長度可變
#00-#07 描述首部
#08-#17 插入座標值 real*16
#18-#1F 型體高度 real*8
#20 型體號 real*8
#21-#28 插入角度(可省略) real*8
若描述首部中的屬性字第0位為1,讀值存在,否則預設值為0
#29 型體檔案號(可省) int*1
若描述首部中的屬性字第1位為1,讀值存在,否則預設值為0
(5) TEXT實體
標識數為07H,描述段長度可變
#00-#07 描述首部
#08-#17 文字頭的座標值 real*16
#18-#1F 字元高度 real*8
#20-#21 字串長度 into*2
#22 字串 char*256
# 字元創旋轉角 real*8
(6) ARC實體
標識數為08H,描述段長度為30H
#00-#07 描述首部
#08-#17 圓心座標值 real*16
#18-#1F 半徑 real*8
#20-#27 起始角 real*8
#28-#2F 終止角 real*8
(7) TRACE實體
標識數為09H,描述段長度為48H
#00-#07 描述首部
#08-#17 第一點座標值 real*16
#18-#1F 第二點座標值 real*16
#28-#37 第三點座標值 real*16
#38-#47 第四點座標值 real*16
(8) SOLID實體
標識數為0BH,描述段長度為48H
#00-#07 描述首部
#08-#17 第一點座標值 real*16
#18-#1F 第二點座標值 real*16
#28-#37 第三點座標值 real*16
#38-#47 第四點座標值 real*16
複雜圖形實體:
在DWG檔案中,複雜圖形實體指重複圖形、圖塊和多段連線實體,它們都是有不止一個標識數的實體。
(1) 重複圖形實體
重複圖形指某些簡單圖形的重複排列,它的描述由三部分組成,開始實體、簡單圖形實體和結束實體。
(a)開始實體
標識數為06H,描述段長度為08H,格式同描述首部。
(b)結束實體
標識數為07H,描述段長度為1CH。
#00-#07 描述首部
#08-#09 重複行數 int *2
#0A-#0B 重複列數 int*2
#14-#1B 重複行距 real*8
#14-#1B 重複列距 real*8
(2) 實體圖塊
圖塊實體就是將某些簡單圖形實體看作一個整體,他的描述由三部分組成,BLOCK(圖塊開始)實體,簡單圖形實體和圖塊結束實體。
(a) BLOCK實體
標識數為0CH,描述段長度為08H,格式同描述首部
(b)圖塊結束實體
標識數為0CH,描述段長度為18H。
#00-#07 描述首部
#08-#17 基點座標值 real*16
(3) POLYLINE實體
多段連線指直線和圓弧所組合的曲線,它的描述也由三部分組成:POLYINE(多段連線)實體、結點實體和結束實體。
(a) POLYLINE實體
標識數為8013H,描述段長度可變
#00-#07 描述首部
#08 狀態值(可省) int*1
(若屬性字第0位為1,該值存在,否則為0)
數值0,正常;數值1 封閉;數值2 擬合
#09-#10 起始寬度(可省)
#11-#18 終止寬度(可省)
(b) 結點實體
標識數為14H,描述長度可變
#00-#07 描述首部
#08-#17 結點座標值
#18-#1F 結點起始寬度
#20-#27 結點終止寬度
#28-#2F 凹凸值
#30 結點狀態
#31--#38 光滑切線方向
(c) 結束實體
標識數為11H,描述段長度為12H
#00-#07 描述首部
#08-#11 開始實體的首址
(四) 名錶部
該部給出了所有有名實體的描述,有名實體具體指圖塊名、LAYER圖層名、字型格式名、型體檔名,線型名和檢視名
(1) 圖塊名
圖塊名錶的首地址存在於DWG檔案的#32-#35H中,描述段的長度為25H,其格式為:
#00 標識 int *1
#01-#20 名字 char *32
#21-#24 地址 int *4
(2) 層名
層名錶的首地址存於DWG檔案的#3C-#3FH中。描述段長度為25H.
在對DWG檔案進行解析的過程中需要什麼資訊就可以在相應的段中尋找。例如你需要得到DWG檔案的直線就可以去實體部段裡取LINE實體對應的起點座標和重點座標屬性,構造出自定義直線類,其他類似。