MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_01C89E58.7D2470F0" Данный документ является веб-страницей в одном файле, также называемой файлом веб-архива. Если вы видите это сообщение, значит, данный обозреватель или редактор не поддерживает файлы веб-архива. Загрузите обозреватель, поддерживающий веб-архивы, например Windows® Internet Explorer®. ------=_NextPart_01C89E58.7D2470F0 Content-Location: file:///C:/D16B49F6/Lesson6.htm Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset="windows-1251"
Урок 6. =
span>Программирование
диалоговых окон на языке DCL
1. Технология
программирования диалогов=
1
2. Директивы
и элементы языка DCL<=
/span>=
.. =
6
3. Функции
открытия и закрытия диалоговых окон=
. =
9
4. Функции
управления элементами =
span>диалога=
. =
11
5. Функции
для работы со списками=
14
6. Функции
для работы с графическими элементами=
. =
15
В диалоговых окнах удобно вводить данные и настройки созданных = LISP-приложений. Для создания диалоговых окон разработан специальный язык DCL (= span>Dialog Control Language). Диалоговые окна описываются в текстовых DCL-файлах с расширением .dc= l. Примерами <= span style=3D'mso-bookmark:_Toc190054325'>DCL-файлов являются ф= айлы с описанием стандартных диалогов acad.dcl и base.dcl, размещенные в па= пке C:\Documents and Settings\User\Application Data\Autodesk\AutoCAD 2007\R17.1\enu\Support. Работа с диалогами производится в интегрированной среде разработки <= /span>Visual LISP.
В предыдущих уроках была составлена = span>LISP-программа вычерч= ивания полого рога.
(defun =
c:qrog
(/ cenrt1 rad1 diam1 circle1 arc1 rog1 thick1 angle1 endp1 col1)
(setq centr1 '(0 0 0)) ;исходная базовая точка
(setq rad1 (getreal "Задайте радиус базовой окружности: "))
(setq diam1 (getre= al "Задайте диаметр направляющей дуги: "))
(setq thick1 (getr= eal "Задайте толщину стенки рога: "))
(setq col1 (getint "Задайте индекс цвета: "))
(setq angle1 (* 55.0 (atan r=
ad1 (*
diam1 (/ pi 2)))))
(command "_view" "_top") ;начинаем со стандартного вида
(command "_view" "_swiso");переходим к северо-западному виду
(command "_circle" centr1 rad1 "") ;строим базовую окружность
(setq circle1 (entlast));извлекаем имя сущности для базовой окружности
(command "_ucs"
"_x" "90" "");поворачиваем ПСК
(setq endp1 (list diam1 0.0))
(command "_arc" centr1
"e" endp1 "a" "-180" "")
(setq arc1 (entlast));извлекаем = имя сущности для дуги и сохраняем его
(command
"_ucs" "_x" "-90");совмещаем плоскость окружн=
ости
с плоскостью XY
(command "extrude" circle1
"" "t" angle1 "p" arc1 "")
(setq rog1 (entlast));извлекаем = имя сущности для рога и сохраняем его
(command "_zoom" "e" "");растягиваем изображение на ве= сь экран
(command "_vscurrent" "_r" "");устанавливаем текущий визуальный стиль - realistic
(command "_chprop"
"_all" "" "_color" col1 "")
(command "_view"
"_bottom" "");устанавливаем вид снизу
(command "_solidedit" "_=
body"
"_shell" rog1 centr1 "" thick1 "" ""=
;)
(command "_erase" = span>arc1 "");уд= аляем ненужную образующую дугу
(princ)
)
Внешний вид рога показан на рис.6.1.= span>
Рис. 6.1. Рисунок рога= p>
Рог строился путем экструзии базовой окружности вдоль дуги с раствором 180о. Угол сужения брался равн= ым углу сужения подобного прямого конуса. Полость в роге выполнялась с помощью команды Shell. =
При запуске функции qrog пользователь задавал требуемые параметры по запросам программы:
<= span style=3D'mso-bookmark:_Toc190054325'>·&nb= sp; радиус базовой окружности = rad1;
<= span style=3D'mso-bookmark:_Toc190054325'>·&nb= sp; диаметр направляющей дуги diam1;= span>
<= span style=3D'mso-bookmark:_Toc190054325'>·&nb= sp; толщину стенки рога thick1;<= /span>
<= span style=3D'mso-bookmark:_Toc190054325'>·&nb= sp; индекс цвета col1.
Требуется вместо запросов создать диал= оговое окно для одновременного ввода этих параметров.
Вначале напишем отдельную программу для открытия диалогового окна. В новом чертеже AutoCAD откройте среду Visual LISP по команде Tools — AutoLISP — Vi= sual LISP Editor. По команде File — New File создайте новый файл. Наберите в нем следующий текст программы диалога «rog» на языке DCL. Учтите только, что элементы языка DCL чувствительны к р= егистру. Все ключевые слова, метки и коды элементов должны состоять только из латинс= ких букв, цифр и символа подчеркивания. Начинаться служебные слова должны с латинской буквы.
//Диалоговое окно установки параметров рога
//
rog: dialog{label=3D"Установка параметров рога";= span>
:edit_box{label=3D"Радиус окружности ";key=3D"rad"
;value=3D"0.00"; edit_width=3D8;}
:edit_box{label=3D"Диаметр<=
/span> дуги, мм
:edit_box{label=3D"Толщина<=
/span> стенки, мм
:spacer{height=3D1;}
:edit_box{label=3D"Индекс=
span> цвета";key=3D"col"=
;value=3D"0";edit_width=3D4;}
:spacer{height=3D1;}
ok_cancel;
}
Сохраните написанное в файле C:\Program Files\AutoCAD2007\Support\Rog.dcl. Па= пка = Support= принадлежит= span> к маршрутам файлов поддержки. Проверьте это еще раз, выполнив команду = Tools — Options — Files — Su= pport File Search Path. Чтобы открыть диалоговое окно на экране, система должна загрузить DCL-файл. Эта загрузка будет выполнена автоматически, если = span>DCL-файл помещен в да= нную папку. Иначе нужно указывать полный путь к файлу.
Вся написанная программа называется диалогом. В о=
дном
файле может быть несколько диалогов. Рассмотрим структуру программы-диалога=
.
За двойной чертой // до конца строки размещается комментар= ий. В нашей программе комментарий занимает первые две строки. Далее программа содержит логически законченные единицы — директивы. Каждая директива описывает один элемент (tile) или способ группировки элементов внутри диалогового= окна. Директива должна заканчиваться фигурной скобкой или точкой с запятой. Количество открывающих скобок должно быть равно количеству закрывающих скоб= ок. При описании элементов разделителем служит точка с запятой. Текстовые строки должны быть заключены в кавычки. Между ключевыми словами языка, разделитель= ными символами, метками, числовыми и строковыми значениями может быть любое количество пробелов.
Директивы могут записываться в двух ви= дах:
[<метка>]:<оператор>{<атрибуты>}
<метка>;
Здесь квадратные скобки обозначают необязательность размещенного внутри них элемента. Фигурные скобки и двоето= чия являются обычными символами. Метка — идентификатор директивы. Она должна бы= ть уникальной в данном файле.
В листинге программы мы сразу можем вы= делить директиву описания диалога в целом:
rog: dialog {label=3D"Установка параметров рога";<= /span>
…
ok_cancel;=
}
ro= g — это метка, имя диалога;
di= alog — это оператор, он вызывает свою подпрограмму, выполняющую действия;=
la= bel=3D”…”; — эта надпись будет заголовком диалогового окна;
ok= _= cancel — внизу окна будут размещены кнопки = ОК и CANCEL (Отмена= ).
Внутри директивы dia= log размещены четыре однотипные директивы, имеющие следующий вид:=
:edit_box{label=3D"Радиус окружности "; key=3D"rad&quo=
t;; value=3D"0.00";
edit_width=3D8;}
Элементы этих директив описывают следу= ющие понятия:
ed= it_= box — оператор редактируемого текстового поля;
la= bel=3D”…”; — эта надпись будет размещена перед текстовым полем;
ke= y=3D"rad"; — код диал= ога;
va= lue=3D"0.00"; — значение, которое содержит текстовое поле по умолчанию;
ed= it_= width=3D8; — ширина окна текстового поля в символах шрифта.
В листинге программы имеются еще две о= динаковые директивы
:spacer{height=3D1;}= span>
sp= acer — это пустой элемент, обозначающий пропуск строки;
he= ight=3D1; — атрибут he= ight показывает высоту пропущенной строки. Единицей измерен= ия является стандартная высота строки текущего шрифта.
Итак, в сохраненном файле “Rog.
Составим теперь LISP-функцию, которая позволяла бы загружать (load_dialog) и= выгружать (= unload_dialog) DCL-файлы, открывать и закрывать окна загруженных диалогов. В редакторе = Visual LISP создайте новый файл и наберите в нем следующий текст:
(defun c:show_rog ( / num)
(if (< (setq num (load_=
dialog
"rog.dcl")) 0)(exit))
(if (not (new_dialog "=
;rog"
num)) (exit))
(start_dialog)
(unload_dialog num)
(princ)
);defun
В первой строке определена функция show_rog c локальной переменной num. В переменной num сохраняется внутренний номер открываемого диалогового окна. Обычно он присваивается всем вновь открываем= ым диалогам по порядку, начиная с единицы.
Во второй строке записана команда (load_dialog "rog.dcl"), загружающая файл rog.dcl. Если полный адрес файла не указан, то система и= щет этот файл по стандартному алгоритму поиска файлов поддержки. Если загрузка прошла успешно, то функция load_dialog во= звращает положительное целое число, которое присваивается переменной <= span style=3D'mso-bookmark:_Toc189925086'>num. Если загрузка не выполнила= сь, то возвращается отрицательное число. В этом случае выполняется функция = exit, прерывающая работу приложения.
В третьей строке проверяется, имеется = ли в загруженном DCL-файле rog.dcl диалог с именем “<= span class=3Daf0>rog”, имеющий номер num. Если т= акого диалога в файле нет, то программа завершается с помощью функции exit. Если такой диалог есть, то активируется диалоговое = окно, управление передается функции start_dialog. = Эта функция возвращает 1, если пользователь выйдет из диалогового окна с помощью кнопки OK или 0, если пользователь выйдет из диалогового окна с помощью кнопки Cancel.
В пятой строке функция unload_dialog = num выгружает файл из оперативной памяти. Возвращаемое значение — nil.= span>
Загрузите файл, перейдите в AutoCAD и наберите в командной строке show_rog. На экране по= явится диалоговое окно (рис. 6.2).
Рис. 6.2. Диалоговое окно
Установите параметры в текстовых полях.
Щелкните по кнопке ОК. Окно исчезнет с экрана. Файл rog.
Исключим из программы черчения рога приглашения задать параметры рога и включим обращение к диалогу «rog». На время наладки программы введем печать четырех параметров в отдельных строках.
(defun =
c:qrog
(/ cenrt1 rad1 diam1 circle1 arc1 rog1 thick1 angle1 endp1 col1)
(setq centr1 '(0 0 0)) ;исходная базовая точка
(if (< (setq num (load_di= alog "rog.dcl")) 0) (exit))<= o:p>
(if (not (new_dialog "rog"
num)) (exit))
(action_tile "rad" "(set=
q rad1
(atof $value))")
=
(terpri)
=
(princ
rad1)
(action_tile "diam" "(setq diam1 (atof $value))")<= o:p>
=
(terpri)
=
(princ
diam1)
(action_tile "thick" "(s=
etq
thick1 (atof $value))")
=
(terpri)
=
(princ
thick1)
(action_tile "col" "(set=
q col1
$value)")
(terpri)
=
(princ col1)
=
(terpri)
(start_dialog)
(unload_dialog num)
(setq angle1 (* 55.0 (atan rad1 (* diam=
1 (/
pi 2)))))
(command "_view" "_top") ;начинаем со стандартного вида
(command "_view" "_swiso");переходим к северо-западному виду
(command "_circle" centr1 rad1 "") ;строим базовую окружность
(setq circle1 (entlast));извлекаем имя сущности для базовой окружности
(command "_ucs"
"_x" "90" "");поворачиваем ПСК
(setq endp1 (list diam1 0.0))
(command "_arc" centr1
"e" endp1 "a" "-180" "")
(setq arc1 (entlast));извлекаем = имя сущности для дуги и сохраняем его
(command "_ucs" "_x" "-90");совмещаем плоскость окружн= ости с плоскостью XY
(command "extrude" circle1
"" "t" angle1 "p" arc1 "");с=
оздаем тело рога
(setq rog1 (entlast));извлекаем = имя сущности для рога и сохраняем его
(command "_zoom" "e" "");растягиваем изображение на ве= сь экран
(command "_vscurrent" "_r" "");устанавливаем текущий визуальный стиль realistic
(command "_chprop"
"_all" "" "_color" col1 "");=
закрашиваем цветом col1
(command "_view" "_botto=
m"
"");устанавливаем вид снизу
(command "_solidedit" "_=
body"
"_shell" rog1 centr1 "" thick1 "" ""=
;);делаем полость
(command "_erase" = span>arc1 "");уд= аляем ненужную образующую дугу
( ) Для обработки данных, вводимых в текст=
овых
полях диалогового окна, применена функция =
action_tile.
Она помещена между функциями new_dialog и <=
/span>start_dialog. Фу=
нкция
имеет следующий синтаксис: ( <код> — это строка с кодом элеме=
нта; <выражение> — строка с =
span>LISP-выражением дейст=
вия, выполняемого
при выборе данного элемента; Возвращаемое значение Т.=
Функция=
action_tile
присваивает значения текстовых полей переменным функции qrog. Текстовые поля различаются по кодам этих полей. Зна=
чения
полей сохраняются в глобальной переменной $value. =
Тип
сохраненных величин — строковые константы. Чтобы обеспечить возможность
дальнейших расчетов, применено преобразование строковых констант в веществе=
нные
числа с помощью функции atof. <=
/span>action_tile <код> <выражение>)2. Директивы
и элементы языка DCL
Технология создания диалоговых окон из=
ложена
в предыдущем разделе. Сейчас разберем более подробно отдельные элементы и
синтаксис языка DCL с использованием LISP-программ.
Директива описания диалога задает имя,=
по
которому диалоговое окно вызывается из программы на экран. Директива исполь=
зует
ключевое слово
<имя>:dialog{<атрибуты><элементы>}
В качестве имени диалога может быть использован любой идентификатор, не совпадающий со служебными словами. Имена диалогов в одном сеансе AutoCAD не должны повторяться. Пара= метр <атрибуты> — это последовательность разделяемых точкой с запятой операций задания атрибутам значений:
<атрибут1>=3D<значение1>;&= lt;атрибут2>=3D<значение2>;…
Параметр <элементы> является наб= ором директив описания элементов (текстовых полей, кнопок, списков, надписей, флажков и пр.).
Имена атрибутов и элементов должны быть стандартными ключевыми словами. Значения атрибутов могут быть числами или строками, — в зависимости от атрибута. Если директива описывает элемент диалогового окна, то параметр <атрибуты> — это описание атрибутов элемента и их значений, отличных от значений по умолчанию. Если директива является директивой группировки элементов, то она содержит внутри фигурных = скобок директивы определения группируемых элементов.
Атрибуты диалога — это различные характеристики окна в целом или его отдельных элементов. В таблице приведены ключевые слова, которые могут быть использованы в качестве атрибутов в директиве описания диалога.
Атрибут |
Описание |
Допустимые
значения |
Значение
по умолчанию |
label |
Начальный текст заголовка диалогового окна= p> |
Строка |
“ “ (про=
бел) |
value |
Текущий текст заголовка диалогового окна |
Строка |
Нет |
key |
Код диалога |
Строка |
Нет |
width |
Ширина окна |
Число |
Нет |
height |
Высота окна |
Число |
Нет |
initial_focus |
Код подсвеченного элемента в диалоговом окне= |
Строка |
Нет |
children_alignment |
Способ выравнивания подчиненных элементов по умолчанию |
left, right, centered (для =
колонок), top, bottom, center=
ed (для =
рядов) |
left (д=
ля колонок),
centered (для рядов) |
children_fixed_width |
Фиксация ширины подчиненных элементов по умолчанию<= /span> |
true, false |
false |
children_fixed_height |
Фиксация высоты подчиненных элементов по умолчанию<= /span> |
true, false |
false |
Атрибуты label и value близки по смыслу. Различие между ними состоит в то= м, что атрибут label влияет на размер окна, а значение ат= рибута value — не влияет. Атрибут key= span> обеспечивает возможность изменить программно заголовок выводимого диалогово= го окна. В качестве значения кода диалога могут использоваться только строки.<= /span>
Атрибут width= задает минимальную ширину окна в условных символах. Ширина символа равна средней ширине символа латинского алфавита шрифта по умолчанию. Ширина окна вычисля= ется системой по размерам заголовка и элементов. Если она получилась меньше, чем задано в значении атрибута width, то она увеличива= ется. То же самое справедливо для атрибута height, только здесь задается высота окна в количестве условных высот символа шрифта.
Атрибут initial_focu= s указывает код элемента, который подсвечивается по умолчанию и выполняет действие при нажатии пользователем клавиши ENTER.
Три атрибута с префиксом children
задают свойства не самого диалога, а входящих в него элементов. Атрибут
Атрибуты children_fi=
xed_width
и children_fixed_height обычно задают тогда, когда=
их
значение равно
В среде Visual LISP имеется способ проверки внешнего вида диалогового окна без загрузки <= span style=3D'mso-bookmark:_Toc189925086'>DCL-файла в память си= стемы. Для этого нужно запустить команду = Tools — Interface Tools — Pr= eview DCL in Editor. Активизируется диалоговое окно, в котором нужно выбрать имя диалога. После этого диалоговое окно отобразится на экране.= p>
Внутри директивы описания диалога разм= ещены директивы описания эл= ементов. Эти директивы записываются в форме:
[<метка>]:<оператор>{<атрибуты>}
Каждый элемент является либо элементом оформления (надписи, слайды и пр.), либо э= лементом управления (кнопки, текстовые поля, списки и пр.). К элементам управления пользователь имеет доступ с помощью клавиатуры или указателя мыш= и.
В директивах в качестве значения <о= ператор> могут использоваться следующие наименования элементов:
button — кнопк= а;
edit_box — ред= актируемое текстовое поле;
errtile — поле= для отображения сообщений об ошибках;
image — поле с изображением;
image_button —= кнопка с изображением;
list_box — спи= сок;
popup_list —ра= скрывающийся список;
radio_button —= переключатель;
radio_column —= вертикальная группа переключателей;
radio_row — го= ризонтальная группа переключателей;
boxed_radio_column — конка переключателей в рамке;
boxed_radio_row — ряд переключателей в рамке;
slider — сколь= зящая шкала;
toggle — флажо= к;
column — колон= ка (средство объединения элементов);
row — ряд (сре= дство объединения элементов);
text — нередак= тируемое текстовое поле;
text_part — часть текста, вклю= чаемая в элементы concatenation и paragraph= ;
concatenation — горизонтальное соединение элементов text_part;
paragraph — вертикальное соеди= нение элементов text_part и concatenatio= n;
spacer — пустой элемент ширины= width и высоты height;
spacer_0 — элемент c нулевы= ми значениями ширины width и высоты h= eight;
spacer_1 — элемент spacer <= span lang=3DEN-US style=3D'mso-ansi-language:EN-US'>c = единичными значениями width и height.<= /p>
В файле base.= dcl определены следующие элементы, ссылки на которые очень= часто применяются в пользовательских диалоговых окнах:
ok_button — элемент с одной кн= опкой ОК;
ok_only — элемент в виде колон= ки с одной кнопкой ОК;
ok_cancel — элемент из кнопок = OK и Cancel;
ok_cancel_help — элемент из<=
span
style=3D'mso-ansi-language:EN-US'> кнопок OK, Cancel и Help;
ok_ cancel_err — элемент из кн= опок OK и Cancel и полем сообщений об = ошибках;
ok_cancel_help_errtile — элеме= нт из кнопок OK, Cancel, Help и полем сообщений об ошибках;
ok_cancel_help_info — элемент из<=
span
style=3D'mso-ansi-language:EN-US'> кнопок OK, Cancel, Help и
Info.
<= o:p>
Все эти элементы содержат кнопку выхода из диалогового= окна. Ниже приведены коды (keys) стандартных элементов, включенные в элементы с кнопкой выхода.
=
Элемент
(кнопка) |
=
Код
элемента |
OK |
“accept” |
Cancel |
“cancel” |
Help |
“help” |
Info |
“info” |
Поле
сообщений об ошибках |
“error” |
При описании элемента нет необходимости перечислять зн=
ачения
всех его атрибутов. Достаточно указать только те атрибуты, значения которых
должны отличаться от значений по умолчанию. Большая часть атрибутов (наприм=
ер, label, value,
key,
Ниже приведены некоторые часто употребляемые атрибуты<= /p>
=
Атрибут |
=
Описание |
=
Допустимые
значения |
=
Область
применения |
=
Значения
по умолчанию |
actio=
n |
Действия, выполняемые при выборе данного элемента |
Строка с текстом AutoLISP |
Элементы управления |
“ ” |
align=
ment |
Способ выравнивания |
left,=
right,
centered; top, bottom, centered |
Все элементы |
left,=
centered |
color=
|
Цвет |
0-256=
или black, red, yellow,=
green,
cyan, blue, magenta |
image=
|
7 |
edit_=
width |
Количество видимых символов в редактируемом поле |
Целое число |
edit_=
box |
Максимально возможное |
is_ca=
ncel |
Признак срабатывания при нажатии ESC |
true,=
false |
butto=
n (только
один элемент) |
false=
|
is_de=
fault |
Признак срабатывания при нажатии ENTER |
true,= false |
butto= n (только один элемент)= |
false= |
key |
Код элемента |
Строка |
Все элементы |
Нет |
label=
|
Начальный заголовок |
Строка |
Все элементы |
“ “ |
list<= o:p> |
Начальное состояние списка |
Строка с элементами списка (разделитель \n) |
list_=
box,
popup_list |
Нет |
multi=
ple_select |
Разрешение множественности выбора |
true,= false |
list_= box |
false= |
passw=
ord_char |
Символ, закрывающий текст вводимого пароля |
Символ |
Edit_=
box |
Нет |
value=
|
Начальное значение |
Строка |
Все элементы |
Нет |
Для того, чтобы вызвать на экран диалоговое окно, необ= ходимо сначала загрузить DCL<= /span>-файл, содержащий нужный диалог с описанием окна. Затем нужно открыть диалоговое о= кно. После завершения в окне всех установок оно должно быть закрыто. После закры= тия диалогового окна DCL= span>-файл выгружается из оперативной памяти. Все эти операции выполняются с помощью специальных функций.
Функция load_dialog загружает = DCL-файл в оперативну= ю память компьютера. Синтаксис функции:
(load_dialog <файл>)
Аргумент <файл> — текстовая строка (текст в кавы= чках) с именем файла. Возвращаемое значение — положительное целое число при успеш= ной загрузке. Это число является порядковым номером DCL-файла, загруженного в данном с= еансе работы с сиcтем= ой AutoCAD. Если загрузк= а не выполнена, то функция возвращает отрицательное число. Если в имени файла не указан пол= ный путь, то система AutoC= AD пытается найти файл, просматривая все маршруты файлов поддержки.
Функция unload_dialog выгружае= т DCL-файл из оперативн= ой памяти компьютера. Синтаксис функции:
(unload_dialog <номер>)
Аргумент <номер> — положительное целое число, ко= торое было возвращено при вызове функции load_dia= log. Возвращаемое значение — nil.
Функция new_dialog открывает н= а экране диалоговое окно, если его диалог уже загружен в оперативную память в состав= е DCL-файла. Синтаксис = функции:
(new_dialog <диалог> <номер> [<действие> [&= lt;положение>]])
Аргументы:
<диалог> — текстовая строка с именем диалога;
<номер> — положительное целое число, возвращаемое функцией load_<= span lang=3DEN-US style=3D'mso-ansi-language:EN-US'>dialog;
<действие> — строка с LISP-выражением (если нет действия, оставить “”);
<положение> — координаты левого верхнего угла диалогового окна.
Функция возвращает Т, если диалоговое окно открылось, = и nil, если возникла ош= ибка открытия. Когда по условиям задачи аргумент <положение> должен быть задан, то должен быть задан и аргумент “действие”. Это действие будет выпол= нено только тогда, когда пользователь выбрал элемент, для которого не задано действие с помощью атрибута action или функции action-tile.
Пример:
(= new_dialog “cone” num “” (list 111 222)) — открывает диалого= вое окно с диалогом cone. Лев= ый верхний угол помещен в точку (111,222). Функция возвращает T.
Функция start_dialog активизир= ует диалоговое окно и готовит систему AutoCAD к приему действий пользователя в этом окне. Синтаксис= :
(start= span>_dialog)
Возвращает целое число, которое было передано в качест=
ве
аргумента функции done
1 — если пользователь выйдет из диалогового окна с пом= ощью кнопки ОК;
0 — если пользователь выйдет из диалогового окна с пом= ощью кнопки Cancel;
-1 — если работа всех диалоговых окон будет прервана с помощью функции term_= dialog.
Функция done_dialog использует=
ся
только внутри LISP-выражений
в функции action-tile или атрибуте actio=
n.
Она закрывает диалоговое окно и передает значение, которое будет возвращаем=
ым
значением функции start_=
dialog.
Синтаксис:
(done_dialog [<число>= ])
Аргумент <число> — это положительное целое число, которое станет возвращаемым значением функции start_= dialog. Возвращаемое значение — список из двух целых чисел с координатами левого верхнего угла диалогового окна в момент его закрытия.
Пример:
(= done_dialog 92) — может ве= рнуть список (220 180), а функция start_= dialog при этом вернет 92.
Функция term_dialog закрывает = все открытые диалоговые окна так, как будто пользователь вышел из каждого из ни= х, нажимая кнопку Cancel. Синтаксис:
(term_dialog)
Возвращаемое значение — nil.
Если работа приложения прерывается по какой-то причине= , а некоторые диалоговые окна остались незакрытыми, то система AutoCAD сама обеспечивает вызов фу= нкции term_dialog.
Несколько функций языка LISP управляют элементами и их действиями. Они позволяют выполнять следующие операции:
·&nb= sp; задавать LISP-выражение, выполняемое при выборе элемента и нажатии кла= виши ENTER или щелчк= е левой клавишей мыши (функция action_= tile);
·&nb=
sp;
отключать элемент и включать его (функция mode_tile);
·&nb= sp; читать текущее содержимое элемента (функция = get_tile);
·&nb= sp; менять текущее содержимое элемента (функция = set_tile);
·&nb= sp; читать значение атрибута элемента (функция <= span class=3Dac>get_attr);
·&nb=
sp;
связывать с элементом данные пользователя (ф=
ункция
client_data_=
tile).
Функция action_tile задает при= помощи LISP-выражения действ= ие, которое нужно выполнить системе AutoCAD при выборе элемента или редактировании его содержимого. Синтаксис функции:
(action<= /span>_tile <код> <= выражение>)
Аргументы: <код> — строка с кодом элемента, <= выражение> — строка с LISP= -выражением. Возвращаемое значение — Т.
Большинство элементов диалогового окна являются элемен= тами управления. Для них должны быть описаны действия, выполняемые системой AutoCAD при выборе пользователем этого элемента. Под выбором элемента имеются в виду, в частности, такие события, вызванные пользователем:
·&nb= sp; нажатие клавиши Enter;
·&nb= sp; щелчок мышью по кнопке Butt= on;
·&nb= sp; редактирование содержимого поля edit_box;
·&nb= sp; выбор элемента списка list_= box или popup_box;
·&nb= sp; движение шкалы элемента sli= der.
Отклик системы на события окна совершается тогда, когда после операции с одним элементом курсор перейдет к другому элементу или пользователь выйдет из диалогового окна с помощью кнопки выхода.
Такое действие для каждого элемента может быть задано с
помощью атрибута action D=
CL-файла.
Значением атрибута может быть строка с LISP-выражением (там не должно быть функции =
command).
Другой вариант задания действия — указание LISP-выражения в строке, передаваемой в качестве аргумента
функции action_tile. Обращение к этой функции должн=
о быть
записано между вызовами функций new_dialog и start_dialog.
Действие, заданное с помощью аргумента <выражение&g= t; функции action_tile аннулирует действие, заданное значением атрибута action этого элемента в DCL-= файле. Действие всегда задается через код элемента. Значение атрибута key передается функции= action_tile в качестве аргумента <код>.
L= ISP-выражение в функции action_tile может использовать значения зарезервированных глобальных переменных со следующими именами:
·&nb= sp; $value — текущее зна= чение рассматриваемого элемента;
·&nb= sp; $key — код рассматриваемого элемента;
·&nb= sp; $reason — тип действ= ия, выполненного над элементом;
·&nb= sp; $data — данные элеме= нта, заданные функцией client_data_tile;
·&nb= sp; $x и $y — координаты указанной точки внутри изображения.
Примеры:
(action_= tile “accept” “(done_= dialog)”) — действи= е кнопки выхода;
(action_= tile “Test” (strcat “(if (= <=3D (atoi $value) 0))” “(alert \”Отрицательные числа не допускаются!= span>\”)”)) — проверка значения элемента на отрицательные числа или ноль;
В этом примере длинное LISP-выражение получено сцепкой двух строк. Обратите внимание= на то, что внутренние двойные кавычки, необходимые для вызова функции alert, применяются с предшествующим слэшем.
(=
action_tile “Test” “(setq myTest 1) (saveVars) (done_dialog)”)
По событию с элементом “Test” выполняется три действия: переменной myTest п= рисваивается значение 1, запускается функция saveVars и закрывается диалоговое окно. Обратите внимание, что = и код и выражение всегда берутся в кавычки.
Функция mode_tile изменяет сос= тояние элемента диалога. Синтаксис:
(mode_tile <код> <состояние>)
Аргументы: <код> — код элемента; <состояние&g= t; — целое число от 0 до 4 (см. таблицу). Возвращаемое значение — nil.
=
Значение |
=
Действие |
0 |
Включить элемент |
1 |
Выключить элемент (сделать недоступным) |
2 |
Выбрать элемент |
3 |
Подсветить содержимое элемента |
4 |
Включить/выключить подсветку изображения |
При выключении элемента его цвет приглушается. Он стан= овится недоступным для пользователя. Чтобы сделать его вновь доступным, его надо включить.
Примеры:
(= mode_tile “k1” 1) — выключает элемент с кодом= k1;
(= mode_tile “k1” 0) — включает элемент с кодом = k1.
Функция set_tile позволяет мен= ять содержание диалога, заданное атрибутом value.
(set_tile <код> <значение>)
Аргументы: <код> — код элемента; <значение>= ; — строка с новым значением, присваиваемым атрибуту value данного элемента.
Возвращаемое значение — значение второго аргумента, переданного функции.
Функция get_tile читает содерж= имое элемента диалога (текущее значение атрибута value). Синтаксис:
(get_tile <код>)
Аргумент — строка с кодом элемента.
Возвращаемое значение — строка с текущим значением атр= ибута value.
Функция get_attr читает значен= ие атрибута элемента текущего каталога:
(= get_attr <код> <= атрибут>)
Аргументы: <код> — строка с кодом элемента, <= атрибут> — строка с именем атрибута. Возвращаемое значение — строка со значением атрибута элемента.
Пример:
(= get_attr “user” “alignment”) — возвратит “centered”
Функция client_data_tile связы= вает с элементом диалогового окна строку с пользовательскими данными. Синтаксис:= p>
(client<=
/span>_data_tile <код> <данные>)=
p>
Аргументы: <код> — строка с кодом элемента, <=
данные>
— строка с пользовательскими данными. Возвращаемое значение — nil. Чтобы обратиться к данным, присоединенным к элементу
диалогового окна, нужно прочитать значение переменной $dat=
a
в функции action_tile. Так можно изменять действие,
присвоенное элементу, в зависимости от пользовательских данных. Пример: (=
client_data_tile “user” “2110”) — связывает строку 2110 с элементом “user”. Во время работы диалогового окна система AutoCAD формирует значения глобаль=
ных
переменных, которые называются переменными действия: $key, $value, =
$reason,
$data, $x, $y. В них сохраняются некоторые дополнительные данные о со=
стоянии
диалогового окна и выполненных в нем действиях пользователя. Переменные
используются в LISP-выражениях,
задаваемых в качестве второго аргумента функции action_til=
e.
Вне этой функции значения переменных действия не определены. Пользовательская программа не может изменять значения =
этих
переменных и должна применять их только для чтения. В таблице рассматривают=
ся
различные варианты формирования значений переменных действия. =
Переменная =
Значение $key<=
o:p> Код элемента (во всех элементах) $valu=
e Значение атрибута value во всех элементах. Для поля edit_box —
это введенная строка; Для t=
oggle
— “1” (включен) или “0” — выключен; Для l=
ist_box и
popup_list — строка с ном=
ером
(номерами) выбранных элементов списка или nil, если ни один элемент списка не выбран $data=
Строка с пользовательскими данными, привязанными к элемент=
у Sreas=
on Для элементов 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))”); <=
o:p> Таблица. Значения переменной $reason<=
/span> =
Значение =
Описание 1 Обычный вариант действия с
элементом, в том числе, пользователь выбрал элемент, нажата клавиша ENTER, а элемент имеет значение true атриб=
ута is=
_default<=
o:p> 2 Для поля edit_box:
пользователь вышел из поля, но не завершил редактирование (например, нажал
клавишу TAB 3 Для элемента slider: пользователь изменил значение элемента с пом=
ощью
указателя шкалы, но не завершил ввода 4 Для элементов list_box
и image_button: =
пользователь
выполнил двойной щелчок. Если multiple=
_selection=
=3Dfalse, т=
о это
должно означать окончательный выбор. Если multiple_selection=3Dtrue, то это должно обрабатываться как обычный выб=
ор
(значение 1). Функция start_list начинает оп=
ерацию
редактирования списка в элементах list_box и popup_list. Синтаксис функции: (start=
span>_list <код>[<операция>
[<номер>]]) Аргументы: <код> — код элемента, список которого редактируе=
тся; <операция> — целое число, обозначающее тип опера=
ции: 1 —
изменить выбранные элементы; 2 —
добавить новые элементы; 3 —=
удалить
старый список и создать новый; <номер> — номер элемента, начиная с которого вно=
сятся
изменения (операция=3D1); По умолчанию для второго аргумента действующее значение
равно 3, а для третьего аргумента — равно 0. Аргументы в списке нумеруются,
начиная с нуля. Возвращаемое значение — код элемента Вызов функции start_list являе=
тся
отметкой начала операции формирования или редактирования списка. Вызов функ=
ции end_list является отметкой окончания операции. Изменения
вносятся с помощью функции add_list и других функци=
й,
расположенных между start_list и e=
nd_list.
Здесь нельзя использовать функцию set_tile. Примеры: (=
start_list “kr2”) — указывает начало операции
формирования заново списка для элемента диалога с кодом “kr2”; (=
start_list “kr2” 2) — указывает начало операции
добавления новых элементов списка для элемента диалога с кодом “kr2”; (=
start_list “kr2” 1 14) — указывает начало опер=
ации
замены элементов списка, начиная с 14, для элемента диалога с кодом “kr2”. Функция add_list выполняет опе=
рацию
редактирования списка в элементах list_box и popup_list. Синтаксис функции: (add_list <строка>) Аргументы <строка> — строка, которая добавляется=
к
списку или заменяет элемент списка. Возвращаемое значение — значение аргуме=
нта <строка>,
если операция выполнена успешно. В случае сбоя возвращается nil. Тип операции (изменение или добавление) определяется
предшествующим вызовом функции start_list. Пример: (add_list “Деталь 3217-06”=
) Функция end_list завершает операц=
ию
редактирования списка в элементах list_box и popup_list. Синтаксис функции: (end_list) Возвращаемое значение nil. Элементы image и image_button
являются графическими полями с прямоугольной зоной. Зона может быть заполне=
на ·&nb=
sp;
одним цветом; ·&nb=
sp;
слайдом; ·&nb=
sp;
отрезками разных цветов. Открывает процесс заполнения функция =
start_image,
а завершает процесс заполнения функция end_imag=
e.
Между ними располагаются функции fill_image, slide_image, vector_image. Не допускается применять функцию=
set_tile. При указании координат в графическом окне
предполагается, что левый верхний угол графического элемента находится в на=
чале
координат. Координаты правого нижнего угла могут быть получены с помощью
функций dimx_tile и dimy_tile. Функция start_image открывает =
процесс
заполнения графического элемента. Синтаксис: (start=
span>_image <код>) Аргумент <код> — значение атрибута key графического элеме=
нта.
Возвращаемое значение — строка со значением аргумента, если операция выполн=
ена
успешно. В случае сбоя возвращается nil=
. Функция end_image завершает пр=
оцесс
формирования изображения. Синтаксис: (end_image) Возвращаемое значение — nil. Вызову функции end_imag=
e должен обязательно предшествовать вызов функции start_image. Функция fill_image заполняет
прямоугольник внутри графического элемента одним цветом. Синтаксис: (fill_image <x1> <y1> <ширина> <высота&g=
t;
<цвет>) Аргументы: <x1>
<y1> — ко=
ординаты
верхнего левого угла заполняемого прямоугольника; <ширина> <высота> — размеры заполняемого
прямоугольника; <цвет> — индекс цвета. Возвращаемое значение — значение аргумента <цвет>=
;. Пример: (=
fill_image 5 6 15 25 1) —
заполняет красным (1) цветом прямоугольник с левым верхним углом в точке (5=
,6)
и нижним правым углом в точке (15,25). Функция slide_image заполняет
графический элемент слайдом из отдельного SLD-файла или из библиотеки слайдов. Синтаксис: (slide=
span>_image <x1> <y1> <ширина> <высота&g=
t;
<слайд>) Аргументы <x1> <y1>
<ширина> <высота> аналогичны таковым для функции fill_image.
Аргумент <слайд> — строка с именем файла слайда (расширение .sld не
указывается) или с именем библиотеки слайдов (имя слайда из библиотеки
указывается в круглых скобках). Возвращаемое значение — строка со значением аргумента =
<слайд>. Примеры: (=
slide_image 0 0 50 32 “ring1”) — заполняет г=
рафический
элемент размером 50х30 слайдом из файла ring1.sld. (=
slide_image 0 0 50 32 “lib23(nut8)”) — заполняет графический эл=
емент
размером 50х30 слайдом nut8 из библиоте=
ки
слайдов lib23. Функция vector_image рисует от=
резок
заданного цвета внутри графического элемента диалогового окна. Синтаксис:=
p>
(vector<=
/span>_image <x1> <y1> <x2> <y2> <цвет>) Аргументы: <x1>,
<y1> — ко=
ординаты
(в пикселях) начала отрезка; <x2>,
<y2> — ко=
ординаты
(в пикселях) конца отрезка; <цвет> — индекс цвета Пример: (=
vector_image 5 11 33 11 2) —=
рисует
отрезок желтого цвета из точки (5,11) в точку (33, 11). Функция dimx_tile вычисляет
горизонтальный размер графического элемента с данным кодом (точнее, размер
элемента минус 1). Синтаксис: (dimх_tile <код>) Аргумент <код> — строка с кодом графического эле=
мента.
Возвращаемое значение — целое число с номером крайнего правого пикселя элем=
ента
(левый крайний пиксель имеет номер ноль). Пример: (=
dimx_tile “igp2”) — может вернуть 50 (всего по
горизонтали 51 пиксель) Функция dimy_tile вычисляет вертик=
альный
размер графического элемента с данным кодом (точнее, размер элемента минус =
1).
Синтаксис: (dimy_tile <код>) Аргумент <код> — строка с кодом графического эле=
мента.
Возвращаемое значение — целое число с номером крайнего нижнего пикселя элем=
ента
(верхний крайний пиксель имеет номер ноль) Пример: (=
dimy_tile “igp2”) — может вернуть 32 (всего по
вертикали будет 33 пикселя). Уста=
новите
элементы диалогового окна согласно следующей программе: // Установки элементов диалогового окна // elements: dialog {label=3D"Установка элементов диалогов=
ого
окна"; :column{:row{:boxed_column{label=3D"Элементы управления=
"; :row{:boxed_column{label=3D"Поле и выпадающий список&qu=
ot;; :edit_box
{label=3D"Edit_box";key=3D"txt";value=3D"0.00"=
;;edit_width=3D8;} :popup_list
{label=3D"Popup_list";key=3D"pop";width=3D"8"=
;list=3D"Иванов\nПетров\nСидоров";}} :boxed_column{label=3D"Кноп=
ка и
шкала"; :button
{label=3D"Button";key=3D"but";color=3D"1";wid=
th=3D"8";} :slider {label=3D"Slider";}}}=
:spacer{height=3D1;} :radio_row {label=3D"РядПеременные действия
или выбрал другой элемент)
5. Функции
для работы со списками
Функция start_list
Функция add_list
Функция end_list
6. Функции
для работы с графическими элементами
Функция start_image
Функция end_image
Функция fill_image
Функция slide_image
Функция vector_image
Функция dimx_tile
Функция dimy_tile
7. Упражнения
с элементами диалоговых окон
Построение элементов
:radio_button {label=3D"Radio_bu=
tton
1";value=3D1;}
:radio_button {label=3D"Radio_bu=
tton
2";value=3D0;}
}
}
:boxed_row{:column{label=3D&qu=
ot;Список и
флажок";
:list_box
{label=3D"List_box";key=3D"list";list=3D"Ив=
анов\nПетров\nСидоров";height=3D"8";}
:toggle {label=3D"Toggle";valu=
e=3D1;}
}
}}
:boxed_row{label=3D"Стандартная кнопка закрытия окна=
";
ok_cancel_help_info;
}}}
Сохраните файл как
Elements.dcl в папке Support.
Созд=
айте файл загрузки:
<= o:p>
(defun
c:show_elements (/ num ddiag)
(if (< (setq num (load_dialog
"elements.dcl")) 0)
(prong<= o:p>
(alert =
"The Elements.dcl
file could not be loaded!") (=
exit))
)
(if (not (new_dialog "elements&quo=
t;
num))
(exit)
)
(start_dialog)
(unload_dialog num)
;;;--- =
If the
user pressed the Cancel button
(if (=3D ddiag 1)
(princ "\n Window cancelled!&quo=
t;)
)
;;;--- =
If the
user pressed the Okay button
(if (=3D ddiag 2)
(progn
(princ "\n The user pressed
Okey!")
)
)
(princ)
) ;_def=
un
<= o:p>
Сохраните файл загрузки как Elements.dcl.
Запустите функцию show_ele= ments из командной строки AutoCAD. На экране должно появиться диалоговое окно (рис. 6.3= ).
Рис. 6.3. Элементы диалогового окна
Программа может различить в наших действиях лишь нажат= ие кнопок ОК и Cancel.
Измените описание диалогового окна в файле rog.dcl:
//Диалоговое окно установки параметров рога
rog: dialog{label=3D"Установка параметров рога";= p>
:edit_box{label=3D"Радиус окружности ";key=3D"rad" ;value=3D&q=
uot;150.00";
edit_width=3D8;}
:edit_box{label=3D"Диаметр<=
span
style=3D'mso-ansi-language:EN-US'> дуги, мм&quo=
t;;key=3D"diam";value=3D"300.00";edit_width=3D8;}
:edit_box{label=3D"Толщина<=
span
style=3D'mso-ansi-language:EN-US'> стенки, мм";key=3D"thick";value=3D"1.00";edit_width=
=3D6;}
:spacer{height=3D1;}
:edit_box{label=3D"Индекс цвета";key=3D"col";value=3D"2";edit_width=3D4;}<=
o:p>
:spacer{h= eight=3D1;}
ok_cancel;
}
А теперь вернитесь к файлу rog.lsp. В функции qrog отклики на событи= я в диалоговом окне описывались с помощью функции action_tile<= /span>. Значения переменных сохранялись для каждого отдельного элемента. Опробуйте другой способ сохранения указанных данных — по нажатии кнопки ОК. В этом сл= учае можно оставить значения величин по умолчанию, либо отредактировать их в текстовых полях диалогового окна.
Создайте в этом же файле новую функцию save_vars, которая будет вызываться после нажатия кнопки ОК. С= одержимое текстовых полей прочитает функция get_tile.
Следует учесть, что в данном случае переменные rad1, diam1, thick1, = col1 должны быть общими для функций qrog и save_vars, т.е. глобальными.
(defun =
save_vars
()
(setq rad1 (atof (get_tile “rad”)))
(setq diam1 (atof (get_tile “diam”)))
(setq thick1 (atof (get_tile “thick”)))=
(setq col1 (get_tile “col”))
)
Программа построения рога будет выглядеть следующим об= разом:
(defun =
c:qrog (/
cenrt1 circle1 arc1 rog1 angle1 endp1 dial)
(setq centr1 '(0 0 0)) ;исходная б= азовая точка
(if (< (setq num (load_dialog
"rog.dcl")) 0)
(progn<= o:p>
(alert "Файл Rog.dcl не загружен!")
(exit)
))
(if (not (new_dialog "rog" nu=
m))
(progn
(alert "Диалог Rog не н= айден!")
(exit)
))
;;;If an action event=
occurs,
do this function
(action=
_tile
"accept" "(setq dial 2)(save_vars)(done_dialog)")
(action=
_tile
"cancel" "(setq dial 1)(done_dialog)")
(start_dialog)
(unload_dialog num)
(setq angle1 (* 55.0 (atan rad1 (* diam=
1 (/
pi 2)))))
(command "_view" "_top") ;начинаем со стандартного вида
(command "_vi= ew" "_swiso");переходим к северо-западному виду
(command "_circle" centr1 rad1 "") ;строим базовую окружность
(setq circle1 (entlast));извлекаем имя сущности для базовой окружности
(command "_ucs" "_x"
"90" "");поворачиваем ПСК
(setq endp1 (list diam1 0.0))
(command "_arc" centr1
"e" endp1 "a" "-180" "")
(setq arc1 (entlast));извлекаем = имя сущности для дуги и сохраняем его
(command "_uc=
s"
"_x" "-90");совмещаем плоскость окружности с плоскостью=
XY
(command "extrude" circle1
"" "t" angle1 "p" arc1 "");с=
оздаем тело рога
(setq rog1 (entlast));извлекаем = имя сущности для рога и сохраняем его
(command "_zo= om" "e" "");растягиваем изображение на весь экран
(command "_vscurrent" "_r" "");устанавливаем текущий визуальный стиль realistic
(command "_chprop" "_all&q=
uot;
"" "_color" col1 "");закрашиваем цветом col1
(command "_view" "_botto=
m"
"");устанавливаем =
вид снизу
(command "_solidedit" "_=
body"
"_shell" rog1 centr1 "" thick1 "" ""=
;);делаем полость
(command "_erase" arc1 "&quo= t;);удаляем ненужную образующую дугу
;;;If t=
he user
pressed the Okey Or Cancel button
(if(=3D=
dial 2)
(alert =
“Congratulations!"))
(if(=3D=
dial 1)
(alert<= /span> “Alas!"))
(princ)
)
Введите операции сохранения значений переменных в функ= цию qrog. Сделайте все переменные локальными. Функция save_vars тогда не нужна.
Создадим DCL-файл описания диалогового окна с тремя кнопками Button и= одной кнопкой Cancel. Каждая из трех кнопок должна выдать= послание при нажатии.
Расположите кнопки в колонку друг под другом в две гру= ппы:
But:dialog
{label<= /span>=3D"Работа с кнопками Button";
:column{:boxed_column{
:button {key=3D"but1"=
;;label=3D"Button1";is_default=3D"false";}
:button
{key=3D"but2";label=3D"Button2";is_default=3D"fals=
e";}
:button
{key=3D"but3";label=3D"Button3";is_default=3D"fals=
e";}
}
:boxed_row{
ok_cancel;
}
}
}
Сохраните файл как
But.dcl в папке …\Support.
А теперь составьте файл But.lsp<= /span> для загрузки dcl-файла и описания сценария отклика на события в диалоговом окне. Он будет состоять= из двух функций:
(defun<= /span> C= :But1()
;;;--- = Load t= he d= cl f= ile
(setq d=
cl_id
(load_dialog "But.dcl"))
;;;--- =
Load the
dialog definition if it is not already loaded
(if (not (new_dialog "But" dcl_id))
(progn
(alert "The But.dcl file could not be loaded!")(exit)
)
)
;;;--- If an action event occurs, do this function
(action_tile "but1" "(doButton 1)")
(action_tile "but2" "(doButton 2)")
(action_tile "but3" "(doButton 3)")
(action=
_tile
"cancel" "(done_dialog)")
;;;--- Display the dialog box
(start_dialog)
;;;--- =
Unload the
dialog box
(unload_dialog dcl_id)
;;;--- Suppress the last echo for a clean exit
(princ)
)
<= o:p>
(defun
doButton(a)
(cond
((=3D a 1)(alert "Button 1 was
pressed!"))
((=3D a 2)(alert "Button 2 was
pressed!"))
((=3D a 3)(alert "Button 3 was
pressed!"))
)
)
На экране должна быть картинка, подобная рис. 6.4.
Рис. 6.4. Диалоговое окно с кнопками
Составьте файл List.dcl= с описанием диалогового окна с двумя списками в верхне= м ряду и кнопкой ОК и Cancel<= /span> в нижнем ряду. Сохраните его в папке …\Support.
list: dialog {label =3D "Работа со списками= list_box";
: colum=
n {
: boxed=
_row {:
text { key =3D "text1"; value =3D "Nothing selected"; }=
}
: boxed=
_row {
: list_=
box {key =3D
"mylist1"; label =3D"Choose Item"; height =3D 9; width =
=3D 8;
multiple_select =3D false; fixed_width_font =3D true;
list=3D=
"Лимон\nЛист\nНебо\nСажа\nСнег\nЯблоко";}
: boxed=
_row {
: popup=
_list {
key =3D "mylist2"; label =3D"Choose Color"; width =3D 8;
multiple_select =3D false;
fixed_w=
idth_font
=3D true; list=3D"red\nyellow\ngreen\ncyan\nwhite\nblack";}}}
: boxed=
_row {
: butto=
n { key =3D
"accept"; label =3D "Okey "; is_default =3D true; }
: butto=
n { key =3D
"cancel";label =3D "Cancel "; is_default =3D false; is_=
cancel =3D
true; }}
}
}
Заполнение спискoв здесь произведено с помощью атрибута list. Однако, если бы мы написали атрибуты value =3D "";, то списки были бы пустыми. В этом случае они заполняются при запуске файла<= span style=3D'mso-spacerun:yes'> List.lsp= так, как это показано ниже.
Составьте теперь загрузочный файл List.lsp. Строки, относящиеся к загрузке списков, закомментированы. Если списки уже заполнены, то эти строки можно удалить. Если их раскомментировать, то старое содержимое в списках будет удалено, а новые за= писи установлены.
(defun C:<=
span
lang=3DEN-US style=3D'font-size:11.0pt;mso-ansi-language:EN-US'>list=
()
;;; (setq myList1(=
span>list=
"Лимон" "Лист" "Небо&q=
uot;
" Сажа" "Снег" "Яблоко")) ;;; (setq myList2(list "red" "yellow"
"green" "cyan" "white" "black")) ;;;--- Load the dcl file (setq dcl_id (load_dialog
"list.dcl")) ;;;--- Load the dialog definition if it is not already loaded (if (not (new_dialog
"list" dcl_id)) (progn (alert "The List.DCL f=
ile
could not be loaded!") (exit) ) ) ;;; (start_list "mylist1" 3) ;;; (mapcar 'add_list myList1) ;;; (end_list) ;;; (start_list "mylist2" 3) ;;; (mapcar 'add_list myList2) ;;; (end_list) ;;;--- If an action event o=
ccurs,
do this function (action_tile "mylist2" "(saveVars)") (action_tile "accept&q=
uot;
"(setq ddiag 2)(done_dialog)") (action_tile "cancel&q=
uot;
"(setq ddiag 1)(done_dialog)") ;;;--- Display the dialog b=
ox (start_dialog) ;;;--- Unload the dialog bo=
x (unload_dialog dcl_id) ;;;--- If the user pressed =
the
Cancel button (if(=3D ddiag 1) (princ "\n List
cancelled!") ) ;;;--- If the user pressed =
the
Okay button (if(=3D ddiag 2) (progn (princ "\n The user pr=
essed
Okay!") ) ) (princ) ) (defun saveVars () (setq numstrlist (atoi (get_tile "mylist1"))) (princ numstrlist) (setq word_list (cond ((=3D numstrlist 0) "Лимон"=
;) ((=3D numstrlist 1) "Лист"=
) ((=3D numstrlist 2) "Небо"=
) ((=3D numstrlist 3) "Сажа"=
) ((=3D numstrlist 4) "Снег"=
) ((=3D numstrlist 5) "Яблоко&quo=
t;) (Т "") ) ;_конец cond ) ;_ конец setq (setq numstrpop (atoi (ge=
t_tile
"mylist2"))) (princ numstrpop) (setq word_pop (cond ((=3D numstrpop 0) "red"=
) ((=3D numstrpop 1) "yellow&qu=
ot;) ((=3D numstrpop 2) "green&quo=
t;) ((=3D numstrpop 3) "cyan"=
;) ((=3D numstrpop 4) "white&quo=
t;) ((=3D numstrpop 5) "black&quo=
t;) (Т "") ) ;_конец cond ) ;_ конец setq (setq myStr (strcat word_l=
ist
" имеет цвет " word_pop)) (set_tile "=
;text=
1" myStr) ) В этот же файл занесена функция saveV=
ars,
которая определяет отклики на события диалогового окна. Событие состоит в
выборе слова в левом списке и слова в правом списке. Оба выбранных слова
занесем в строку text по щелчку в правом списке. Ес=
ли
щелкнуть по кнопке ОК, то окно закроется. При чтении значения списка функция get_
Диалоговое окно списков показано на рис. 6.5. Выбранна= я запись отражена в нередактируемом текстовом поле text в ве= рхней части окна.
Рис. 6.5. Окно с двумя списками
Составьте программу построения диалогового окна с коло= нкой флажков. Сохраните файл как …\Support\Toggle.dcl
Toggle<= /span>: dialog { label =3D "Работа с элементам= и toggle";
: colum=
n {: column
{
: text { key =3D "text1"; value =3D "Nothing selected }
<=
/span>}
:
boxed_column { =
label =3D
"Choose your lucky charms:";
: toggle { key =3D "tog1"; label =3D "Hearts"; v=
alue =3D
"0";}
: toggle { key =3D "tog2";label =3D "Moons";valu=
e =3D
"0";}
: toggle key =3D "tog3";label =3D "Stars";value =
=3D
"0";}
: toggle { key =3D "tog4";label =3D "Clovers";va=
lue =3D
"0";}
}
: boxed=
_row {
: butto=
n {key =3D
"cancel";label =3D "Cancel";is_default =3D true; is_can=
cel =3D
true;}
}
}
Теперь составьте файл загрузки и обработки Toggle.lsp. В этом файле создано две функ= ции: chkToggle и Toggle:
(defun
chkToggle()
(setq tog1(atoi(get_tile "tog1"=
;)))
// 0 =3D not chosen 1 =3D chosen
(setq tog2(atoi(get_tile
"tog2"))) // 0 =3D not chosen <=
/span>1
=3D chosen
(setq tog3(atoi(get_tile
"tog3"))) // 0 =3D not chosen <=
/span>1
=3D chosen
(setq tog4(atoi(get_tile
"tog4"))) // 0 =3D not chosen <=
/span>1
=3D chosen
(setq myStr "")
(if(=3D tog1 1)(setq myStr(strcat =
myStr
" Hearts")))
(if(=3D tog2 1)(setq myStr(strcat =
myStr
" Moons")))
(if(=3D tog3 1)(setq myStr(strcat =
myStr
" Stars")))
(if(=3D tog4 1)(setq myStr(strcat =
myStr
" Clovers")))
;;;--- If nothing was selected...
(if(=3D myStr "")(setq m=
yStr
"Nothing Selected!"))
;;;--- Now set the text control to displ=
ay the
string
(set_tile "text1" myStr)=
)
<= o:p>
(defun
C:Toggle()
;;;--- Load the dcl file
(setq dcl_id (load_dialog "To=
ggle.dcl"))
;;;--- Load the dialog definition if it =
is not
already loaded
(if (not (new_dialog "Toggle&=
quot;
dcl_id) ) (exit))
;;;--- If an action event occurs, do this
function
(action_tile "tog1"
"(chkToggle)")
(action_tile "tog2"
"(chkToggle)")
(action_tile "tog3"
"(chkToggle)")
(action_tile "tog4"
"(chkToggle)")
(action_tile "cancel"
"(done_dialog)")
;;;--- Display the dialog box
(start_dialog)
;;;--- Unload the dialog box
(unload_dialog dcl_id)
;;;--- Suppress the last echo for a
clean exit
(princ))
H= a экране диалоговое окно выглядит так, как на рис. 6.6.<= /p>
Рис. 6.6. Диалоговое окно с флажками
Постройте диалоговое окно с четырьмя переключателями. = Из всей группы только один из переключателей может быть выделен. Он должен быть определен при нажатии кнопки ОК.
Составьте DCL-файл для колонки из четырех переключателей. Внизу окна поместите кнопки OK и Cancel. Сохраните файл как С= :\Program Files\AutoCAD 2007\Support\Radio.dcl. Файл можно сохранить и в другом каталоге. Тогда загрузить его в чертеж нужно по команде Tools — AutoLISP — Load Application. Загрузить можно и непосредственно из среды Visual LISP.
Radio : dialog {
 =
; label =3D "Переключатели RadioButtons";
&nbs=
p; &=
nbsp;
: column {
&nbs=
p; &=
nbsp; &=
nbsp;
: radio_column {
&nbs=
p; &=
nbsp; &=
nbsp; k=
ey
=3D "my=
choice";
&nbs=
p;
: radio_button {
&nbs=
p; &=
nbsp; k=
ey
=3D "bu=
t1";
&nbs=
p; &=
nbsp; l=
abel
=3D "Ap=
ples";
value =3D1;
&nb=
sp;
}
&nb=
sp;
: radio_button {
&nb=
sp;
key =3D "but2";
&nb=
sp;
label =3D "Oranges";
&nb=
sp;
}
&nb=
sp;
: radio_button {
&nb=
sp;
key =3D "but3";
&nb=
sp;
label =3D "Bananas";
&nb=
sp;
}
&nb=
sp;
: radio_button {
&nb=
sp;
key =3D "but4";
&nb=
sp;
label =3D "Lemons";
&nb=
sp;
}
}
: boxed_column {
&nb=
sp;
: button {
&=
nbsp;
key =3D "accept";
&nb=
sp;
label =3D " Okay ";
&nb=
sp;
is_default =3D true;
&nb=
sp;
}
&nb=
sp;
: button {
&=
nbsp;
key =3D "cancel";
&nb=
sp;
label =3D " Cancel ";
&nb=
sp;
is_default =3D false;
&nb=
sp;
is_cancel =3D true;
&nb=
sp;
}
}
}
}
Далее создайте LSP-файл загрузки:
(defun =
C:Radio()
;;;--- Load the dcl file
(setq dcl_id (load_dialog "Radio.dcl"))
;;;--- Load the dialog definition if it is not already loaded
(if (not (new_dialog "Radio&qu=
ot;
dcl_id))
(progn
(alert "The Radio=
span>.DCL
file could not be loaded!")
(exit)
)
)
;;;--- If an action event occurs, do this function
(action_tile "accept" "(setq ddiag 2)(saveVars)(done_dialog)")
(action_tile "cancel" "(setq ddiag 1)(done_dialog)&qu=
ot;)
;;;--- Display the dialog box
(start_dialog)
;;;--- Unload the dialog box
(unload_dialog dcl_id)
;;;--- If the user pressed the Cancel button
(if(=3D ddiag 1)
(princ "\n Radio
cancelled!")
)
;;;--- If the user pressed the Okay button
(if(=3D ddiag 2)
(progn
(princ "\n The user pressed Okay!"=
)
)
)
;;;--- Suppress the last echo for a clean exit
(princ)
)
Загрузите файлы и
запустите команду “Radio”. На экране п=
оявится
диалоговое окно, в котором работают лишь кнопки OK и
Рис. 6.7. Макет диалогового окна “Radio Buttons”
При нажатии кнопки ОК вызывается функция saveVars, которая запускает сценарий отклика на событие выделения переключателя. Сост= авим эту функцию и поместим ее в LSP-файл:
(defun =
saveVars()
=
;;;--- Get
the key of the choice made
;;; [ returns "but1" "but2"
"but3" or "but4" whichever is selected.]
=
(setq
myChoice(get_tile "mychoice"))
=
;;;--- Get
the value of each item
(setq choice1(atoi(get_tile "but1"))) // 0 =3D not c=
hosen
1 =3D chosen
(setq choice2(atoi(get_tile "but2"))) // 0 =3D not c=
hosen
1 =3D chosen
(setq choice3(atoi(get_tile "but3"))) // 0 =3D not c=
hosen
1 =3D chosen
(setq choice4(atoi(get_tile "but4"))) // 0 =3D not c=
hosen
1 =3D chosen
)
(defun =
C:Radio()
;;;--- Load the dcl file
(setq dcl_id (load_dialog "Radio.dcl"))
;;;--- Load the dialog definition if it is not already loaded
(if (not (new_dialog "Radio" dcl_id))
(progn
(alert "The Radio=
span>.DCL
file could not be loaded!")
(exit)
)
)
;;;--- If an action event occurs, do this function
(action_tile "accept" "(setq ddiag
2)(saveVars)(done_dialog)")
(action_tile "cancel" "(setq ddiag 1)(done_dialog)&qu=
ot;)
;;;--- Display the dialog box
(start_dialog)
;;;--- Unload the dialog box
(unload_dialog dcl_id)
;;;--- If the user pressed the Cancel button
(if(=3D ddiag 1)
(princ "\n Radio cancelled!")
)
;;;--- If the user pressed the Okay button
;;;--- =
If the
user pressed the Okay button
(if(=3D ddiag 2)
(progn
&=
nbsp;
;;;--- Inform the user of his selection using the radio_column data
(princ "\n Us=
ing
Radio_column data...You chose ")
(cond
((=3D myChoice "but1")=
(princ
"Apples!"))
((=3D myChoice "but2")=
(princ
"Oranges!"))
((=3D myChoice "but3")=
(princ
"Bananas!"))
((=3D myChoice "but4")=
(princ
"Lemons!"))
)
&=
nbsp;
;;;--- Inform the user of his selection using the radio_buttons data
(princ "\n Us=
ing
Radio_buttons data...You chose ")
(cond
((=3D Choice1 1)(princ
"Apples!"))
((=3D Choice2 1)(princ
"Oranges!"))
((=3D Choice3 1)(princ
"Bananas!"))
((=3D Choice4 1)(princ
"Lemons!"))
)
&=
nbsp;
)
)
=
;;;---
Suppress the last echo for a clean exit
(princ))
<= o:p>
Сейчас попробуем соединить все изложенные выше отдельн=
ые
сведения о программировании диалоговых окон. Необходимо построить такой
Нарисуем многоугольник или окружность на выбранном нами слое. Выбранные нами опции должны быть сохранены как опции по умолчанию при следующем открытии программы. Если выбран многоугольник, нужно выбрать число сторон в popup_list. Список слоев должен быть помещ= ен в list_box. Выбор фигуры должен производиться радиокнопкой = radio_column. В элементе toggle н= ужно поставить флажки "Save Settings" сохранения опций. Наконец, нам бу= дут нужны кнопки ОК и Cancel.
Список слоев, возможно, будет большим, — для него нужно отвести одну высокую колонку. Остальные элементы следует разместить во втор= ую колонку. В нижнем ряду будут помещены кнопки ОК и <= span class=3Da2>Cancel.
Скопируйте коды элементов из вышележащих материалов ур= ока.
SAMPLE
: dialog {
label =3D "Sample Dia=
log
Box";
: column {
: row {
:
boxed_column {
: radio_column {
&nb=
sp;
key =3D "radios";
&nb=
sp;
: radio_button {
&nb=
sp;
label =3D "Draw Circle";
&nb=
sp;
key =3D "drawcir";
&nb=
sp;
value =3D "1";
}
&nb=
sp;
: radio_button {
&nb=
sp;
label =3D "Draw Polygon";
&nb=
sp;
key =3D "drawpol";
&nb=
sp;
value =3D "0";
}
}
&nb=
sp;
: popup_list {
&nb=
sp;
key =3D "numsides";
&nb=
sp;
label =3D "Number of Sides";
&nb=
sp;
width =3D 25;
&nb=
sp;
fixed_width_font =3D true;
&nb=
sp;
}
&nb=
sp;
: toggle {
&nb=
sp;
key =3D "saveset";
&nb=
sp;
label =3D "Save settings";
&nb=
sp;
}
} =
;
:
row {
: list_box {
label
=3D"Select Layer";
key =3D
"layerList";
height =
=3D 12;
width =
=3D 10;
multiple=
_select
=3D false;
fixed_width_font =3D true;
value =3D
"";
}
}
}
: row {
:
button {
key =3D
"accept";
label =3D " Okay
";
is_default =3D true;=
}=
:
button {
key =3D
"cancel";
label =3D " Can=
cel
";
is_default =3D false=
;
is_cancel =3D true;<=
/span>
}=
} =
}
}
Сохраните файл как
C:\Program Files\AutoCAD 2007\Support\Sample.dcl.
Скопируйте далее lsp-файл загрузки и обработки:
(defun C:SAMPLE=
()
;;;--- Load the dcl file
(setq dcl_id (load_dialog "SAMPLE.dcl"))
;;;--- Load the dialog definition if it is not already loaded
(if (not (new_dialog "SAMPLE&q=
uot;
dcl_id))
(progn
(alert "The SAMPLE<=
/span>.DCL
file could not be loaded!")
(exit)
)
)
;;;--- If an action event occurs, do this function
(action_tile "cancel" "(setq ddiag 1)(done_dialog)&qu=
ot;)
(action_tile "accept" "(setq ddiag
2)(saveVars)(done_dialog)")
;;;--- Display the dialog box
(start_dialog)
=
;;;---
Unload the dialog box
(unload_dialog dcl_id)
;;;--- If the cancel button was pressed - display message
(if (=3D ddiag 1)
(princ "\n \n ...SAMPLE=
span>
Cancelled. \n ")
)
;;;--- If the "Okay" button was pressed
(if (=3D ddiag 2)
(princ "\n \n ...SAMPLE=
span>
Complete!")
)
;;;--- Suppress the last echo for a clean exit
(princ)
)
Сохраните файл как
C:\Program Files\AutoCAD 2007\Support\Sample.lsp.
Загрузите файлы и запустите функция S= ample. На экране должно появиться диалоговое окно (рис. 6.7)
Рис. 6.7. Предварительное построение диалогового окна<= /p>
Обратите внимание, что списки отсутствуют, а переключа= тель Draw Circle выделен (значение value=3D1). В элементе Toggle флажок не установлен, так как не задано значение value. Если нажать кнопку Cancel, то окно закро= ется. Если же нажать кнопку ОК, то будет выдано сообщение= об ошибке: функция saveVars не определена.
Прежде всего составим списки числа сторон многоугольни= ка и добавим их к элементу popup_list. Далее составим сп= исок слоев и заполним элемент list_box.
Вместо того, чтобы создавать функцию, которая получала= бы все имена слоев чертежа, можно просто составить список вручную. Первый путь длиннее, но он более строгий.
Чтение имен слоев чертежа:
;;=
;--- Set
up a list to hold the layer names
(setq layerList(list))
;;;--- Get the first layer name in the drawing
(setq layr(tblnext "LAYER" T))
;;;--- Add the layer name to the list
(setq layerList(append layerList (list(cdr(assoc 2 layr)))))
;;;--- Step though the layer table to get all layers
(while (setq layr(tblnext "LAYER"))
;;;--- Save each layer name in the list
(setq layerList(append layerList (list(cdr(assoc 2 layr)=
))))
)
Составление списка вручную:
(setq
layerList(list "0" "Layer1" " Layer2" " =
Layer3"
" Layer4" " Layer5" "Layer6" " Layer7&qu=
ot;
" Layer8" " Layer9"))
То же самое для числа сторон многоугольника:
(setq= span> n= umSides(list "4" "6" "8" "12" "16"))
Добавим эти строки в описание диалога DCL-файла.
;;;--- =
Add the
layer names to the dialog box
(start_list "layerlist" 3)
(mapcar 'add_list layerList)
(end_list)
;;;--- =
Add the
number of sides to the dialog box
(start_list "numsides" 3)
(mapcar 'add_list numSides)
(end_list)
<= o:p>
После этого добавление основная LISP-программа должна выглядеть та= к:
(defun =
C:SAMPLE ()
;;;--- Load the dcl file
(setq dcl_id (load_dialog "SAMPLE.dcl"))
;;;--- Load the dialog definition if it is not already loaded
(if (not (new_dialog "SAMPLE" dcl_id))
(progn
(alert "The SAMPLE<=
/span>.DCL
file could not be loaded!")
(exit)
)
)
(setq layerList=
(list
"0" "Layer1" " Layer2" " Layer3" &q=
uot;
Layer4" " Layer5" "Layer6" " Layer7" &qu=
ot; Layer8"
" Layer9"))
(setq numSides(list "4" "6" "8" "12"
"16"))
;;;--- Add the layer names to the dialog box
(start_list "layerList" 3)
(mapcar 'add_list layerList)
(end_list)
;;;--- Add the number of sides to the dialog box
(start_list "numsides" 3)
(mapcar 'add_list numSides)
(end_list)
=
;;;--- If
an action event occurs, do this function
(action_tile "cancel" "(setq ddiag 1)(done_dialog)&qu=
ot;)
(action_tile "accept" "(setq ddiag
2)(saveVars)(done_dialog)")
;;;--- Display the dialog box
(start_dialog)
=
;;;---
Unload the dialog box
(unload_dialog dcl_id)
;;;--- If the cancel button was pressed - display message
(if (=3D ddiag 1)
(princ "\n \n ...SAMPLE Cancelled. \n ")
)
;;;--- If the "Okay" button was pressed
(if (=3D ddiag 2)
(princ "\n \n ...SAMPLE Complete!")
)
;;;--- Suppress the last echo for a clean exit
(princ)
)
<= o:p>
<= o:p>
Сохраните файлы, загрузите их и запустите команду Sample. На экране должно по= явиться диалоговое окно со списками (рис. 6.8):
Рис. 6.8. Диалоговое окно со списками
Создадим сценарий отклика на события в окне в описании функции SaveVars LISP-файла. При выборе строки в списке функция = чтения get_tile возвращает номер строки как строковую конс= танту. На время отладки программы введем распечатки полученных значений переменных= . В дальнейшем эти распечатки нужно убрать.
(defun saveVars()
(setq radios=
span>(get_tile
"radios"))
;;;--- Get the number of sides sel=
ected
from the list
(setq n=
umStr(get_tile
"numsides"))
(if(=3D numStr
"")
(setq nu=
mSides
nil)
(setq nu=
mSides(nth
(atoi numStr) n=
umSides))
)
(princ =
numSides)
(terpri=
)
;;;--- See if the user wants to sa=
ve the
settings
(setq sa=
veSet(atoi(get_tile
"saveset")))
(princ =
saveSet)
(terpri=
)
;;;--- Get the selected item from =
the
layer list
(setq sStr(get_tile "layerList"))
;;;--- If the index of the selecte=
d item
is not "" then something was selected
(if(/=3D sStr "")
(progn
;;;--- Something is selected, so c=
onvert
from string to integer
(setq sIndex(atoi sStr))
;;;--- And get the selected item f=
rom
the list
(setq la=
yerName(nth
sIndex layerList))
)
;;;--- Else, nothing is selected
(progn
;;;--- Set the index number to -1<=
br>
(setq sIndex -1)
;;;--- And set the name of the sel=
ected
item to nil
(setq la=
yerName
nil)
)
)
(princ<= /span> layerName)
(terpri=
)
)
Если не выделить имя слоя в элементе list_box, то значение его будет nil. Иначе будет выдан примерно такой результат:
Command:
sample
6
1
sStr5
sindex5
layerNameLayer5
...SAMPLE <= span lang=3DEN-US style=3D'mso-ansi-language:EN-US'>Complete!
При вычерчивании окружности нужно сде=
лать
неработающим элемент "Number o=
f S=
ides"
popup_list.
Для этого нужно запрограммировать =
span>события с
радиокнопками таким образом:
;;;--- If an action =
event
occurs, do this function
(action_tile "drawcir" &=
quot;(
1)")
(action_tile "drawpol"
"(toggleRadio 2)")
При выборе элемента = drawcir вызывается функция toggleRadio 1, а при выборе элемента drawpol вызывается функция togg= leRadio 2.
Создадим такую функцию с параметром (= a) в AutoLisp-программе:
(defun
toggleRadio(a)
;if circle is selected
(if(=3D a 1)
(mode_tile "numsides"
1) ;disable
;else
(mode_tile "numsides"
0) ;enable
)
)
По умолчанию в программе должна рисоваться окружность. Поэтому перед выражениями с функциями action_t= ile нужно добавить строку
(mode_tile "numsides" 1)
Таким образом, когда выделяем кнопку, чтобы нарисовать окружность, numSides= span> p= opup_list недоступен. Когд= а же мы собираемся рисовать многоугольник, то элемент установки число сторон станов= ится доступным.
А теперь можно изменить слой:
(setq oldLay(getvar "clayer")) =
(setvar "clayer" layerName)
Напишем такжекоманды построения окружности и многоуго=
льника
(if(=3D=
radios
"drawcir")
(progn
(setq pt(getpoint "\n Center =
point:
"))
(command "circle" pt pau=
se)
)
;;;---=
Else
draw a polygon
(progn
(setq pt(getpoint "\n Center =
Point:
"))
(command "polygon" numSi=
des pt
"C" pause)
)
)
LISP-файл будет выглядеть следующим образом:
(defun =
C:SAMPLE ()
;;;--- =
Load the
dcl file
(setq dcl_id (load_dialog
"Sample.dcl"))
;;;--- =
Load the
dialog definition if it is not already loaded
(if (not (new_dialog "sample"
dcl_id))
(progn
(alert "The SAMPLE.DCL file co=
uld
not be loaded!")
(exit)
)
)
(setq =
layerList
(list "0"
"Layer1" "=
;Layer2" "Layer3"
"L=
ayer4" "Layer5" "Layer6" =
"
Layer7"
"L=
ayer8" "Layer9"
)
)
(setq numSides (list "4"
"6" "8" "12" "16"))
;;;--- =
Add the
layer names to the dialog box
(start_list "layerList" 3)
(mapcar 'add_list layerList)
(end_list)
;;;--- =
Add the
number of sides to the dialog box
(start_list "numsides" 3)
(mapcar 'add_list numSides)
(end_list)
(mode_t=
ile
"numsides" 1)
;;;--- If an action event occurs, do this
function
(action_tile "drawcir"
"(toggleRadio 1)")
(action_tile "drawpol"
"(toggleRadio 2)")
(action_tile "cancel" "(=
setq
ddiag 1)(done_dialog)")
(action_tile
"accept"
"(setq ddiag
2)(saveVars)(done_dialog)"
)
;;;--- =
Display
the dialog box
(start_dialog)
;;;--- =
Unload the
dialog box
(unload_dialog dcl_id)
;;;--- =
If the
cancel button was pressed - display message
(if (=3D ddiag 1)
(princ "\n \n ...SAMPLE Cancelle=
d. \n
")
)
;;;--- =
If the
"Okay" button was pressed
(if (=3D ddiag 2)
(princ "\n \n ...SAMPLE
Complete!")
)
;;;--- =
Suppress
the last echo for a clean exit
(princ)
(if(=3D=
radios "drawcir")
(progn
(setq pt(getpoint "\n Center point:
"))
(command "circle" pt pause)
)
;;;--- Else draw a polygon
(progn
(setq pt(getpoint "\n Center Point:
"))
(command "polygon" numSides pt
"" pause)
)
)
)
(defun =
saveVars ()
(setq radios (get_tile "radios&quo=
t;))
;;;--- =
Get the
number of sides selected from the list
(setq numStr (get_tile "numsides&q=
uot;))
(if (=3D numStr "")
(setq numSides nil)
(setq numSides (nth (atoi numStr)
numSides))
)
(princ numSides)
(terpri)
;;;--- =
See if the
user wants to save the settings
(setq saveSet (atoi (get_tile
"saveset")))
(princ saveSet)
(terpri)
;;;--- =
Get the
selected item from the layer list
(setq sStr (get_tile "layerList&qu=
ot;))
(princ "sStr")
(princ sStr)
(terpri)
;;;--- =
If the
index of the selected item is not "" then something was selected =
(if (/=3D sStr "")
(progn
;;;--- =
Something
is selected, so convert from string to integer
(setq sIndex (atoi sStr))
(princ "sindex")
(princ sIndex)
(terpri)
;;;--- =
And get
the selected item from the list
(setq layerName (nth sIndex layerLi=
st))
(princ "layerName")
(princ layerName)
(terpri)
)
;;;--- =
Else,
nothing is selected
(progn
;;;--- =
Set the
index number to -1
(setq sIndex -1)
;;;--- =
And set
the name of the selected item to nil
(setq layerName nil)
)
)
(setq
oldLay(getvar "clayer"))
(setvar
"clayer" layerName)
)
(defun
toggleRadio(a)
;if circle is selected
(if(=3D a 1)
(mode_tile "numsides" 1) ;disa=
ble
;else
(mode_tile "numsides" 0) ;enab=
le
)
)
И наконец, займемся кодом сохранения установок по умол=
чанию.
В элементах диалога все значения переменных интерпретируются как строки. В AutoCAD поддерживается 15 пользоват=
ельских
системных переменных сохранения данных. =
USERR1 – USERR5 используют действительные =
числа.
USE=
RI1 – USERI5 используют целые числа. =
span>USERS1 — USERS5 будут сохранять наши данны=
е как
строки. Все эти величины доступны в файле чертежа каждый раз при его открыт=
ии.
Первой переменной у нас по=
является
RAD=
IOS, и она уже имеет строковый тип.
(setvar= "USERS1&qu= ot; radios).
Второй переменной является NUMSIDES — целое число сторон многоугольника. Но при чтении значения (value) элемента нам возвращается номер строки типа = string: (setvar "USERS2" numStr).
Третья переменная SAVESET имеет т=
ип integer. Поэтому ее нужно конвертировать (setvar "USERS3" (itoa
Индекс четвертой переменной LAYERNAME сохраним в в= иде строки:
(setvar
"USERS4" sSTR)
<= o:p>