国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

DWG文檔格式化存儲(chǔ)方法研究

2011-01-01 00:00:00尹義方吳曉宇左曉彥董微張方舟
科技資訊 2011年4期


  摘要:基于CAD的DWG文件解析是解決DWG文件不易讀取的唯一方法,也是CAD在實(shí)際操作中遇到的主要問(wèn)題。本文闡述了如何解析DWG文件,分析DWG文件數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)類型,將DWG二進(jìn)制格式文件分解成可以存儲(chǔ)的實(shí)體元素,并將得到的實(shí)體元素存入數(shù)據(jù)庫(kù),可提取數(shù)據(jù)庫(kù)中DWG文件信息,為實(shí)現(xiàn)工程概算和模糊匹配提供方便,同時(shí)簡(jiǎn)要介紹了DWG文件轉(zhuǎn)換成XML文件的方法。
  關(guān)鍵詞:DWG 文檔格式化 研究
  中圖分類號(hào):TP393文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1672-3791(2011)02(a)-0000-00
  
  1前言
  CAD作為一種功能強(qiáng)大的計(jì)算機(jī)輔助設(shè)計(jì)軟件被廣泛使用,在建筑、規(guī)劃、測(cè)繪中用它來(lái)繪制圖形,例如建筑設(shè)計(jì)圖、城市規(guī)劃圖等,其繪制的結(jié)果被保存為以DWG為擴(kuò)展名的矢量圖形文件中,這種矢量圖形在許多軟件中不能直接使用,必須經(jīng)過(guò)各種方法的轉(zhuǎn)換后方能調(diào)用。因此傳統(tǒng)的DWG文件不易讀取,不易轉(zhuǎn)換的特性就成為實(shí)際操作應(yīng)用的瓶頸,所以開發(fā)解析DWG文件,將DWG文件解析成可以讀取的,字符串形式的數(shù)據(jù)或方便轉(zhuǎn)換存儲(chǔ)形式的數(shù)據(jù),就成為十分必要的,也是現(xiàn)在軟件實(shí)際應(yīng)用中主要面臨的問(wèn)題。
  本文對(duì)CAD矢量圖形的轉(zhuǎn)換方法進(jìn)行探究。通過(guò)對(duì)DWG實(shí)例文件的二進(jìn)制剖析,重點(diǎn)研究了DWG文件的內(nèi)部格式,包括其總體結(jié)構(gòu),以及各部分的組織方式。在具體數(shù)據(jù)類型方面包括基本數(shù)據(jù)類型,擴(kuò)展數(shù)據(jù)類型和三維信息等的內(nèi)部表示方法。分析了其數(shù)據(jù)表示的不對(duì)齊,不定長(zhǎng),表示域大等特點(diǎn)。
  
  2 DWG文件的組成與解析
  2.1 DWG 文件的結(jié)構(gòu)
  如圖 1 所示,DWG文件按照地址偏移量依次分為定位器部分,圖像部分,環(huán)境變量部分,實(shí)體部分和對(duì)象映射表部分。各部分相互指向,共同表達(dá)了DWG 文件中實(shí)體的復(fù)雜邏輯關(guān)系。各個(gè)部分組成了一個(gè)有機(jī)整體,用戶可以訪問(wèn)任何部分,在訪問(wèn)具體對(duì)象前要通過(guò)對(duì)象映射表。定位器部分實(shí)質(zhì)是整個(gè)DWG 文件的總起部分,它用相對(duì)于文件首部的偏移來(lái)記錄其他各部分的位置。其中定位器的編號(hào)與其內(nèi)容是一一對(duì)應(yīng)的,在所有DWG文件中保持不變。
  
  圖 1 DWG 文件的總體結(jié)構(gòu)
  2.2 DWG二進(jìn)制格式文件
  DWG采用二進(jìn)制格式的文件形式,一方面可以節(jié)省文件占用的空間,另一方面提高讀寫文件的效率。為了防止用戶對(duì)DWG文件無(wú)意損壞而造成的AutoCAD 崩潰,AutoCAD 采用循環(huán)冗余校驗(yàn),對(duì)DWG文件的正確性進(jìn)行檢查。
  DWG二進(jìn)制格式文件,共有5 種數(shù)據(jù)形式:字符型、字節(jié)型、整型、長(zhǎng)整型、IEEE標(biāo)準(zhǔn)的浮點(diǎn)數(shù),用戶可以直接對(duì)這些數(shù)據(jù)進(jìn)行存取和處理。文件DWG 的數(shù)據(jù)結(jié)構(gòu)由5 部分組成,分別是:頭部、實(shí)體部、表部、塊實(shí)體部和應(yīng)急頭部。總體結(jié)構(gòu)如圖2所示:
  
  圖2 DWG文件數(shù)據(jù)結(jié)構(gòu)圖
  (1)頭部結(jié)構(gòu)
  DWG文件的頭部存放著DWG 文件的一些重要信息,如DWG 文件標(biāo)志、版本信息、各種索引用的地址以及Auto-CAD 軟件中的一部分系統(tǒng)變量。頭部的信息對(duì)于AutoCAD來(lái)講是至關(guān)重要的,因?yàn)锳utoCAD 對(duì)DWG 文件的所有尋址操作的地址均從頭部的有關(guān)參數(shù)計(jì)算而來(lái),而且頭部還保存著與該文件中所保存圖形密切相關(guān)的系統(tǒng)變量的值。
  (2)實(shí)體部
  實(shí)體部保存著該圖形中的全部實(shí)體。所謂實(shí)體是指AutoCAD 中的基本圖形單元。如:點(diǎn),線、圓、弧、塊、尺寸標(biāo)注等。為了識(shí)別實(shí)體,AutoCAD 將實(shí)體進(jìn)行編碼,如點(diǎn)實(shí)體的編碼為02H,直線實(shí)體的編碼為01H。對(duì)于每一個(gè)實(shí)體,其數(shù)據(jù)結(jié)構(gòu)都可以分成兩個(gè)部分:實(shí)體頭部和實(shí)體尾部。實(shí)體頭部的長(zhǎng)度固定,包含有實(shí)體類型編碼、實(shí)體性質(zhì)、實(shí)體長(zhǎng)度。不同實(shí)體,其尾部數(shù)據(jù)結(jié)構(gòu)不同。
  (3)表部
  表是AutoCAD 為方便索引而引入的數(shù)據(jù)結(jié)構(gòu)。在DWG文件中所有的表均按一定順序集中存放在表部。這些表包括塊表、層表、字型表、線型表。每一種表的格式、長(zhǎng)度均固定。例如層表,它包含了該層的全部信息:層名、該層實(shí)體的顏色、線型以及該層的狀態(tài),而每一種表的長(zhǎng)度、個(gè)數(shù)和起始地址保存在頭部的索引信息段。
  (4)塊實(shí)體部
  塊是用AutoCAD 進(jìn)行繪圖時(shí)經(jīng)常遇到的一個(gè)概念。它是為了減少圖形文件的長(zhǎng)度和方便操作而引入的。AutoCAD 將用戶所做的塊集中存在一起,這就是塊實(shí)體部。每生成一個(gè)塊時(shí),AutoCAD 同時(shí)自動(dòng)地生成一個(gè)相應(yīng)的塊表以便檢索。對(duì)于每一個(gè)塊,其兩端均為塊起始實(shí)體和結(jié)束實(shí)體,中間為該塊所包含的各種實(shí)體元素。
  (5)應(yīng)急頭部
  為了防止由于頭部的重要索引信息的損壞而使整個(gè)DWG文件中的信息丟失, AutoCAD 將一些重要索引信息的副本保存在DWG 文件的尾部,稱為應(yīng)急頭部。它包含了恢復(fù)受損圖形文件的重要信息。
  
  3 DWG文件數(shù)據(jù)類型
  3.1 基本數(shù)據(jù)類型
  作為一個(gè)工程軟件,AutoCAD 必須有能力處理很大范圍的數(shù)據(jù),同時(shí)極大地節(jié)省空間,因此在DWG文件中廣泛存在著可變長(zhǎng)度的數(shù)據(jù)類型,這是其數(shù)據(jù)類型的典型特征,并在大多數(shù)的數(shù)據(jù)類型中得到體現(xiàn)。根據(jù)具體處理數(shù)據(jù)的方式不同,可分為2種典型的表示方式。
  第1種典型表示方式主要用于表示浮點(diǎn)型及雙精度型。這種處理方式對(duì)一些特別而常用的數(shù)據(jù)如1.0,0.0 只采用兩位標(biāo)識(shí)表示,與IEEE 雙精度浮點(diǎn)數(shù)占用8字節(jié)相比,節(jié)約了62 位。DWG文件中存儲(chǔ)的數(shù)據(jù)沒有按要求對(duì)齊字節(jié),這給讀取DWG 文件帶來(lái)了麻煩。由于數(shù)據(jù)不定長(zhǎng)、不對(duì)齊,在實(shí)踐中采用以下編接的方法。
  Readdouble(data, ucin, dRes)
  {switch(flags)
  {case 00:
   Break;
  case 01: dRes=1.0; break;
  case 10: dRes=0.0; break;
  }}
  ReadMC(data, iRes)
  { uctemp1= 按無(wú)符號(hào)字符讀data 的第1 個(gè)字節(jié);
  while(uctemp>=128)
  {ires=uctemp1-128;
  untemp2=2th;
  if(64<=uctemp2<128) {ires+=uctemp2*128;ires=-ires;}
  elseif(uctemp2<64) {ires+=uvtemp2*128;}
  uctemp1=uctemp2;
  }}
  上面的基本數(shù)據(jù)類型主要用來(lái)表示幾何坐標(biāo)。DWG文件中有大量的對(duì)象需要定位,模式字符常用來(lái)表示地址數(shù)據(jù)。模式字符也是一種變長(zhǎng)類型,但都是對(duì)齊的。它可表示任意大小的整型數(shù),實(shí)際操作時(shí)可按32位整數(shù)處理。
  第2種典型表示方式,基本數(shù)據(jù)類型常用來(lái)記錄對(duì)象的句柄。在DWG文件中,每一個(gè)可繪制或不可繪制的對(duì)象都有一個(gè)句柄唯一的標(biāo)識(shí)。句柄采用下面的數(shù)據(jù)結(jié)構(gòu):
  typedef struct tagHandle
  {uchar code;
  uchar* Hdata;
  }Handle;
  DWG文件最多可包含128個(gè)對(duì)象,DWG文件還有巨大的潛力有待挖掘。需要指出的是,DWG 文件中并不是所有的句柄都采用這種格式表示,有些句柄記錄在擴(kuò)展數(shù)據(jù)類型中。
  3.2 擴(kuò)展數(shù)據(jù)類型
  DWG文件中一般存儲(chǔ)有大量的附加屬性信息,這些信息可以是文本,整數(shù),浮點(diǎn)數(shù)或其他任何自定義數(shù)據(jù)。用戶常遇到的BLOB在DWG文件中就表現(xiàn)為這種類型,其類名XRecord。它們的具體存儲(chǔ)方式靈活多變,基本方式是用一個(gè)詞典對(duì)象與一個(gè)或多個(gè)XRecord對(duì)象共同表示一組擴(kuò)展數(shù)據(jù)。
  
  3.3 三維信息
  AutoCAD 的造型能力來(lái)自ACIS,這是一個(gè)集成了目前最先進(jìn)造型方法和技術(shù)的幾何造型平臺(tái),采用文本方式記錄造型信息。從DWG 文件內(nèi)部數(shù)據(jù)格式來(lái)講,AutoCAD 將其通過(guò)造型界面獲取的ACIS 文本造型信息通過(guò)簡(jiǎn)單轉(zhuǎn)化后直接存儲(chǔ),而當(dāng)用戶用ACISOUT 命令輸出模型信息時(shí),AutoCAD 將這部分文本信息輸出為單獨(dú)的SAT 文件。因此這類信息既不是基本數(shù)據(jù)類型,也不同于附加屬性信息。
  
  4讀取文件對(duì)象
  4.1讀取DWG文件
  用簡(jiǎn)單的代碼就可以實(shí)現(xiàn)對(duì)DWG 文件的讀取。要讀取某個(gè)DWG 文件,需要將其所有對(duì)象或?qū)嶓w的句柄,絕對(duì)地址,組代碼一一讀取。
  BOOL ReadAllObjEnt()
  {
  從定位器部分讀取對(duì)象映射表的絕對(duì)地址;
  在對(duì)象映射表開始處讀取對(duì)象映射表的長(zhǎng)度;
  Hndl=0; Adrss=0
  do
  {
  緊接著讀句柄的偏移量;
  讀取對(duì)象的地址偏移量;
  Hndl+=句柄偏移量;
  Adrss+=地址偏移量;
  按 Adrss 尋址;
  讀取對(duì)象的組代碼;
  輸出 Hndl, Adrss,組代碼;
  }
  while(對(duì)象映射表長(zhǎng)度耗盡)
  }
  上述代碼可以生成一個(gè)XML文件。一幅AutoCAD 圖形中包含著多個(gè)對(duì)象,其數(shù)據(jù)庫(kù)結(jié)構(gòu)如下:層表和層表記錄,塊表和塊表記錄,包括模型空間和圖紙空間。AutoCAD 中所有的實(shí)體可見對(duì)象均屬于塊表的這兩個(gè)記錄。
  在文件讀取的過(guò)程中,根據(jù)這些對(duì)象可以建立相應(yīng)的對(duì)象集合。層表對(duì)象包含圖層的信息,可生成集合LAYER={L1 , L2 , L3, . . . , Ln};塊表中包含所有的實(shí)體和可見對(duì)象,可以生成集合:
  BLOCK= { POINT, LINE, CIRCLE,TEXT, . . . }
  POINT= { P1 , P2 , P3 , . . . , Pn}
  LINE= {Li1, Li2, Li3 , . . . , Lin}
  CIRCLE= {C1, C2, C3 , . . . , Cn}
  TEXT= {T1, T2, T3, . . . , Tn}
  這樣DWG文件在圖紙上就被表示成點(diǎn)、線或三角形,把復(fù)雜的的DWG文件轉(zhuǎn)換成可以存儲(chǔ)在數(shù)據(jù)庫(kù)中的實(shí)體對(duì)象。
  實(shí)體是一類特殊的數(shù)據(jù)庫(kù)對(duì)象,在AutoCAD圖形中表現(xiàn)為如下的基本實(shí)體組合:線、圓、弧、文本、區(qū)域、復(fù)合線和橢圓。用戶可以在AutoCAD 的圖形編輯器中使用命令來(lái)編輯這些實(shí)體,通過(guò)訪問(wèn)實(shí)體數(shù)據(jù)庫(kù)來(lái)改變獲得這些實(shí)體的值。利用一些軟件來(lái)自動(dòng)提取DWG 文件標(biāo)題欄字符串信息的模塊,實(shí)現(xiàn)圖紙標(biāo)題欄信息的自動(dòng)提取并保存到數(shù)據(jù)庫(kù)。服務(wù)器端利用SQL Server 數(shù)據(jù)庫(kù)實(shí)現(xiàn)對(duì)設(shè)計(jì)圖紙的自動(dòng)化管理。
  4.2 DWG文件入庫(kù)
  圖紙需入庫(kù)保存時(shí),在AutoCAD 環(huán)境中加載該程序,執(zhí)行圖紙入庫(kù)命令,選擇所需入庫(kù)的圖紙文件。系統(tǒng)調(diào)用AutoCAD 內(nèi)部函數(shù)limmax()獲得圖紙幅面大小,得到標(biāo)題欄位置,再根據(jù)標(biāo)題欄中各個(gè)字符串的相應(yīng)位置,即可實(shí)現(xiàn)標(biāo)題欄中圖名、圖號(hào)、比例、材料、設(shè)計(jì)者、審核者、批準(zhǔn)者、日期等字符串信息在AutoCAD 后臺(tái)數(shù)據(jù)庫(kù)中的自動(dòng)提取,最后將所提取的信息保存到服務(wù)器端SQL Server 數(shù)據(jù)庫(kù)中。附著的外部參照經(jīng)過(guò)綁定和插入操作后即與圖塊相同,可按相同方式處理。定義好的外部圖塊和繪制好的圖紙都存成DWG 圖紙的形式。它們用兩種不同方法插入到當(dāng)前圖紙中,即圖塊和外部參照,命令分別是INSERT 和XREF。關(guān)鍵問(wèn)題是圖元在外部圖塊或被插入圖紙中的參照坐標(biāo)系與當(dāng)前圖紙坐標(biāo)系不同,因此要進(jìn)行坐標(biāo)變換,具體可分為4 種情況。
  DWG 圖紙作為圖塊插入,則圖紙中圖元坐標(biāo)不變,基點(diǎn)坐標(biāo)為(0,0)。DWG 圖紙作為外部引用插入,則圖紙中圖元坐標(biāo)不變,基點(diǎn)坐標(biāo)為(0,0)。圖塊作為外部引用插入,則圖紙中圖元坐標(biāo)不變,基點(diǎn)坐標(biāo)變化。圖塊作為圖塊插入,則圖紙中圖元坐標(biāo)變化,基點(diǎn)坐標(biāo)為(0,0)。4種情況分別處理會(huì)很復(fù)雜,經(jīng)分析歸納出統(tǒng)一的坐標(biāo)轉(zhuǎn)換公式。設(shè)圖元在當(dāng)前圖紙中的坐標(biāo)點(diǎn)為( x c ,y c),圖元原始坐標(biāo)點(diǎn)為( x 0,y 0),基點(diǎn)坐標(biāo)為( x b,yb ),插入點(diǎn)坐標(biāo)為( x i,yi ),其中( x 0,y 0),( x b,yb ),( x i,y i ) 可從DXF 文件中獲得,坐標(biāo)轉(zhuǎn)換公式為( x c,y c ) = ( x 0,y 0) - ( x b,y b ) + ( x i,y i )這樣就把復(fù)雜的圖元轉(zhuǎn)換成可以存儲(chǔ)的實(shí)體元素,為入庫(kù)及文件的讀取提供方便。經(jīng)過(guò)處理,復(fù)雜的DWG文件被解析成可以存儲(chǔ)、轉(zhuǎn)換、可供用戶調(diào)用的元素。
  
  5結(jié)語(yǔ)
  DWG文件是高度緊湊的數(shù)據(jù)與可表示數(shù)據(jù)域的完美結(jié)合。在DWG 圖紙中發(fā)現(xiàn)知識(shí),其中用到的很多技術(shù)都是一些嶄新的技術(shù)。本文給出了一種從AutoCAD 的DWG 圖紙中提取數(shù)據(jù)信息解析DWG文件的方法。解析后的DWG文件將會(huì)給文件的入庫(kù)和數(shù)據(jù)提取帶來(lái)方便,減少文件不易轉(zhuǎn)換,文件過(guò)大等實(shí)際應(yīng)用方面的缺陷。DWG文件數(shù)據(jù)信息入庫(kù)為工程概算提供條件,方便用戶進(jìn)行模糊匹配,實(shí)現(xiàn)工程造價(jià)的預(yù)算。解析DWG文件將對(duì)研究CAD,實(shí)際操作應(yīng)用等方面都能提供極大的幫助。將提高在海量的圖紙中發(fā)現(xiàn)知識(shí)的能力。這是一種嘗試,相信不懈的努力會(huì)有更大的成果。
  
  參考文獻(xiàn)
  [1]

石屏县| 五莲县| 和硕县| 南开区| 奇台县| 墨竹工卡县| 满城县| 石门县| 湟源县| 富锦市| 攀枝花市| 海阳市| 紫云| 开原市| 甘谷县| 临江市| 东港市| 长葛市| 织金县| 威信县| 黑水县| 金堂县| 凤凰县| 启东市| 云安县| 依安县| 曲松县| 扬中市| 全州县| 康保县| 中牟县| 汉沽区| 九江市| 乌鲁木齐县| 津市市| 巩留县| 彰武县| 抚顺市| 曲沃县| 山西省| 安西县|