天天看点

C#语言对CAD二次开发(三)

C#语言对CAD二次开发(三)

接上两篇:

C#程序对AutoCAD二次开发(一)

C#语言对AutoCAD二次开发(二)

在本章内容中主要来讲解一下CAD中实体。认识实体的类型、实体的属性和实体的方法,以及如何使用实体标识和事务处理,并把向图面添加实体写成一个函数,用于后期开发进行调用。在CAD图形中所有的图元对象都可以称之为实体(Entity),是所有可见对象基类,可见对象都继承Entity的属性和方法。使用lisp语言的entget方法即可获取图元信息。

C#语言对CAD二次开发(三)

实体是具有图形特征的数据库对象,实体的对象包含直线、圆、圆弧、文本注记、曲线和椭圆。用户可以在屏幕上看到实体,也可以对实体进行编辑。在我们工作过程中常用的就是Curve类,圆、圆弧、多段线、都继承于Curve类。除少数复杂实体外,大部分实体都含有自身几何图形所有的信息;少数复杂实体则包含其他对象,这些对象保存着实体的几何信息,比如Polyline2d含有Vertex对象。常见的比如南方Cass界址线属性,每条界址线的属性保存在宗地线的节点上。

C#语言对CAD二次开发(三)
C#语言对CAD二次开发(三)

Entity类部分属性

C#语言对CAD二次开发(三)

Entity类部分方法

C#语言对CAD二次开发(三)

在上节课程中学到向CAD中添加一条线段;在CAD开发中我们经常会用到向图面添加实体,下面把向CAD中添加实体重写一个方法。方法又称之为函数,主要的作用是将一堆代码进行重用的一种机制,避免太多的冗余的代码,还有方便后期维护。

C#语言对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 对象。