// command set from the command stack.
//
void
unloadApp()
{
acedRegCmds->removeGroup("ASDK_ALINES");
// Remove the AsdkObjectToNotify class from the ACRX
// runtime class hierarchy. If this is done while the
// database is still active, it should cause all objects
// of class AsdkObjectToNotify to be turned into proxies.
//
deleteAcRxClass(AsdkObjectToNotify::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;
}
Немедленная и задержанная передача событий
Для AcDbObjectReactor события уведомления могут или происходить немедленно или быть задержано на время. Используйте задержку, когда объект закрыт, если Вы работаете на основании " в объект ", или конец наиболее удаленной сделки, если Вы используете операционную модель. Следующие события посылают немедленное уведомление:
cancelled()
Уведомление послано, когда AcDbObject::cancelled() вызван.
openedForModify()
Уведомление послано перед первым вызовом функции модификации, прежде, чем состояние объекта изменено.
copied()
Уведомление послано, когда объект скопирован.
goodbye()
Уведомление послано, когда объект собирается быть удаленным из памяти.
Немедленные уведомления вызваны в то же самое время как соответствующее событие. Например, когда assertWriteEnabled () вызван первый раз на объекте, openedForModify () уведомление немедленно послано всем реакторам на том объекте.
Следующие события посланы с задержкой:
n modified()
n subObjModified()
n erased()
n modifyUndone()
n modifiedXData()
n unappended()
n reappended()
n graphicsModified()
modified() уведомление о AcDbObjectReactor - пример передавать-разового уведомления. Предположим, что объект открыт, и функция модификации - обратился к этому. Функция модификации вызывает assertWriteEnabled() и все реакторы получают openedForModify() реакция. Последующие функции модификации на объекте не приводят к любому дальнейшему уведомлению. Когда объект наконец закрыт, modified() уведомление послано. Однако, если новичок хотел называть cancel() на объекте вместо cancelled(), cancel() уведомление будет послано вместо cancelled() уведомление.
Когда Вы получаете задержанное уведомление типа modified(), один из параметров - указатель на объект. В это время объект находится в состоянии только для чтения. Вы не способны изменить это до конца совершающегося процесса.
При попытке изменять объект прежде, чем совершающийся процесс закончен, есть причины AutoCAD, чтобы прерваться с сообщением об ошибках eWasNotOpenForWrite или eInProcessOfCommitting.
Вы можете использовать следующие функции, чтобы проверить, что совершающийся процесс закончен прежде, чем Вы открываете объект для записи:
AcDbObjectReactor::objectClosed(AcDbObjectId ObjId);
AcTransactionReactor::transactionEnded(int NumActiveAndSuccessful);
ObjectClosed() уведомление послано, когда объект полностью закрыт и указатель больше не имеет силу. Вы можете открывать объект, снова использующий ID, который пропускают в параметре и работать на этом. Будьте внимательным, чтобы не создать бесконечные циклы уведомления в этой точке.
В transactionEnded() уведомление, Вы можете использовать numActiveTransactions(), чтобы сделать запрос операционного менеджера, чтобы видеть, сколько сделок активны. Если не имеется никаких активных сделок, то сделка закончилась, и все объекты в сделке были совершены.
Иногда Вы могут были должны знать, когда наиболее удаленная сделка заканчивается, и совершающийся процесс начинается. Используйте следующее уведомление для этой цели:
AcTransactionReactor::endCalledOnOutermostTransaction()
Когда наиболее удаленные операционные концы, совершающийся процесс начинается и close() обратился к каждому объекту. Вы могли бы получать objectClosed() уведомление как часть этого завершения. Однако, вообще лучше всего не действовать немедленно.
Вместо этого, ждите, пока целая сделка не закончена прежде, чем Вы исполняете любые операции на этих объектах.
Руководящие принципы использования уведомления
В то время как при использовании уведомлений, твердо придержитесь следующих руководящих принципов. Использование уведомлений, которые нарушают эти руководящие принципы, могло приводить к непредсказуемым результатам для вашего приложения.
§ Не полагаются на последовательность обращения к уведомлениям.
Вы можете считать commandWillStart () обстрелянным прежде commandEnded (), и beginInsert () обстрелянный прежде endInsert ().
Доверие на любые другие последовательности могло бы приводить к проблемам для вашего приложения, если последовательность изменена, когда новые уведомления представлены, или существующие перестроены.
§ Не полагаются на последовательность операций (функция вызывает) между уведомлениями.
Если Вы связываете ваше приложение с этим уровнем подробности, ваше приложение может терпеть неудачу в будущих выпусках.
Вместо доверия на последовательности, положитесь на уведомления, чтобы указать состояние системы. Например, когда Вы получаете erased (kTrue) уведомление на объекте A, это означает, что объект A стерт. Если Вы получаете erased() уведомление на сопровождаемом erased() уведомление на B, это означает только, что оба объекта A и B стерты. Система не будет гарантировать, что B будет всегда стираться после A.
§ Не используют никакие функции взаимодействия пользователя в вашей функции повторного вызова уведомления, типа acedCommand (), acedGetPoint (), acedGetKword (), или любого другого acedXXX () функция.
Подобные интерпретации обращаются к уведомлениям на реакторах базы данных, редактор реакторы, и операционные реакторы.
Глава16. Многодокументная среда
AutoCAD поддерживает многодокументную среду (MDI), который позволяет Вам иметь больше чем один рисунок, загруженный сразу на единственной сессии AutoCAD. Эта глава описывает, как работать с MDI в вашем ObjectARX-приложении.
§ Краткий обзор
§ Терминология
§ SDI Переменная Системы
§ Уровни Совместимости
§ Взаимодействующий с Множественными документами
§ Уведомление События Документа
§ Специфические для приложения Объекты Документа
§ Неповторно используемые Команды
§ Команды Много-документа
§ Отключение Переключения Документа
§ Прикладной Контекст Выполнения
§ Отмена Базы данных и Средства Управления Транзакции
§ Документированные - независимые Базы данных
§ MDI-ЗНАЮЩИЙ Приложение Примеры.
Краткий обзор
AutoCAD поддерживает многодокументную среду, и ObjectARX-приложения, выполняющиеся в пределах AutoCAD должны работать должным образом в среде MDI. Три принципа должны соблюстись для ObjectARX-приложения, чтобы обеспечить поддержку MDI:
§ приложение должен обслужить документированное - определенное состояние на стеке, в базе данных, или в структуре, которая может быть индексирована через соответствующий указатель документа.
§ Все документы должен быть блокирован, чтобы измениться. Основной документ блокировка обработана автоматически для AutoCAD, командует, ObjectARX команды, и функции AutoLISP. Немодальный диалог и код инструментальной панели, и любые команды, которые должны работать вне активного документа, должны вручную исполнить документ блокировка.
§ приложение должен обслужить{*поддержать*} отношения между документами и базами данных. Библиотека баз данных AutoCAD (AcDb) не сознает документы и MDI, и должна остаться так.
Несколько архитектурных особенностей ObjectARX делают поддержку возможного MDI.
Они включают отдельные контексты выполнения, образцы данных, документ блокировка, и классы управления документа. Следующие секции обсуждают эти темы{*разделы*} более подробно.
Контексты Выполнения Документа
Отдельный контекст выполнения установлен для каждого документа, открыл в AutoCAD, позволять командные процессоры и Визуальный ШЕПЕЛЯВЯТ среды для каждого документа, чтобы выполниться независимо от друг друга. Каждый контекст выполнения обслуживает{*поддерживает*} его собственный стек. Все контексты выполнения работают на общей{*обычной*} динамической памяти и статических данных. Контексты Выполнения могут только быть переключены, когда система голосует для более интерактивного ввода.
Образцы Данных
Имеется отдельный образец всех элементов данных, связанных с базой данных и текущей командой, обрабатывающей состояние для каждого документа. Это включает командный процессор, входной процессор, Визуально ШЕПЕЛЯВЯТ среда, базы данных, наборы выбора, и (больше всего, но не все) переменные системы. Текущая команда, обрабатывающая состояние поддерживается в динамической памяти. В дополнение к этим встроенным элементам системы, все ObjectARX-приложения должны также обслужить{*поддержать*} документированное - определенное состояние или на стеке или в структурах на динамической памяти, которые соответствуют каждому активному документу.
Каждый документ имеет его собственную текущую базу данных, плюс любое число баз данных таблицы перекрестных ссылок и побочных баз данных. По умолчанию, база данных связана с одним документом, и это участвует в регистрации отмены и воспроизведении для того документа. Однако, базы данных могут также быть созданы независимо от любого документа, когда их состояние отмены или заблокировано или поддерживается заказным средством отмены приложения.
Документ Блокировка
Все документы должны быть блокированы, чтобы изменяться. Документы могут также быть блокированы, чтобы предотвратить код в других контекстах выполнения от изменения их временно. Документы не должны быть блокированы, чтобы исполнить, запрос (читает) операции, и они никогда не предотвращены от выполняющих операций запроса на других документах. Основной документ блокировка обработана автоматически для AutoCAD, командует, ObjectARX команды, и функции AutoLISP.
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


