CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

ObjectARX 开发指南

在 wblockClone() 期间处理对 AcDbEntities 的硬引用:案例 1

2022-12-31 17:57| 发布者: admin| 查看: 305| 评论: 0|来自: AutoCAD

如果引用实体和引用实体始终存在于同一实体中,则引用实体的重写转发其收到的值就足以调用引用实体的值。这利用了所有三种形式的 WBLOCK 的默认行为,如上一节所述。我们不需要关心正在发生哪种类型的 WBLOCK。AcDbBlockTableRecordwblock()isPrimarywblock()

在这种情况下,有两种方法可以覆盖 wblock 克隆的默认行为。首先,您可以覆盖引用实体的整个内容。在 (在上一节中)的默认实现的示例代码中,您将看到一个循环。在此循环中,您必须截获引用对象的 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);
}

路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 )

GMT+8, 2024-5-19 14:35

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部