李少輝,王志遠(yuǎn)(中國(guó)恩菲工程技術(shù)有限公司,北京 100038)
AutoCAD二次開發(fā)技術(shù)在礦山工程設(shè)計(jì)中的應(yīng)用
李少輝,王志遠(yuǎn)(中國(guó)恩菲工程技術(shù)有限公司,北京 100038)
介紹了AutoCAD二次開發(fā)在工程設(shè)計(jì)中的必要性,及基于.NET平臺(tái)利用C#語言對(duì)AutoCAD進(jìn)行二次開發(fā)的方法。根據(jù)礦山工程設(shè)計(jì)的實(shí)際需要,開發(fā)了坐標(biāo)計(jì)算和坐標(biāo)表自動(dòng)繪制的輔助設(shè)計(jì)程序,對(duì)其主要功能和特點(diǎn)進(jìn)行了介紹。
AutoCAD; .NET API; 二次開發(fā); 坐標(biāo)計(jì)算
AutoCAD軟件由于其易學(xué)易用、功能豐富等特點(diǎn),現(xiàn)已成為國(guó)際上廣為流行的繪圖工具,特別是在工程設(shè)計(jì)領(lǐng)域成為不可或缺的重要工具,但是在礦山工程設(shè)計(jì)工作中,經(jīng)常遇到圖形復(fù)雜、計(jì)算量較大或重復(fù)工作較多等問題,對(duì)于這樣的復(fù)雜CAD問題,依據(jù)AutoCAD的基本功能往往難以解決問題或者制圖效率不高,在此情況下,就需要根據(jù)制圖工作的具體要求,對(duì)AutoCAD進(jìn)行二次開發(fā),給軟件添加自定義功能,以提高設(shè)計(jì)效率和技術(shù)水平,減少人力投入和降低出錯(cuò)概率[1~2],同時(shí)使制圖工作更加規(guī)范準(zhǔn)確。因此,AutoCAD的二次開發(fā)是十分必要的。
Autodesk公司為AutoCAD的二次開發(fā)提供了一系列的工具和應(yīng)用程序編程接口(API),方便用戶對(duì)其進(jìn)行二次開發(fā)。
2.1 .NET API技術(shù)簡(jiǎn)介
從AutoCAD2006開始,.NET API開始用于AutoCAD的二次開發(fā),.NET API提供了一系列托管的外包類,使開發(fā)人員可以在.NET框架下,使用任何支持.NET的語言,如Visual Basic、C#等對(duì)AutoCAD進(jìn)行二次開發(fā)。其優(yōu)點(diǎn)是完全面向?qū)ο?,功能?qiáng)大且方便易用,是目前較理想的AutoCAD二次開發(fā)工具[3~4]。
.NET API與傳統(tǒng)ObjectARX的區(qū)別主要在于開發(fā)應(yīng)用程序的環(huán)境不同,.NET API將ObjectARX下的全局函數(shù)封裝為.NET API下的某些對(duì)象或?qū)ο蟮膶傩裕肅#、VB來編寫托管ARX程序,提高了程序的重用性和安全性,開發(fā)人員不必關(guān)心具體的函數(shù)實(shí)現(xiàn)方法,只需要了解其用法,因此開發(fā)流程較為簡(jiǎn)便。
2.2 .NET API與其它二次開發(fā)工具的比較
當(dāng)前主要的AutoCAD二次開發(fā)工具中,VisualLisp與VBA語法簡(jiǎn)單,使用方便且開發(fā)速度較快,不需要安裝另外的編程工具包,但是其功能也有所不足,開發(fā)的AutoCAD插件可視化程度低,對(duì)面向?qū)ο蟮墓δ苤С植缓?。而ObjectARX基于VC平臺(tái),使用C++作為編程語言,功能強(qiáng)大,可以很好地運(yùn)用各種面向?qū)ο蠹夹g(shù),但其缺點(diǎn)是開發(fā)效率較低,由于C++語法較為復(fù)雜,對(duì)開發(fā)人員的能力要求較高。ObjectARX使用C#語言時(shí),不但融合了VBA開發(fā)速度快、語言簡(jiǎn)單的特點(diǎn),還結(jié)合了C++面向?qū)ο蟮脑S多優(yōu)點(diǎn),可以說C#是最適合進(jìn)行AutoCAD開發(fā)的語言?;?NET平臺(tái)對(duì)AutoCAD進(jìn)行二次開發(fā),可充分利用.NET 的各種優(yōu)勢(shì),在保證功能強(qiáng)大的前提下大大提高開發(fā)速度[5]。
應(yīng)用.NET API進(jìn)行AutoCAD二次開發(fā),所開發(fā)的程序會(huì)生成動(dòng)態(tài)鏈接庫(kù)(DLL)文件,在AutoCAD中加載后就可以使用。下面以使用C#語言基于Visual Studio 2010平臺(tái)下進(jìn)行開發(fā)為例,對(duì)于使用.NET API進(jìn)行AutoCAD二次開發(fā)的一般過程進(jìn)行描述。
3.1 建立Windows應(yīng)用程序
在Visual Studio 2010中新建Windows應(yīng)用程序,在程序開發(fā)前要對(duì)AutoCAD進(jìn)行托管,即在Visual Studio 2010中添加引用(acdbmgd.dll和acmgd.dl1)[6],此外還要在程序的開頭引用命名空間。代碼如下:
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
應(yīng)用程序引用了AutoCAD提供的開發(fā)程序集后,就可以利用程序集中的函數(shù)編寫代碼,實(shí)現(xiàn)與AutoCAD的互操作。
3.2 添加AutoCAD命令
接下來對(duì)需要在AutoCAD中新增的各項(xiàng)功能,在二次程序開發(fā)中定義對(duì)應(yīng)菜單和命令入口??梢栽诠δ芎瘮?shù)中進(jìn)行各功能模塊的具體代碼編寫。編譯成功以后生成的DLL文件,在AutoCAD中可以通過NETLOAD命令加載啟動(dòng),也可以通過修改AutoCAD的加載文件實(shí)現(xiàn)自動(dòng)加載。
3.3 向AutoCAD繪制圖形
在程序中繪制圖形需要訪問AutoCAD圖形數(shù)據(jù)庫(kù)。AutoCAD圖形數(shù)據(jù)庫(kù)對(duì)象包含一套固定的符號(hào)表和命名的對(duì)象詞典。符號(hào)表和命名對(duì)象詞典都是存儲(chǔ)數(shù)據(jù)庫(kù)對(duì)象的容器。訪問AutoCAD數(shù)據(jù)庫(kù)的方法為:使用事務(wù)處理來獲取數(shù)據(jù)庫(kù)對(duì)象,在符號(hào)表(模型空間所在的塊表也是符號(hào)表之一)中加入實(shí)體。通常繪圖都在模型空間中進(jìn)行,所有模型空間的實(shí)體都存儲(chǔ)在塊表的“模型空間”記錄中。
在礦山工程設(shè)計(jì)工作中,如設(shè)計(jì)中段平面圖、斜坡道時(shí),需要計(jì)算各個(gè)控制點(diǎn)的坐標(biāo),兩點(diǎn)間的坡度、距離,并繪制坐標(biāo)表等,并需要經(jīng)常調(diào)整坐標(biāo)點(diǎn)的位置和兩點(diǎn)間的坡度等數(shù)據(jù)進(jìn)行試算,計(jì)算過程較為復(fù)雜。利用.NET平臺(tái),對(duì)AutoCAD2010進(jìn)行二次開發(fā),制作出了點(diǎn)坐標(biāo)計(jì)算和坐標(biāo)表自動(dòng)繪制的輔助設(shè)計(jì)程序,能夠?qū)崿F(xiàn)坐標(biāo)自動(dòng)計(jì)算、坐標(biāo)點(diǎn)的添加、修改、刪除后的數(shù)據(jù)實(shí)時(shí)更新等功能,有助于減少工作量,提高工作效率并保證數(shù)據(jù)的準(zhǔn)確性。
二次開發(fā)使用Visual Studio 2010作為開發(fā)工具,C#為開發(fā)語言,利用ObjectARX2010開發(fā)包對(duì)AutoCAD2010進(jìn)行開發(fā)。對(duì)于AutoCAD的其它版本,使用對(duì)應(yīng)版本的開發(fā)工具包進(jìn)行重新編譯即可。
4.1 主要功能
坐標(biāo)計(jì)算程序包括“平面坐標(biāo)計(jì)算”和“斜井斜坡道坐標(biāo)計(jì)算”兩種,主要差別在于平面坐標(biāo)計(jì)算中坡度值較小,因此坡度數(shù)值以千分?jǐn)?shù)表示,繪制的坐標(biāo)表中不包含“實(shí)際斜長(zhǎng)”一項(xiàng),斜井斜坡道坐標(biāo)計(jì)算中坡度值較大,因此坡度數(shù)值以百分?jǐn)?shù)表示,繪制的坐標(biāo)表中包含“實(shí)際斜長(zhǎng)”一項(xiàng)。程序功能結(jié)構(gòu)如圖1所示。
圖1 坐標(biāo)計(jì)算程序功能結(jié)構(gòu)圖
在AutoCAD命令欄中輸入自定義的坐標(biāo)計(jì)算命令后,即彈出窗體對(duì)話框,如圖2所示。
圖2 初始窗體界面
(1)添加坐標(biāo)數(shù)據(jù)。打開坐標(biāo)計(jì)算對(duì)話框后,首先需要輸入或拾取第一點(diǎn)的平面X、Y坐標(biāo)及標(biāo)高(Z坐標(biāo))。需進(jìn)行坐標(biāo)計(jì)算的示例圖形如圖3所示,添加坐標(biāo)數(shù)據(jù)后對(duì)話框如圖4所示。后續(xù)的坐標(biāo)點(diǎn)要選擇基點(diǎn)(默認(rèn)為上一點(diǎn)),輸入標(biāo)號(hào),選擇到基點(diǎn)為直線或圓弧,輸入標(biāo)高或坡度以及圓弧半徑等,拾取點(diǎn)獲取其坐標(biāo)后,計(jì)算該點(diǎn)到基點(diǎn)的距離、實(shí)際斜長(zhǎng)、坡度或標(biāo)高等數(shù)據(jù),并將該點(diǎn)的數(shù)據(jù)實(shí)時(shí)添加到對(duì)話框左側(cè)的坐標(biāo)數(shù)據(jù)表中,添加坐標(biāo)點(diǎn)后,會(huì)在AutoCAD圖形中根據(jù)已拾取的點(diǎn)繪制一條標(biāo)示線,提示用戶已經(jīng)選取的坐標(biāo)點(diǎn)。
圖3 坐標(biāo)計(jì)算示例圖形
圖4 添加坐標(biāo)數(shù)據(jù)
坐標(biāo)計(jì)算中經(jīng)常會(huì)遇到分支的坐標(biāo)點(diǎn)計(jì)算或者閉合線路的計(jì)算,如圖3中點(diǎn)2到點(diǎn)7即為一個(gè)分支,計(jì)算坐標(biāo)點(diǎn)7時(shí),只需選擇基點(diǎn)為已知點(diǎn)2,程序會(huì)自動(dòng)將點(diǎn)2作為該分支的起始點(diǎn)進(jìn)行計(jì)算,坐標(biāo)表中會(huì)添加點(diǎn)2和點(diǎn)7的數(shù)據(jù)。
當(dāng)分支需要閉合時(shí),如圖6中點(diǎn)4→點(diǎn)8→點(diǎn)9→點(diǎn)10→點(diǎn)3即為一個(gè)閉合的分支,選擇閉合點(diǎn)3時(shí),只需在標(biāo)號(hào)中輸入3,系統(tǒng)會(huì)將其識(shí)別為已知點(diǎn),不需錄入其它參數(shù),便會(huì)自動(dòng)計(jì)算點(diǎn)10到點(diǎn)3的距離,坡度等數(shù)據(jù),添加到坐標(biāo)表中,如圖4中數(shù)據(jù)表格所示。
(2)修改坐標(biāo)數(shù)據(jù)。要插入坐標(biāo)點(diǎn),需在坐標(biāo)表中選中某一點(diǎn),點(diǎn)擊工具欄中的“插入”按鈕,即彈出“插入點(diǎn)對(duì)話框”,如圖5所示,以選中的點(diǎn)為基點(diǎn),其它參數(shù)錄入同(1)中所述,拾取點(diǎn)后即將該點(diǎn)插入到坐標(biāo)表中。如果AutoCAD圖形中移動(dòng)了某一點(diǎn)的位置,可以點(diǎn)擊工具欄中的“拾取點(diǎn)替換”按鈕,更改選中點(diǎn)的坐標(biāo)。要?jiǎng)h除坐標(biāo)表中的點(diǎn),可以點(diǎn)擊工具欄中的“刪除”按鈕,即刪除選中的坐標(biāo)點(diǎn)。
圖5 插入坐標(biāo)點(diǎn)
除在圖形中選取點(diǎn)外,也可以直接修改數(shù)據(jù)表中的數(shù)據(jù),包括坡度、標(biāo)高等。在修改數(shù)據(jù)后,由于各個(gè)坐標(biāo)點(diǎn)之間是相互關(guān)聯(lián)的,因此需要對(duì)整個(gè)坐標(biāo)表中的數(shù)據(jù)進(jìn)行重新計(jì)算,計(jì)算流程如圖6所示。
圖6 坐標(biāo)表計(jì)算流程圖
(3)繪制圖形。點(diǎn)擊工具欄中的“標(biāo)注圓弧尺寸”按鈕,可在圖形中拾取圓弧,之后會(huì)自動(dòng)標(biāo)注其半徑、弧長(zhǎng)、角度等數(shù)據(jù)。
完成坐標(biāo)點(diǎn)拾取后,可以設(shè)置繪制坐標(biāo)表的參數(shù),如圖7所示,設(shè)置的參數(shù)為字體高度、字體顏色、繪圖比例、寬度比例等,繪制的圖形默認(rèn)以生成AutoCAD塊的形式插入到圖形中。繪制的坐標(biāo)表格式如圖8所示。
圖7 設(shè)置繪圖參數(shù)
圖8 在AutoCAD中繪制的坐標(biāo)表
(4)坐標(biāo)數(shù)據(jù)的導(dǎo)入導(dǎo)出??梢詫⒆鴺?biāo)數(shù)據(jù)導(dǎo)出至csv格式文件,需要修改坐標(biāo)數(shù)據(jù)時(shí),可以直接將csv格式文件導(dǎo)入,而不需用重新到圖形中拾取坐標(biāo)點(diǎn)。
4.2 程序特點(diǎn)
(1)可視化界面,便于操作。將坐標(biāo)計(jì)算的各種功能集成到對(duì)話框中,并將已獲取的點(diǎn)坐標(biāo)數(shù)據(jù)實(shí)時(shí)顯示在數(shù)據(jù)表格中,用戶可以隨時(shí)掌握各個(gè)坐標(biāo)點(diǎn)的數(shù)據(jù)。
(2)實(shí)時(shí)更新數(shù)據(jù)。在需要修改點(diǎn)的坐標(biāo)時(shí),可以方便地插入點(diǎn)、刪除點(diǎn)和編輯坐標(biāo)數(shù)據(jù),并可自動(dòng)更新數(shù)據(jù),自定義程度較高,用戶可以隨時(shí)獲取修改后的數(shù)據(jù)。
(3)坐標(biāo)數(shù)據(jù)可以隨時(shí)保存和導(dǎo)入,便于此后的數(shù)據(jù)修改而不需要重新獲取點(diǎn)坐標(biāo)。
基于.NET API進(jìn)行AutoCAD二次開發(fā)的方法結(jié)合了其它二次開發(fā)工具的優(yōu)點(diǎn),流程簡(jiǎn)單而功能強(qiáng)大,開發(fā)效率高,且有利于實(shí)現(xiàn)與其他Windows應(yīng)用程序的數(shù)據(jù)交互,是目前進(jìn)行AutoCAD二次開發(fā)較為理想的工具。
依據(jù)此方法開發(fā)的點(diǎn)坐標(biāo)計(jì)算程序能夠?qū)崿F(xiàn)修改坐標(biāo)點(diǎn)后的數(shù)據(jù)自動(dòng)計(jì)算,可作為中段平面圖或斜坡道等設(shè)計(jì)中的輔助工具,經(jīng)過在多個(gè)設(shè)計(jì)項(xiàng)目中的實(shí)際使用表明,程序能夠有效降低出錯(cuò)概率,提高工作效率。
[1] 陳文峰,劉祚秋,等.AutoCAD二次開發(fā)在工程計(jì)算軟件中的應(yīng)用[J].科學(xué)技術(shù)與工程,2011,11(24).
[2] 丁航行,任鳳玉,等.AutoCAD環(huán)境下巷道坐標(biāo)參數(shù)表的自動(dòng)生成[J].東北大學(xué)學(xué)報(bào)(自然科學(xué)版),2015,36(6).
[3] 李保風(fēng).基于.NET訪問AutoCAD數(shù)據(jù)庫(kù)探討[J].制造業(yè)自動(dòng)化,2012,34(4).
[4] 宋 威,王正瓊,等.使用C#語言進(jìn)行AutoCAD開發(fā)學(xué)習(xí)初探[J].測(cè)繪與空間地理信息,2010,33(4).
[5] 魏 坤,陳 開,等.基于.NET技術(shù)與AutoCAD的產(chǎn)品數(shù)據(jù)管理系統(tǒng)研究[J].制造業(yè)信息化,2008,(7).
[6] 于蕭榕,郭昌言.結(jié)合Objectarx和C#進(jìn)行AutoCAD二次開發(fā)框架的研究[J].科學(xué)技術(shù)與工程,2010,10(20).
Application of AutoCAD secondary development in mine engineering design
The necessity of AutoCAD secondary development in engineering design and the method of based on. NET platform, using C# language to develop AutoCAD were introduced. According to the actual demand of mine engineering design, the aided design program was developed to accomplish coordinate calculation and automatically draw coordinate table, and its main functions and characteristics were introduced.
AutoCAD; .NET API; secondary development; coordinate calculation
TP391.72
A
李少輝(1987-),男,河北邯鄲人,工程師,從事礦山工程咨詢與設(shè)計(jì)工作。