利用AutoCAD 2005.NET API进行AutoCAD的二次开发(一)
--直线
大家好!从今天开始我向大家介绍如何利用AutoCAD 2005.NET API进行AutoCAD的二次开发。由于我只学过C#,因此在所讲的例子中一律使用C#。至于广大的vb.net程序员,我想编程的原理是一样的,并且因为vb.net和C#都属于.net语言,因此熟悉vb.net的朋友对理解C#程序是没有太大问题的(呵呵,如果有哪位愿意把相关的C#程序翻译成Vb.net程序,那就更好了)。
由于AutoCAD 2005.NET API是比较新的东西,我几乎没有找到比较系统的教程或参考,因此我会使用明经通道出版的《AutoCAD VBA 开发精彩实例教程》的实例来进行讲解。
好了,闲话少说,让我们直接进入 AutoCAD 2005.NET API的世界。
一、准备工作
这指的是如何添加相关的引用和命名空间。用AutoCAD 2005.NET API进行AutoCAD的二次开发,必须添加的引用是acdbmgd.dll和acmgd.dll,这可以在AutoCAD2005的安装目录下找到。还必须添加的是在visual studio.net的添加引用时在com选项下选择“AutoCAD 2005类型库”和“AutoCAD/ObjectDBX Common 16.0类型库”这两项。
然后在程序的开头加入以下命名空间:
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using DBTransMan=Autodesk.AutoCAD.DatabaseServices.TransactionManager;
using Autodesk.AutoCAD.Interop;
using Autodesk.AutoCAD.Interop.Common;
这些命名空间是要在每一个程序中都要加入的。
二、第一个实例--创建直线
(1)在visual studio.net 中,新建一个类库工程,然后添加相关的引用及在程序的开头加入有关的命名空间(请参见一)。
(2)创建基准函数(AddLine)。基准函数就是与系统提供的方法一致的函数。其实现的步骤如下:
l 在程序文件中加入以下私有字段:
private Database db; //代表AutoCAD数据库对象
private DBTransMan tm; //代表AutoCAD事务处理管理器
private Transaction myT;// 代表AutoCAD事务处理
BlockTable bt; //代表AutoCAD块表
BlockTableRecord btr;// 代表AutoCAD块表记录对象
l 在类的构造函数部分加入以下代码:
db = HostApplicationServices.WorkingDatabase;//取得当前运行的AutoCAD的数据库对象
tm = db.TransactionManager;// 定义一事务处理管理器
l 主程序AddLine
public Line AddLine(Point3d pt1, Point3d pt2)
{
Line line;//声明一直线对象
try
{
Initialize();//相关的初始化工作,是一自定义函数
line = new Line(pt1, pt2);//给line对象赋于具体的值
btr.AppendEntity(line);
tm.AddNewlyCreatedDBObject(line, true);//在AutoCAD中加入创建的直线
myT.Commit();//提交事务处理
}
finally
{
DisposeAll();//有关的清理工作,是一自定义函数
}
return line;
}
上面程序中的Initialize函数如下:
public void Initialize()
{
myT = tm.StartTransaction();//开启事务处理
bt = (BlockTable)tm.GetObject(db.BlockTableId, OpenMode.ForRead, false); //获取AutoCAD块表对象
btr = (BlockTableRecord)tm.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false); //获取AutoCAD块表记录对象
}
DisposeAll函数如下:
public void DisposeAll()
{
bt.Close();//关闭块表
btr.Close();//关闭块表记录
myT.Dispose();//销毁事务处理
}
如果大家对上面的东西不是很清楚的话,也没有关系,因为你只要知道这是前期的准备工作,以后只要调用相关的函数就可以了。 |