C# 才鸟( Email:[email protected] )
时下流行的开发 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)
<p class="MsoNormal" style="MAR