.NET平臺的AutoCAD二次開發

當前AutoCAD的 二次開發工具主要有:VisualLisp、VBA和ObjectARX等。其中,VisualLisp與VBA較為簡單,特別是VBA,使用方便且開發速度較快,但其功能相比ObjectARX有所不足,尤其是對面向對象的功能支持不好。而ObjectARX基于VC平臺,在C++的支持下,其功能非常強大,可以很好地運用各種面向對象技術,但其缺點是發開速度比較慢,同時對開發人員的能力要求較高。

.NET是微軟新推出的開發平臺,具有眾多優點。基于.NET平臺對AutoCAD進行 二次開發,可充分利用.NET的各種優勢,在保證功能強大的前提下大大提高開發速度。

一、基于.NET的開發

1..NET API簡介

在新推出的AutoCAD 2006中,Autodesk為其開發增加了.NET API。.NET API提供了一系列托管的外包類(Managed Wrapper Class),使開發人員可在.NET框架下,使用任何支持.NET的語言,如VB.NET、C# 和Managed C++等對AutoCAD進行二次開發。其優點是完全面向對象,在擁有與C++相匹配的強大功能的同時,具有方便易用的特點,是較理想的AutoCAD二次開發工具。

2..NET API與傳統ObjectARX的主要區別

.NET API與傳統ObjectARX的區別主要源于在.NET環境下開發應用程序與在VC環境下開發應用程序的區別。首先,在VC環境下,程序員需要自己管理內存的申請和釋放,而.NET采用了垃圾回收機制,由.NET框架自行判斷內存回收的時機并實行回收,從而解決了令C++程序員頭痛的內存泄漏問題。也正是由于這個特點,在.NET環境下不能象在C++環境下那樣利用析構函數釋放其他的資源,需要程序員在程序中顯式地釋放。在.NET API中,主要通過Dispose來函數進行資源的釋放。

其次,ObjectARX中的各種反應器(Reactor)在.NET API中由外包類映射為各種事件(Event),可通過定義這些事件的響應函數來響應AutoCAD的各種操作。同時對于錯誤信息的處理也從函數返回值改變為通常異常來處理,使其更好地兼容.NET。由于VB.NET、C#等語言都是完全面向對象的,沒有全局函數的概念,所以.NET API將ObjectARX下的全局函數封裝為.NET API下的某些對象或對象的屬性,如ObjectARX下與用戶交互的系列全局函數被封裝為CommandLinePrompt類。

3.使用.NET API

下面以C#為例,在Microsoft Visual C# 2005 Express Edition Beta平臺上,先新建一個Class Library項目,再將AutoCAD2005安裝目錄下的acdbmgb.dll與acmgb.dll作為引用添加進項目中。這兩個文件包含了.NET API中所有的外包類。

然后在要使用.NET API的類中添加以下語句以引用.NET API的命名空間。需要添加的語句如下:

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;

這樣就可以利用.NET API進行開發了。以下代碼可在AutoCAD注冊為一個命令"AddLine",該命令可在當前工作空間中添加一條起點為(0,0,0),終點(200,200,0)的直線。代碼如下:

[CommandMethod ("AddLine")]
public static void AddLineCmd()
{
Database db = HostApplicationServices.WorkingDatabase;//獲得當前工作空間的數據庫
BlockTable bt = (BlockTable)db.BlockTableId.Open(OpenMode.ForRead); //獲得塊表
BlockTableRecord btr = (BlockTableRecord)bt[BlockTableRecord.ModelSpace].Open(OpenMode.ForWrite); //獲得模型空間的塊表記錄
Line line = new Line(new Point3d(0, 0, 0), new Point3d(200, 200, 0));//創建一條直線
try {
btr.AppendEntity(line);//將直線添加到模型空間中
line.Close();//關閉該直線
}
finally {
btr.Close();//關閉塊表記錄
bt.Close();//關閉塊表
}
}

