在 wblockClone() 期间处理对 AcDbEntities 的硬引用:案例 1
如果引用实体和被引用实体始终存在于同一个实体中,则被覆盖的实体转发它收到的值以调用被引用实体的 .这利用了所有三种形式的 WBLOCK 的默认行为,如上一节所述。我们不需要关心正在发生哪种类型的 WBLOCK。AcDbBlockTableRecordwblock()isPrimarywblock() 在这种情况下,有两种方法可以覆盖 wblock clone 的默认行为。首先,您可以覆盖引用实体的整个内容。在默认实现的示例代码中(在上一节中),你将看到一个循环。在此循环中,您必须截获引用对象的 ID,并将值从更改为与传入的值相同。wblockClone() wblockClone() getNextHardObject()isPrimaryAdesk::kFalseisPrimary 但是,执行此操作的更简单的方法是继续对自定义实体使用默认值,但当默认设置不正确时,请先使用正确的设置克隆引用的实体。克隆引用的实体后,当您调用自己的实体时,它将看到引用的实体已被克隆,并且不会尝试使用默认设置克隆它。下面的示例演示了这一点。数据成员 是引用 。wblockClone()isPrimarywblockClone()mRefEntAcDbHardPointerId Acad::ErrorStatus
AsdkEntity::wblockClone(AcRxObject* pOwner,
AcDbObject*& pClone,
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary) const
{
// If isPrimary is kTrue, then override the default cloning
// within our own cloning, which would set it to kFalse,
// by cloning our referenced entity first.
//
if (isPrimary) {
Acad::ErrorStatus es;
AcDbEntity* pEnt;
es = acdbOpenAcDbEntity(pEnt, mRefEnt, AcDb::kForRead);
if (es != Acad::eOk)
return es;
// Use the same owner, and pass in the same isPrimary
// value.
//
AcDbObject* pSubClone = NULL;
es = pEnt->wblockClone(pOwner, pSubClone, idMap, kTrue);
if (pSubClone != NULL)
pSubClone->close();
pEnt->close();
if (es != Acad::eOk)
return es;
}
// Now we can clone ourselves by calling our parent's method.
//
return AcDbEntity::wblockClone(pOwner, pClone, idMap,
isPrimary);
}
|
|Archiver|CAD开发者社区
( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-10-24 07:54
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.