// kUnloadAppMsg case. This function removes this application’s

// command set from the command stack and the

// AsdkOwnerDemo class from the ARX runtime class tree.

//

void

unloadApp()

{

acedRegCmds->removeGroup("ASDK_OWNERSHIP_COMMANDS");

// Remove the AsdkOwnerDemo class from the ACRX runtime

// class hierarchy. If this is done while the database is

// still active, it should cause all objects of class

// AsdkOwnerDemo to be turned into proxies.

//

deleteAcRxClass(AsdkOwnerDemo::desc());

}

// ObjectARX entry point

//

AcRx::AppRetCode

acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)

{

switch (msg) {

case AcRx::kInitAppMsg:

acrxDynamicLinker->unlockApplication(appId);

acrxDynamicLinker->registerAppMDIAware(appId);

initApp();

break;

case AcRx::kUnloadAppMsg:

unloadApp();

}

return AcRx::kRetOK;

}

Ссылки Указателя

Ваш класс пользователя может также содержать интенсивно или мягкие ссылки указателя к другим объектам в базе данных. Указатель - односторонняя связь{*ссылка*} (то есть не имеется никакой информации в упомянутом объекте, который указывает источник указателя). Объект может указывать на, или быть указано, любое число других объектов.

Жесткие Указатели

Жесткая ссылка указателя защищает объект от чистки. Например, объект содержит жесткую ссылку указателя к уровню. Поэтому, Вы не можете производить чистку уровня, который указан одним или большее количество объектов. Когда новая база данных выписана от существующего (например, в операции WBLOCK), все жесткие указатели скопированы в новую базу данных.

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

Другие примеры жестких ссылок указателя

§  объект лидера содержит жесткую ссылку указателя к стилю измерения.

§  текстовый объект содержит жесткую ссылку указателя к текстовому стилю.

§  объект измерения содержит жесткую ссылку{*справочники*} указателя к стилю измерения.

§  mline объект имеет жесткую ссылку указателя к mline стилю.

Мягкие Указатели

Мягкий указатель - просто указатель на объект. Это не защищает упомянутый объект от чистки.

Примеры мягких ссылок указателя

§  Xdata ссылки - мягкие указатели.

§  Постоянные реакторы - мягкие указатели.

Если Вы используете мягкий указатель, чтобы обратиться{*отнестись*} к объекту, Вы должны проверить{*отметить*}, чтобы объект все еще существовал прежде, чем Вы открываете это.

Проблемы длинных транзакций для объектов пользователя

Длинные транзакции – метод борьбы против обычных проблем, следующих из объектов, которые не должны имитироваться, или меж-объектные ссылки, которые не обработаны.

Если LongTransactionManager (LTM) находит, что это должно имитировать, фильтрованный класс возражает против законченного длинную операционную отладку () или checkIn (), это прервет полную операцию. Если это находит AcDbSoftPointerId или AcDbHardPointerId, который не в имитации IdMap, это также прервется.

Приложения, которые должны предотвратить их объекты от включения как имитируется в длинных трудах, должны регистрировать те объекты, использующие AcApLongTransactionManager::addClassFilter () функция.

AcDbProxyEntity и AcDbProxyObject всегда фильтруются, так когда приложение - не, подарок{*настоящее*}, все его объекты будет фильтрован автоматически.

Wblock имитирующие маркеры{*дескрипторы*} все жесткие ссылки{*справочники*} указателя, но глубоко имитация не требует никакого типа ссылки{*справочников*}, которая будет отображена. Оба из этих типов имитации используются в длинных трудах, в зависимости от типа сделки, это. Если прикладные использования или этих типов ссылок{*справочников*}, или маркеров{*дескрипторов*} xdata, то его объекты будут отклонены от длинных трудов, если приложение берет дополнительные шаги, чтобы обработать ссылки{*справочники*}. Это означает, что, если приложение не загружено, то его объекты и ссылки{*справочники*} будут автоматически предотвращены от участия в длинных трудах, и любые данные должны сохраниться в его Отсутствие.

Используйте длинные операционные и глубокие уведомления аналога, чтобы прервать имитацию их объекта и ссылок{*справочников*}, и добавляться необходима ли имитация объекта или отображение. См. глубокую документацию уведомления аналога и выборки для получения дополнительной информации на этом.

Если объект с мягкой ссылкой{*справочниками*} указателя имитируется (или жесткая ссылка{*справочники*} указателя в глубоком аналоге), приложение должно удостовериться, что ссылка{*справочники*} ИДЕНТИФИКАТОР находится в IdMap, или как отображенная пара ИДЕНТИФИКАТОРА, или имитируемая пара ИДЕНТИФИКАТОРА. Отображения обычно используются, когда объекты обращаются{*относятся*} к некоторому общему{*обычному*} словарю, который приложение обслуживает{*поддерживает*} в пределах рисунка. В глубоком аналоге, отображение может состоять из IdPair, где key = value. В аналоге wblock между рисунками, IdPair отобразил бы словарь одной базы данных со словарем другой базы данных.

Ссылка{*справочники*} имитируется приложением, используя или deepClone () или wblockClone () от повторного вызова уведомления.

