Избегают использовать acedCommand (). Используйте AcApDocManager:: setStringToExecute () вместо этого, потому что это имеет параметр документа. Избегают использовать kLoadDwg и kUnloadDwg случаи, и использовать documentToBeCreated () и documentToBeDestroyed () реакторы вместо этого. Поддерживают документированную - независимую особенность базы данных. Для большего количества информации, см. " Документированные - независимые Базы данных " на странице 439. команды много-документа Поддержки. Для подробной информации, см. " Команды Много-документа " на странице 432. Поддерживают все события, которые происходят в пределах прикладного контекста выполнения. Для подробной информации, см. " Прикладной Контекст Выполнения " на странице 436.

Взаимодействие с Множественными документами

Эта секция описывает три основных уровня взаимодействия, ObjectARX-приложение должно иметь с множественными документами в пределах данного обращения команды. В следующих трех подразделах, " нормальная команда " является или встроенной командой AutoCAD, командой AcEd-registered, или функцией AutoLISP, подчиненной к ограничениям на использование AcDocManager - > curDocument ().

Доступ к текущему документу и связанным с ним объектам

Ключ вызывает ObjectARX-приложение, должен делать, когда это извлекает пользу, контроль должен выяснить текущий документ, который может быть выполнен с функцией acDocManager->curDocument().

ОБРАТИТЕ ВНИМАНИЕ, что текущий документ - не всегда активный документ. Дело обстоит так в течение переходных состояний, типа того, когда documentToBeActivated () реактор происходит. Не делайте попытку обширной обработки в течение переходных состояний.

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

Рассмотрите использование mdiActiveDocument () если Вы заинтересованы активным документом.

Из текущего документа, Вы можете определять текущую базу данных, уместного операционного менеджера, и связанное определенное документом состояние вашего приложения, и затем делать любые потребности, которые будут сделаны перед возвращением.

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

Если ваше приложение работает от прикладного контекста выполнения, это должно блокировать и разблокировать текущий документ, чтобы изменить что - нибудь связанное этим. Это может делать так, непосредственно вызывая AcApDocManager::lockDocument () и unlockDocument () функцию члена.

Если ваше приложение работает от функции ObjectARX или AutoLISP, никакая блокировка не должна быть необходима, поскольку система устанавливает блокировки и удаляет их автоматически вокруг выражений AutoLISP и команд.

Доступ к базам данных, связанным с нетекущими документами

Иногда Вы будете должны смотреть или изменить базы данных, связанные с другими документами, но не нуждаться в любом явном вводе пользователя в них. Вы могли бы даже смотреть на кое-что связанное с другим документом.

Чтобы просто исследовать базы данных, связанные с другими документами, Вы не должны блокировать документ, хотя, если документ блокирован в AcAp:: kXWrite режиме другим контекстом выполнения, Вы будете лишены доступа к любому из его элементов.

Чтобы изменять базы данных, связанные другими документами, или предотвращать другие контексты выполнения от изменения их на некоторое время, Вы должны блокировать документ, определяя AcAp::kXWrite, AcAp::kWrite, или AcAp::kRead, в зависимости от вашего намерения. Если командный процессор документа не статический, это обычно уже блокируется, и если это взаимно исключает вашу блокировку, Вы будете лишены доступа.

ОБРАТИТЕ ВНИМАНИЕ При изменении объектов базы данных в нетекущем документе, если Вы должны использовать сделки, убедитесь, что использовали операционного менеджера, связанного с документом.

Такие модификации не будут невыполнимые из текущего документа. Вместо этого они будут зарегистрированы со стеком отмены их ведущего документа, и уничтожены, используя отмену, когда ведущий документ текущий. Когда закончено с информацией, связанной с документом, убедитесь, что разблокировали это как можно скорее, минимизировали потенциал для конфликтов с другими командами.

Установка текущего документа без его активации

Имеются несколько особенностей, которые неявно работают на текущем документе, который может отличаться от активного документа. Вы можете использовать функцию AcApDocManager:: setCurDocument () с активизирующимся набором параметров к kFalse, чтобы делать текущий документ и активный отличный документ. Особенности, которых это является необходимым, включают:

    Использование любых функций взаимодействия пользователя, типа acedXXX () функции. Создание базы данных, которая будет связана со специфическим документом. Получение или управление набором выборов без того, чтобы требовать взаимодействие пользователя. функции Using, описанные в aced. h.

Когда активный и текущий документы различны, все функции ввода пользователя и члены относительно документа, типа графического экрана, будут заблокированы. Это включает функции для обоих приложений ObjectARX и ActiveX.