由此可見,上述語句與在VC下的開發非常類似,其過程都是先得到數據庫,然后依次打開塊表、塊表記錄,接著添加實體,最后關閉塊表、塊表記錄。值得注意的是finally語句,無論try塊中的語句是否發生異常,finally塊中的語句都會被執行,從而確保關閉塊表和塊表記錄的操作會被執行。

寫完代碼后進行編譯,編譯完成將得到一個dll文件。在AutoCAD 2006中通過"netload"命令即可選擇該dll文件進行加載,加載成功后即可以通過"AddLine"命令執行上述代碼。遺憾的是目前的.NET API版本還不支持卸載,若要卸載只能關閉AutoCAD。

4..NET API的初始化與清除

在ObjectARX中,"acrxEntryPoint"函數是ARX程序的載入點,程序的初始化和清除均可在該函數中進行。而在.NET API中則首先需要將初始化代碼封裝在一個類中,同時該類需要壓迫實現

IExtensionApplication接口。該接口包含Initialize與Terminate兩個函數。其中Initialize負責加載程序時的初始化操作,Terminate則負責進行卸載程序時的清除操作。代碼如下:

namespace ARXExample {
public class MyARX : IExtensionApplication {
……
public void Initialize() {
//初始化操作
}
public void Terminate() {
//清除操作
}
……

}

同時,為加快加載速度,可在MyARX.cs的文件頭加入以下語句:

[assembly: ExtensionApplication (typeof (ARXExample.MyARX) ) ]
[assembly: CommandClass (typeof (ARXExample.MyARX) ) ]

這樣在加載程序時AutoCAD將直接通過MyARX中的Initialize語句進行初始化,同時注冊MyARX中的命令。否則,AutoCAD將搜索dll中所有的類以找到實現IExtensionApplication接口的類進行初始化,如找不到則不進行初始化。同樣,通過CommandClass屬性,AutoCAD也會直接到MyARX類中搜索要注冊的命令。當程序中包含的類數目較多時,通過ExtensionApplication和CommandClass這兩個屬性可顯著地加快程序的加載速度。

5..NET API與COM交互操作

在目前的.NET API中,其功能與傳統的ObjectARX相比有所不及,有相當的ObjectARX函數目前還沒有封裝到.NET API中,如GetPoint等。但可以通過COM方式使用ActiveX來彌補.NET API的不足。

增加了COM引用后,程序就可以使用許多VBA中的功能了。以AutoCAD ActiveX中的事件為例,以下代碼可以為當前工作空間中所有的圖元添加Modified事件:

Database db = HostApplicationServices.WorkingDatabase;
BlockTable bt = (BlockTable)db.BlockTableId.Open(OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)bt[BlockTableRecord.ModelSpace].Open(OpenMode.ForWrite);
try {
AcadObject obj;
//遍歷塊表記錄
foreach (ObjectId objId in btr) {
//由ObjectId得到ActiveX中的AcadObject對象
obj = (AcadObject)((AcadDatabase)db.AcadDatabase).ObjectIdToObject(objId.OldId);
//為obj添加響應Modified事件
obj.Modified += new IAcadObjectEvents_ModifiedEventHandler(obj_Modified);
}
}
finally {
btr.Close();
bt.Close();
}

其中事件響應函數obj_Modified的表示如下所示:

public static void obj_Modified(AcadObject obj) {
CommandLinePrompts.Message("object modified!" + obj.ObjectID + "\n");
}

二、結論

本文以C#為例,對基于.NET API的AutoCAD二次開發作了較詳細的介紹。.NET API在具有ObjectARX強大功能的同時具有VBA使用方便易用的優點,同時具有C++的強大功能,是較為理想的開發工具。但目前.NET API在某些方面還有些不足,但隨著其版本的更新、完善,定會成為眾多開發人員的首選工具。作者:華南理工大學 劉林 麥智暉 閻漢生
登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

1