Когда объект скопирован таким образом, карта ID все еще содержит два объектных ID для каждого клонированного объекта (исходный ID и адресат ID), но эта точка ID временно к тому же самому объекту. Когда операция вставки заканчивается, исходная база данных удалена.

Редактор Функции Уведомления Реактора

AcEditorReactor класс обеспечивает четыре функции уведомления, которые возвращают контроль на приложение в некоторых точках в глубокой клонируемой операции. Следующие функции вызваны в течение всего глубокого клона и операций клона wblock:

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

BeginDeepClone () функция вызвана после того, как AcDbIdMapping образец создан и прежде, чем любые объекты клонированы. Карта ID будет пуста, но этом можно делать запрос для destDb () и deepCloneContext () в это время.

BeginDeepCloneXlation () функция вызвана в конце концов объектов в первичном наборе выборов, были клонированы и прежде, чем ссылки оттранслированы.

Это - первый раз, когда возможно видеть, полный набор чего был клонирован в карте ID. Это - также время, чтобы клонировать любые дополнительные объекты и добавлять их к карте ID. Помните, что любые клонированные объекты имеют их объектные ID в состоянии непрерывного изменения в этой точке.

AbortDeepClone () функция вызвана в любое время между beginDeepClone () и endDeepClone ().

EndDeepClone () функция вызвана в конце процесса трансляции и клонирования. Объектные ID больше не в состоянии непрерывного изменения. Однако, этот запрос не подразумевает, что примитивы находятся в их конечном состоянии для любой команды, выполняется. Часто клонированные примитивы преобразованы, или другие операции выполнены после клонируемого процесса. Имеются дополнительные функции повторного вызова, которые могут использоваться, чтобы обратиться к примитивам позже, включая commandEnded ().

НЕ нашли? Не то? Что вы ищете?

В дополнение к предыдущим четырем функциям, следующие функции уведомления обеспечиваются в операции клона wblock:

    beginWblock () otherWblock () abortWblock () endWblock ()

Они вызывают, входят в следующий порядок с глубокими клонируемыми функциями:

1 beginDeepClone () Этот запрос послан, как только образец адресата АкДбДатабас был создан, но это находится в “необработанном” состоянии и не готово к добавлению в конец.

2 beginWblock () новая база данных теперь имеет ее основные элементы, типа таблицы метки, класс карта ID, и записи таблицы блоков пространства листа и пространство модели. Это все еще пусто. Клонирование не началось, но новая база данных теперь готова к добавлению в конец.

3 otherWblock () и beginDeepCloneXlation () Эти два вызывает, сделаны противовключенным и может использоваться для той же самой цели. Первичный набор объектов был клонирован, но трансляция ссылки не началась все же.

4 endDeepClone () процесс трансляции теперь закончил, но примитивы - еще не в их конечном состоянии.

5 endWblock () примитивы теперь были преобразованы, и пространство модели, и начала координат пространства листа были установлены. Новая база данных полна, но еще не была сохранена.

Имеются три типа AcEditorReactor:: beginWblock (). Они перечислены здесь наряду с их соответствующими функциями AcDbDatabase:

1 WBLOCK*

void

AcEditorReactor:: beginWblock (

AcDbDatabase* pTo,

AcDbDatabase* pFrom)

Acad:: ErrorStatus

AcDbDatabase::wblock(AcDbDatabase*& POutputDatabase)

2 WBLOCK определяемого пользователем блока

void

AcEditorReactor:: beginWblock (

AcDbDatabase* pTo,

AcDbDatabase* pFrom,

AcDbObjectId blockId)

Acad:: ErrorStatus

AcDbDatabase:: wblock (

AcDbDatabase*& POutputDatabase,

AcDbObjectId nObjId)

3 WBLOCK набора выборов

void

AcEditorReactor:: beginWblock (

AcDbDatabase* pTo,

AcDbDatabase* pFrom,

const AcGePoint3d& InsertionPoint)

Acad:: ErrorStatus

AcDbDatabase:: wblock (

AcDbDatabase*& POutputDatabase,

const AcDbObjectIdArray& PIdSet,

const AcGePoint3d& PPoint3d)

