ObjectARX, AutoCAD. Среда программирования библиотеки C++

       

Много-документные команды


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

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

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

virtual void

documentActivated( AcApDocument* pActivatedDoc );

virtual void

documentToBeDeactivated( AcApDocument* pDeActivatedDoc );

DocumentToBeActivated() реакторная функция может также использоваться, но это происходит прежде, чем документ активизирован. Контекст документа не был установлен в этом случае.

Эти повторные вызовы вызваны всякий раз, когда пользователь нажимает на различный документ, чтобы активизировать это. Реакторы должны только использоваться на AcApDocManager, когда в начальной команде как раз перед запросом ввода пользователя, в точке, когда переключение документа должно быть поддержано. Реактор должен быть удален, когда любой или все такие подсказки закончены или отменены. От повторного вызова, вызовите:


virtual Acad::ErrorStatus

sendStringToExecute(

AcApDocument* pAcTargetDocument,

const char * pszExecute,

bool bActivate = true,

bool bWrapUpInactiveDoc = false) = 0;

Эта функция стоит в очереди строка, которую нужно интерпретировать следующий раз,  указанный документ активизирован. Строка должна типично быть обращение команды (мы назовем это вторичной командой), но можем также быть выражение AutoLISP, фрагмент команды, или лексема меню. Строковый предел - 296 байтов, так что более длинные последовательности должны быть осуществлены как команда SCRIPT, выполняющая временный сценарий, или как выражение AutoLISP, чтобы загружать и выполнить программу AutoLISP. Новый документ будет блокирован согласно уровню блокировок новой команды как определено в течение его регистрации.

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

ОБРАТИТЕ ВНИМАНИЕ, поскольку эта методика вовлекает запрос от documentActivated () метод, Вы должны передать kFalse в bActivate параметр, чтобы избежать ошибок или бесконечных циклов.

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

Когда команда много-документа заканчивает, приложение управления должно убедиться, что  команда не оставила никакие ждущие обработки состояния команды в предыдущих документах. Приложение может делать это,  посылая ESC или ВВОДИТЬ в документы, которые это пересекло через, используя bWrapUpInactiveDoc параметр sendStringToExecute (). Если это не сделано, документы могут быть оставлены в не-статическом состоянии.

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



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

Помните ту ОТМЕНУ, выполняет отдельно в каждом документе при проектировании этих конструкций.

ОБРАТИТЕ ВНИМАНИЕ, что  "нормальная" acedSSGet() не жизнеспособна, потому что это может запрашивать множественные времена, таким образом не возвращая любой набор выборов в продвижении. Вместо этого, acedEntSel() используется, потому что это или возвращает примитив, или RTNONE, означая пользователя действительно сделан, или RTCAN, который может быть или реальная отмена или "перемещенный в другой документ" сигнал. Установите местный "done" флажок, исполните действие, затем стойте в очереди ESC к каждому другому активному документу так, чтобы команда была закончена в том документе следующий раз,  пользователь идет к щелчку в это.


Содержание раздела