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

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

Функция done_dialog

Функция done_dialog используется только внутри LISP-выражений в функции action-tile или атрибуте action. Она закрывает диалоговое окно и передает значение, которое будет возвращаемым значением функции start_dialog. Синтаксис:

(done_dialog [<число>])

Аргумент <число> - это положительное целое число, которое станет возвращаемым значением функции start_dialog. Возвращаемое значение - список из двух целых чисел с координатами левого верхнего угла диалогового окна в момент его закрытия.

Пример:

(done_dialog 92) - может вернуть список (220 180), а функция start_dialog при этом вернет 92.

Функция term_dialog

Функция term_dialog закрывает все открытые диалоговые окна так, как будто пользователь вышел из каждого из них, нажимая кнопку Cancel. Синтаксис:

(term_dialog)

Возвращаемое значение - nil.

Если работа приложения прерывается по какой-то причине, а некоторые диалоговые окна остались незакрытыми, то система AutoCAD сама обеспечивает вызов функции term_dialog.

Функции управления элементами диалога

Несколько функций языка LISP управляют элементами и их действиями. Они позволяют выполнять следующие операции:

  • задавать LISP-выражение, выполняемое при выборе элемента и нажатии клавиши ENTER или щелчке левой клавишей мыши (функция action_tile);
  • отключать элемент и включать его (функция mode_tile);
  • читать текущее содержимое элемента (функция get_tile);
  • менять текущее содержимое элемента (функция set_tile);
  • читать значение атрибута элемента (функция get_attr);
  • связывать с элементом данные пользователя (функция client_data_tile).

Функция action_tile

Функция action_tile задает при помощи LISP-выражения действие, которое нужно выполнить системе AutoCAD при выборе элемента или редактировании его содержимого. Синтаксис функции:

(action_tile <код> <выражение>)

Аргументы: <код> - строка с кодом элемента, <выражение> - строка с LISP-выражением. Возвращаемое значение - Т.

Большинство элементов диалогового окна являются элементами управления. Для них должны быть описаны действия, выполняемые системой AutoCAD при выборе пользователем этого элемента. Под выбором элемента имеются в виду, в частности, такие события, вызванные пользователем:

  • нажатие клавиши Enter;
  • щелчок мышью по кнопке Button;
  • редактирование содержимого поля edit_box;
  • выбор элемента списка list_box или popup_box;
  • движение шкалы элемента slider.

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

Такое действие для каждого элемента может быть задано с помощью атрибута action DCL-файла. Значением атрибута может быть строка с LISP-выражением (там не должно быть функции command). Другой вариант задания действия - указание LISP-выражения в строке, передаваемой в качестве аргумента функции action_tile. Обращение к этой функции должно быть записано между вызовами функций new_dialog и start_dialog.

Действие, заданное с помощью аргумента <выражение> функции action_tile аннулирует действие, заданное значением атрибута action этого элемента в DCL-файле. Действие всегда задается через код элемента. Значение атрибута key передается функции action_tile в качестве аргумента <код>.

LISP-выражение в функции action_tile может использовать значения зарезервированных глобальных переменных со следующими именами:

  • $value - текущее значение рассматриваемого элемента;
  • $key - код рассматриваемого элемента;
  • $reason - тип действия, выполненного над элементом;
  • $data - данные элемента, заданные функцией client_data_tile;
  • $x и $y - координаты указанной точки внутри изображения.

Примеры:

(action_tile "accept" "(done_dialog)") - действие кнопки выхода;

(action_tile "Test" (strcat "(if (<= (atoi $value) 0))" "(alert \"Отрицательные числа не допускаются!\")")) - проверка значения элемента на отрицательные числа или ноль;

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

(action_tile "Test" "(setq myTest 1) (saveVars) (done_dialog)")

По событию с элементом "Test" выполняется три действия: переменной myTest присваивается значение 1, запускается функция saveVars и закрывается диалоговое окно. Обратите внимание, что и код и выражение всегда берутся в кавычки.

Функция mode_tile

Функция mode_tile изменяет состояние элемента диалога. Синтаксис:

(mode_tile <код> <состояние>)

Аргументы: <код> - код элемента; <состояние> - целое число от 0 до 4 (см. таблицу). Возвращаемое значение - nil.

Значение Действие
0 Включить элемент
1 Выключить элемент (сделать недоступным)
2 Выбрать элемент
3 Подсветить содержимое элемента
4 Включить/выключить подсветку изображения

При выключении элемента его цвет приглушается. Он становится недоступным для пользователя. Чтобы сделать его вновь доступным, его надо включить.

Примеры:

(mode_tile "k1" 1) - выключает элемент с кодом k1;

(mode_tile "k1" 0) - включает элемент с кодом k1.

Функция set_tile

Функция set_tile позволяет менять содержание диалога, заданное атрибутом value.

(set_tile <код> <значение>)

Аргументы: <код> - код элемента; <значение> - строка с новым значением, присваиваемым атрибуту value данного элемента.

Возвращаемое значение - значение второго аргумента, переданного функции.

Функция get_tile

Функция get_tile читает содержимое элемента диалога (текущее значение атрибута value). Синтаксис:

(get_tile <код>) 

Аргумент - строка с кодом элемента.

Возвращаемое значение - строка с текущим значением атрибута value.

Функция get_attr

Функция get_attr читает значение атрибута элемента текущего каталога:

(get_attr <код> <атрибут>)

Аргументы: <код> - строка с кодом элемента, <атрибут> - строка с именем атрибута. Возвращаемое значение - строка со значением атрибута элемента.

Пример:

(get_attr "user" "alignment") - возвратит "centered"

Функция client_data_tile

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

(client_data_tile <код> <данные>)

Аргументы: <код> - строка с кодом элемента, <данные> - строка с пользовательскими данными. Возвращаемое значение - nil.

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

Пример:

(client_data_tile "user" "2110") - связывает строку 2110 с элементом "user".

Переменные действия

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

$key, $value, $reason, $data, $x, $y.

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

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

Переменная Значение
$key Код элемента (во всех элементах)
$value

Значение атрибута value во всех элементах.

Для поля edit_box - это введенная строка;

Для toggle - "1" (включен) или "0" - выключен;

Для list_box и popup_list - строка с номером (номерами) выбранных элементов списка или nil, если ни один элемент списка не выбран

$data Строка с пользовательскими данными, привязанными к элементу
Sreason Для элементов edit_box, list_box, image_button и slider - число с кодом причины прерывания работы с элементом (см. следующую таблицу)
$x, $y Координаты в пикселях указанной пользователем точки внутри изображения для элемента image_button

Примеры:

(action_tile "user" "(setq nam (strcat \ "Пользователь: \" $value))");
(action_tile "cldat" "(setq tyg (read $data))");
Значения переменной $reason
Значение Описание
1 Обычный вариант действия с элементом, в том числе, пользователь выбрал элемент, нажата клавиша ENTER, а элемент имеет значение true атрибута is_default
2 Для поля edit_box: пользователь вышел из поля, но не завершил редактирование (например, нажал клавишу TAB или выбрал другой элемент)
3 Для элемента slider: пользователь изменил значение элемента с помощью указателя шкалы, но не завершил ввода
4 Для элементов list_box и image_button: пользователь выполнил двойной щелчок. Если multiple_selection=false, то это должно означать окончательный выбор. Если multiple_selection=true, то это должно обрабатываться как обычный выбор (значение 1).
Алексей Тимонин
Алексей Тимонин
Алексей Потапкин
Алексей Потапкин

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

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

Public Sub DrawHatchedBox()

...

End Sub

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