Все три версии клонируют, и пространство модели и пространство листа AcDbBlockTableRecord перед запросом beginWblock (). Однако, для примитивов в пределах этих записей таблицы блоков, порядок уведомления, будет кажется, прибывает по-другому в первый тип и последние два типа. В одной версии, примитивы в пространстве модели, которые клонируются, получит запрос wblockClone() перед AcEditorReactor::beginWblock(). В версиях два и три, примитивы в AcDbBlockTableRecord или наборе выборов получат их wblockClone() запрос после AcEditorReactor::beginWblock() уведомление Запрос.

Объекты, которые были клонированы в течение частичного XBIND, автоматически переадресованы только после endDeepClone() уведомление. Это означает, что их AcDbObjectIds во внешне упомянутой базе данных отправлены AcDbObjectIds клонируемых объектов в рисунке главного компьютера, и объекты во внешне упомянутой базе данных удалены. Объекты, что ссылка, на которую отправленный AcDbObjectIds заканчивают ссылаться, имитируют в ведущем рисунке. Если Вы должны отключить это автоматическое переназначение для ваших объектов, то удалите idPair() от idMap, для ваших клонированных объектов, в течение endDeepClone() уведомление.

Следующая функция вызывает, происходят в течение команды INSERT ИЛИ INSERT*:

§  beginInsert ()

§  otherInsert ()

§  abortInsert ()

§  endInsert ()

Они вызывают, входят в следующий порядок с глубокими клонируемыми функциями:

1 beginInsert () и beginDeepClone () Они вызывают, возвращаются-to-back и может использоваться для той же самой цели.

2 otherInsert() и beginDeepCloneXlation() Они вызывают, также возвращаются - to-back и может использоваться для той же самой цели.

3 endDeepClone() клонирование и процессы трансляции закончено. Примитивы клонированы, но не были добавлены в конец к блоку, так что они не графические. Вы не можете использовать примитивы в наборе выборов все же.

4 endInsert() примитивы теперь были преобразованы и были добавлены в конец к блоку. Если это - ВСТАВКА*, они - теперь в пространстве модели и имеют их графику. Они могут использоваться в наборах выбора. Однако, если это - ВСТАВКА, они только были добавлены в конец к записи таблицы блоков; та запись еще не была добавлена к таблице блоков. В этом случае, Вы должны ждать до commandEnded() уведомления, чтобы использовать эти примитивы в наборе выборов.

Типовой код в этой секции использует beginDeepCloneXlation() функция уведомления. Эта выборка иллюстрирует, как Вы могли записывать реактор, чтобы добавить поведение к команде WBLOCK, чтобы сообщить этому включать все текстовые стили в новый рисунок, вместо только текстовые стили, которые упомянуты примитивами.

Это таким образом показывает, как использовать wblock с небытием.

AcDbIdMapping имеет функцию, deepCloneContext (), который возвращает контекст, в котором глубокая клонируемая функция была вызвана. Контексты - следующее:

kDcCopy

Копирование в пределах базы данных; использует COPY, ARRAY, MIRROR (если Вы не удаляете оригинал), приобретение LEADER, или копия INSERT

kDcExplode

EXPLODE блок-ссылки

KDcBlock

BLOCK создание

kDcXrefBind

XREF Связывают, и XBIND

kDcSymTable

XREF Слияние Присоединяются, DXFIN, и IGESIN (только записи таблицы идентификаторов клонированы здесь)

kDcSaveAs

SAVEAS, когда VISRETAIN установлен в 1 (только записи, таблицы идентификаторов клонированы здесь)

kDcInsert

ВСТАВКА рисунка

kdcWblock

WBLOCK

kDcObjects

AcDbDatabase:: deepCloneObjects ()

AcEditorReactor::abortDeepClone() функция вызвана, когда запрос к AcDbDatabase::abortDeepClone() сделан.

Следующий код использует переходного редактора реактор, полученный из AcEditorReactor и перегружает beginDeepCloneXlation () функция для реактора.

// С тех пор AcDbDatabase::wblock() только поддерживает AcDbEntities в его массиве ID,

// этот код демонстрирует, как добавить дополнительные объекты в течение beginDeepCloneXlation ().

// Если это - команда WBLOCK, это спрашивает пользователя, если все текстовые стили были wblocked.

// Иначе, только те текстовые стили, упомянутые примитивами, являющимися wblocked будут

// включены (заданное по умолчанию поведение wblock's).

// 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) {

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132