在上一节中介绍了层表的使用过程, 其他符号表处理方式类似,不同的符号表具有不同的对象,具体的操作,查看API。
1. 对象的操作和理解
访问图形数据库中对象的特性,必须在该对象被打开(创建对象时也会被打开)的状态下,用对象的指针进行访问,并且在访问结束后要及时关闭该对象,不然会引起AutoCAD的错误终止。
在创建完对象后图形数据库会给对象一个ID号,可以根据这个ID号从数据库中获取指向对象的指针,就可以修改或者查询改对象的特性。
例如,AcDbBlockTableRecord类的appendAcDbEntity函数能够将一个实体添加到图形数据库中,并分配给实体一个ID; 全局函数AcDbOpenAcDbEntity用于从实体ID号获取图形数据库中实体的指针,其定义为:
Acad::ErrorStatus acdbOpenAcDbEntity(AcDbEntity*& pEnt,AcDbObjectID id,AcDb::OpenMode mode,bool openErasedEntity = false);
ObjectARX提供了另外两个全局函数acdbOpenAcDbObject和acdbOpenObject
acdbOpenAcDbEntity: 适用于打开继承于AcDbEntity的数据库常驻对象,这类对象一般都能显示在图形窗口中,如直线、圆。
AcDbOpenDBObject: 适用于打开位继承AcDbEntity的数据库常驻对象,这类对象不能再图形界面中显示,如 层表、线型。
AcDbOpenObject: 如果不知道要打开的对象是否继承于AcDbEntity类,可以使用这个函数。
2. 对象ID的转化
访问实体的特性必须通过对象的指针,但是你一旦获得了实体的ID、句柄或者ads_name,都能通过ID作为中介而获得实体的对象的指针,
句柄是Windows中常用的概念,在ObjectARX编程中一般指ACDBHand类,该类封装了一个64位的整形标识符。随DWG文档一起保存。
ads_name 则是在ADS编程中出现的一个概念,其实际上就是一个二维数组,数组的元素类型是长整形,在与用户交互的函数中还会用到。
ID: 在一个AutoCAD任务中,可能会加载多个图形数据库,但是所有对象的ID在本次任务中都是独一无二的,在不同的任务中,统一图形对象的ID可能不同。
句柄: 在一个AutoCAD任务中,不能保证每一个对象的句柄都是唯一,但是在一个图形数据库中所有对象的句柄都是唯一的,句柄随DWG图纸一起保存。
ads_name: 不稳定,仅当你在AutoCAD的一个特征图形中工作是可以使用,一旦退出AutoCAD或者切换到另一个图形,ads_name会丢失。
1>. 从ID到指针有三个函数 acdbOpenDbEntity、acdbOpenDbObject、acdbOpenObject
2>. 从对象之战到ID: 所有的数据库常驻对象都继承自AcDbObject,objectID函数能获取对象的ID。
3>. 从句柄到指针: 使用ACDBDatabase::getAcDbObjectID函数
4>. 从ID到句柄: 使用AsDbObjectId::hand函数
5>. 从指针到句柄: 使用AcDbObject::getAcDbHandle函数。
6>. 从ads_name到ID: 使用全局函数acdbGetObjectId。
7>. 从ID到ads_name: 使用全局函数acdbGetAdsName.