晏 韻, 許 超
(東南大學(xué),江蘇 南京 210096)
基于DWGDirect訪問AutoCAD DWG圖形文件
晏 韻, 許 超
(東南大學(xué),江蘇 南京 210096)
文章介紹了DWG文件的數(shù)據(jù)格式和利用DWGDirect C++函數(shù)庫進(jìn)行接口程序開發(fā)的主要流程。DWG文件分為頭部、實(shí)體部、表部、塊實(shí)體部和應(yīng)急頭部5個(gè)部分,對各部分的存儲(chǔ)信息給予了簡要介紹。DWGDirect是開放設(shè)計(jì)聯(lián)盟(Open Design Alliance)開發(fā)的函數(shù)庫,可以脫離 AutoCAD平臺(tái)實(shí)現(xiàn)對 DWG文件的讀寫操作。針對CAD/CAM應(yīng)用軟件,討論了對DWG文件中加工圖素的讀取操作實(shí)現(xiàn)方法,并給出部分C++代碼。
計(jì)算機(jī)應(yīng)用;DWGDirect C++;DWG文件;AutoCAD
AutoCAD是美國Autodesk公司設(shè)計(jì)的計(jì)算機(jī)輔助設(shè)計(jì)軟件,已經(jīng)成為國際上廣為流行的繪圖工具。DWG文件格式也成為二維繪圖的事實(shí)標(biāo)準(zhǔn)格式。因此,對于國內(nèi)開發(fā)的眾多CAD/CAM軟件而言,兼容DWG格式是極其重要的一環(huán)。鑒于使用AutoCAD本身提供的開發(fā)工具包如AutoLISP、ADS、ARX以及VBA等開發(fā)出來的程序都無法脫離AutoCAD平臺(tái)本身[1]。而且Autodesk公司提供的數(shù)據(jù)轉(zhuǎn)換格式DXF存在閱讀時(shí)內(nèi)存資源消耗大,處理速度慢等缺點(diǎn)。對于批量文件,全部轉(zhuǎn)化為DXF格式也很困難。因此,隨著信息集成化程度愈來愈高,在獨(dú)立平臺(tái)上自由讀取DWG文件顯得相當(dāng)重要。
DWG文件格式尚未公開,獨(dú)立開發(fā)接口程序存在相當(dāng)?shù)碾y度。而且隨著AutoCAD升級(jí),DWG文件會(huì)或多或少相應(yīng)變化,造成讀寫困難。幸運(yùn)的是,開放設(shè)計(jì)聯(lián)盟(Open Design Alliance)提供了一套函數(shù)庫DWGDirect,開發(fā)人員只要對DWG文件的整體結(jié)構(gòu)有一定了解,再結(jié)合圖形的特點(diǎn),就可以輕松實(shí)現(xiàn)DWG文件的自由讀寫操作。
(1) DWG文件數(shù)據(jù)類型
DWG文件為二進(jìn)制格式文件,共有5種數(shù)據(jù)形式:字符型,單字節(jié)型,雙字節(jié)整型,四字節(jié)整型和以IEEE標(biāo)準(zhǔn)存儲(chǔ)的浮點(diǎn)數(shù)(即雙精度浮點(diǎn)數(shù))。
(2) DWG文件整體結(jié)構(gòu)
DWG文件包含5個(gè)部分:頭部、實(shí)體部、表部、塊實(shí)體部和應(yīng)急頭部[2],如圖1所示。
圖1 DWG文件總體結(jié)構(gòu)
文件頭存儲(chǔ)一些重要信息,如DWG文件標(biāo)志,版本信息,各種索引地址以及一部分系統(tǒng)變量[2]。圖形數(shù)據(jù)包括實(shí)體數(shù)據(jù),塊數(shù)據(jù)和表數(shù)據(jù)。實(shí)體是AutoCAD中的基本圖形單元,線、圓、弧、文本、實(shí)心體、區(qū)域、復(fù)合線和橢圓都是實(shí)體,用戶可以在屏幕上看見實(shí)體并能對其進(jìn)行操作。實(shí)體數(shù)據(jù)由實(shí)體頭和實(shí)體尾組成,實(shí)體頭表述實(shí)體的共同屬性,不同實(shí)體頭結(jié)構(gòu)一樣。而實(shí)體尾部的長度及格式與類型編號(hào)及特征值有關(guān),各不相同[3]。當(dāng)用戶生成塊時(shí),AutoCAD自動(dòng)創(chuàng)建相應(yīng)的塊表以便檢索。每個(gè)塊兩端均為起始實(shí)體和結(jié)束實(shí)體,中間為各種實(shí)體元素。表是AutoCAD為方便檢索而引入的數(shù)據(jù)結(jié)構(gòu),如塊表,層表,線型表,字型表等。
應(yīng)急頭部主要存儲(chǔ)一些重要信息的副本,防止文件頭部損壞導(dǎo)致整個(gè)文件數(shù)據(jù)的丟失。
圖2為DWGDirect中DWG文件的數(shù)據(jù)模型。圖中其他類型表包括視圖表、文本表、線型表、尺寸表、視口表、用戶坐標(biāo)系表、注冊應(yīng)用表等。方框左上角的數(shù)字表示對應(yīng)項(xiàng)目數(shù)量。
圖2 DWGDirect數(shù)據(jù)模型
DWGDirect中的類有固定的命名規(guī)則,如OdRx——表示運(yùn)行時(shí)類注冊和識(shí)別的類,OdDb——表示數(shù)據(jù)庫類,OdGi——表示數(shù)據(jù)庫類對象矢量化的類,OdGe——通用圖形類(點(diǎn)和矢量)等。數(shù)據(jù)庫類表示圖素信息,是一般接口程序的研究重點(diǎn)。以直線類OdDbLine為例:
由以上直線類定義可知,成員函數(shù)不僅可以讀出實(shí)體信息,而且可以設(shè)置實(shí)體信息,這就為DWGDirect讀寫DWG文件提供了方便。
(1) 添加DWGDirect Libraries
在編輯接口程序的工程中添加 DWGDirect include目錄下的頭文件,這些頭文件對相關(guān)的類做了定義,用戶使用時(shí)可以方便調(diào)用,重寫或者派生出自定義的對象類。同時(shí)還要添加 lib目錄下的庫文件。
(2) 創(chuàng)建自定義服務(wù)和DWGDirect對象
在 DWGDirect具體應(yīng)用時(shí),往往需要自定義服務(wù)和DWGDirect對象。
DWGDirect允許客戶程序執(zhí)行幾種服務(wù),如狀態(tài)標(biāo)定(文件加載,保存等),字體文件定位等。這些服務(wù)在OdDbHostAppService類中定義。每個(gè)數(shù)據(jù)庫實(shí)例都有相關(guān)的OdDbHostAppService對象,這種關(guān)聯(lián)由以下方式獲得:
·OdDbHostAppService實(shí)例調(diào)用
creatDatabase(),創(chuàng)建新的空數(shù)據(jù)庫對象,與該數(shù)據(jù)庫相關(guān)的服務(wù)對象就是創(chuàng)建它的實(shí)例。
· 客戶程序調(diào)用
OdDbHostAppService::readFile()或者OdDbHostAppService::recoverFile(),將返回的數(shù)據(jù)庫與期望得到的OdDbHostAppService實(shí)例聯(lián)系起來。
DWGDirect對象均由現(xiàn)有類派生而來,如OdDbEntity,OdDbObject,一般自定義應(yīng)用要求重寫下面6個(gè)函數(shù):
virtual bool OdDbEntity::worldDraw(OdGiWorldDraw *pWd ) const; //由OdDbEntity派生類調(diào)用,能獨(dú)立在任何模型空間或者圖紙空間表示實(shí)體
virtual void OdDbEntity::viewportDraw
(OdGiViewportDraw *pVd ) const; //調(diào)用無限制,建立與視圖相關(guān)的實(shí)體表示法OdResult dwgInFields(OdDbDwgFiler*pFiler);//從 DWG文件裝載自定義實(shí)體時(shí)調(diào)用該函數(shù)
void dwgOutFields(OdDbDwgFiler* pFiler)const; //將自定義實(shí)體保存到DWG文件時(shí)調(diào)用該函數(shù)
OdResult dxfInFields(OdDbDxfFiler* pFiler);//從DFX文件裝載自定義實(shí)體時(shí)調(diào)用該函數(shù)
void dxfOutFields(OdDbDxfFiler* pFiler) const;//將自定義實(shí)體保存到DFX文件時(shí)調(diào)用該函數(shù)
需要注意的是,客戶程序要在創(chuàng)建任何DWGDirect對象之前調(diào)用OdInitialize(),它優(yōu)先于任何DWGDirect的函數(shù)調(diào)用。所有的DWGDirect調(diào)用完成之后,要調(diào)用OdUninitialize()刪除所有DWGDirect對象(除了傳遞給 Initialize()的OdDbSystemService指針)。
(3) 復(fù)雜實(shí)體的處理
在DWG文件中存在一些包含其他對象的復(fù)雜實(shí)體,這些對象保存著實(shí)體的幾何圖形信息??梢杂?explode()函數(shù)把一些實(shí)體分解成一系列簡單的元素,如長方體能被先分解成面,再分解成直線,多義線則能被分解成直線段和圓弧段,多行文字能被分解成單行文字,等等。主要程序如下://將分解的塊表記錄添加到鏈表中
然后只需按照普通實(shí)體的操作方法讀取所需的加工圖素。
(4) 實(shí)體的讀取實(shí)現(xiàn)
實(shí)體的讀取要依次遍歷塊表,塊表記錄和每個(gè)實(shí)體數(shù)據(jù)。下面的函數(shù)實(shí)現(xiàn)對實(shí)體的遍歷:
關(guān)于具體實(shí)體信息的讀取,限于篇幅,這里不再詳述。
(5) 數(shù)據(jù)轉(zhuǎn)換
讀取實(shí)體信息之后需要把數(shù)據(jù)轉(zhuǎn)換為用戶程序的數(shù)據(jù)類型,才能實(shí)現(xiàn)文件信息的正確顯示。以國外 CAM 軟件 ProCAM 為例,需要將DWGDirect 4×4矩陣轉(zhuǎn)化為4×3的矩陣,從而在ProCAM中實(shí)現(xiàn)線型、字符、加工圖素、坐標(biāo)、尺寸、引導(dǎo)線等信息的正確讀取,如圖3所示。
(6) 關(guān)閉實(shí)體
必須注意,無論何時(shí)打開數(shù)據(jù)庫對象,應(yīng)盡可能早的關(guān)閉。如果使用了擴(kuò)展協(xié)議類,需要利用函數(shù)delXs()刪除協(xié)議擴(kuò)展。
圖3 ProCAM直接讀取DWG文件
利用DWGDirect直接讀寫DWG文件,簡單方便,不需要花費(fèi)大量的人力物力開發(fā)接口程序。但是,由于需要進(jìn)行數(shù)據(jù)轉(zhuǎn)換,讀寫較大DWG文件時(shí)速度較慢。另外,盡管開放設(shè)計(jì)聯(lián)盟(Open Design Alliance)能較快地更新函數(shù)庫,但是相對AutoCAD的最新版本仍然不可避免地存在滯后性,而且由于開發(fā)的不系統(tǒng)性導(dǎo)致函數(shù)庫中存在一些錯(cuò)誤。在CAM應(yīng)用中最關(guān)鍵的是加工圖素的圖形轉(zhuǎn)換和讀取,這是本文討論的重點(diǎn)。希望這里介紹的思路幫助讀者開發(fā)類似應(yīng)用接口提供參考,并利用DWGDirect完善DWG文件的讀寫雙向操作。
[1]萬明民, 顧景文. AutoCAD圖形數(shù)據(jù)格式的分析[J].工程圖學(xué)學(xué)報(bào), 2004, 25(1):34-36.
[2]孫向紅. 圖形文件DWG數(shù)據(jù)格式及信息傳遞[J]. 西安科技學(xué)院學(xué)報(bào), 2001, (4):372-374.
[3]黃維豐, 李橋梁, 吳洪濤. 基于OpenDWG Toolkit訪問 AutoCAD DWG 圖形文件[J]. MODERN COMPUTER, 2003, (1):69-72.
Accessing AutoCAD DWG Graphic Files with DWGDirect
YAN Yun, XU Chao
( Southeast University, Nanjing Jiangsu 210096, China )
The data format of AutoCAD DWG files and the main steps for developing the interfaces with DWGDirect C++ Libraries are presented in the paper. DWG file consists of five parts:header, entities, tables, blocks and contingency header, and the information storage of each part is briefly given. DWGDirect, a library developed by the Open Design Alliance, can be used to read and write DWG files without AutoCAD platform. With the method, the realization of how to access part entities for a CAD/CAM software is discussed and a part of C++ codes is introduced also.
computer application; DWGDirect C++; DWG file; AutoCAD
TP 391.72
A
1003-0158(2010)06-0178-04
2009-02-24
晏 韻(1984-),男,湖南株洲人,碩士研究生,主要研究方向?yàn)殁k金CAD/CAM。