CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

AutoCAD 2024 开发者帮助

编辑器 Reactor 通知函数

2024-5-18 19:12| 发布者: admin| 查看: 155| 评论: 0|原作者: admin|来自: AutoCAD

编辑器 Reactor 通知函数

该类提供了四个通知函数,这些函数在深度克隆操作的某些点将控制权返回给应用程序。在所有深度克隆和 wblock 克隆操作期间调用以下函数:AcEditorReactor

  • beginDeepClone()
  • beginDeepCloneXlation()
  • abortDeepClone()
  • endDeepClone()

该函数在创建实例后和克隆任何对象之前调用。ID 映射将为空,但此时可以查询 AND 。beginDeepClone()AcDbIdMappingdestDb()deepCloneContext()

在克隆主选择集中的所有对象之后,在转换引用之前,将调用该函数。这是第一次可以在 ID 映射中看到克隆的整个集合。这也是克隆任何其他对象并将它们添加到 ID 映射的时候了。请记住,此时克隆的任何对象的对象 ID 都在不断变化。beginDeepCloneXlation()

该函数在 和 之间的任意时间调用。abortDeepClone()beginDeepClone()endDeepClone()

该函数在克隆和转换过程结束时调用。对象 ID 不再处于变化状态。但是,此调用并不意味着实体处于正在执行的任何命令的最终状态。通常,在克隆过程之后会转换克隆的实体或执行其他操作。还有其他回调函数可用于稍后访问实体,包括 .endDeepClone()commandEnded()

除了前面的四个函数外,wblock 克隆操作中还提供了以下通知函数:

  • wblockNotice()
  • beginWblock()
  • beginWblockObjects()
  • otherWblock()
  • abortWblock()
  • endWblock()

这些调用按深度克隆函数的顺序排列:

  1. wblockNotice()此调用在进行任何 wblock 处理之前发送。它允许应用程序调用,以便强制克隆 wblock* 操作。AcDbDatabase::forceWblockDatabaseCopy()
  2. beginDeepClone()此调用在创建目标实例后立即发送,但它处于“原始”状态,尚未准备好追加。AcDbDatabase
  3. beginWblock()新数据库现在具有其基本元素,例如句柄表、类 ID 映射以及模型空间和纸张空间块表记录。它仍然是空的。克隆尚未开始,但新数据库现在已准备好追加。
  4. otherWblock()这两个调用是背靠背进行的,可以用于相同的目的。已克隆主要对象集,但引用转换尚未开始。beginDeepCloneXlation()
  5. endDeepClone()翻译过程现已完成,但实体尚未处于最终状态。
  6. endWblock() 现在,图元已经变换,模型空间和纸张空间原点也已设置。新数据库已完成,但尚未保存。

beginWblockObjects()仅在调用并正在执行函数时发送。在克隆该数据库中的第一个对象之前,每个源数据库都会发送一次。对于 ,通知序列为:AcDbDatabase::wblockCloneObjects()wblockCloneObjects()

  1. beginDeepClone()
  2. beginWblockObjects()
  3. ...
  4. beginWblockObjects()
  5. endDeepClone

有三种类型的 .此处列出了它们及其相应的功能:AcEditorReactor::beginWblock()AcDbDatabase

WBLOCK*

virtual void
AcEditorReactor::beginWblock(
    AcDbDatabase* pTo,
    AcDbDatabase* pFrom)
 
Acad::ErrorStatus
AcDbDatabase::wblock(
    AcDbDatabase*& pOutputDatabase)

用户定义块的 WBLOCK

virtual void
AcEditorReactor::beginWblock(
    AcDbDatabase* pTo,
    AcDbDatabase* pFrom,
    AcDbObjectId blockId)
 
Acad::ErrorStatus 
AcDbDatabase::wblock(
    AcDbDatabase*& pOutputDatabase, 
    AcDbObjectId nObjId)

选择集的 WBLOCK

virtual void
AcEditorReactor::beginWblock(
    AcDbDatabase* pTo, 
    AcDbDatabase* pFrom, 
    const AcGePoint3d& insertionPoint)
 
Acad::ErrorStatus
AcDbDatabase::wblock(
    AcDbDatabase*& pOutputDatabase,
    const AcDbObjectIdArray& pIdSet,
    const AcGePoint3d& pPoint3d)

这三个版本在调用之前都克隆了模型空间和图纸空间。但是,对于这些块表记录中的实体,第一种类型和最后两种类型中的通知顺序似乎不同。在版本 1 中,模型空间中正在克隆的实体将在 .在版本二和版本三中,或选择集中的实体将在通知调用后收到其调用。AcDbBlockTableRecordbeginWblock()wblockClone()AcEditorReactor::beginWblock()AcDbBlockTableRecordwblockClone()AcEditorReactor::beginWblock()

在部分 XBIND 期间克隆的对象会在通知后立即自动重定向。这意味着它们在外部引用的数据库中被转发到宿主图形中的克隆对象,并且外部引用的数据库中的对象将被删除。引用转发的对象最终会引用宿主图形中的克隆。如果需要为对象禁用此自动重定向,请在通知期间从克隆对象的 中删除 。endDeepClone()AcDbObjectIdsAcDbObjectIdsAcDbObjectIdsidPair()idMapendDeepClone()

