英语比较烂,借着翻译帮助文档,一边学习英语,一边加强专业知识,有翻译的不妥的地方,欢迎评论区指正,谢谢各位看官赏脸
arxdev.chm帮助文档:ObjectARX库为AutoCAD 2010提供的开发指南
第一章:ObjectARX 介绍性的概念
第五节:数据库对象
本章节描述的主题涉及所有的AutoCAD数据库对象,包括实体、符号表记录和字典项;主要概念包括打开/关闭对象、管理内存中的对象、对象权限和使用扩展数据或对象的扩展字典扩展一个对象。对象的其他常见操作,还讨论了移除和文件读取问题。
本小节内容:
1.打开关闭数据库对象
2.删除对象
3.数据库对象的所有权
4.添加特定的数据到对象
5.移除对象
6.对象文件读取
7.嵌入和封装对象
(1)打开/关闭数据库对象
每个AcDbObject对象可以用三种不同的方式来用:
1.句柄
2.对象id
3.c++实例指针
当AutoCAD没有运行的时候,图像是存储在文件系统中的。DWG文件中包含的对象通过他们的句柄来标识。图像打开之后,可以通过AcDbDatabase 对象访问图像信息。每个对象在数据库中都有一个对象id,该id在当前编辑的对话框中,从创建到删除都始终存在于该对象的AcDbDatabase中。open()函数将对象ID作为参数,并返回一个指向AcDbObject对象的指针。这个指针在对象关闭之前都是有效的,如下图所示:
1.你可以使用全局函数acdbOpenObject() 打开一个对象
2.你可以使用函数getAcDbObjectId()将句柄映射到对象id
3.你也可以打开一个对象,然后获得它的句柄
AcDbObject* pObject;
AcDbHandle handle;
pObject->getAcDbHandle(handle);
注:每当打开数据库对象时,应该尽早关闭它,用AcDbObject::close()函数关闭数据库对象。
ads_name等价于AcDbObjectId。AcDb库提供了两个独立的函数,允许你在AcDbObjectId和ads_name之间进行转换:
// 通过AcDbObjectId 返回一个ads_name
acdbGetAdsName(ads_name& objName, AcDbObjectId objId);
// 通过ads_name返回一个AcDbObjectId
acdbGetObjectId(AcDbObjectId& objId, ads_name objName);
通常,你通过选择获得一个对象,然后它以ads_name形式返回,此时你需要把ads_name转换成AcDbObjectId,并打开AcDbObjectId。下面的函数演示了这个过程:
AcDbEntity*selectEntity(AcDbObjectId& eId, AcDb::OpenMode openMode)
{
ads_name en;
ads_point pt;
acedEntSel("\n请选择一个实体: ", en, pt);
acdbGetObjectId(eId, en);
AcDbEntity * pEnt;
acdbOpenObject(pEnt, eId, openMode);
return pEnt;
}
你可以在以下三种权限中打开一个对象:
1.kForRead:只要对象还没有通知以写的权限被打开,就可以被多达256个读者打开一个对象。
2.kForWrite:如果对象尚未打开,则可以打开该对象。否则,打开失败。
3.kForNotify:当对象关闭、 以读的权限打开或以写的权限打开时,可以通知打开一个对象,但当该对象已经通知被打开时则不能打开。请参见Notification (第四章:第二节:通知),它很少需要通知打开一个对象并通知发送。
下表显示了一个对象已经打开后,在尝试以不同权限打开对象时所返回的错误信息:
如果你试图以写的权限打开一个对象,然后得到一个错误eWasOpenForRead,只有一个读者时,可以使用upgradeOpen()来升级打开状态,也可以使用downgradeOpen()来降低其读取的状态。同理,如果你通知打开对象,例如,当您接收通知,您想要以写的权限打开时,您可以使用upgradeFromNotify()来升级它的打开状态。或者使用downgradeToNotify()降低其状态。
有关如何管理打开和关闭对象的复杂顺序的更多信息,请参见Transaction Manager(第四章:第四节:事务管理器)
(2)删除对象
当你创建一个用于将 AcDbObject对象添加到数据库的实例时,使用AcDbObject::new()函数。当一个对象首先被创建并且还没有被添加到数据库时,你可以删除他,然而,一旦一个对象被加到数据库,你就不能删除他;AutoCAD管理删除所有数据库内的对象。
(3)数据库对象所有者
根对象:一个由数据库隐式拥有的对象(而不是另一个数据库对象)。数据库包含10个根对象:九个符号表和命名的对象字典。所有的文件读取操作都是通过对数据库的根对象进行文件读取来开始的。看Object Filing(对象文件读取)
除了根对象外,数据库中的每个对象都必须有一个所有者,并且只能有一个所有者。数据库创建的对象像一个有层次结构的树。下面的调用将对象添加到数据库,并为其分配一个ID,但是该对象还没有所有者:
db->addAcDbObject(...);
通常,您可以使用一个成员函数AcDbBlockTableRecord::appendAcDbEntity()将对象添加到它的所有者,同时将其添加到