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

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

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

Программирование диалоговых окон с помощью языка Dialog Control Language

531

Строка 2

(setq dcl_id (load_dialog "dclwel1.dcl"))

Выражение (load_dialog "dclwel1.dccl"), содержащееся в этой строке, загружает файл dclwel1.dcl и возвращает положительное целое число. Функция setq присваивает полученное целочисленное значение переменной dcl_id.

Строка 3

(new_dialog "welcome1" dcl_id)

В этой строке функция AutoLISP new_dialog загружает диалоговое окно welcome1, определенное в файле DCL (строка 1). Переменная dcl_id содержит целое число, идентифицирующее файл DCL.

Примечание

Имя диалогового окна, указанное в программе AutoLISP (welcome1), должно совпадать с именем диалогового окна, определенного в файле DCL (welcome1).

Строки 4–6

(action_tile "accept" "(done_dialog)"

Кнопка ОК, определенная в файле DCL (пример 1), получила ASCII-имя accept (key = “accept”). Первые две строки (4 и 5) связывают кнопку ОК с выражением действия. Функция action_tile инициализирует соответствие между кнопкой ОК и выражением действия (done_dialog). При выборе кнопки ОК программа AutoLISP считывает ее значение и выполняет функцию, определенную в этом выражении. Функция done_dialog завершает работу диалогового окна.

Строка 7

(start_dialog)

Функция start_dialog дает возможность программе AutoLISP принимать информацию, вводимую пользователем в диалоговое окно.

Строка 8

(unload_dialog dcl_id)

Выражение, содержащееся в этой строке, выгружает файл DCL, идентифицированный целочисленным значением dcl_id.

Строки 9 и 10

(princ)

)

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

532

Глава 15

Обычные и блочные строки элементов

Строка (элемент row)

Формат в DCL: row

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

Блочная строка

Формат в DCL: boxed_row

Блочная строка состоит из элементов, расположенных в одну строку и окруженных рамкой прямоугольной формы. Надпись в блочной строке обычно располагается в левом верхнем углу блока прямо на линии рамки. Если атрибут метки не определен, в диалоговом окне отображается рамка, окружающая элементы блока. В некоторых системах в зависимости от используемого графического интерфейса пользователя метка раздела может находиться внутри блока.

Столбцы и переключатели

Столбец

Формат в DCL: column

Столбец представляет собой несколько однотипных элементов, расположенных вертикально друг над другом и объединенных в один составной элемент.

Блочный столбец

Формат в DCL: boxed_column

Блочный столбец представляет собой несколько однотипных элементов, сгруппированных в столбец и окруженных рам-

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

Переключатели

Формат в DCL: toggle

Переключатель (флажок), используемый в диалоговых окнах, представляет собой маленькое квадратное окошко, справа от которого находится поясняющая надпись. Эта надпись является необязательной, но каждый переключатель должен иметь соответствующую метку, с помощью которой пользователь сможет узнать, какая функция назначена данному элементу. Переключатель может иметь два состояния: включено и выключено. При включении переключателя в окошке появляется “галочка” или, другими словами, метка выбора. При выключении функции метка, размещенная внутри кнопки-флажка, исчезает. Состояние кнопки определяется значением булевой (логической) переменной.

Программирование диалоговых окон с помощью языка Dialog Control Language 533

Когда переключатель находится в положении “включено”, значение булевой переменной равно 1; когда переключатель выключен, эта переменная имеет значение 0.

Атрибуты ускоряющих клавиш

Формат в DCL: mnemonic

Пример

mnemonic = "U"

Диалоговое окно может содержать несколько элементов управления, имеющих метки различного содержания. Одним из способов выбора является выделение нужного элемента с помощью клавиш управления курсором и последующее нажатие соответствующей клавиши (чаще всего клавиши <Enter>). Эта операция может быть выполнена с помощью такого координатно-указательного устройства, как кодирующий преобразователь или стандартная мышь. При отсутствии указательного устройства выделить нужный элемент довольно сложно, в таком случае можно использовать мнемонические или ускоряющие клавиши, которые назначаются различным элементам диалогового окна. Например, ускоряющей клавишей для кнопки New является буквенная клавиша <N>. В этом случае нажатие клавиши <N> на клавиатуре приведет к выделению кнопки New в диалоговом окне. В качестве ускоряющей клавиши используется буквенная клавиша, которая соответствует подчеркнутой букве в строке меню или диалога. Подчеркивание буквы выполняется автоматически при определении атрибута mnemonic, относящегося к данному элементу. В метке элемента в качестве мнемонического символа может быть выбрана только одна буква, причем различным элементам диалогового окна должны быть назначены разные ускоряющие клавиши. Если в диалоговом окне имеется несколько элементов с одинаковыми подчеркнутыми буквами, то при нажатии соответствующей клавиши будет выделен только один элемент. Мнемонические символы нечувствительны к регистру клавиатуры; таким образом, для выделения кнопки New можно использовать как прописную (N), так и строчную (n) букву. Тем не менее, символы метки, выбранные вами при определении ускоряющих клавиш, должны быть напечатаны заглавными буквами. Это упростит их распознавание.

