在上一篇文章中向大家简单讲了.NET开发AutoCAD的流程,其中介绍了我编写的一个简化程序开发的ZHFARX库。下面向大家介绍ZHFARX库中的主要函数及如何用它来编写.NET程序。关于ZHFARX库的所有函数的说明,请大家参考本章附件中的ZHFARX帮助文档。
在介绍ZHFARX库之前,让我们首先来了解一下有关的基本概念。你可以把AutoCAD看作为一个数据库,而AutoCAD中有关的东西都放在这个数据库的相关表中。例如,你用Line命令在AutoCAD的模型空间中添加了一条直线,那么AutoCAD会创建一个直线类的实例并把它加入到数据库的模型空间块表记录中。在传统的C++编写ObjectARX程序的时候,你必须首先打开当前数据库的块表(因为模型空间是在块表中的),然后打开模型空间对应的块表记录,在记录中加入直线类的实例,然后分别关闭块表和模型空间块表记录。而在.NET程序中,相应的代码编写是这样的:
Database db= Application.DocumentManager.MdiActiveDocument.Database;
//获得当前数据库
DBTransMan tm=db.TransactionManager;
//获取事务处理
using(Transaction trans=tm.StartTransaction())//开始事务处理
{
BlockTable bt=(BlockTable)tm.GetObject(db.BlockTableId,OpenMode.ForRead,false);
//打开当前数据库的块表
BlockTableRecord btr=(BlockTableRecord)tm.GetObject(bt[BlockTableRecord.ModelSpace],OpenMode.ForWrite,false);
//打开模型空间块表记录
btr.AppendEntity(ent);//在记录中加入实体
tm.AddNewlyCreatedDBObject(ent,true);//
trans.Commit();//提交事务
}
从上面的代码中可以看到,.net用事务处理代替了C++中的打开和关闭操作(当然你也可以像C++一样使用相应的Open和Close函数来进行打开和关闭的操作,但ObjectARX托管封装类已把这两个函数标记成了过时的函数,也就是说不建议用户使用它们)。
有一点要大家注意的是,对象没有被加入到AutoCAD数据库之前,你可以对它进行直接的操作(如改变颜色,移动,设置实体的几何属性等)。但一旦对象被加入到AutoCAD数据库中,你就必须使用事务处理来打开它然后进行相应的操作。比如说,你在AutoCAD中加入了上面的直线,而你想改变这条直线的颜色,你不能直接调用直线的Color或ColorIndex属性来进行设置,你必须首先用事务处理的GetObject()函数打开这个直线对象,然后你才能调用Color或ColorIndex属性来对直线设置颜色。
ZHFARX库的作用正是为了简化以上这些操作,有了它你在AutoCAD中加入对象的时候就不必再打开AutoCAD数据库的表,也可以直接对已加入到数据库中的对象进行操作,它还包括了以下这些功能:更为方便地创建AutoCAD实体的构造函数,遍历数据库表,添加组和扩展字典及其它一些常用的函数。
首先向大家介绍ZHFARX库中的Tools类。这个类是ZHFARX库的主要类,上面介绍的ZHFARX库的主要功能都是在这个库中实现的。下面介绍这个类中的主要成员(这个类的成员都是静态的):
l 属性
包括3个:Database(获取当前数据库),Editor(获取AutoCAD命令行),TransactinManager(获取事务处理管理器)。通过这三个属性,你就不要再输入诸如Application.DocumentManager.MdiActiveDocument.Database这么长的代码了,而只要简单地写为Tools.Database。
l 函数
按照函数的功能可以分为以下几类:
1. 加入对象
包括以下几个:
Ø public static ObjectId AddEntity(Entity ent);
这个函数向AutoCAD数据库加入实体类对象(如直线、圆等),下面的代码向数据库加入一条直线:
Line line;
…….
Tools.AddEntity(line);
Ø public static ObjectId AddSymbolTableRecord(SymbolTableRecord str,ObjectId symbolTableId)
这个函数向AutoCAD数据库加入符号表记录,符号表是AutoCAD数据库中的一系列表如层、线型等。函数的输入参数一个为要加入的符号表记录对象(str),另一个是符号表记录要加入的符号表的对象Id(可以通过访问数据库的属性获得,如LayerTableId属性就表示数据库的层表)。下面的代码向数据库添加一个新层:
LayerTableRecord ltr;
……
Tools.AddSymbolTableRecord(ltr,Tools.Database.LayerTableId);
Ø public static ObjectId AddDictionaryObject(string searchKey)
加入字典对象。关于字典对象的有关介绍,请看我以后写的文章。
Ø public static ObjectId AddDictionaryObject(string searchKey,DBObject newValue,ObjectId owne