.NET 开发AutoCAD2006指南(二)

本文是.NET开发AutoCAD2006指南的第二篇,介绍了AutoCAD数据库概念及.NET与C++操作差异。重点讲解了ZHFARX库,包括其主要类Tools的属性和函数,以及对AutoCAD实体类的改写,该库可简化操作,方便创建和修改实体属性。

.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++一样使用相应的OpenClose函数来进行打开和关闭的操作,但ObjectARX托管封装类已把这两个函数标记成了过时的函数,也就是说不建议用户使用它们)。

       有一点要大家注意的是,对象没有被加入到AutoCAD数据库之前,你可以对它进行直接的操作(如改变颜色,移动,设置实体的几何属性等)。但一旦对象被加入到AutoCAD数据库中,你就必须使用事务处理来打开它然后进行相应的操作。比如说,你在AutoCAD中加入了上面的直线,而你想改变这条直线的颜色,你不能直接调用直线的ColorColorIndex属性来进行设置,你必须首先用事务处理的GetObject()函数打开这个直线对象,然后你才能调用ColorColorIndex属性来对直线设置颜色。

       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),第一个参数为对象的实例,第二个参数则是要设置的值。

第二种形式为PutColorObjectId id,Color color),第一个参数为对象实例的Id,第二个参数则是要设置的值。

获取通用属性的函数都以Get开头再加上对应的通用属性名,如获取对象颜色的函数为GetColor。也有两种形式,下面以获取颜色的函数为例来进行说明。

第一种形式为GetColor(Entity ent),输入参数为对象的实例。

第二种形式为GetColorObjectId 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实体的函数,也就是构造函数,通常只有一种形式,如圆只能通过圆心、半径还有一个基本上不需要使用的法向量来创建。而我们知道在AutoCAD中有许多种创建圆的方式,如通过三点、通过二点的直径来创建圆。在ZHFARX库的Circles类中就包含了这些创建圆的构造函数。下面的例子说明了通过三点来创建一个圆:

Circles circle=new Circles(pt1,pt2,pt3);

关于这些构造函数的说明,大家可以参考附件中的帮助文档,里面有详细的说明。

通过前面的介绍,你已经知道加入到数据库中的实体是不能直接访问的,而这些改写的类就可以。下面就以两段代码作比较来说明(以圆为例),首先来看一般的实体类:

Circle circle=new Circle (center,normal,radius);

circle.Radius=1;//由于圆还没有加入到数据库中,改变圆的半径属性是允许的

Tools.AddEntity(circle);//利用ZHFARX库的简化函数把圆加入到数据库中

circle. Radius =2;

//这句是错误的,因为圆已经加入到数据库中,你必须首先打开它,然后再进行相关

//的操作,不能这样直接访问圆

 

下面是改写类的代码:

       Circles circle =new Circles (center, radius);//呵呵,连构造函数也比上面的简单了

       circle. Radius =1;//在圆没有加入到数据库之前,改变圆的半径属性

       Tools.AddEntity(circle);//利用ZHFARX库的简化函数把圆加入到数据库中

       circle. Radius =2;// 圆虽然已加入到数据库中,但你仍然可以直接修改它的属性

还有一点大家要注意的是,对于诸如颜色、层等的通用属性,请使用Tools类的Get类和Put类函数(关于这些函数,请大家参考前面的内容),这些函数对于一般类和改写类都是适用的。  

最新版本的ZHFARX库(版本1.1)

ZHFARX库函数的说明文档

AutoCAD .net开发人员手册中文版 文档介绍: 当前版本为20101128版,为第一个CHM版本,如需更新版本,请及时关注http://www.01vb.com,也可以查看CHM文件中的前言部分的版本通知。 因本版本制作仓促,还有如下不完善的内容。 1、还有一章内容没有翻译完成; 2、目录部分和索引部分还是英文版本,但具体页面中全部是中英文对照(有些在提示中有些在翻译上面)。 本《AutoCAD .NET 开发人员手册》由01VB编程站翻译并提供,版权所有,原英文版本版权归原版权所有者所有。本手册为免费版本,可在网上随意发送,但必须注明出处(01VB编程站及网站链接http://www.01vb.com)及翻译者。 序言 自从 AutoCAD 支持使用 .NET 开发以来,所有关于 .NET 的官方开发资料全部是英文版本,给国内开发者的学习带来了一定的阻碍,为了给广大 .NET 爱好者提供更多方便,于是决定翻译一部分资料。 因本人英文水平及CAD开发水平有限,翻译的资料中也许有表达不清楚的地方,请大家谅解,也可以在资料底部找到留言的链接,给我留言或直接点击QQ联系我。 01VB编程站是一个非营利性的网站,但是,网站要生存,必须有经济来源。因此,本人在本手册中的投放了广告,但是,广告都是在正文内容的底部,不影响阅读。原则上我不鼓励大家点击上面的广告,除非真的对广告内容感兴趣。因广告给您带来的不便,还望谅解。 最近一段时间,老婆一直生病,始终没有痊愈,在此,我希望老婆能快点儿好起来, 并想对她说一句:老婆,别哭,好好养病,病痛在你身,也疼在我心。你累了,我会背你;钱花光了,我会去挣,身体是第一位的。如果你也想给我老婆送上祝福,请留言,谢谢!(2010.11.24) 翻译历史 2010年8月中旬 开始,期间由于本人生病,中断了几天,还有部分内容没有翻译完成,仍然在翻译中。 11.6 更新《图层状态管理器的使用》部分。 11.07 更新《文字样式》部分 11.08 更新完《创建和编辑AutoCAD图元》这章。 11.11 更新 《标注的概念》 部分 11.12 更新《创建标注》部分 11.15 更新完 《创建引线和注释》 部分 11.20 更新完《形位公差》 部分 11.24 更新到 《在三维空间中编辑 》 11.28 修正手册中的脚本错误,进行CHM格式文档的制作并在01VB编程站首发。 感谢 《AutoCAD .NET 开发人员手册》的翻译过程得到 明经通道 网站 "明经 AutoCAD.NetApi 群"中许多网友的帮助,像 MCCAD、雪山飞狐、Still等等,另外还有其它人记不清楚了,因为太多太多,总之两个字,谢谢。 版权 本开发人员手册版权属01VB编程站网站所有。 翻译者:黄明新(平凡)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值