Page 66 - AutoLISP и Visual LISP в среде AutoCAD
P. 66
3.6. СТРУКТУРА ПРОГРАММЫ УПРАВЛЕНИЯ ДИАЛОГОВЫМИ
ОКНАМИ
Описание диалога на языке DCL является статическим представлением
диалогового окна. Все действия в момент его активации и после закрытия
определяются управляющей программой на AutoLisp. Для этого имеется ряд
функций, перечисленных выше.
Рассмотрим структуру программы, управляющей диалоговыми окнами.
Такая программа должна иметь следующие блоки:
· инициализации;
· обработки событий (действий);
· деинициализации.
Блок инициализации должен включать функции загрузки DCL-файла
(load_dialog), отображения диалогового окна на экране (new_dialog), задания
(если необходимо) выражений, обрабатывающих действия при выборе или
изменении состояния элементов управления (action_tile). На этом этапе часто
вызываются функции для установки состояния элементов управления
(set_tile, mode_tile), функции для работы со списками и изображениями.
Процесс ввода данных пользователем, выбора определенных
элементов, нажатия на кнопки принято обозначать событиями или
действиями. Блок обработки событий представляет собой бесконечный цикл,
в котором выполняются выражения AutoLisp, приписанные элементам
управления с помощью атрибута action или функции action_tile. Передача
управления циклу обработки событий осуществляется вызовом функции
start_dialog. Цикл обработки событий длится до тех пор, пока результатом
какого-либо выражения действия не станет вызов функции закрытия диалога
(done_dialog). Для стандартных кнопок подтверждения и отмены закрытие
происходит автоматически (можно не вызывать функцию done_dialog).
Блок деиницилизации начинается с вызова функции done_dialog и
может включать прерывание (если необходимо) диалога функцией
term_dialog и его выгрузку – unload_dialog.
Согласно представленной структуре lisp-программы, работающей с
диалоговыми окнами, функции установки параметров (set_tile, mode_tile),
работы со списками и изображениями, а также получения значений и
атрибутов элементов управления (get_tile, get_attr) можно использовать
только непосредственно внутри блока инициализации после вызова
new_dialog, а также внутри выражений, обрабатывающих действия (атрибут
action и функция action_tile) до вызова done_dialog.
В цикле обработки событий (после вызова функции start_dialog)
нельзя вызывать функции AutoLisp, которые не связаны с диалоговым окном
или требуют ввода пользователя, не имеющего отношения к диалоговому
окну. Если необходимо ввести данные в режиме графического экрана
AutoCad, необходимо временно закрыть диалоговое окно вызовом функции
done_dialog, при этом следует запомнить в глобальных или локальных
переменных программы значения, выставленные пользователем в элементах
65