Примечание

Некоторые графические интерфейсы пользователей (GUI) не поддерживают использование мнемонических атрибутов. Такие системы не позволяют выделять элементы диалоговых окон с помощью соответствующих буквенных клавиш. В этом случае для выделения элементов управления используется координатно-указательное устройство.

Пример 3

Напишите программу на языке DCL для диалогового окна, с помощью которого вы сможете устанавливать различные режимы объектной привязки (рис. 15.8). Элементы управления организованы в блочную строку, состоящую из двух столбцов.

Прежде чем писать программу, особенно на языке DCL, необходимо продумать организацию диалогового окна. В данном примере описывается процесс проектирования окна. Следует заметить, что при самостоятельной разработке необходимо обращать особое внимание на расположение элементов диалогового окна. Структура программы DCL во многом зависит от внешнего вида создаваемого окна. На рис. 15.8 показан один из возможных вариантов диалогового окна, описанного в примере 3. В данном диалоговом окне имеется две строки и два столбца. Первая строка содержит два столбца; во второй строке столбцов нет (рис. 15.9).

534

Глава 15

Рис. 15.8. Диалоговое окно привязки объектов

Рис. 15.9. Структура диалогового окна

Ниже представлен листинг программы для примера 3. Номера строк не являются

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

Osnaps : dialog {

1

label = "Running Object Snaps"

2

: boxed_row {

3

label = "Select Object Snaps"

4

: column {

5

: toggle {

6

label = "Endpoint";

7

key = "Endpoint";

8

mnemonic = "E";

9

fixed_width = true;

10

}

11

: toggle {

12

label = "Midpoint";

13

key = "Midpoint";

14

mnemonic = "M";

15

fixed_width = true;

16

}

17

}

18

: column {

19

: toggle {

20

label = "Intersection";

21

key = "Intersection";

22

Программирование диалоговых окон с помощью языка Dialog Control Language

535

mnemonic = "I";

23

fixed_width = true;

24

}

25

: toggle {

26

label = "Center";

27

key = "Center";

28

mnemonic = "C";

29

fixed_width = true;

30

}

31

}

32

}

33

ok_cancel

34

}

35

Пояснения

Строки 3 и 4

: boxed_row {

label = "Select Object Snaps"

В первой строке boxed_row — предварительно определенный групповой элемент, создающий рамку вокруг элементов группы. Во второй строке выражение label = "Select Object Snaps" обеспечивает отображение метки Select Object Snaps в левом верхнем углу создаваемого раздела. Выражение label — предопределенный атрибут DCL.

Строки 5–7

:column {

:toggle {

label = "Endpoint";

Выражение column — предопределенный атрибут DCL, организующий элементы управления в вертикальный столбец. Другой предопределенный атрибут toggle вводит в диалоговое окно маленькое квадратное окошко (флажок), справа от которого находится текстовая надпись. Атрибут label отображает метку Endpoint, которая располагается с правой стороны флажка.

Строки 8–11

key = "Endpoint"; nemonic = "E"; fixed_width = true;

}

Атрибут key присваивает элементу управления имя Endpoint. В дальнейшем присвоенное имя будет использоваться прикладной программой для управления данным элементом. Вторая строка (mnemonic = "E";) определяет ускоряющую клавишу для флаговой кнопки Endpoint. В результате этого буква “Е”, с которой начинается слово “Endpoint”, будет показана в диалоговом окне в подчеркнутом виде. Атрибут fixed_width используется для контроля над шириной элемента управления. Например, для того чтобы элемент имел фиксированную ширину, а не растягивался на всю длину диалогового окна, атрибут fixed_width должен иметь значение true. Закрывающая фигурная скобка (}), содержащаяся в следующей строке, завершает определение флажка.

536

Глава 15

Строки 31–35

}

}

}

ok_cancel

}

Закрывающая фигурная скобка, содержащаяся в строке 31, завершает определение переключателя (флажок), а закрывающая скобка в строке 32 завершает определение столбца, начатое в строке 19. Закрывающая скобка в строке 33 завершает определение элемента boxed_row (блочной строки), начинающееся в строке 3. Предопределенный элемент ok_cancel обеспечивает ввод стандартного кнопочного субблока, содержащего кнопки OK и Cancel. Закрывающая скобка в последней строке завершает определение диалогового окна.