Всякий раз, когда Вы устанавливаете текущий документ без также формирования этого, setCurDocument () вызывающая программа должна восстановить текущий документ, чтобы быть тем же самый как активный документ когда закончено. Однако, если это не сделано к времени, что следующий входной случай обработан, текущий документ будет переключен назад к активному документу.

События уведомления документа

ObjectARX-приложения должны осуществить менеджера документа реактор, чтобы получить уведомление относительно изменений состояния документа, если любое из следующих условий применяется:

    Они должны управлять состоянием "в документ". Они должны быть уведомлены всякий раз, когда документ или его база(ы) данных собираются изменяться или изменения уже сделаны. Они должны следить за выключателями документа, то есть который документ сделан текущим или активным.

AcApDocManReactor делает повторные вызовы, когда изменения в состоянии документа имеют место, типа открытия, закрытия, активации, дезактивации и изменения состояние блокировки документов.

Специфические для приложения объекты документа

Эта секция выделяет, как приложения MDI-Aware должны быть структурированы. Фактически все разработчики ObjectARX-приложения должны обслужить{*поддержать*} карту между поддерживаемыми системой объектами документа и передачей специфических для приложения данных. Любая такая карта должна быть манипулирована с определенными значениями указателя AcApDocument (адреса).

Это требует, чтобы приложение по крайней мере осуществило повторные вызовы для AcApDocManagerReactor методов documentCreated () и documentToBeDestroyed (), создавать и удалять передачу docu-ment-specific состояние. Удостоверитесь, что ваши указатели AcApDocument современны, поскольку они будут вероятно многократно использоваться, поскольку документы закончены и созданы. Как альтернатива, Вы можете осуществлять обработчики для того, когда ваш acrxEntryPoint () функция вызвана с AcRx:: kLoadDwgMsg и AcRx:: kUnloadDwgMsg сообщения, которые вызваны с документом в вопросе, являющемся текущим.

Такие специфические для приложения данные должны содержать любое состояние, которое должно быть связано с каждым открытым документом, который должен упорствовать{*сохраниться*} поперек команд. Одна альтернатива выполнения была бы должна обслужить{*поддержать*} AcArray шаблон класса, чей образцы состоят из указателя AcApDocument и указателя на, или образца, вашего документированного - определенного состояния, и чей == оператор перезагружен, чтобы сравнить только AcApDocument* члена. Другой подход был бы состоял в том, чтобы обслужить{*поддержать*} пару массивов с соответствующими элементами, делайте находку на указателях документа, и выберите соответствующий элемент из

Другой массив.

Повторно неспользуемые команды

Повторно неиспользуемые команды - те команды, которые не могут быть вызваны в одном документе когда уже в продвижении различного документа. Это должно быть расценено как способ делать ваше приложение MDI-знающими(Aware) быстро, без того, чтобы иметь необходимость изолировать всю вашу командо-определенную информацию о состоянии.

Создание Неповторно используемой Команды

Делать команду неповторно используемой

1 Объявляют статическую Булеву переменную в вашем приложении для каждой команды, Вы желаете быть неповторно используемыми. Статически инициализируйте каждую переменную к FALSE.

2 Всякий раз, когда пользователь вводит команду или действие, Вы хотите предотвратить повторную входимость к, сначала проверять{*отмечать*} его статическую Булеву переменную. Если это - FALSE, устанавливает это в TRUE и продолжает команду. Если это - TRUE, команда повторно вводится, так перенесите сообщение, спрашивающее пользователя, чтобы закончить команду в другом документе, в котором это используется.

3 Всегда задерживают Булеву переменную к FALSE, когда команда закончена, отменена, или заканчивается по любой причине.

Повторно неиспользуемые команды AutoCAD

Некоторые команды AutoCAD неповторно используемы. Они - команды, которые просят о вводе пользователя и поэтому обычно позволили бы выключатель окна документа, но вызовут серьезные осложнения, если это было переключено, или если команда была вызвана{*названа*} снова в другом документе. Три команды соответствуют эту конфигурацию:

n TABLET

n NEW

n OPEN

Команда TABLET ограничена, потому что пользователь определяет, как устройство управления позицией собирается работать, так, чтобы операция была должна быть закончена прежде, чем что - нибудь еще может быть сделано. Поскольку НОВЫЙ и ОТКРЫТЫЙ должны открыть окно, и затем просить о имени (когда FILEDIA=0), переключая к другому окну в тот момент мог быть подвержен ошибкам.

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