李志超,余杉鈺,章 波,張彩云
LI Zhi-chao,YU Shan-yu,ZHANG Bo,ZHANG Cai-yun
(哈爾濱理工大學 自動化學院,哈爾濱 150080)
AutoCAD作為一款成功的計算機輔助軟件在工程繪圖中具有廣泛的應用,它可以幫助設計人員進行繪圖設計。CAD已經成為現代工程設計最常用的工具,在機械、建筑、電子等領域得到了廣泛的應用。但由于CAD軟件的通用性,可能造成在某些專業領域內的功能不足或缺失[1]。因此,有必要對CAD進行二次開發,設計出符合特定領域的專業模塊。這樣可以擴展CAD的應用范圍,同樣可以提高設計人員的工作效率還可以減少設計時出現的錯誤,具有很強的實用價值。
以實際工程中法蘭的繪制為例,不同法蘭的直徑,材質,螺孔數,厚度等參數均不同。因此,如果對每一個法蘭盤都進行繪制將浪費工程師大量的時間,而且不便于管理。利用CAD二次開發技術,不但可以快速準確的繪制所要求的法蘭盤,而且通過數據庫技術可以將CAD與企業的ERP管理系統鏈接起來,更方便企業的綜合管理,提高企業的管理效率,節約成本。
目前AutoCAD二次開發的工具比較多,如Visual Lisp、VBA和ObjectARX等。它們各存在著不同的優缺點,Visual Lisp采用Lisp語言開發,簡單但不直觀。VBA采用Visual Basic語言開發,開發簡單方便但功能不足。而ObjectARX是基于Visual C++開發語言的,功能強但難以掌握[2]。
AutoCAD .NET API使用戶可通過編程的方法利用程序集和開放庫操作AutoCAD和圖形文件。通過開放的對象,它們可被許多不同的編程語言和環境訪問。在AutoCAD中實現.NET API具有以下優點:
1)有更多的編程環境可以訪問AutoCAD圖形。而之前的開發工具僅限于使用相應的語言。如VBA只能使用Visual Basic語言。
2)NET 框架可以為32位及64位操作系統進行設計,而VBA只能為32位操作系統設計。
3)與那些傳統編程語言相比,如C++,.NET具有更低的學習要求來訪問高級接口。
4)C#相比VC++采用了垃圾回收機制,自行判斷內存回收的時機并實行回收,通過Dispose函數進行資源自動釋放,從而解決了內存泄漏問題。同時VC# NET的二次編譯技術也使得其開發的程序編譯成功之后可以實現編譯后的程序與硬件無關,從而使得程序員只是專注于程序本身,因而成為了程序員開發工具的首選。因此,在.NET框架下利用C#語言對AutoCAD進行二次開發,具有完全面向對象、方便易用的特點,是最合適的AutoCAD二次開發工具[3]。
在AutoCAD二次開發中,一般有兩種實現方式。一種是通過外部應用程序啟動AutoCAD,并在CAD中作圖;另一種是在CAD中加載插件,利用插件來彈出我們所需的面板,在面板上輸入參數,并可在CAD中畫出圖形。這兩種方法的實現方法和原理大致相同,只是實現的方式有所不同,在這里我們以更具普遍性和代表性的插件開發為例來進行說明[4]。
在AutoCAD二次開發中,為了使用.NET API托管封裝的類,我們需要先引入上述的這些DLL文件。先啟動Visual studio 2008,新建一個類庫項目,然后將鼠標放在項目名稱上,鼠標右鍵單擊“引用”,然后選擇“添加引用”。在“添加引用”對話框中選擇“瀏覽”,然后找到上述的AcDbMgd.dll、AcMgd.dll、AcCui.dll文件,點擊確定將這些組建添加到項目中。此時,我們已經將C#與.NET API連接起來了,接下來我們就可以專心進行CAD的開發了[5]。
首先我們在AutoCAD的菜單項中,添加我們的插件菜單,這里將該菜單項命名為“法蘭”,其含有下拉子菜單。在項目添加一個類文件,添加如下代碼:
[CommandMethod(“AddMenu”)]
Public void AddMenu()
{AcadApplication acadApp=Application.AcadApplication;
AcadPopupMenuItem pm=acadApp.MenuGroups.Item(0).Menus.Add(“法蘭”);
AcadPopupMenuItem pmi1,pmi2,pmi3,pmi4,pmi5;
pm1=pm.AddMenuItem(pm.count+1,“板式平焊法蘭”,“Thickness”+convert.Tochar(13));//子菜單}
通過以上代碼我們可以實現在C A D中添加插件菜單和去其子菜單,[CommandMethod(“AddMenu”)],可以在CAD中添加命令,如在命令行中輸入,AddMenu相當于單擊“堵板”菜單。根據我們的要求可以任意添加菜單和子菜單,最終可生成如下圖所示的形式。

圖1 插件菜單圖
添加好所要求的插件菜單和其子菜單后,就可以對各個子菜單添加命令以實現各自不同的功能?,F在假設當點擊子菜單后彈出的是面板形式,那么我們首先需要在項目中添加一個Windows Form窗體,并將該窗體的命令與子菜單的命令相對應,則可實現單擊子菜單彈出相應的窗體。
而面板的設計則相對的比較容易,我們可以根據Visual studio 2008集成環境中提供的各種控件如文本框、標簽、按鈕等,設計自己想要的面板。我們以法蘭為例設計一種面板,如圖2所示。

圖2 法蘭盤面板圖
該面板比較簡潔,左上方為DataGridView控件,主要與數據庫中的數據進行交互綁定,通過查詢等一些命令來顯示數據庫中的相關信息。左下方為TextBox控件,主要用來輸入數據下達命令。右上方為PictureBox控件,主要用來顯示預覽圖片,右下方為按鈕控件。這些按鈕控件具體實現什么功能,主要取決于內部包含相應的代碼。雙擊控件我們就可以進入該控件的編程界面,根據所實現的功能編寫相應的程序。
對AutoCAD進行二次開發,主要是用來繪圖的,下面我們就來介紹一下通過面板怎樣實現在CAD中作圖。由上述內容我們知道,直線、園、注釋、圖層等均為AutoCAD的對象,因此我們可以利用這些類來繪制圖形,下面以法蘭為例進行說明。設置好面板上的相關數據后,單擊作圖按鈕,則相應圖形將顯示在CAD的繪圖界面中。法蘭圖形如圖3所示。
在工程應用中,設計人員可能經常需要將設計好的圖形保存下來,如果圖形太多則不方便管理,查找起來也比較困難,也不利于公司內部進行資源交流。因此,在進行二次開發的時候將AutoCAD與數據庫聯系起來是很有必要的。同時,數據庫也是CAD與企業的ERP管理系統鏈接起來的紐帶,這樣方便企業的整體管理,可以提高管理效率。

圖3 法蘭圖
數據庫主要分為本地數據庫和遠程數據庫兩種。本地數據庫安裝在所使用電腦上,一般比較小,用于個人電腦上的信息存儲;遠程數據庫一般在公司的服務器上,一般來說比較大,遠程數據庫與本地數據庫通過局域網或因特網進行連接,實現本地與服務器之間的傳遞與下載。本文中我們以MySQL為本地數據庫,以SQL Server為遠程數據庫。由于它們之間操作方法類似,我們主要以MySQL數據庫為例進行說明。
要想實現AutoCAD與MySQL的連接,必須在工程項目中引入MySQL的一個組件,即mySql.data.dll[6]。
先在數據庫中建一個表,該表有四列型號、直徑、螺孔數、厚度。在查詢中,我們可以根據已知的某些信息查找出所有符合條件的零件。實現代碼如下:


從上述代碼可以看出,其過程是先與數據庫取得連接,然后通過查詢語句返回我們所需要的信息。圖2左上角中顯示了庫存中厚度為80mm的法蘭信息。
當設計好需要的插件時,便可以對程序進行編譯,最終生成一個dll文件,可以在CAD中輸入Netload命令進行加載,但顯然這種方法太繁瑣,我們更希望每次在CAD啟動時能自動加載。此時可在CAD安裝文件support中的acad2007.lsp的末尾處添加命令(COMMAND "NetLoad" "D:/Program Files/AutoCAD 2007/Support/MyMenu.dll")即可[5]。
本文主要介紹C#與.NET API技術相結合的一種AutoCAD二次開發方法,并對其原理及實現各種功能的流程進行了簡要的闡明。從文中的介紹中,我們可以看到利用該方法可輕松實現AutoCAD的二次開發,并且比較容易掌握,只需具備一定的C#基礎和CAD的一些基本常識便可以進行CAD的二次開發,具有很好的實用價值。
[1] 方毅.基于C#與AutoCAD的斷面圖繪制程序設計與應用[J].地理空間信息.2012,10.10(5).
[2] 余甚洋,謝元禮.AutoCAD平臺下坐標文件圖形化模塊C#實現[J].西北大學學報.2008,9.6(5).
[3] 蔣元星.基于C#的AutoCAD二次開發技術研究及應用[J].中國制造業信息化.2007,9.36(17).
[4] 堯燕.基于VC#.NET對AutCAD二次開發方法的研究[J].科學技術與工程.2008,12.8(23).
[5] 曾洪飛. AutoCAD VBA&VB.NET開發基礎與實例教程[M].中國電力出版社.2009.
[6] Matthew Stucky著,金旭軍譯. MySQL:創建用戶接口[M].北京:人民郵電出版社.2002.