.NET開發AutoCAD指南(一)
2024-07-10 12:58:48
供稿:網友
時下流行的開發autocad的工具,一個是objectarx,另一個是autocad自帶的vba(autocad內置的visual lisp本來也算一個,但它只能開發一些小型的程序,因此不能和前面的兩個工具相比)。但兩者都存在明顯的不足,以vc++為基礎的objectarx的開發功能無庸質疑是非常強大的,但要想學習并熟練掌握vc++及objectarx對于普通人來說是比較困難的。還有大家應該注意到的是,objectarx是以vc++為基礎的,但就是最新的objectarx2006也只能用visual stuio.net 2001來進行開發,而不能使用現在普遍使用的visual studio.net 2003(呵呵,當然不能用更高版本的visual studio.net了)。而vba正好相反,非常容易上手,但對于編寫高效或者復雜的程序就不是那么簡單的事情了。更為糟糕的是,vba已沒有更新的版本了,因為vb已經被vb.net取代了。
那到底有沒有一種結合objectarx和vba優點的開發autocad的工具呢?答案就是利用功能強大并且易用的.net。對于autocad 2004及以前的版本,大家可以使用activex來進行autocad 的.net程序開發(我也寫過這方面的文章),但開發出來的程序還不是真正意義上的.net程序,功能不是很強大,和objectarx或vba相比沒有任何的優勢而言。到了autocad2005,有了真正的可以開發.net程序的objectarx® managed wrapper classes,但它的功能還是很有限,如連最基本的用于讀取autocad命令行的函數都沒有。隨著最新的autocad2006的發布,objectarx® managed wrapper classes的性能被大幅度提升,以前只有objectarx才有的一些函數和功能(而這些東東往往對于autocad的開發是非常重要的),現在objectarx® managed wrapper classes都提供了。
最令人激動的是,利用objectarx® managed wrapper classes,你可以非常方便的生成autocad工具欄、面板和擴展多頁對話框(呵呵,英文名為extend tabbed dialogs,可能翻譯的不太準確,用過cad的人都應該知道選項對話框吧,擴展多頁對話框就是指的這一種,甚至你可以在選項對話框中添加你自定義的頁,是不是很酷啊!),而這些往往是objectarx和vba非常難以做到的。
類似于屬性的面板
擴展多頁對話框,竟然可以在autocad的選項對話框中添加自定義的選項卡,太酷了!
呵呵,費話說了這么多,還是讓我們來用一個具體的例子來看一下如何使用objectarx® managed wrapper classes(2006)來開發autocad程序,這個例子是先在autocad中畫一個圓,再根據用戶在命令行中的選擇改變圓的顏色。先說明一下,你可以用任何版本的visual studio.net(不管是老版本的2001,還是2003,或者是最新的2005)來進行autocad .net程序的開發,編程語言你可以用c#或vb.net。我用的是visual studio.net 2003,語言為c#,autocad 版本為2006英文版。
下面是具體的步驟(可以看附件中的演示視頻):
1.在visual studio.net 中,創建一個類庫工程。
2.添加相關的引用。請把autocad2006安裝目錄下的acdbmgd.dll和acmgd.dll添加到工程中。
3.在源代碼文件中,加入以下代碼:
using system;
//下面加入的命名空間都是開發autocad程序時會用到的
using autodesk.autocad.databaseservices;
using autodesk.autocad.runtime;
using autodesk.autocad.geometry;
using autodesk.autocad.applicationservices;
using autodesk.autocad.editorinput;
using dbtransman=autodesk.autocad.databaseservices.transactionmanager;
namespace example
{
public class class1
{
//注冊autocad命令,你可以在autocad的命令行中通過輸入此命令來調用.net程序
[commandmethod("test")]
public void test()
{
//定義圓的圓心
point3d center=new point3d(100,100,0);
//定義圓的半徑
double radius=50;
//定義一個circle對象來表示你要生成的圓,傳入的第二個參數為圓的法向,就是把圓生、//成在什么面上,因為autocad程序一般都是平面問題,因此你一般都把這個法向量定義成//z軸方向。
circle circle=new circle(center,new vector3d(0.0,0.0,1.0),radius);
//獲得當前活動autocad文檔所在的數據庫
database db=application.documentmanager.mdiactivedocument.database;
//獲得事務處理管理器
dbtransman tm=db.transactionmanager;
//開始事務處理,也就是往cad中加入東西
using(transaction trans=tm.starttransaction())
{
//獲得autocad塊表,autocad將加入到圖形中的對象的信息都放在這個表中
blocktable bt=(blocktable)
tm.getobject(db.blocktableid,openmode.forread,false);
//獲得塊表記錄
blocktablerecord btr=(blocktablerecord)
tm.getobject(bt[blocktablerecord.modelspace],openmode.forwrite,false);
//向塊表記錄加入圓的相關信息
btr.appendentity(circle);
//向autocad加入圓
tm.addnewlycreateddbobject(circle,true);
trans.commit();
}
}
}
}
是不是看了上面的東西覺得有點難?(呵呵,如果你要弄清楚什么塊表、塊表記錄、事務處理的,你得先了解autocad內在的一些東西,這我會在以后講)不就是加入一個圓嗎?要這么復雜?!為了讓初學者快速地進入.net開發autocad的世界,我給大家編了一個庫zhfarx,你可以通過這個庫來簡化上面的程序(關于zhfarx庫,你可以在附件中下載。關于這個庫的詳細介紹請大家看我下一期的文章)。下面是引用zhfarx庫后加入圓的代碼:
using system;
using autodesk.autocad.databaseservices;
using autodesk.autocad.runtime;
using autodesk.autocad.geometry;
using autodesk.autocad.applicationservices;
using autodesk.autocad.editorinput;
using dbtransman=autodesk.autocad.databaseservices.transactionmanager;
using zhfarx;//這是引用的zhfarx庫
namespace example
{
public class class1
{
[commandmethod("test")]
public void test()
{
point3d center=new point3d(100,100,0);
double radius=50;
//circles是zhfarx庫中對應于circle類的類
circles circle=new circles(center,radius);
//entities是zhfarx庫中用來向autocad中加入圖形的一個類
entities.addentity(circle);
}
}
}
呵呵,是不是簡單了許多。
下面的代碼是根據用戶在命令行中的選擇來改變圓的顏色。
//editor代表autocad命令行
editor ed=entities.editor;
// promptkeywordoptions定義一個關鍵字列表選項
promptkeywordoptions opt=
new promptkeywordoptions("選擇顏色[綠色(g)/藍色(b)]<紅色(r)>");
//加入關鍵字列表
opt.keywords.add("r");
opt.keywords.add("g");
opt.keywords.add("b");
//獲取用戶輸入的關鍵字
promptresult result=ed.getkeywords(opt);
//判斷是否輸入了定義的關鍵字
if (result.status==promptstatus.ok)
{
//根據用戶選擇的關鍵字,來改變圓的顏色
switch(result.stringresult) {
case "r":
// putcolorindex是zhfarx庫中改變對象顏色的函數
entities.putcolorindex(circle,1);
break;
case "g":
entities.putcolorindex(circle,3);
break;
case "b":
entities.putcolorindex(circle,5);
break;
}
}
編譯這個程序,生成example.dll文件,這就是你編寫的.net程序。
完整的源程序放在附件中。
4.打開autocad,在命令行中輸入netload命令。在彈出的對話框中選擇剛才生成的example.dll。接下來請在命令行中輸入在程序中定義的命令的名字test,好了應該可以看到一個圓了。這時命令行中出現選擇顏色[綠色(g)/藍色(b)]<紅色(r)>[r/g/b] 的提示,你可以鍵入r,則圓變為紅色;鍵入g,圓變為綠色;鍵入b,圓變為藍色。
好了,今天就介紹到這里。