查看原文
其他

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

王双炎 GIS前沿 2022-03-16


接上两篇:

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



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

 

图元信息


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


Polyline2d中Vertex对象

 

Entity类中部分对象


Entity类部分属性


Entity类部分方法




在上节课程中学到向CAD中添加一条线段;在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 -


让你精通CASS软件的教程免费下载
ArcGIS Web 开发技术讲解
在ArcGIS中的Python开发技术面面观——以数据处理为例
Python学的好,数据处理快又好!ArcPy入门到精通(手册可下载)
Think LiDAR in Python


戳原文,更有料!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存