Книги_AutoCad_2 / Настройка AutoCAD_Sham_Tickoo-Customizing_2006г
.pdf
Программирование диалоговых окон с помощью языка 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. Закрывающая фигурная скобка (}), содержащаяся в следующей строке, завершает определение флажка.
Программирование диалоговых окон с помощью языка 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.
