编辑器 Reactor 通知函数
该类提供了四个通知函数,这些函数在深度克隆操作的某些点将控制权返回给应用程序。在所有深度克隆和 wblock 克隆操作期间调用以下函数:AcEditorReactor
该函数在创建实例后和克隆任何对象之前调用。ID 映射将为空,但此时可以查询 AND 。beginDeepClone()AcDbIdMappingdestDb()deepCloneContext() 在克隆主选择集中的所有对象之后,在转换引用之前,将调用该函数。这是第一次可以在 ID 映射中看到克隆的整个集合。这也是克隆任何其他对象并将它们添加到 ID 映射的时候了。请记住,此时克隆的任何对象的对象 ID 都在不断变化。beginDeepCloneXlation() 该函数在 和 之间的任意时间调用。abortDeepClone()beginDeepClone()endDeepClone() 该函数在克隆和转换过程结束时调用。对象 ID 不再处于变化状态。但是,此调用并不意味着实体处于正在执行的任何命令的最终状态。通常,在克隆过程之后会转换克隆的实体或执行其他操作。还有其他回调函数可用于稍后访问实体,包括 .endDeepClone()commandEnded() 除了前面的四个函数外,wblock 克隆操作中还提供了以下通知函数:
这些调用按深度克隆函数的顺序排列:
beginWblockObjects()仅在调用并正在执行函数时发送。在克隆该数据库中的第一个对象之前,每个源数据库都会发送一次。对于 ,通知序列为:AcDbDatabase::wblockCloneObjects()wblockCloneObjects()
有三种类型的 .此处列出了它们及其相应的功能: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* 命令期间发生以下函数调用:
这些调用按深度克隆函数的顺序排列:
本节中的示例代码使用通知函数。此示例演示如何编写反应器以向 WBLOCK 命令添加行为,以告知它包括新图形中的所有文本样式,而不仅仅是实体引用的文本样式。因此,它展示了如何将 wblock 与非实体一起使用。beginDeepCloneXlation() AcDbIdMapping有一个函数 ,该函数返回调用深度克隆函数的上下文。上下文如下:deepCloneContext()
调用时调用该函数。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();
}
}
父主题: |
|Archiver|CAD开发者社区
( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-11-1 12:09
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.