Опубликован: 21.02.2012 | Уровень: специалист | Доступ: платный
Лекция 6:

Программирование диалоговых окон на языке DCL

Директивы и элементы языка DCL

Технология создания диалоговых окон изложена в предыдущем разделе. Сейчас разберем более подробно отдельные элементы и синтаксис языка DCL с использованием LISP-программ.

Директива описания диалога

Директива описания диалога задает имя, по которому диалоговое окно вызывается из программы на экран. Директива использует ключевое слово dialog:

<имя>:dialog{<атрибуты><элементы>}

В качестве имени диалога может быть использован любой идентификатор, не совпадающий со служебными словами. Имена диалогов в одном сеансе AutoCAD не должны повторяться. Параметр >атрибуты< - это последовательность разделяемых точкой с запятой операций задания атрибутам значений:

<атрибут1>=<значение1>;<атрибут2>=<значение2>;…

Параметр <элементы> является набором директив описания элементов (текстовых полей, кнопок, списков, надписей, флажков и пр.).

Имена атрибутов и элементов должны быть стандартными ключевыми словами. Значения атрибутов могут быть числами или строками, - в зависимости от атрибута. Если директива описывает элемент диалогового окна, то параметр <атрибуты> - это описание атрибутов элемента и их значений, отличных от значений по умолчанию. Если директива является директивой группировки элементов, то она содержит внутри фигурных скобок директивы определения группируемых элементов.

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

Атрибут Описание Допустимые значения Значение по умолчанию
Label Начальный текст заголовка диалогового окна Строка " " (пробел)
Value Текущий текст заголовка диалогового окна Строка Нет
Key Код диалога Строка Нет
Width Ширина окна Число Нет
Height Высота окна Число Нет
initial_focus Код подсвеченного элемента в диалоговом окне Строка Нет
children_alignment Способ выравнивания подчиненных элементов по умолчанию left, right, centered (для колонок), top, bottom, centered (для рядов) left (для колонок), centered (для рядов)
children_fixed_width Фиксация ширины подчиненных элементов по умолчанию true, false false
children_fixed_height Фиксация высоты подчиненных элементов по умолчанию true, false false

Атрибуты label и value близки по смыслу. Различие между ними состоит в том, что атрибут label влияет на размер окна, а значение атрибута value - не влияет. Атрибут key обеспечивает возможность изменить программно заголовок выводимого диалогового окна. В качестве значения кода диалога могут использоваться только строки.

Атрибут width задает минимальную ширину окна в условных символах. Ширина символа равна средней ширине символа латинского алфавита шрифта по умолчанию. Ширина окна вычисляется системой по размерам заголовка и элементов. Если она получилась меньше, чем задано в значении атрибута width, то она увеличивается. То же самое справедливо для атрибута height, только здесь задается высота окна в количестве условных высот символа шрифта.

Атрибут initial_focus указывает код элемента, который подсвечивается по умолчанию и выполняет действие при нажатии пользователем клавиши ENTER.

Три атрибута с префиксом children задают свойства не самого диалога, а входящих в него элементов. Атрибут children_alignment задает способ, которым система AutoCAD выравнивает элементы, размещенные в диалоговом окне. По умолчанию элементы диалога, расположенные в колонку, выравниваются влево, а элементы, расположенные в ряд, выравниваются по центру. На элементы, у которых задан свой атрибут alignment, значение атрибута children_alignment не влияет.

Атрибуты children_fixed_width и children_fixed_height обычно задают тогда, когда их значение равно true. Это означает, что по умолчанию размеры подчиненных элементов (например, кнопок) не изменяются при выводе диалогового окна. Система не будет растягивать кнопки, а будет лишь изменять расстояния между ними.

В среде Visual LISP имеется способ проверки внешнего вида диалогового окна без загрузки DCL-файла в память системы. Для этого нужно запустить команду Tools - Interface Tools - Preview DCL in Editor. Активизируется диалоговое окно, в котором нужно выбрать имя диалога. После этого диалоговое окно отобразится на экране.

Элементы диалога

Внутри директивы описания диалога размещены директивы описания элементов. Эти директивы записываются в форме:

[<метка>]:<оператор>{<атрибуты>}

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

В директивах в качестве значения <оператор> могут использоваться следующие наименования элементов:

  • button - кнопка;
  • edit_box - редактируемое текстовое поле;
  • errtile - поле для отображения сообщений об ошибках;
  • image - поле с изображением;
  • image_button - кнопка с изображением;
  • list_box - список;
  • popup_list -раскрывающийся список;
  • radio_button - переключатель;
  • radio_column - вертикальная группа переключателей;
  • radio_row - горизонтальная группа переключателей;
  • boxed_radio_column - конка переключателей в рамке;
  • boxed_radio_row - ряд переключателей в рамке;
  • slider - скользящая шкала;
  • toggle - флажок;
  • column - колонка (средство объединения элементов);
  • row - ряд (средство объединения элементов);
  • text - нередактируемое текстовое поле;
  • text_part - часть текста, включаемая в элементы concatenation и paragraph;
  • concatenation - горизонтальное соединение элементов text_part;
  • paragraph - вертикальное соединение элементов text_part и concatenation;
  • spacer - пустой элемент ширины width и высоты height;
  • spacer_0 - элемент c нулевыми значениями ширины width и высоты height;
  • spacer_1 - элемент spacer c единичными значениями width и height.

