CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

AutoCAD 2019 开发者帮助

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

2024-5-18 17:57| 发布者: admin| 查看: 9| 评论: 0|原作者: admin|来自: AutoCAD

在 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);
}

路过

雷人

握手

鲜花

鸡蛋

最新评论

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

GMT+8, 2024-6-27 15:54

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部