.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,圓變為藍色。 
好了,今天就介紹到這里。