Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Книги_AutoCad_2 / Настройка AutoCAD_Sham_Tickoo-Customizing_2006г

.pdf
Скачиваний:
182
Добавлен:
09.04.2015
Размер:
9.06 Mб
Скачать

Программирование диалоговых окон с помощью языка 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 присваивает этому эле-

544 Глава 15

менту имя scientific. В дальнейшем присвоенное имя будет использоваться прикладной программой для управления указанным элементом.

Строки 9–11

label = "Scientific"; mnemonic = "S";

}

Атрибут label обеспечивает отображение метки Scientific, которая обычно располагается справа от окошка переключателя. Вторая строка (mnemonic = "S";) определяет ускоряющую клавишу, используемую для выбора опции Scientific. В результате этого буква S, с которой начинается слово Scientific, будет отображена в диалоговом окне в подчеркнутом виде. В следующей строке содержится закрывающая фигурная скобка (}), которая завершает определение переключателя.

Строки 41–46

}

}

}

}

ok_cancel

}

Закрывающая фигурная скобка, содержащаяся в строке 41, завершает определение переключателя (селективной кнопки), а закрывающая скобка в следующей строке завершает определение столбца переключателей. Закрывающая скобка в строке 43 завершает определение элемента boxed_column (блочного столбца), а закрывающая фигурная скобка в строке 44 завершает определение строки элементов, начинающееся в строке 3 файла DCL. Предопределенный элемент ok_cancel обеспечивает ввод стандартного кнопочного субблока, содержащего кнопки OK и Cancel. Закрывающая скобка в последней строке завершает определение диалогового окна.

Загрузите файл DCL и выведите на экран диалоговое окно, используя следующие команды. Предполагается, что файл программы сохранен под именем dwgunits.dlc, а имя диалогового окна — dwgunits. Если загрузка файла будет выполнена успешно, AutoCAD возвратит целое число. В рассматриваемом примере программа AutoCAD возвращает число 5. На рис. 15.12 показано, как будет выглядеть диалоговое окно после загрузки программы.

Command: (load_dialog "dwgunits.dcl") 5

Command: (new_dialog "dwgunits" 1)

Рис. 15.12. Диалоговое окно, созданное в примере 5

Программирование диалоговых окон с помощью языка 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. Эта переменная определяет точность отображения линейных размеров, т.е. количество знаков после запятой в десятичных числах или величину знаменателя дробных или архитектурных единиц.

548 Глава 15

Строки 43–47

(action_tile "accept" (done_dialog)")

;

(start_dialog)

(setvar "lunits" lunits) (setvar "luprec" luprec)

Кнопка ОК, находящаяся в диалоговом окне, получает имя "accept". Когда вы выбираете эту кнопку, программа выполняет функцию, которая была определена в диалоговом окне dwgunits. Функция start_dialog запускает диалоговое окно. При выполнении строк (setvar "lunits" lunits) и (setvar "luprec" luprec) значения системных переменных lunits и luprec присваиваются локальным переменным lunits и luprec, соответственно.

Текстовое окно

Формат в DCL: edit_tile

Текстовое окно представляет собой предопределенный активный элемент управления, позволяющий вводить и редактировать однострочные текстовые выражения. Если длина выражения превышает ширину текстового окна, вводимый текст автоматически “прокручивается” в правую или левую сторону. Метка является необязательной и обычно отображается слева от текстового окна.

Атрибуты width и edit_width

Атрибут width

Формат в DCL: width

Пример

width = 22

Атрибут width обеспечивает сохранение начальных размеров элементов диалогового окна. Этому атрибуту может быть назначено вещественное или целое число, представляющее собой количество букв или знаков, общая ширина которых соответствует требуемой длине элемента. Значение, назначенное атрибуту width, определяет минимальную ширину элемента. В приведенном примере минимальная ширина элемента равна 22. Тем не менее, при наличии свободного места элементы управления будут автоматически растягиваться во всю длину диалогового окна. Заданный размер (22) будет сохраняться только в том случае, если данному элементу назначен атрибут fixed_width. Следует заметить, что атрибут width может использоваться с любым элементом.

Атрибут edit_width

Формат в DCL: edit_width

Пример

edit_width = 10

Рис. 15.13. Диалоговое окно для примера 6

Программирование диалоговых окон с помощью языка 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 {

550

Глава 15

label = "On"; mnemonic = "n"; key = "gridon";

}

: edit_box {

label = "X-Spacing"; mnemonic = "S";

key = "xgrid"; edit_width = 10;

}

: edit_box {

label = "Y-Spacing"; mnemonic = "p";

key = "ygrid"; edit_width = 10;

}

}

}

ok_cancel

}

Ниже приведен листинг программы AutoLISP для примера 6. Когда эта программа будет загружена и запущена, она загрузит диалоговое окно, выведет его на экран и обеспечит выполнение всех его функций (рис. 15.14).

Рис. 15.14. Окно программы AutoCAD с диалоговым окном для примера 6

Соседние файлы в папке Книги_AutoCad_2