acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pBlockTable, AcDb::kForRead);
AcDbObjectId modelSpaceId, paperSpaceId;
pBlockTable->getAt(ACDB_MODEL_SPACE, modelSpaceId);
pBlockTable->getAt(ACDB_PAPER_SPACE, paperSpaceId);
pBlockTable->close();
// Step 4: Create a new ID map.
//
AcDbIdMapping idMap;
// Step 5: Call deepCloneObjects().
//
acdbHostApplicationServices()->workingDatabase()
->deepCloneObjects(objListMS, modelSpaceId, idMap, Adesk::kTrue);
acdbHostApplicationServices()->workingDatabase()
->deepCloneObjects(objListPS, paperSpaceId, idMap);
// Now we can go through the ID map and do whatever we’d
// like to the original and/or clone objects.
//
// For this example we’ll print out the object IDs of
// the new objects resulting from the cloning process.
//
AcDbIdMappingIter iter(idMap);
for (iter. start(); !iter. done(); iter. next()) {
AcDbIdPair idPair;
iter. getMap(idPair);
if (!idPair. isCloned())
continue;
acutPrintf("\nObjectId is: %Ld", idPair. value().asOldId());
}
}
Реализация deepClone() для заказных классов
Первая часть этой главы описала основное использование deepCloneObjects () функция. Эта секция описывает скрытые подробности глубокого клонирования, так что Вы можете перегружать deepClone () и wblockClone () функции для ваших собственных заказных объектов и примитивов.
При перегрузке этих функций для заказных объектов, Вы можете желать клонировать другие объекты с заказным объектом. Они упомянуты как зависимые ссылки.
WblockClone заказного объекта () функция может вызывать wblockClone () на зависимой ссылке, но не должна вызвать deepClone ().
Аналогично, deepClone заказного объекта () функция может вызывать deepClone () на зависимой ссылке, но не должна вызвать wblockClone (). Когда клонируемый запрос отправлен этим способом, Вы должны также отправить AcDbIdMapping образец, который был получен в запросе к клонируемой функции заказного объекта к клонируемой функции зависимого объекта. Никогда не создайте новый образец AcDbIdMapping, чтобы пройти к клонируемой функции зависимой ссылки.
Команды AutoCAD для использования глубокого клона и Wblock-клона
Множество команд AutoCAD использует deepClone () функция, чтобы создать новые объекты от старых. В некоторых случаях, одна версия команды исполняет глубоко клонирование, в то время как другая версия делает нет. Команды, использующие deepClone() и wblockClone() следующие:
COPY | Использует deepClone (). |
ARRAY | Использует deepClone (). |
MIRROR | Если и оригинал и отраженные объекты сохраняются, использует deepClone (). Если первоначальные объекты удалены, deepClone () не используется (первоначальные объекты только отражены). |
BLOCK | Использует deepClone (). Эта команда копирует примитивы в другое пространство и стирает первоначальные примитивы. |
INSERT | Когда Вы вставляете рисунок, эта команда использует deepClone () чтобы копировать примитивы в рисунок. |
WBLOCK | Использует wblockClone (). Эта функция следует за жестким монопольным использованием и жесткими связями указателя только. Вся другая копия командует, чтобы использование deepClone () следовало, и интенсивно и мягкие связи монопольного использования от первичного объекта. |
XREF BIND XBIND | Использует wblockClone () чтобы принести упомянутые примитивы в ваш текущий рисунок. |
EXPLODE | Когда Вы взрываете объект в его части, никакое клонирование не выполнено. |
Когда Вы взрываете блок-ссылку, AutoCAD удаляет примитив блок-ссылки и копирует индивидуальные примитивы в рисунок. Эта версия EXPLODE использует deepClone (). |
Клонируемая Стадия
В течение клонируемой стадии, когда Вы вызываете, deepClone () на объекте, AutoCAD выясняет, если клонированный объект (первичный объект) имеет любые другие объекты. Если это делает, это вызывает deepClone () на тех объектах также. Этот процесс продолжается, пока все находящиеся в собственности объекты не клонировались. И интенсивно и мягкие связи монопольного использования сопровождаются.
Когда Вы вызываете wblockClone () на объекте, AutoCAD следует за жестким владельцем и жесткими связями указателя и вызывает wblockClone () на тех объектах также.
Стадия Трансляции
И для глубокого клона и wblock клонируют функции, объекты, которые упомянуты первичным объектом, также оттранслированы. После того, как объекты скопированы, AutoCAD транслирует ссылки как описано в следующем три случая.
§ Случай 1: Если упомянутый объект был скопирован, старая ссылка оттранслирована, чтобы обратиться{*отнестись*} к скопированному объекту. В этом случае, это не имеет значение, если скопированный объект находится в той же самой базе данных как исходные объекты или в новой базе данных.
§ Случай 2: Этот случай предполагает, что исходный объект и скопированный объект постоянно находятся в той же самой базе данных. Если упомянутый объект не был скопирован, ссылка оставлена на месте
§ Случай 3: Этот случай предполагает, что исходный объект и скопированный объект находятся в различных базах данных. Если упомянутый объект не был скопирован, ссылка к этому установлена в NULL (потому что это не находится в базе данных адресата).
Стадия Трансляции: Случай 1
Как пример Случая 1, предположите, что Вы имеете Примитив 1, который содержит ссылку указателя к Примитиву B1. И Примитив 1 и Примитив B1 отобран, чтобы клонироваться. Перед трансляцией, Примитив 2 все еще относится к Примитиву B1. После трансляции, Примитив 2 модифицирован, чтобы отнестись к Примитиву B2.