В файле base.dcl определены следующие элементы, ссылки на которые очень часто применяются в пользовательских диалоговых окнах:

  • ok_button - элемент с одной кнопкой ОК;
  • ok_only - элемент в виде колонки с одной кнопкой ОК;
  • ok_cancel - элемент из кнопок OK и Cancel;
  • ok_cancel_help - элемент из кнопок OK, Cancel и Help;
  • ok_ cancel_err - элемент из кнопок OK и Cancel и полем сообщений об ошибках;
  • ok_cancel_help_errtile - элемент из кнопок OK, Cancel, Help и полем сообщений об ошибках;
  • ok_cancel_help_info - элемент из кнопок OK, Cancel, Help и Info.

Все эти элементы содержат кнопку выхода из диалогового окна. Ниже приведены коды (keys) стандартных элементов, включенные в элементы с кнопкой выхода.

Элемент (кнопка) Код элемента
OK "accept"
Cancel "cancel"
Help "help"
Info "info"
Поле сообщений об ошибках "error"

Атрибуты элементов

При описании элемента нет необходимости перечислять значения всех его атрибутов. Достаточно указать только те атрибуты, значения которых должны отличаться от значений по умолчанию. Большая часть атрибутов (например, label, value, key, width, height и др.) применяется во всех элементах. Однако смысл атрибута в разных элементах может быть различным.

Ниже приведены некоторые часто употребляемые атрибуты

Атрибут Описание Допустимые значения Область применения Значения по умолчанию
Action Действия, выполняемые при выборе данного элемента Строка с текстом AutoLISP Элементы управления " "
alignment Способ выравнивания left, right, centered; top, bottom, centered Все элементы left, centered
Color Цвет 0-256 или black, red, yellow, green, cyan, blue, magenta image 7
edit_width Количество видимых символов в редактируемом поле Целое число edit_box Максимально возможное
is_cancel Признак срабатывания при нажатии ESC true, false button (только один элемент) false
is_default Признак срабатывания при нажатии ENTER true, false button (только один элемент) false
Key Код элемента Строка Все элементы Нет
Label Начальный заголовок Строка Все элементы " "
List Начальное состояние списка Строка с элементами списка (разделитель \n) list_box, popup_list Нет
multiple_select Разрешение множественности выбора true, false list_box false
password_char Символ, закрывающий текст вводимого пароля Символ Edit_box Нет
Value Начальное значение Строка Все элементы Нет

Функции открытия и закрытия диалоговых окон

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

Функция load_dialog

Функция load_dialog загружает DCL-файл в оперативную память компьютера. Синтаксис функции:

(load_dialog <файл>)

Аргумент <файл> - текстовая строка (текст в кавычках) с именем файла. Возвращаемое значение - положительное целое число при успешной загрузке. Это число является порядковым номером DCL-файла, загруженного в данном сеансе работы с сиcтемой AutoCAD. Если загрузка не выполнена, то функция возвращает отрицательное число. Если в имени файла не указан полный путь, то система AutoCAD пытается найти файл, просматривая все маршруты файлов поддержки.

Функция unload_dialog

Функция unload_dialog выгружает DCL-файл из оперативной памяти компьютера. Синтаксис функции:

(unload_dialog <номер>)

Аргумент <номер> - положительное целое число, которое было возвращено при вызове функции load_dialog. Возвращаемое значение - nil.

Функция new_dialog

Функция new_dialog открывает на экране диалоговое окно, если его диалог уже загружен в оперативную память в составе DCL-файла. Синтаксис функции:

(new_dialog <диалог> <номер> [<действие> [<положение>]])

Аргументы:

  • <диалог> - текстовая строка с именем диалога;
  • <номер> - положительное целое число, возвращаемое функцией load_dialog;
  • <действие> - строка с LISP-выражением (если нет действия, оставить "");
  • <положение> - координаты левого верхнего угла диалогового окна.

Функция возвращает Т, если диалоговое окно открылось, и nil, если возникла ошибка открытия. Когда по условиям задачи аргумент <положение> должен быть задан, то должен быть задан и аргумент "действие". Это действие будет выполнено только тогда, когда пользователь выбрал элемент, для которого не задано действие с помощью атрибута action или функции action-tile.

Пример:

(new_dialog "cone" num "" (list 111 222)) - открывает диалоговое окно с диалогом cone. 
Левый верхний угол помещен в точку (111,222). Функция возвращает T.

Функция start_dialog

Функция start_dialog активизирует диалоговое окно и готовит систему AutoCAD к приему действий пользователя в этом окне. Синтаксис:

(start_dialog)

Возвращает целое число, которое было передано в качестве аргумента функции done_dialog. Если приложение закрывает диалоговое окно, а функции done_dialog при этом не передано никакого аргумента, то функция start_dialog возвратит:

  • 1 - если пользователь выйдет из диалогового окна с помощью кнопки ОК;
  • 0 - если пользователь выйдет из диалогового окна с помощью кнопки Cancel;
  • -1 - если работа всех диалоговых окон будет прервана с помощью функции term_dialog.
Алексей Тимонин
Алексей Тимонин
Алексей Потапкин
Алексей Потапкин

Здравствуйте.

Подскажите, пожалуйста, каким образом можно передать параметры в макрос написанный в Autocad на VBA? Например, есть процедура, которая отрисовывает заштрихованный прямоугольник (см. ниже). Как её изменить, чтобы на входе от пользователя требовалось ввести также в качестве параметров координаты углов прямоугольника?

Public Sub DrawHatchedBox()

...

End Sub

Сергей Ивков
Сергей Ивков
Россия, Геленджик
Юлия Мягчилова
Юлия Мягчилова
Россия