.NET 开发 AutoCAD2006 指南(二)
C# 才鸟
在上一篇文章中向大家简单讲了 .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 ownerId )
加入字典类对象,如扩展对象、组等。
2. 设置或读取对象的通用属性
通用属性包括:颜色( Color ),颜色索引 (ColorIndex) ,层 (Layer) ,线型 (Linetype) ,线型比例 (LinetypeScale) ,线宽 (LineWeight) ,打印样式名 (PlotStyleName) 和可见性 (Visible) 。
设置通用属性的函数都以 Put 开头再加上对应的通用属性名,如设置对象颜色的函数为 PutColor 。设置每一种通用属性的函数都有两种形式,下面以设置颜色的函数为例来进行说明。
第一种形式为 PutColor(Entity ent,Color color) ,第一个参数为对象的实例,第二个参数则是要设置的值。
第二种形式为 PutColor ( ObjectId id,Color color ),第一个参数为对象实例的 Id ,第二个参数则是要设置的值。
获取通用属性的函数都以 Get 开头再加上对应的通用属性名,如获取对象颜色的函数为 GetColor 。也有两种形式,下面以获取颜色的函数为例来进行说明。
第一种形式为 GetColor(Entity ent) ,输入参数为对象的实例。
第二种形式为 GetColor ( ObjectId id ),输入参数为对象实例的 Id 。
3. 变换操作
令人非常不解的是在 ObjectARX 托管封装类中,实体类 (Entity) 没有诸如旋转、平移、缩放之类的函数,你只能通过实体类的 TransformBy() 函数来实现这些变化操作。而 TransformBy() 函数由于要使用到一个矩阵参数,用起来不是很方便。在 ZHFARX 库中,已经给大家重新编写了用于变换操作的函数,你可以使用它们来方便地进行相关的变换操作。变换操作函数有两种形式,区别是第一个输入函数可以是实体对象的实例,也可以是实体对象的 Id ,在下面的介绍中我只介绍输入参数是实体对象的实例的那一种,对于另一种形式,你只要把相应的输入参数改成实体对象的 Id 就可以了。变换操作函数如下:
Ø public static void Move ( Entity ent , Point3d fromPoint , Point3d toPoint )
把实体 ent 从点 fromPoint 移动到点 toPoint
Ø public static void Rotate ( Entity ent , Point3d basePoint , double rotationAngle )
以点 basePoint 为基准点,把实体 ent 旋转 rotationAngle 角度(为弧度值)。
Ø public static void Scale ( Entity ent , Point3d basePoint , double scaleFactor )
以点 basePoint 为基准点,把实体 ent 缩放 scaleFactor 倍 (>1 为放大, <1 为缩小 ) 。
Ø public static ObjectId Mirror ( Entity ent , Point3d mirrorPoint1 , Point3d mirrorPoint2 , bool eraseSourceObject )
对实体 ent 以由点 mirrorPoint1 和点 mirrorPoint2 组成的直线线进行镜像拷贝,参数 eraseSourceObject 表示是否删除源对象。
4. 其它一些常用的操作函数
Ø public static ObjectId Copy ( Entity ent )
对实体 ent 进行复制,还有一个重载函数,输入参数为实体的 Id 。
Ø public static void Erase ( Entity ent )
删除实体 ent ,还有一个重载函数,输入参数为实体的 Id 。
Ø public static Entity GetEntity ( ObjectId id )
通过对象 Id 来获得实体对象(而获得实体的对象 Id ,你只要访问它的 ObjectId 属性就可以了)。
Ø public static DBObject GetDBObject ( ObjectId id )
通过对象 Id 来获得非实体类对象。
Ø public static DBObjectCollection GetIteratorForSymbolTable ( ObjectId id )
获取用于遍历符号表(由 id 表示)的遍历器(对象集合)。
Ø public static ObjectIdCollection GetIteratorForSymbolTableID ( ObjectId id )
获取用于遍历符号表(由 id 表示)的遍历器(对象 Id 集合)。
Ø public static Point3d GetMidPoint ( Point3d pt1 , Point3d pt2 )
获取两点表示的线段的中点。(呵呵,本来还想写诸如求交点、判断是否平行、垂直等的数学函数,但 ObjectARX 托管封装类都有相关的函数,就没有写)。
终于介绍完了 Tools 类的成员,再来介绍 ZHFARX 库中其它的类。 Tools 类外的其它类都是一些对 AutoCAD 实体类如直线、圆等的改写,以方便 .NET 程序的编写。到目前的 ZHFARX 版本为止,我改写的实体类有:直线 (Line) ,圆 (Circle) ,圆弧 (Arc) ,椭圆 (Ellipse) ,多段线 (Polylines ,这个多段线是二维的,也就轻量多段线 ) ,单行文本 (DBText ,请大家注意,在 ObjectARX 托管封装类中单行文本所在的类不是 Text ,而是 DBText) ,多行文本( MText ),表格 (Table) ,填充 (Hatch) ,各种标注 ( 包括对齐标注 AlignedDimension 、直径标注 DiametricDimension 、角度标注 LineAngularDimension2 、半径标注 RadialDimension 和旋转标注 RotatedDimension) 。改写的实体类都是由这些实体类派生的,实体类的所有函数和属性改写类都可以使用。改写类的名字为实体类原名后加上 s ,如改写的直线类就是 Lines ,而改写的圆类就是 Circles 。你可能要说了,改写这些类有什么用?呵呵,答案有两个。一个是为了方便创建实体,另外一个就是你可以方便地修改实体的属性,不管它有没有加入到数据库中。 ObjectARX 的托管封装类中创建 AutoCAD </spa