天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 61|回复: 0

ObjectARX中对象句柄、ID和指针的关系

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
一、AcDbObject对象对象的访问方式
在ObjectARX中,每个AcDbObject对象可以通过三种方式进行访问:

通过其句柄
通过其ID
通过其C++实例指针
当AutoCAD没有运行,图纸保存在文件系统中时,可以通过句柄来标识DWG文件中的对象;当图纸打开以后,图纸信息可通过AcDbDatabase对象进行访问。每一个数据库中的对象拥有一个ID,其生存期持续于AcDbDatabase对象创建和删除之间的时期。打开函数(例如acdbOpenObject()函数)根据对象的ID打开对象,并返回对象的指针。当对象关闭后,这个指针随即失效。
上述关系如下图所示。


二、ID→句柄的转换
法1:AcDbDatabase::getAcDbObjectId(),根据对象ID值获取其句柄。

Acad::ErrorStatus getAcDbObjectId(
        AcDbObjectId& retId,
        bool createIfNotFound,
    const AcDbHandle& objHandle,
    Adesk::UInt32 xRefId = 0
);

法2:打开一个对象后通过getAcDbHandle()方法获取句柄

AcDbObject* pObject;
AcDbHandle handle;
pObject->getAcDbHandle(handle);
1
2
3
请注意:打开对象以后,请尽快关闭。可以使用AcDbObject::close() 函数去关闭一个数据库对象。

三、对象ads_name→对象ID→对象指针
ads_name和AcDbObjectId是等价的。AcDb库提供了两个标准函数来实现AcDbObjectId和ads_name的转换。

// Returns an ads_name for a given object ID.
// 根据指定ID返回其ads_name
acdbGetAdsName(ads_name& objName, AcDbObjectId objId);

// Returns an object ID for a given ads_name.
// 根据指定ads_name返回其ID
acdbGetObjectId(AcDbObjectId& objId, ads_name objName);

通常,你是通过选择集获取对象,而选择集返回的是对象的ads_name。此时,你需要将ads_name转换为ID值,然后利用acdbOpenObject 全局函数打开对象。
以下函数描述了这个过程

AcDbEntity*
selectEntity(AcDbObjectId& eId, AcDb::OpenMode openMode)
{
ads_name en;
ads_point pt;
acedEntSel("\nSelect an entity: ", en, pt);

// Exchange the ads_name for an object ID.
// 更换ads_name为ID值
acdbGetObjectId(eId, en);

AcDbEntity * pEnt;
acdbOpenObject(pEnt, eId, openMode);

return pEnt;
}



四、对象打开模式说明
acdbOpenObject可以三种模式打开对象,分别为:

kForRead:如果对象没有用kForWrite或者kForNotify方式打开,该模式可以被打开为读模式,且最多可以被256个读者读取。
kForWrite:如果对象没有被打开,则该模式可将对象打开为写模式。
kForNotify:当对象关闭、打开为读模式、打开为写模式时,该模式均可以打开为通知模式。程序中极少需要将一个对象打开为通知模式。
以下表格描述了当对象打开后,再次以不同模式打开时返回的错误代码。

已经打开为        再次打开为        再次打开为        再次打开为
kForRead        kForWrite        kForNotify
openedForRead        eAtMaxReaders (if readCount = 256; otherwise succeeds)        eWasOpenForRead        (Succeeds)
openedForWrite        eWasOpenForWrite        eWasOpenForWrite        (Succeeds)
openedForNotify        eWasOpenForNotify        eWasOpenForNotify        eWasOpenForNotify
wasNotifying        (Succeeds)        eWasNotifying        eWasNotifying
Undo        eWasOpenForUndo        eWasOpenForUndo        (Succeeds)
当你试图用写模式打开一个对象时,函数返回错误提示“eWasOpenForRead”,你可以用upgradeOpen() 升级原对象的读模式为写模式(如果对象只有一个读取者)。当写完对象以后,调用downgradeOpen()函数将对象打开模式降级为读模式。相似的,如果对象已经以通知模式打开,但你想升级为写模式,可以调用函数upgradeFromNotify()进行升级;当使用完毕后,调用downgradeToNotify()去降级为通知模式。
[code] https://blog.csdn.net/mary288267/article/details/120324434[/code]

 

 

 

 

ObjectARX中对象句柄、ID和指针的关系
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 11:40 , Processed in 0.132472 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表