Взятие этих шагов гарантирует “ транзитивное замкнутое выражение. ”, чтобы гарантировать что, набор объектов, которые обращаются{*относятся*} к друг другу, может быть проверен, и затем проверен назад в снова, без того, чтобы ломать{*нарушить*} отношения объекта, все связанные объекты проверены вместе. Например, если любую границу или ассоциативная штриховка непосредственно пропускают в отладку (), код штриховки прибавляет, что вся граница возражает против списка объектов, которые будут проверены. Это - то, как это достигает транзитивного замкнутого выражения. Если бы это не случалось, LTM нашел бы мягкий указатель IDs штриховки на его границы. Если это нашло, что граничный объект, столь упомянутый отсутствовал от имитации, длинная сделка будет прервана. Если это не делал этого, даже если никакие изменения{*замены*} не были сделаны к проверенной штриховке, первоначальная штриховка будет терять ее ассоциативность на регистрации.

Иногда, имеются известные ссылки{*справочники*}, которые не должны быть решены. Одно местоположение было бы объект, который следит за всеми объектами, которые используют это. Например, блочные отчеты{*записи*} таблицы сохраняют список всех блочных ссылок{*справочников*}, которые используют их. Правильно только проверить одну из ссылок{*справочников*}, так что Вы должны позволить длинному операционному механизму знать, что остальная часть ссылок{*справочников*} не должна имитироваться. Имеются несколько путей, которыми это может быть сделано.

Имеются некоторые примеры:

§  если приложение знает, относительно, которые объекты упомянуты, но не будут имитироваться — в beginWblockObjects (), beginDeepClone (), или beginCheckOut () уведомление —, они могут прибавлять объект ID упомянутого объекта к IdMap для имитации. Рекомендуемый подход состоит в том, чтобы установить значение в NULL, и idPair как не имитируемый. Например idMap. assign (idPair (идентификатор, AcDbObjectId:: kNull, kFalse); Если объект должен имитироваться позже, idPair будет изменен{*заменен*} соответственно.

§  вышеупомянутое отображение мог также быть сделан изнутри wblockClone объекта () метод, если это уже отменяет.

§  если ссылка{*справочники*} - компонент данных объекта, который зарегистрирован из использования dwgOutFields (), тогда может быть возможно избежать длинного операционного испытания законности. Испытание сделано, регистрируя из ИДЕНТИФИКАТОРОВ, использующих тип kIdFiler регистратора. Чтобы избегать испытания, делайте не файл из ИДЕНТИФИКАТОРОВ, которые не должны имитироваться, в течение этого типа записи в файл. Однако, не проведите{*держите*} никакое монопольное использование ИДЕНТИФИКАТОРАМИ из этой записи в файл, или других особенностей, которые используют этого регистратора, подобно частичному сохраняют{*экономят*} и загружают, не может должным образом обрабатывать ваши объекты. Единственные безопасные ИДЕНТИФИКАТОРЫ, чтобы отказать от этого регистратора - объекты AcDbSoftPointerId и AcDbHardPointerId.

§  если ИДЕНТИФИКАТОР - фактически в постоянном реакторе, возможно найти это, используя реактор iterator. Имеется пример того, как объект словаря находит и прибавляет его ИДЕНТИФИКАТОР к IdMap в течение beginWblockClone () уведомление.

beginWblockClone(..., AcDbIdMapping& idMap)

{

...

AcDbDictionaryIterator* pIter = pDict->newIterator();

AcDbObject* pObj;

for ( ; !pIter->done(); pIter->next()) {

acdbOpenObject(pObj, pIter->objectId(), kForRead);

AcDbVoidPtrArray* pReactors = pObj->reactors();

void* pReactor;

AcDbObjectId rId;

MyReactor* pMyReactor;

if (pReactors) {

for (int i = 0; i < pReactors->length(); i++) {

pReactor = pReactors->at(i);

if (acdbIsPersistentReactor(pReactor)) {

rId = acdbPersistentReactorObjectId(pReactor);

if (acdbOpenObject(pMyReactor, rId, kForRead) == eOk) {

pMyReactor->close();

AcDbIdPair idPair(rId,

AcDbObjectId::kNull, kFalse);

idMap. assign(idPair);

}

}

}

}

pObj->close();

}

delete pIter;

pDict->close();

}

Чистка (Purge)

Механизм чистки позволяет Вам стирать неиспользованные объекты в базе данных. Если объект имеет жесткого владельца или ссылку{*справочники*} указателя, это не может быть очищено. Чистка () функция AcDbDatabase вызвана на набор объектов, указанных в массиве ID:

AcDbDatabase:: чистка (AcDbObjectIdArray &idArray);

Purge() возвращает в том же самом ID массив ID объектов, которые могут быть очищены (то есть которые не имеют никаких жестких ссылок к ним). Как только Вы имеете этот массив объектов IDs, Вы ответствены за стирание объектов.

Когда рисунок загружен, AutoCAD проходит базу данных и производит чистку, несослался на анонимные блоки и вложил блоки таблицы перекрестных ссылок. Эти блоки стерты, когда чертежный файл закрыт. Если Вы создаете любые анонимные блоки между открытым и близким из рисунка, они будут очищены без вашего знания, если Вы не защищаете их, вызывая автономную функцию acdbSetReferenced (). Эта чистка происходит, даже если объекты имеют жесткие ссылки к ним.

Из за большого объема этот материал размещен на нескольких страницах:
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