Написав программу, загрузите файл DCL и выведите на экран созданное диалоговое окно, используя для этого следующие команды. Предполагается, что файл программы сохранен под именем osnapsh.dlc. Если загрузка файла будет выполнена успешно, AutoCAD возвратит целое число. Как показано в следующем примере, целое число, возвращенное программой AutoCAD, равно 1. На рис. 15.10 показано, как будет выглядеть окно AutoCAD после загрузки созданного вами диалогового окна.

Рис. 15.10. Окно программы AutoCAD, содержащее диалоговое окно, созданное в примере 3

Программирование диалоговых окон с помощью языка Dialog Control Language

537

Загрузка программы DCL приведет к “замораживанию” AutoCAD. О том, как выйти из этого положения, вы можете узнать из примечания на стр. 7, а сейчас просто “прибейте” загруженную программу, используя для этого диспетчер задач Windows.

Command: (load_dialog "osnapsh.dcl") 1

Command: (new_dialog "osnapsh" 1)

Функции AutoLISP

Функции logand и logior

Функции AutoLISP logand и logior используются для получения значения логической функции И (AND) и логической функции включающее ИЛИ (OR), возвращенного при обработке числового массива.

Примеры использования функции logand

logand

(2

7)

 

возвращает 2

logand

(8

15)

7)

возвращает 8

logand

(6

15

возвращает 6

logand

(6

15

1)

возвращает 0

logand

(1

4)

 

возвращает 0

logand

(1

5)

 

возвращает 1

Примеры использования функции logior

logior

(2

7)

 

возвращает 7

logior

(8

15)

7)

возвращает 15

logior