在 INSERT 或 INSERT* 命令期间发生以下函数调用:

  • beginInsert()
  • otherInsert()
  • abortInsert()
  • endInsert()

这些调用按深度克隆函数的顺序排列:

  1. beginInsert()这些呼叫是背靠背的,可以用于相同的目的。beginDeepClone()
  2. otherInsert()这些调用也是背靠背的,可以用于相同的目的。beginDeepCloneXlation()
  3. endDeepClone()克隆和翻译过程已经完成。这些实体是克隆的,但尚未追加到块中,因此它们不是图形的。您还不能使用选择集中的实体。
  4. endInsert()这些实体现在已转换并已附加到块中。如果这是 INSERT*,则它们现在位于模型空间中并具有图形。它们可用于选择集。但是,如果这是一个 INSERT,则它们仅附加到块表记录中;该记录尚未添加到块表中。在这种情况下,必须等到收到通知才能在选择集中使用这些实体。commandEnded()

本节中的示例代码使用通知函数。此示例演示如何编写反应器以向 WBLOCK 命令添加行为,以告知它包括新图形中的所有文本样式,而不仅仅是实体引用的文本样式。因此,它展示了如何将 wblock 与非实体一起使用。beginDeepCloneXlation()

AcDbIdMapping有一个函数 ,该函数返回调用深度克隆函数的上下文。上下文如下:deepCloneContext()

kDc复制

在数据库中复制;使用 COPY、ARRAY、MIRROR(如果不删除原始文件)、LEADER 采集或 INSERT 的副本

kDc爆炸

块引用的 EXPLODE

kDcBlock

区块创建

kDcXrefBind

外部参照绑定和 XBIND

kDcSymTableMerge

外部参照附加、解析和重新加载

kDcSaveAs

当 VISRETAIN 设置为 1 时保存(此处仅克隆符号表记录)

kDc插入

图纸的插入

kDcWblock

WBLOCK的

kDc对象

AcDbDatabase::deepCloneObjects()

调用时调用该函数。AcEditorReactor::abortDeepClone()AcDbDatabase::abortDeepClone()

以下代码使用派生自该反应器的瞬态编辑器反应器,并重写该反应器的函数。AcEditorReactorbeginDeepCloneXlation()

//  Since AcDbDatabase::wblock() only supports AcDbEntities
//  in its array of IDs, this code demonstrates how to add
//  additional objects during beginDeepCloneXlation(). If
//  it is a WBLOCK command, it asks the user if all text
//  styles should be wblocked.  Otherwise, only those text
//  styles referenced by entities being wblocked
//  will be included (wblock's default behavior).
// AsdkEdReactor is derived from AcEditorReactor.
//
void AsdkEdReactor::beginDeepCloneXlation(AcDbIdMapping& idMap,
    Acad::ErrorStatus* es)
{
    if (idMap.deepCloneContext() == AcDb::kDcWblock
        && getYorN("Wblock all Text Styles"))
    {
        AcDbDatabase *pOrigDb, *pDestDb;
        if (idMap.origDb(pOrigDb) != Acad::eOk)
            return;
        *es = idMap.destDb(pDestDb);
        if (*es != Acad::eOk)
            return;
        AcDbTextStyleTable *pTsTable;
        *es = pOrigDb->getSymbolTable(pTsTable,
            AcDb::kForRead);
        if (*es != Acad::eOk)
            return;
        AcDbTextStyleTableIterator *pTsIter;
        *es = pTsTable->newIterator(pTsIter);
        if (*es != Acad::eOk) {
            pTsTable->close();
            return;
        }
        AcDbTextStyleTableRecord *pTsRecord;
        AcDbObject *pClonedObj;
        for (; !pTsIter->done(); pTsIter->step()) {
            *es = pTsIter->getRecord(pTsRecord,
                AcDb::kForRead);
            if (*es != Acad::eOk) {
                delete pTsIter;
                pTsTable->close();
                return;
            }
            // It is not necessary to check for already cloned
            // records.  If the text style is already
            // cloned, wblockClone() will return Acad::eOk
            // and pCloneObj will be NULL.
            //
            pClonedObj = NULL;
            *es = pTsRecord->wblockClone(pDestDb,
                pClonedObj, idMap, Adesk::kFalse);
            if (*es != Acad::eOk) {
                pTsRecord->close();
                delete pTsIter;
                pTsTable->close();
                return;
            }
            *es = pTsRecord->close();
            if (*es != Acad::eOk) {
                delete pTsIter;
                pTsTable->close();
                return;
            }
            if (pClonedObj != NULL) {
                *es = pClonedObj->close();
                if (*es != Acad::eOk) {
                    delete pTsIter;
                    pTsTable->close();
                    return;
                }
            }
        }
        delete pTsIter;
        *es = pTsTable->close();
    }
}

路过

雷人

握手

鲜花

鸡蛋

最新评论

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

GMT+8, 2025-3-28 17:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部