日期:2013-08-25  浏览次数:20430 次

时下流行的开发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; 
            &n