AutoCAD开发选择----ObjectARX仍是.net API(转载)

本文基于AutoCAD 2006新推出的.NET API为工具,介绍了在.NET平台下对AutoCAD进行二次开发的技术,并与目前经常使用的VBA、ObjectARX做了对比。同时讨论了如何弥补.NET API某些不足的功能。
    
       当前AutoCAD的二次开发工具主要有:VisualLisp、VBA和ObjectARX等。其中,VisualLisp与VBA较为简单,特别是 VBA,使用方便且开发速度较快,但其功能相比ObjectARX有所不足,尤为是对面向对象的功能支持很差。而ObjectARX基于VC平台,在C++的支持下,其功能很是强大,能够很好地运用各类面向对象技术,但其缺点是发开速度比较慢,同时对开发人员的能力要求较高。
        .NET是微软新推出的开发平台,具备众多优势。基于.NET平台对AutoCAD进行二次开发,可充分利用.NET的各类优点,在保证功能强大的前提下大大提升开发速度。程序员

1、基于.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");
}
2、结论
    本文以C#为例,对基于.NET API的AutoCAD二次开发做了较详细的介绍。.NET API在具备ObjectARX强大功能的同时具备VBA使用方便易用的优势,同时具备C++的强大功能,是较为理想的开发工具。但目前.NET API在某些方面还有些不足,但随着其版本的更新、完善,定会成为众多开发人员的首选工具。编程

 

 

说明:.NET API又是怎么工做的呢?咱们都知道ACAD的功能实际上是经过ObjectARX来实现的,因此.NET API其实就经过VC++和C++/CLI(原来的VC++.NET)混合编程把ARX功能包装一下以.NET类的形式展现出来。也就是说使用.NET API其实使用的是ARX,而.NET API能实现多少功能就取决于包装的程度,也就是包装了多少ARX的功能。了解ARX的朋友都知道,使用ARX库,因为C++语言的特色,咱们常常须要派生ARX类。但使用.NET就没必要了,咱们常常只需对对应的event来个delegate就好了,相比而言简洁得一塌糊涂(好比:Autodesk.AutoCAD.ApplicationServices.Application.BeginQuit等event)。根据前边对自定义对象的描述,如今就清楚了,.NET API除了部分自定义对象功能外,基本能代替ARX。app

相关文章
相关标签/搜索