(1)打开和关闭图形数据库的对象
访问图形数据库中对象的特性,必须在该对象被打开(对象创建时也会被打开)的状态下,用对象的指针进行访问,并且在访问结束后要及时关闭该对象,不然就会引起AutoCAD的错误终止。
创建一个对象,必须在创建之后关闭该对象,那么如何在某个时候再访问该对象﹖这就要用到AcDbObjectId,也就是对象的ID号。在创建对象时,可以将图形数据库分配给该对象的ID保存起来,在需要访问该对象时,根据这个ID从数据库中获得指向该对象的指针,就可以修改或者查询该对象的特性。
AcDbBlockTableRecord类的appendAcDbEntity 函数能够将一个实体添加到图形数据库中,并且返回分配给该实体的ID,这个函数上一节已经介绍过;全局函数acdbOpenAcDbEntity用于从实体的ID号获得指向图形数据库中实体的指针,其定义为:
Acad:ErrorStatus acdbOpenAcDbEntity(
AcDbEntity*& pEnt,
AcDbObjectld id,
AcDb::OpenMode mode,
bool openErasedEntity = false);
/*第一个参数返回指向图形数据库实体的指针;
第二个参数输入了要获得的实体的ID号;
第三个参数指定了打开该实体的方式,如果仅是查询该实体的特性用“读”模式打开即可,要修改实体的特性就必须用“写”模式打开;
第四个参数指定是否允许访问一个已经被删除的实体。*/
ObjectARX提供了另外两个全局函数 acdbOpenAcDbObject和 acdbOpenObject 来实现类似的功能,这三个函数的区别在与适用范围:
acdbOpenAcDbEntity:
//适用于打开继承于 AcDbEntity 的数据库常驻对象,这类对象
//一般都能在图形窗口中显示,如直线、圆等。
acdbOpenAcDbObject:
//适用于打开未继承于 AcDbEntity 的数据库常驻对象,这类对
//象不能在图形窗口中显示,如层表、线型表等。
acdbOpenObject:
//如果不知道要打开的对象是否继承于AcDbEntity类,可以使用这个函数。
打开某个对象之后,使用 close 函数就可以将其关闭。
(2)ID ( AcDbObjectld ) 、指针、句柄( Handle )和ads_name
访问实体的特性必须通过对象指针,但是一旦你获得了实体的ID、句柄或者ads_name,
都能通过ID作中介而获得对象的指针。其中ID是一个桥梁。
ID、句柄和
ads_name
具有各自的特点:
ID
:在一个
AutoCAD
任务中,可能会加载多个图形数据库,但是所有对象的
ID
在
本次任务中都是独一无二的。在不同的
AutoCAD
任务中,同一个图形对象的
ID
可
能不同。
句柄:在一个
AutoCAD
任务中,不能保证每个对象的句柄都唯一,但是在一个图
形数据库中所有对象的句柄都是唯一的。句柄随
DWG
图形一起保存,在两次任务
期间同一对象的句柄是相同的。
ads_name
:是不稳定的,仅当你在
AutoCAD
的一个特定图形中工作时可以使用,
一旦退出
AutoCAD
或者切换到另一个图形,
ads_name 就会丢失。
具体来说,ID
、指针、句柄和
ads_name
之间具有下面的转换关系(不完全归纳,不常
用的转换并未提及):
从 ID 到对象指针:通过打开数据库对象的三个函数 acdbOpenAcDbEntity、 acdbOpenAcDbObject 和 acdbOpenObject 中的任何一个。
从对象指针到 ID:所有的数据库常驻对象都继承自 AcDbObject,而 AcDbObject 类 包含的 objectId 函数能获得所指向对象的 ID。
从句柄到 ID:使用 AcDbDatabase::getAcDbObjectId 函数。
从 ID 到句柄:使用 AcDbObjectId::handle 函数。
从指针到句柄:使用 AcDbObject::getAcDbHandle 函数。
从 ads_name 到 ID:使用全局函数 acdbGetObjectId。
从 ID 到 ads_name:使用全局函数 acdbGetAdsName。