陳 寧,李榮川,2
(1.江蘇科技大學(xué)船舶與海洋工程學(xué)院,江蘇 鎮(zhèn)江 212003;2.92538部隊(duì),遼寧 大連 116041)
在以AutoCAD為平臺(tái)的工程制圖過(guò)程中,圖形的引用與圖形信息統(tǒng)計(jì)是一項(xiàng)繁瑣的工作。盡管其為此提供了塊的解決圖形引用的問(wèn)題,但其操作不夠簡(jiǎn)單快捷,而且不能實(shí)現(xiàn)將圖形塊保存到統(tǒng)一的圖形數(shù)據(jù)庫(kù)中,以方便其他工程人員的引用。而對(duì)于圖形信息的統(tǒng)計(jì),作為AutoCAD本身更是無(wú)法做到??梢?jiàn),如何做到方便快速的生成圖形、插入圖形、統(tǒng)計(jì)圖形信息成為提高繪圖效率的關(guān)鍵所在。二次開(kāi)發(fā)能夠提高工作效率和減輕工作量,其開(kāi)放式結(jié)構(gòu)能滿足不同專(zhuān)業(yè)的需要,來(lái)實(shí)現(xiàn)設(shè)計(jì)中的應(yīng)用,達(dá)到改進(jìn)和加強(qiáng) AutoCAD功能的目的[1]。因此,在建立統(tǒng)一的圖形數(shù)據(jù)庫(kù)的基礎(chǔ)上對(duì)AutoCAD進(jìn)行二次開(kāi)發(fā)成為了提高繪圖效率的有效途徑。通過(guò)VBA(Visual Basic For Application)可以用ActiveX技術(shù)對(duì)AutoCAD進(jìn)行二次開(kāi)發(fā),且其與其他二次開(kāi)發(fā)工具相比,VBA具有突出的優(yōu)點(diǎn):①應(yīng)用程序運(yùn)行速度快;②其編程語(yǔ)言和開(kāi)發(fā)環(huán)境簡(jiǎn)單;③與Windows交互性好[2]。利用VBA與數(shù)據(jù)庫(kù)相結(jié)合的模式對(duì)AutoCAD進(jìn)行二次開(kāi)發(fā),不但可以方便地將具有屬性的圖形保存到統(tǒng)一的圖形數(shù)據(jù)庫(kù)下,而且可以實(shí)現(xiàn)方便快速地插入數(shù)據(jù)庫(kù)中的圖形,并且還能夠?qū)D形的操作記錄及屬性保存到記錄數(shù)據(jù)庫(kù)中。通過(guò)讀取處理記錄數(shù)據(jù)庫(kù)中的信息,不僅可以達(dá)到實(shí)現(xiàn)對(duì)圖形統(tǒng)計(jì)的目的,還能夠結(jié)合一定的程序自動(dòng)生成明細(xì)表。
系統(tǒng)針對(duì)的是在AutoCAD平臺(tái)下如何實(shí)現(xiàn)圖形數(shù)據(jù)庫(kù)的創(chuàng)建、圖形的插入與記錄及圖框和明細(xì)表的自動(dòng)生成3個(gè)功能。采用VBA與通用性較好的Microsoft Access工具進(jìn)行聯(lián)合開(kāi)發(fā),并在實(shí)物關(guān)系模型基礎(chǔ)上建立數(shù)據(jù)庫(kù),并以相關(guān)關(guān)系運(yùn)算為指導(dǎo),采用ADO技術(shù)實(shí)現(xiàn)VBA與Microsoft Access數(shù)據(jù)庫(kù)之間的通信,最終分別以3個(gè)VBA工程來(lái)實(shí)現(xiàn)要達(dá)到的3個(gè)功能,從而實(shí)現(xiàn)程序設(shè)計(jì)的要求。系統(tǒng)結(jié)構(gòu)設(shè)計(jì)圖如圖1所示。
基于集合理論,數(shù)據(jù)庫(kù)系統(tǒng)的關(guān)系模型要以嚴(yán)格的數(shù)學(xué)概念為基礎(chǔ),具有嚴(yán)格的數(shù)學(xué)定義和完整的數(shù)學(xué)結(jié)構(gòu),還要能夠進(jìn)行查尋、插入、修改等工作。在實(shí)際的數(shù)據(jù)庫(kù)操作過(guò)程中,常要用到關(guān)系代數(shù)運(yùn)算,任何一種運(yùn)算都是將一定的運(yùn)算符作用到一定的運(yùn)算對(duì)象上,得到預(yù)期的運(yùn)算結(jié)果[3]。因此,要求AutoCAD圖形數(shù)據(jù)庫(kù)和繪圖記錄數(shù)據(jù)庫(kù)關(guān)模型均在嚴(yán)格的數(shù)學(xué)概念的基礎(chǔ)之上進(jìn)行建立和在關(guān)系代數(shù)的指導(dǎo)下進(jìn)行操作。
實(shí)物的關(guān)系結(jié)構(gòu)是建立關(guān)系模型的依據(jù)基礎(chǔ)。由于圖形文件占用存儲(chǔ)空間比較大,如果直接以二進(jìn)制格式存放在數(shù)據(jù)庫(kù)字段中,那么在頻繁查詢數(shù)據(jù)庫(kù)表時(shí),則必然會(huì)大大增加服務(wù)器內(nèi)存的負(fù)擔(dān)[4]。因此將圖形文件的路徑存入數(shù)據(jù)庫(kù)可以有效降低數(shù)據(jù)庫(kù)的占用空間,并提升數(shù)據(jù)庫(kù)查尋數(shù)據(jù)的效率,所以圖形數(shù)據(jù)庫(kù)的實(shí)際關(guān)系結(jié)構(gòu)為:
(名稱(chēng),重量,材料,路徑,備注)?圖形塊?圖形文件?圖形庫(kù) (1)
為了在程序中屬性的提取和操作方便,將屬性與圖形分別存放,以屬性中的路徑來(lái)指定圖形文件的位置。則屬性數(shù)據(jù)庫(kù)與圖形庫(kù)關(guān)系分為:
圖1 系統(tǒng)結(jié)構(gòu)設(shè)計(jì)圖
由于路徑與圖形文件具有映射關(guān)系,則:
從屬性數(shù)據(jù)庫(kù)關(guān)系結(jié)構(gòu)可以推導(dǎo)屬性數(shù)據(jù)庫(kù)的關(guān)系模式:屬性數(shù)據(jù)庫(kù)(名稱(chēng),重量,材料,路徑,備注),其中屬性數(shù)據(jù)庫(kù)為關(guān)系名,括號(hào)中的項(xiàng)目為屬性,見(jiàn)表1。
表1 圖形數(shù)據(jù)庫(kù)的關(guān)系模型
同理,圖形記錄數(shù)據(jù)庫(kù)的關(guān)系模型為:圖形記錄數(shù)據(jù)庫(kù)(編號(hào),名稱(chēng),插入點(diǎn)X,插入點(diǎn)Y,插入點(diǎn)Z,旋轉(zhuǎn)角,放大X,放大Y,放大Z,圖層,材料,重量,備注),見(jiàn)表 2。
表2 圖形記錄數(shù)據(jù)庫(kù)關(guān)系模型
關(guān)系運(yùn)算的方式包括傳統(tǒng)的集合運(yùn)算和專(zhuān)門(mén)的關(guān)系運(yùn)算。在本系統(tǒng)中,對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的操作集中于數(shù)據(jù)的讀寫(xiě)與查找,因此,關(guān)系運(yùn)算集中于專(zhuān)門(mén)的關(guān)系運(yùn)算中的選擇運(yùn)算。在關(guān)系R中選擇滿足給定條件的元組,可以表示為σF(R),其中F表示選擇條件,它是一個(gè)邏輯表達(dá)式,取邏輯值“真”或“假”[5]。如在表1中查名稱(chēng)為法蘭的模型,則表達(dá)式為:
在系統(tǒng)設(shè)計(jì)過(guò)程中對(duì)表中的數(shù)據(jù)選擇時(shí)應(yīng)用此原理。
在程序中,整個(gè)所應(yīng)用的關(guān)鍵技術(shù)主要可以分為兩個(gè)方面,一方面是如何實(shí)現(xiàn)VBA對(duì)AutoCAD的操作,另一方面如何實(shí)現(xiàn)VBA對(duì)Microsoft Access的操作。對(duì)于這兩個(gè)方面的關(guān)鍵技術(shù),在下面將結(jié)合VBA工程實(shí)現(xiàn)來(lái)進(jìn)行闡述。
從整個(gè)程序的設(shè)計(jì)圖中可以看出,該工程的主要任務(wù)有兩個(gè),一是如何將圖形塊保存到圖形庫(kù)中,二是如何將屬性值寫(xiě)入到屬性數(shù)據(jù)庫(kù)中。
圖形數(shù)據(jù)庫(kù)創(chuàng)建是利用VBA與AutoCAD和Microsoft Access的接口來(lái)實(shí)現(xiàn)的,其邏輯圖如圖2所示。
(1)首先分析圖形塊的保存。由于VBA與AutoCAD集成在一起,因此通過(guò)AutoCAD界面的界面菜單即可進(jìn)入到Visual Basic編輯器,通過(guò)其提供的工具箱建立如圖3所示窗口。
圖2 圖形數(shù)據(jù)創(chuàng)建邏輯圖
圖3 創(chuàng)建屬性塊窗體圖
(2)其次分析圖形屬性與路徑如何保存到數(shù)據(jù)庫(kù)中。
采用ADO(ActiveX Data Object)技術(shù)可以實(shí)現(xiàn)VBA與Microsoft Access的通信。ADO同DAO或RDO相比較,在效率上更高,速度更快,并且編寫(xiě)應(yīng)用程序更加簡(jiǎn)單,更加方便,比其他的數(shù)據(jù)訪問(wèn)接口更加全面[6]。但其使用前提條件是必須在VBA環(huán)境中引用“Microsoft ActiveX Data Objects 2.5 Library”。
以下是程序VBA與Microsoft Access數(shù)據(jù)庫(kù)連接的實(shí)現(xiàn)代碼。
通過(guò)運(yùn)行以上代碼便可以建立起VBA與 Microsoft Access數(shù)據(jù)庫(kù)的連接。在此基礎(chǔ)上可以通過(guò)下面的方法在數(shù)據(jù)庫(kù)中增加行,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的寫(xiě)入操作。
從系統(tǒng)的設(shè)計(jì)圖可以看出,本工程的技術(shù)難點(diǎn)在于以下三個(gè)方面:一是如何查找數(shù)據(jù)庫(kù)中的數(shù)據(jù);二是如何將未打開(kāi)圖形中的塊插入到當(dāng)前的工作空間;三是如何得到插入點(diǎn)的信息等屬性并將其寫(xiě)入數(shù)據(jù)庫(kù)中。首先建立如圖4所示窗口。
(1)實(shí)現(xiàn)數(shù)據(jù)庫(kù)存數(shù)據(jù)的查找首先要進(jìn)行數(shù)據(jù)庫(kù)的連接。從原理上講,要實(shí)現(xiàn)數(shù)據(jù)的查找就要依照關(guān)系代數(shù)中專(zhuān)門(mén)的關(guān)系運(yùn)算的選擇公式
進(jìn)行語(yǔ)句設(shè)計(jì)。例如,在表中1查找法蘭的對(duì)應(yīng)的路徑,則程序的任務(wù)是,在數(shù)據(jù)表中查找法蘭所對(duì)應(yīng)的元組,當(dāng)找到后,將該組中路徑所對(duì)應(yīng)的分量從數(shù)據(jù)庫(kù)中讀取出來(lái)。
在程序的部分關(guān)鍵代碼為:
圖4 圖形塊管理界面
以上代碼執(zhí)行條件是建立在VBA與Microsoft Access連接的基礎(chǔ)之上的,它的功能是從數(shù)據(jù)庫(kù)的第一行開(kāi)始查找。如果在名稱(chēng)屬性下查找到法蘭具有相同名稱(chēng)的分量時(shí),則將其路徑屬性在元組中對(duì)應(yīng)的分量賦給path,然后退出,否則繼續(xù)在下一個(gè)元組中進(jìn)行查找。
(2)利用ObjectDBX技術(shù)可以實(shí)現(xiàn)在圖形中插入其他已打開(kāi)的圖形中的圖塊。ObjectDBX包含了一系列動(dòng)態(tài)鏈接庫(kù) (dll),通過(guò)它們可以建立包含在AutoCAD圖形文件中的自定義對(duì)象,也可以使生成的應(yīng)用程序在AutoCAD環(huán)境之外對(duì)DWG圖形進(jìn)行處理[7]。使用ObjectDBX技術(shù)之前同樣要進(jìn)行引用,其引用項(xiàng)為“AutoCAD/ObjectDBX Common16.0 Type Library”。在引用后便可以進(jìn)行編程操作了。
(3)在VBA與Microsoft Access已經(jīng)建立連接的基礎(chǔ)上將屬性值與插入點(diǎn)的信息寫(xiě)入到記錄數(shù)據(jù)庫(kù)中要相對(duì)容易,在與數(shù)據(jù)庫(kù)已連接的基礎(chǔ)上,其實(shí)現(xiàn)代碼為:
其他屬性值的寫(xiě)入同理。
根據(jù)程序設(shè)計(jì)要求,在Visual Basic編輯器中編輯如圖5所示窗口。在本工程中,本工程有兩個(gè)重要的工作,一是在插入圖框塊后進(jìn)行的繪制明細(xì)表線框添加文字,另一個(gè)是數(shù)據(jù)庫(kù)中數(shù)據(jù)的計(jì)算,生成明細(xì)表。
圖5 圖框與明細(xì)表生成界面
(1)添加文字和線段相對(duì)簡(jiǎn)單,只要利用現(xiàn)有的VBA函數(shù)就可以達(dá)到,見(jiàn)表3。
表3 直線與文字增加函數(shù)
(2)生成明細(xì)表首先要讀取記錄數(shù)據(jù)庫(kù),獲得圖形所在的位置。為了操作方便可以將圖形的名稱(chēng)與插入點(diǎn)信息復(fù)制到數(shù)組中,其實(shí)現(xiàn)關(guān)鍵代碼為:
在數(shù)據(jù)信息被復(fù)制到數(shù)據(jù)庫(kù)后,便可以通過(guò)數(shù)組的操作來(lái)進(jìn)行排序、統(tǒng)計(jì),結(jié)合屬性數(shù)據(jù)庫(kù)獲得相應(yīng)屬性,再通過(guò)繪制線形與添加文字操作,便可生成明細(xì)表。其邏輯圖如圖6所示。程序運(yùn)行效果如圖7所示。
(1)介紹了實(shí)現(xiàn)創(chuàng)建、引用數(shù)據(jù)庫(kù)存方法,并成功應(yīng)用于自動(dòng)生成圖框與明細(xì)表。
(2)實(shí)踐發(fā)現(xiàn),通過(guò)VBA與MicrosoftAccess聯(lián)合開(kāi)發(fā)AutoCAD可以降低繪制圖形所需要的時(shí)間,而且在圖形統(tǒng)計(jì)上準(zhǔn)確性高,能夠進(jìn)一步提高工作效率。
圖6 明細(xì)表生成邏輯圖
圖7 程序運(yùn)行效果圖
[1]吳業(yè)紅.應(yīng)用VBA技術(shù)進(jìn)行AutoCAD二次開(kāi)發(fā)[J].電腦知識(shí)與技術(shù),2009,5(28):7950 -7951.
[2]吳海鋒.Auto CAD VBA在工程制圖中的應(yīng)用[J].交通科技與經(jīng)濟(jì),2009,(2):36 -38.
[3]郭曄,王浩鳴,張?zhí)煊?數(shù)據(jù)庫(kù)技術(shù)與Access應(yīng)用[M].北京:人民郵電出版社,2009.
[4]顧金鳳,姚壽廣,陳寧.產(chǎn)品數(shù)據(jù)管理中圖檔管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].華東船舶工學(xué)院學(xué)報(bào)(自然科學(xué)版),2004,18(1):91-94.
[5]王志梅,黃河.關(guān)系數(shù)據(jù)庫(kù)基礎(chǔ)與技術(shù)[M].北京:國(guó)防工業(yè)出版社,2005.
[6]喬美娥.ADO技術(shù)在VB系統(tǒng)開(kāi)發(fā)中的高級(jí)應(yīng)用[J].中國(guó)科技信息,2008,(24):84 -85.
[7]楊應(yīng)平,張明文,肖述剛.ObjectDBX技術(shù)在橋梁CAD中的簡(jiǎn)化作用[J].中華建設(shè),2007,(12):67 -68.