在 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, 2024-12-15 12:44
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.