Стадия Трансляции: Случай 2
Как пример Случая 2, предположите, что Вы имеете те же самые два примитива: Примитив 1 содержит ссылку указателя к Примитиву B1. Примитив 1 клонировался, но Примитив B1 - нет. Источник и адресат (клон), объекты находятся в той же самой базе данных.

Стадия Трансляции: Случай 3
Случай 3 подобен Случаю 2, кроме клонированных объектов находятся в новой базе данных. В этом случае, ссылка указателя Примитива 2 установлена в NULL, потому что Примитив B1 не в новой базе данных.

Словарь имен объектов
Словарь имен объектов имеет мягкое монопольное использование ее вхождений. Вхождения не таким образом клонировались wblockClone (). Это - до приложения, чтобы копировать те объекты в случае необходимости.
В течение команды INSERT, определенные приложением вхождения в словари имен объектов не скопированы. Приложение должно исполнить желательное клонирование в течение beginDeepCloneXlation() стадия, добавляя объектные ID к карте ID и добавляя новый вход адресата в словарь.
Для подробной информации относительно beginDeepCloneXlation(), см. “ Редактор Функции Уведомления Реактора ” на странице 504.
В течение команды WBLOCK, все ID в первоначальной словари имен объектов принесены к словари имен объектов адресата, но объекты указали, автоматически не скопированы. Если объект, на который ID указывает, не клонировался приложением, ID удален из словаря адресата в течение endDeepClone () трансляция. Снова, приложение должно клонировать объекты в течение beginDeepCloneXlation и добавлять ID к карте ID. Не требоваться добавить новый ID к словари имен объектов адресата, потому что эта задача была выполнена автоматически.
Следующий пример показывает, как Вы могли бы записывать AcEditorReactor:: beginDeepCloneXlation () функция для определяемого пользователем словаря объектов, который помещен в словарь имен объектов. Пример относится только к kDcWblock и kDcInsert контекстам.
// Этот пример демонстрирует способ обработать объекты в словари имен объектов для WBLOCK и INSERT.
// Наш объект - AcDbDictionary, который назван "AsdkDictionary" в названном словаре объектов, содержащим
// наши заказные объекты.
//
const char *kpDictionary = "AsdkDictionary";
// AsdkNODEdReactor is derived from AcEditorReactor.
//
void
AsdkNODEdReactor::beginDeepCloneXlation( AcDbIdMapping& idMap, Acad::ErrorStatus* pRetStat)
{
Acad::ErrorStatus es;
AcDbObjectId dictId;
if ( idMap. deepCloneContext() != AcDb::kDcWblock && idMap. deepCloneContext() != AcDb::kDcInsert)
return;
// Get the "from" and "to" databases.
//
AcDbDatabase *pFrom, *pTo;
idMap. origDb(pFrom);
idMap. destDb(pTo);
// See if the "from" database has our dictionary, and
// open it. If it doesn’t have one, we are done.
//
AcDbDictionary *pSrcNamedObjDict;
pFrom->getNamedObjectsDictionary(pSrcNamedObjDict, AcDb::kForRead);
es = pSrcNamedObjDict->getAt(kpDictionary, dictId);
pSrcNamedObjDict->close();
if (es == Acad::eKeyNotFound)
return;
AcDbDictionary *pSrcDict;
acdbOpenObject(pSrcDict, dictId, AcDb::kForRead);
AcDbObject *pClone;
switch (idMap. deepCloneContext()) {
case AcDb::kDcWblock:
// WBLOCK clones all or part of a drawing into a
// newly created drawing. This means that the
// named object dictionary is always cloned, and
// its AcDbObjectIds are in flux. Therefore, you
// cannot use getAt() or setAt() on the dictionary
// in the new database. This is because the
// cloned dictionary references all refer to the
// original objects. During deep clone translation,
// all cloned entries will be translated to the
// new objects, and entries not cloned will be
// "removed" by getting "translated" to NULL.
//
// The cloning of entries in our own dictionary are
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