(6

15

возвращает 15

logior

(6

15

1)

возвращает 15

logior

(1

4)

 

возвращает 5

logior

(1

5)

 

возвращает 5

Одной из областей использования битовых флагов являются режимы объектной привязки. Ниже приведен список битовых флагов, которые назначены различным режимам привязки объектов:

Режим привязки

Битовый флаг

Режим привязки

Битовый флаг

None

0

Intersection

32

Endpoint

1

Insertion

64

Midpoint

2

Perpendicular

128

Center

4

Tangent

256

Node

8

Nearest

512

Quadrant

16

Quick

1024

Apparent Intersection

2048

Extension

4096

Parallel

8192

 

 

Для определения режимов объектной привязки используется системная переменная OSMODE. Например, если этой переменной присвоить значение 4, привязка будет выполняться по центру объекта. Для того чтобы задать несколько текущих режимов объектной привязки, необходимо просуммировать соответствующие битовые флаги. Сложите бито-

538

Глава 15

вые флаги режимов привязки по конечной точке, середине и центру объекта (1 + 2 + 4 = 7), а затем присвойте полученное значение системной переменной OSMODE. Тем самым вы зададите указанные режимы объектной привязки. В языке AutoLISP имеется функция logand, которая позволяет извлекать данные, определяющие существующие режимы объектной привязки. Например, если значение системной переменной OSMODE равно 7, то используя функцию logand, вы сможете получить различные сочетания битовых флагов, описывающих те или иные режимы привязки.

logand

(1

7)

возвращает

1

Endpoint (По конечной точке)

logand

(2

7)

возвращает

2

Midpoint (По середине)

logand

(4

7)

возвращает

4

Center (По центру)

Функции atof и rtos

Функция atof конвертирует строковое выражение в вещественное число, а функция rtos преобразует число в строку.

Примеры

(atof

"3.5")

возвратит

3.5

(rtos

8.15)

возвратит

“8.1500”

Функции get_tile и set_tile

Функция get_tile извлекает текущее значение элемента диалогового окна, а функция set_tile назначает элементу управления то или другое значение.

Примеры

(get_tile "midpoint") (set_tile "xsnap" value)

Пример 4

Напишите программу AutoLISP, которая обеспечит работоспособность диалогового окна и выполнение функций, описанных в примере 3.

Ниже приведен листинг программы AutoLISP для примера 4. Номера строк не явля-

ются частью программного кода, а используются только для ссылок.

;;Программа AutoLISP для задания режимов объектной привязки.

1

;;Файловое имя диалогового окна — osnapsh.dcl.

2

(defun c:osnapsh ( / dcl_id)

3

(setq dcl_id (load_dialog "osnapsh.dcl"))

4

(new_dialog "osnapsh" dcl_id)

5

;;Извлечение существующего значения объектной привязки

6

;;и запись полученных значений в диалоговое окно

7

(setq osmode (getvar "osmode"))

8

(if (= 1 (logand 1 osmode))

9

(set_tile "Endpoint" "1")

10

)

11

(if (= 2 (logand 2 osmode))

12

(set_tile "Midpoint" "1")

13

)

14

(if (= 32 (logand 32 osmode))

15

(set_tile "Intersection" "1")

16

Программирование диалоговых окон с помощью языка Dialog Control Language

539

)

17

(if (= 4 (logand 4 osmode))

18

(set_tile "Center" "1")

19

)

20

;;Считывание значений, заданных элементам диалогового окна,

21

22

;;и присваивание этих значений системной переменной osmode

23

(defun setvars ()

24

(setq osmode 0)

25

(if (= "1" (get_tile "Endpoint"))

26

(setq osmode (logior osmode 1))

27

)

28

(if (= "1" (get_tile "Midpoint"))

29

(setq osmode (logior osmode 2))

30

)

31

(if (= "1" (get_tile "Intersection"))

32

(setq osmode (logior osmode 32))

33

)

34

(if (= "1" (get_tile "Center"))

35

(setq osmode (logior osmode 4))

36

)

37

(setvar "osmode" osmode)

38

)

39

(action_tile "accept" "(setvars) (done_dialog)")

40

41

(start_dialog)

42

(princ)

43

)

44

Пояснения

Строки 1 и 2

;;Программа AutoLISP для задания режимов объектной привязки. ;;Файловое имя диалогового окна — osnapsh.dcl.

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

Строки 3–5

(defun c:osnapsh ( / dcl_id)

(setq dcl_id (load_dialog "osnapsh.dcl")) (new_dialog "osnapsh" dcl_id)

Выражение defun, содержащееся в строке 3, является функцией AutoLISP, которая используется для определения функции osnapsh. Перед именем определяемой функции стоит выражение c:, поэтому функция osnapsh будет выполняться точно так же, как и команды AutoCAD. Функция osnapsh имеет одну локальную переменную (dcl_id). В строке 4 содержится функция (load_dialog "osnapsh.dcl"), которая загружает файл osnapsh.dcl и возвращает положительное целое число. Функция setq назначает полученное значение локальной переменной dcl_id. При выполнении строки 5 функция new_dialog загружает диалоговое окно "osnapsh", определенное в файле DCL

540 Глава 15

(строка 1 файла DCL). Переменная dcl_id содержит целочисленное значение, которое идентифицирует файл DCL.

Строка 8

(setq osmode (getvar "osmode"))

В этой строке содержится функция getvar "osmode", которая извлекает значение системной переменной osmode. Функция setq назначает полученное значение переменной osmode. Обратите внимание, что первое выражение osmode представляет собой имя переменной, а выражение в кавычках ("osmode") является именем системной переменной AutoCAD.

Строки 9–11

(if (= 1 (logand 1 osmode)) (set_tile "Endpoint" "1")

)

Функция (logand 1 osmode), содержащаяся в строке 9, возвратит значение 1, если системная переменная OSMODE содержит битовый флаг (1), соответствующий режиму привязки к конечной точке объекта. Например, если этой системной переменной присвоено значение 7 (1 + 2 + 4 = 7), функция (logand 1 7) возвратит 1. Если значение системной переменной OSMODE равно 6 (2 + 4 = 6), функция (logand 1 6) возвратит 0. Функция if проверяет, равно ли единице значение, возвращаемое функцией (logand 1 osmode). Если функция возвращает значение T (true), выполняются команды, описанные в следующей строке. В строке 10 элементу Endpoint присваивается значение 1, что обеспечивает отображение флаговой кнопки в диалоговом окне. Закрывающая скобка, содержащаяся в строке 11, завершает определение функции if. Если функция (if (= 1 (logand 1 osmode)) возвращает значение nil, программа переходит к выполнению строки 12 этого файла.

Строки 24 и 25

(defun setvars () (setq osmode 0)

Строка 24 определяет функцию setvars, а строка 25 присваивает значение 0 переменной osmode.

Строки 26–28

(if (= "1" (get_tile "Endpoint")) (setq osmode (logior osmode 1))

)

Выражение (get_tile "Endpoint"), содержащееся в строке 26, получает значение элемента с именем Endpoint. Если флажок опции Endpoint установлен, возвращаемое значение равно 1. Если флажок этой опции снят, будет возвращено значение 0. Функция get_tile возвращает значение в виде строки (0 или 1). В строке 27 функция setq присваивает значение, возвращаемое функцией (logior osmode 1), переменной osmode. Например, если начальное значение переменной osmode равно 0, то функция (logior osmode 1) возвратит значение 1. Точно так же, если начальное значение этой переменной равно 1, функция (logior osmode 2) возвратит значение 3.

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