C#语言对CAD二次开发(三)
接上两篇:
C#语言对AutoCAD二次开发(二)
在本章内容中主要来讲解一下CAD中实体。认识实体的类型、实体的属性和实体的方法,以及如何使用实体标识和事务处理,并把向图面添加实体写成一个函数,用于后期开发进行调用。在CAD图形中所有的图元对象都可以称之为实体(Entity),是所有可见对象基类,可见对象都继承Entity的属性和方法。使用lisp语言的entget方法即可获取图元信息。
图元信息
实体是具有图形特征的数据库对象,实体的对象包含直线、圆、圆弧、文本注记、曲线和椭圆。用户可以在屏幕上看到实体,也可以对实体进行编辑。在我们工作过程中常用的就是Curve类,圆、圆弧、多段线、都继承于Curve类。除少数复杂实体外,大部分实体都含有自身几何图形所有的信息;少数复杂实体则包含其他对象,这些对象保存着实体的几何信息,比如Polyline2d含有Vertex对象。常见的比如南方Cass界址线属性,每条界址线的属性保存在宗地线的节点上。
Polyline2d中Vertex对象
Entity类中部分对象
在上节课程中学到向CAD中添加一条线段;在CAD开发中我们经常会用到向图面添加实体,下面把向CAD中添加实体重写一个方法。方法又称之为函数,主要的作用是将一堆代码进行重用的一种机制,避免太多的冗余的代码,还有方便后期维护。
向图形中添加实体函数
句柄(Handle)
DWG文件中的每一个实体都有一个唯一的标识符,称为句柄,用Autodesk.AutoCAD.DatabaseServices 命名空间的Handle类表示。实体的句柄可以随DWG文件保存,所以即使DWG 文件没有被AutoCAD 打开,也可以根据句柄搜索DWG 文件获取对象信息。句柄的唯一性仅限于其所在的DWG文件中,可以通过数据库对象DBObject的Handle属性返回数据库对象对应的句柄。
ObjectId
当DWG图形被打开后,数据库中的实体对象都会在内存中对应一个唯一的对象ID,用Autodesk.AutoCAD.DatabaseServices 命名空间的ObjectId类表示,对象ID也是与实体对象相关联的唯一的标识符, 与句柄不同,对象ID仅存在于其所在的数据库从内存中产生到数据库被删除之间,并且如果操作多个数据库,对象ID 在多个数据库之间都是唯一的,可以通过数据库对象DBObject 的ObjectId属性返回数据库对象对应的ObjectId。通过ObjectId 我们可以通过事务的GetObject方法将对象打开。
事务用来将对多个对象的多个操作打包成单个操作组,以便于提交或回滚。事务通过事务管理器启动和管理。启动事务之后,我们就可以用GetObject()方法打开对象。当我们操作用GetObject函数打开的对象时,事务管理器TransactionManager会跟踪对该对象的修改。创建及添加到数据库的任何新对象也应同时调用AddNewlyCreatedDBObject()方法将其添加到事务。对象编辑完并添加到数据库后,可以使用事务对象的Commit()方法保存对数据库的修改并关闭所有打开的对象。事务处理完毕后,调用Dispose()方法关闭事务。如果使用了.net语言中的Using和End Using关键字来表示事务的开始和结束,就不需要调用Dispose()方法。
如果拿到对象的ObjectId,使用GetObject()方法进行打开,打开方式有以下几种方式:
Read:以读的模式打开对象。
Write:对还没打开的对象以写的模式打开。
Notify:以通知的方式打开。
实体都是从Entity 派生的,所以当打开一个实体对象时,经常需要判断其类型才能访问相应的属性和方法,例如判断选择的一个实体是一条线还是一个圆等,因为直线和圆对应的一些属性是不一样的,例如圆有圆心,而直线没有,所以数据库对象的类型判断十分重要。可以通过对象的Object.GetType 方法获取对象的类型System.Type 对象。
- END -