Книги_AutoCad_2 / Настройка AutoCAD_Sham_Tickoo-Customizing_2006г
.pdf
Программирование диалоговых окон с помощью языка Dialog Control Language |
541 |
Строки 41 и 42
(action_tile "accept" "(setvars) (done_dialog)") (start_dialog)
Строка 42 (start_dialog) запускает диалоговое окно, содержащее кнопку ОК, которой присвоено имя "accept". Когда вы выбираете кнопку ОК, программа обращается к функции setvars, которая обновляет значение системной переменной OSMODE и устанавливает заданные режимы объектной привязки. После этого программа вызывает функцию done_dialog, которая закрывает диалоговое окно. При выборе кнопки Cancel диалоговое окно закрывается без изменения значения системной переменной OSMODE.
Предопределенные переключатели, организованные в столбцы и строки
Одиночный переключатель
Формат в DCL: radio_button
Элемент radio_button представляет собой предварительно определенный переключатель, находящийся в активном состоянии. Переключатели (или селективные кнопки) могут быть организованы в строки или столбцы. Характерной особенностью этих элементов является то, что за один раз можно выбрать только один переключатель. Представьте, например, диалоговое окно, содержащее группу переключателей, позволяющих выбрать научную, десятичную или инженерную систему единиц измерения. В этом случае вы сможете воспользоваться только одной из указанных опций. Если вы выберете, например, кнопку Десятичные, все остальные кнопки будут автоматически выключены. Из-за этой особенности селективные кнопки могут использоваться только в блочных столбцах или строках. Метка, которая обычно располагается с правой стороны от переключателя, является необязательной.
Столбец предопределенных переключателей
Формат в DCL: radio_column
Этот элемент представляет собой предварительно определенную группу активных переключателей, организованных в вертикальный столбец. Следует заметить, что единовременно может быть выбран только один переключатель. При создании группы переключателей элементы управления располагаются вертикально друг над другом, что упрощает выбор нужной опции.
Блочный столбец селективных кнопок
Формат в DCL: boxed_radio_column
Блочный столбец селективных кнопок представляет собой группу вертикально расположенных переключателей, окруженных рамкой.
542 |
Глава 15 |
Строка предопределенных переключателей
Формат в DCL: radio_row
Этот элемент представляет собой группу предварительно определенных переключателей, организованных в горизонтальную строку. Единовременно может быть выбран только один переключатель. Строка, состоящая из нескольких переключате-
лей и соответствующих надписей, может иметь довольно большую длину. В этом случае для выбора нужной опции необходимо переместить курсор на некоторое расстояние, так как элементы управления значительно удалены друг от друга. Поэтому при создании диалоговых окон старайтесь избегать переключателей, организованных в строки, особенно если в строке содержится больше двух переключателей.
Пример 5
Напишите программу DCL для диалогового окна, с помощью которого вы сможете устанавливать нужные единицы и задавать требуемую точность измерений (рис. 15.11). Также напишите программу на языке AutoLISP, обеспечивающую выполнение функций, описанных в этом диалоговом окне.
Рис. 15.11. Диалоговое окно для примера 5
Ниже приведен листинг программы DCL для диалогового окна, показанного на рис. 15.11. Имя диалогового окна — dwgunits. Номера строк не являются частью про-
граммного кода, а используются только для ссылок.
Dwgunits : dialog { |
1 |
label = "Drawing Units" |
2 |
: row { |
3 |
: boxed_column { |
4 |
label = "Select Units"; |
5 |
: radio_column { |
6 |
: radio_button { |
7 |
key = "scientific"; |
8 |
label = "Scientific"; |
9 |
mnemonic = "S"; |
10 |
} |
11 |
: radio_button { |
12 |
key = "decimal"; |
13 |
label = "Decimal"; |
14 |
mnemonic = "D"; |
15 |
} |
16 |
Программирование диалоговых окон с помощью языка Dialog Control Language |
543 |
: radio_button { |
17 |
key = "engineering"; |
18 |
key = "Engineering" |
19 |
mnemonic = "E"; |
20 |
} |
21 |
} |
22 |
} |
23 |
: boxed_column { |
24 |
label = "Unit Precision"; |
25 |
: radio_column { |
26 |
: radio_button { |
27 |
key = "one"; |
28 |
label = "One"; |
29 |
mnemonic = "O"; |
30 |
} |
31 |
: radio_button { |
32 |
key = "two"; |
33 |
label = "Two"; |
34 |
mnemonic = "T"; |
35 |
} |
36 |
: radio_button { |
37 |
key = "three"; |
38 |
label = "Three"; |
39 |
mnemonic = "h"; |
40 |
} |
41 |
} |
42 |
} |
43 |
} |
44 |
ok_cancel |
45 |
} |
46 |
Пояснения
Строки 4 и 5
: boxed_column {
label = "Select Units";
Строка 4 определяет активный предварительно определенный элемент управления boxed_column, формирующий рамку вокруг элементов столбца. Выражение label = "Select Units", содержащееся в строке 5, обеспечивает отображение надписи Select Units в верхней части столбца. Label — предопределенный атрибут DCL.
Строки 6–8
: radio_column {
: radio_button {
key = "scientific";
Элемент radio_column представляет собой предопределенную группу активных переключателей, организованных в вертикальный столбец и окруженных рамкой прямоугольной формы. Элемент radio_button также является предварительно определенным переключателем, находящимся в активном состоянии. С правой стороны от селективной кнопки находится необязательная текстовая метка. Атрибут key присваивает этому эле-
Программирование диалоговых окон с помощью языка Dialog Control Language 545
Ниже представлен листинг программы AutoLISP, которая обеспечивает загрузку, отображение и обработку диалогового окна, описанного в данном примере. Номера строк не
являются частью программного кода, а используются только в качестве ссылок.
;;Программа dwgunits.lsp для установки единиц и точности |
1 |
;;измерения. Файловое имя диалогового окна — dwgunits.dcl |
2 |
; |
3 |
(defun c:dwgunits ( / dcl_id) |
4 |
(setq dcl_id (load_dialog "dwgunits.dcl")) |
5 |
(new_dialog "dwgunits" dcl_id) |
6 |
; |
7 |
;;Вычисление текущих значений переменных lunits и luprec |
8 |
;;и включение соответствующего переключателя. |
9 |
; |
10 |
(setq lunits (getvar "lunits")) |
11 |
(if ( = 1 lunits) |
12 |
(set_tile "scientific" "1") |
13 |
) |
14 |
(if ( = 2 lunits) |
15 |
(set_tile "decimal" "1") |
16 |
) |
17 |
(if ( = 3 lunits) |
18 |
(set_tile "engineering" "1") |
19 |
) |
20 |
; |
21 |
(setq luprec (getvar "luprec")) |
22 |
(if ( = 1 luprec) |
23 |
(set_tile "one" "1") |
24 |
) |
25 |
(if ( = 2 luprec) |
26 |
(set_tile "two" "1") |
27 |
) |
28 |
(if ( = 3 luprec) |
29 |
(set_tile "three" "1") |
30 |
) |
31 |
;;Считывание значений элементов radio_button |
32 |
33 |
|
;;и присвоение этих значений переменным lunit и luprec |
34 |
; |
35 |
(action_tile "scientific" (setq lunits 1)") |
36 |
(action_tile "decimal" (setq lunits 2)") |
37 |
(action_tile "engineering" (setq lunits 3)") |
38 |
; |
39 |
(action_tile "one" (setq luprec 1)") |
40 |
(action_tile "two" (setq luprec 2)") |
41 |
(action_tile "three" (setq luprec 3)") |
42 |
(action_tile "accept" (done_dialog)") |
43 |
; |
44 |
(start_dialog) |
45 |
(setvar "lunits" lunits) |
46 |
(setvar "luprec" luprec) |
47 |
(princ) |
48 |
) |
49 |
546 Глава 15
Пояснения
Строки 1–3
;;Программа dwgunits.lsp для установки единиц и точности измерения. ;; Файловое имя диалогового окна — dwgunits.dcl
;
Первые три строки этой программы являются строками комментариев. Каждая строка комментариев должна начинаться точкой с запятой. AutoCAD игнорирует строки, которые начинаются с этого символа.
Строки 4–6
(defun c:dwgunits ( / dcl_id)
(setq dcl_id (load_dialog "dwgunits.dcl")) (new_dialog "dwgunits" dcl_id)
В строке 4 содержится функция AutoLISP defun, которая определяет функцию dwgunits, содержащую локальную переменную dcl_id. Выражение с:, стоящее перед именем функции dwgunits, обеспечивает возможность выполнения этой функции тем же способом, что и команд AutoCAD (т.е. из командной строки). Выражение (load_dialog "dwgunits.dcl"), содержащееся в следующей строке, загружает файл dwgunits.dcl и возвращает положительное целое число. Функция setq присваивает полученное значение локальной переменной dcl_id. В следующей строке содержится функция new_dialog, которая отображает диалоговое окно dwgunits, определенное в файле DCL (строка 1 файла DCL). Переменная dcl_id содержит целочисленное значение, которое идентифицирует файл DCL.
Строка 11
(setq lunits (getvar "lunits"))
В этой строке содержится функция getvar "lunits", которая извлекает значение системной переменной lunits. Функция setq назначает полученное значение переменной lunits. Обратите внимание, что первое выражение lunits представляет собой имя локальной переменной, а выражение в кавычках ("lunits") является именем системной переменной AutoCAD.
Строки 12–14
(if ( = 1 lunits)
(set_tile "scientific" "1")
)
Функция if (функция AutoLISP) проверяет, равно ли значение переменной lunits 1. Если функция возвращает значение T (true), выполняются команды, описанные в следующей строке. Функция set_tile, содержащаяся в строке 13, присваивает элементу под именем "scientific" значение 1, что приводит к включению соответствующего переключателя. Закрывающая скобка в строке 14 завершает определение функции if. Если функция if ( = 1 lunits) возвращает значение nil, программа переходит к выполнению строки под номером 14.
Программирование диалоговых окон с помощью языка Dialog Control Language 547
Строка 22
(setq luprec (getvar "luprec"))
В этой строке содержится функция getvar "luprec", которая извлекает значение системной переменной luprec. В свою очередь, функция setq назначает полученное значение переменной luprec. Обратите внимание, что первое выражение luprec представляет собой имя локальной переменной, а выражение в кавычках ("luprec") является именем системной переменной AutoCAD.
Строки 23–25
(if ( = 1 luprec) (set_tile "one" "1")
)
Функция if, содержащаяся в строке 23, проверяет, равно ли 1 значение переменной luprec. Если эта функция возвращает значение T (true), выполняются команды, описанные в следующей строке. Функция set_tile, содержащаяся в строке 24, присваивает элементу под именем "one" значение 1, что приводит к включению соответствующего переключателя (селективной кнопки). Закрывающая скобка в строке 25 завершает определение функции if. Если функция if ( = 1 luprec) возвращает значение nil, программа переходит к выполнению строки под номером 25.
Строка 36
(action_tile "scientific" (setq lunits 1)")
При включении переключателя под именем "scientific" функция setq присваивает системной переменной lunits значение 1. Эта системная переменная определяет текущую систему измерения линейных величин. Ниже представлен список числовых значений, которые могут быть назначены переменной lunits:
1 |
Scientific (Научная) |
2Decimal (Десятичная)
3Engineering (Инженерная)
4 Architectural (Архитектурная)
5Fractional (Дробная)
Строка 40
(action_tile "one" (setq luprec 1)")
При выборе переключателя под именем "one", функция setq присваивает системной переменной luprec значение 1. Эта переменная определяет точность отображения линейных размеров, т.е. количество знаков после запятой в десятичных числах или величину знаменателя дробных или архитектурных единиц.
Программирование диалоговых окон с помощью языка Dialog Control Language 549
Атрибут edit_width, используемый с предопределенными текстовыми окнами, определяет размер этого элемента, выраженный в количестве букв или знаков, общая ширина которых равна требуемой ширине окна. Если ширина текстового окна не определена или равна 0, а атрибут fixed_width не назначен, элемент управления автоматически растягивается на всю ширину диалогового окна. При растягивании текстового окна функция PDB располагает окно и соответствующую метку с определенными интервалами, что обеспечивает выравнивание окна по правому, а метки — по левому краю.
Пример 6
Напишите программу DCL для диалогового окна, с помощью которого вы сможете задавать установки шаговой привязки к узлам сетки и параметры сетки, отображаемой в зоне лимитов (рис. 15.13). Две флаговые кнопки в верхней части диалогового окна позволяют изменять состояние режимов Snap и Grid. Кроме этого, напишите программу AutoLISP, которая будет обеспечивать загрузку, отображение и выполнение функций диалогового окна.
Листинг файла DCL для примера 6 следующий:
dwgaids : dialog {
label = "Drawing Aids";
:row {
:boxed_column { label = "SNAP";
fixed_width = true; width = 22;
:toggle { label = "On";
mnemonic = "O"; key = "snapon";
}
:edit_box {
label = "X-Spacing"; mnemonic = "X";
key = "xsnap"; edit_width = 10;
}
: edit_box {
label = "Y-Spacing"; mnemonic = "Y";
key = "ysnap"; edit_width = 10;
}
}
: boxed_column { label = "GRID"; fixed_width = true; width = 22;
: toggle {
