Вы находитесь на странице: 1из 60

ÔÅÄÅÐÀËÜÍÎÅ ÀÃÅÍÒÑÒÂÎ ÏÎ ÎÁÐÀÇÎÂÀÍÈÞ

Ãîñóäàðñòâåííîå îáðàçîâàòåëüíîå ó÷ðåæäåíèå


âûñøåãî ïðîôåññèîíàëüíîãî îáðàçîâàíèÿ
ÑÀÍÊÒ-ÏÅÒÅÐÁÓÐÃÑÊÈÉ ÃÎÑÓÄÀÐÑÒÂÅÍÍÛÉ ÓÍÈÂÅÐÑÈÒÅÒ
ÀÝÐÎÊÎÑÌÈ×ÅÑÊÎÃÎ ÏÐÈÁÎÐÎÑÒÐÎÅÍÈß

ПРОГРАММИРОВАНИЕ В AUTOCAD

Методические указания к выполнению


курсовой и дипломной работы

Ñàíêò-Ïåòåðáóðã
2006
Составитель И. А. Салова
Рецензент доктор технических наук, профессор В. В. Хрущев

Рассматриваются основы программирования на языке AutoLisp в


среде VisualLisp. Приводится пример документированной диалоговой
программы и примеры заданий для выполнения курсовой работы.
Методические указания предназначены для студентов специаль-
ности “Управление и информатика в технических системах” и смеж-
ных специальностей.
Подготовлены кафедрой управления и информатики в технических
системах и рекомендованы к изданию редакционно-издательским со-
ветом Санкт-Петербургского государственного университета аэрокос-
мического приборостроения.

Редактор А. В. Семенчук
Компьютерная верстка Н. С. Степановой

Подписано к печати 27.04.06. Формат 60×84 1/16. Бумага офсетная. Печать офсетная.
Усл. печ. л. 3,54. Уч. -изд. л. 3,9. Тираж 150 экз. Заказ № 228

Редакционно-издательский отдел
Отдел электронных публикаций и библиографии библиотеки
Отдел оперативной полиграфии
ГУАП
190000, Санкт-Петербург, ул. Б. Морская, 67

© ГОУ ВПО «Санкт-Петербургский


государственный университет
аэрокосмического приборостроения», 2006

2
ПРЕДИСЛОВИЕ

AutoCad широко используется как «графический кульман». Одна-


ко AutoCad является не только графическим редактором, но и мощной
средой программирования для создания автоматизированных рабочих
мест для специалистов различных направлений. AutoCad является от-
крытой системой, что дает возможность дополнять стандартные сред-
ства собственными наработками. Основной язык программирования в
среде AutoCad – AutoLisp (один из диалектов языка программирования
высокого уровня Common LISP), созданный в 1986 г. и являющийся соб-
ственной разработкой компании Autodesk; LISP – это сокращение от
LISting Processing (обработка списков). AutoLisp относится к функцио-
нальным языкам программирования, так как в основу положено понятие
функции.
Задача курсовой работы – освоение языка программирования
AutoLisp и разработка программы параметризованной геометрической
модели или чертежа.

3
1. ХАРАКТЕРИСТИКА ЯЗЫКА AUTOLISP

1.1. Типы данных


Основные типы данных в AutoLisp:списки; строка; действитель-
ные числа; целые числа; дескрипторы файлов; точечная пара; имена
примитивов AutoCad; наборы AutoCad; встроенные функции (subr).
В программировании на AutoLisp используются символы и символь-
ные структуры.
Символ – это имя, состоящее из букв, цифр и специальных знаков
за исключением () – круглых скобок; . – точки; ‘ – апострофа; “ –
кавычек; ; – точки с запятой. Список представляет собой упорядо-
ченную последовательность, элементами которой являются атомы или
списки. Списки заключаются в круглые скобки, элементы списка раз-
деляются пробелами. Список всегда начинается с открывающейся
скобки и заканчивается закрывающейся. Атом – это неделимый эле-
мент списка. Понятия списка и атома являются ключевыми понятия-
ми языков семейства LISP. Любые другие типы данных являются либо
атомами, либо списками.
Примеры списков: Примеры атомов:
( 34 26.8) 12.6
(“CAT” “EATS” “MOUSE”) “MOUSE”
(1 (12 9.28) (“ГУАП” “Факультет”)) ()
(setq point ‘(100.0 25.2 7.8))
(* 2 5)
Строковая константа выглядит как набор печатных символов, зак-
люченных в кавычки.
Целые числа могут быть положительными или отрицательными (без
дробей и десятичной точки).
Диапазон целых чисел – -2147483648 до 2147483647.
Исключение для функции GETINT – диапазон -32768 +32767.

4
Действительные числа – это положительные или отрицательные
числа с десятичной точкой. Не разрешается начинать или заканчи-
вать число десятичной точкой
2.12 3.11592652543 -92722.121344 1.23544Е+17.
Переменные в AutoLisp не надо описывать – тип данных определя-
ется автоматически при присвоении переменной значения.
Типы данных AutoLisp с помощью функции TYPE идентифицируют-
ся следующим образом:
Возвращаемое значение функции Тип данных
INT Целые величины
REAL Числа с плавающей точкой
STR Строковые константы
FILE Дескрипторы файлов
LIST Списки и функции пользователя
SUBR Внутренние функции AutoLisp
SYM Символьный

Переменная может быть атомом (целого, вещественного или стро-


кового типа), а может быть списком.
Выражение – список, в котором первым элементом является имя
функции.
(имя функции аргумент1 аргумент2 … аргументN)
Предопределенные символы:
T – логическая константа, имеющая значение “истина”,
Nil – пустое значение (оно же в логических операциях имеет
значение “ложь”),
Pi – постоянная 3.14159…,
Pause – постоянная, позволяющая ввести паузу при работе ко-
манды AutoCad.
Комментарии начинаются с символа ; .
1.2. Системные переменные AutoCad
Среда графического редактора AutoCad позволяет изменять ре-
жимы, переопределять лимиты, менять размеры прицелов объектной
привязки и выбора объектов, получать информацию о различных ус-
тановках графического редактора.

5
Все настройки графического редактора управляются системными
переменными. Системные переменные делятся на:
модифицируемые пользователем;
защищенные (нельзя изменять ни программно, ни при помощи ко-
манды).
Для доступа к системной переменной из программы используется
функция
(getvar “имя системной переменной “), а для ее изменения – функ-
ция
(setvar “имя системной переменной “ “новое значение”).
1.3. Функция присвоения
(setq <переменная1> <выражение1> [<переменная2> <вы-
ражение2>… <переменнаяN> <выражениеN>])
П р и м е р: (setq a “bb” b 2.5 c ‘(0 0))
В любое время можно посмотреть значение переменной из команд-
ной строки AutoCad. Восклицательный знак !, введенный в командной
строке, означает, что следующий за ним идентификатор является име-
нем переменной AutoLisp.
Command: !b <ENTER>
Command:!a
“bb”
(set ‘a 3) – эквивалентно – (setq a 3)
(set ‘b ‘c) – возвращает символ c
(set ‘a ‘(+ k f)) – возвращает список (+ k f)

2. СТРУКТУРА ПРОГРАММЫ НА ЯЗЫКЕ AUTOLISP


(defun VVOD() ; – пользовательская функция VVOD
; (подпрограмма)
.
. ; тело функции
.
)

(defun GEOM() ; – пользовательская функция


; GEOM(подпрограмма)
.
6
. ; тело функции
.
)
(defun C:Myfunc() ;) основная программа Myfunc.
(VVOD) ; вызов функции VVOD
(GEOM) ; вызов функции GEOM
)

Все функции составляют файл, например с именем My.lsp. Он вво-


дится с помощью текстового редактора, например БЛОКНОТа или в
среде VisualLisp.
1. Для запуска программы My.lsp в текущем рисунке необходимо:
в командной строке AutoCad набрать строку
(load “My” [“Файл не найден”])
или
(load “E:\\Student\\My”)
или из меню Сервис выбрать пункт Приложения, и из открывающегося
окна выбрать свой файл. Полный путь доступа указывать необязатель-
но, если сделать в AutoCad дополнительные настройки, для чего выб-
рать пункт меню Сервис – Настройка. Из открывшегося диалогового
окна выбрать закладку Files – Support File Search Path и c помощью
кнопки Add добавить имя своего пути доступа.
В случае удачной загрузки возвращаемое значение функции load –
имя последней загружаемой функции. Необязательный текст сообще-
ния “Файл не найден” появляется в случае, если файл отсутствует.
Для запуска программы My.lsp во всех рисунках необходимо ввести
команду:
(vl-load-all <файл>)
Возвращается значение T в случае успешной загрузки.
2. После успешного выполнения п. 1 в командной строке набрать
имя основной функции Myfunc или последней строкой программы после
основной функции использовать одну из записей:
(command (C:My))
(vl-cmdf (C:My))

7
3. ПРАВИЛА ОТЛАДКИ В СРЕДЕ VISUALLISP

3.1. Синтаксические ошибки


К синтаксическим относятся ошибки, вызванные недостаточным или
избыточным количеством скобок или кавычек, нарушением формата
записи функций и др.
Для проверки всего текста программы следует указать кнопку пане-

ли инструментов – Check Edit Window. Возникает окно Build Output


(Окно вывода). При отсутствии синтаксических ошибок в окне выво-
дится сообщение
[CHECKING TEXT myprog.lsp loading...]
; Check done. – Проверка завершена
Иначе выводится сообщение с указанием ошибки, например сообщение
“error malformed list on input (неправильный список на входе)” – недо-
стает правой скобки;
“extra right paren on input (лишняя правая скобка на входе )“;
“ malformed string on input (неверная строка на входе)” – пропущена ка-
вычка;
“too few arguments in SETQ (слишком мало аргументов в SETQ)” – на-
рушен формат функции setq.
Для проверки выделенной части программы следует выбрать кноп-

ку – Check Selection.

3.2. Устранение синтаксических ошибок


Следует дважды щелкнуть на строке сообщения об ошибке, которое
выделено, как правило, голубым цветом, – произойдет переход в тек-
стовое окно редактирования. Если ошибка связана с нарушением фор-
мата функции, эта функция будет выделена. Если имеется лишняя скоб-
ка, она также будет обнаружена. В остальных случаях необходимо
проверить соответствие скобок.
Для этого нужно:
перейти в текстовое окно программы;
установить курсор мыши в начало проверяемого выражения перед
его левой скобкой, и нажать последовательно сочетание клавиш CTRL+],

8
удерживая клавишу CTRL. Будет найдена ответная правая скобка. При
нажатии CTRL + [выявляется ответная левая скобка.
3.3. Форматирование текста программы

Указать на панели инструментов кнопку – Format Edit Window.


Текст программы примет наглядный удобный вид для чтения програм-

мы. Для форматирования части текста используется кнопка –


Format Selection. Предусмотрена возможность детальной настройки
режима форматирования (рис. 1):
Tools (инструменты)\Environment Options(настройка рабочей среды )\Visual
Lisp Format (настройка формата Visual LISP).
Для комментирования части программы следует использовать кла-

вишу , а для снятия комментария – клавишу .

3.4. Загрузка и выполнение программы


После устранения синтаксических ошибок программу нужно загру-
зить в оперативную память и выполнить. Для этого надо указать кнопку

панели инструментов – Load active edit window. Произойдет загруз-


ка программы в оперативную память. Откроется окно консоли. Для
выполнения программы необходимо ввести в консоль имя выполняемой
функции.
П р и м е р:
(defun mo ()
(setq p0 nil p1 nil p2 nil p3 nil)
(setq a 100 b 100 )
(setq p0 (list 0 0))
(setq p1 (polar p0 0 a)
p2 (polar p1 (/ pi 2.0) b)
p3 (polar p2 pi a)
)
(command “_LINE” p0 p1 p2 p3 “_C”)
)

9
а)

б)

Рис. 1. Диалоговое окно настройки режима форматирования: а – русский


вариант; б – английский вариант

10
В нижнюю строку консоли вводится имя функции с ее параметрами,
заключенными в скобки, т. е. (mo). Начнется выполнение программы.
3.5. Устранение ошибок на стадии выполнения программы
После устранения синтаксических ошибок наступает очередь оши-
бок, связанных с неправильными значениями переменных, неверно при-
мененными функциями и т. д. Эти ошибки выявляются в процессе вы-
полнения программы. При наличии рассматриваемых ошибок программа
прерывается и в консоль выводится сообщение об ошибке. Для опреде-
ления по тексту программы места ее прерывания применяют трасси-
ровку или режим анимации.
Отладка в режиме анимации
Надо указать в падающем меню Debug (Отладка) \ Animate (Ани-
мация), a затем загрузить и начать выполнение отлаживаемой про-
граммы, введя с консоли ее имя (mo). На экране наблюдается вы-
полнение программы в замедленном режиме. Выполняемые функции
последовательно высвечиваются. В случае ошибки анимация пре-
рывается, место ошибки в тексте программы остается выделенным.
Если анимация “затянулась”, ее можно прервать с клавиатуры кла-
вишей BREAK. Скорость анимации регулируется в меню редактора
VLISP: Tools (Инструменты) \ Environment Options (Настройки рабо-
чей среды) \ General Options (Общие настройки)\ Diagnostic (Диагно-
стика).
Контроль значений переменных
Необходимость контроля значений переменных возникает в двух
случаях: программа прерывается по ошибке, программа выполняется
до конца, но дает неверный или сомнительный результат, и требуется
проконтролировать алгоритм вычислений. Если вследствие ошибки про-
изошло прерывание программы, можно посмотреть значения всех пе-
ременных и результаты выполнения любого выражения в тексте про-
граммы до момента прерывания. Это позволит разобраться в
причинах, вызвавших ошибку. Сначала с помощью анимации опреде-
ляется место ошибки. Затем следует установить курсор на символ
какой-либо переменной или выделить курсором необходимое выраже-

ние и нажать кнопку панели инструментов Возникнет окно на-

11
блюдения Watch, в верхней строке которого приведено текущее значе-
ние проверяемой переменной или выражения. Анализ выведенного зна-
чения, как правило, позволяет понять ошибку.
Искусственное прерывание программы
Наиболее сложно устранить ошибку, если программа выполняется
без “сбоя”, но выдает неверный результат. В этом случае программу
искусственно прерывают и осматривают значения переменных. Для
прерывания программы достаточно установить курсор в необходимом

месте по тексту программы и указать кнопку – Toggle breakpoint


на панели инструментов VLISP. Место остановки выделится красным
маркером. После этого надо запустить программу, ее выполнение прервется
в указанном месте. Значения переменных, вычисленные к моменту за-

данного прерывания, можно посмотреть посредством клавиши .

Для продолжения программы следует нажать кнопку –continue.


Во время прерывания можно посмотреть текущее состояние рисунка.
Для этого нужно перейти в графическое окно AutoCad, указав кнопку
на панели задач (как правило, в нижней стро-
ке экрана). Чтобы вернуться в редактор (для продолжения отладки программы),

укажите кнопку Visual LISP в панели задач .


Если отладка закончена и нужно завершить выполнение программы,
необходимо отменить прерывание. Для этого курсор устанавливается

на маркер прерывания и повторно нажимается клавиша . Красный


маркер останова снимается. В тексте программы можно задать не-
сколько точек останова и последовательно переходить от одной к дру-

гой, нажимая кнопку .

12
4. ВСТРОЕННЫЕ ФУКЦИИ

4.1 Геометрические функции


В AutoCad существуют два понятия системы координат: мировая (МС) и
пользовательская система координат (ПСК). Здесь и далее при описании фун-
кций используется ПСК, однако все нижесказанное справедливо и для МС.
Способы задания точек
Абсолютные координаты Полярные координаты
(s e tq <точка> '(X Y)) (polar <точка> <угол > <расстояние>)
(s e tq <точка> (lis t X Y)) Возвращает точку в ПСК, находящуюся
Функция возвращает точку в ПСК c аб- под заданным углом и расстоянием
солютными координатами (X Y) от заданной точки; угол измеряется
в радианах в направлении против часо-
вой стрелки от оси X
Примеры
(s e tq p0 '(100.5 50.25)) (s e tq p1 (polar '(10 20) 0 200))
(s e tq p0 (lis t 100.5 50.25)) (s e tq p2 (polar p0 (/ pi 4.0) 100))

Другие геометрические функции


(dis tance <точка 1> <точка 2>) Возвращает расстояние между двумя
трехмерными точками
(angle <точка 1> <точка 2>) Возвращает угол в радианах, образованный
лучом, направленным из точки 1 в точку 2
и осью Х текущей плоскости построений.
Угол измеряется против часовой стрелки
(inte rs <точка 1> <точка 2> Возвращает точку пересечения двух от-
<точка З> <точка 4> [par]) резков (точкa 1 точка 2) и (точка З точ-
ка 4). Все точки выражены в координа-
тах текущей ПСК. Если факультативный
аргумент par присутствует и является
nil, то определяется пересечение не от-
резков, а бесконечных прямых, прохо-
дящих через эти точки. В этом случае
будет определяться точка кажущегося
пересечения. Если же par отсутствует,
то точка пересечения принадлежит
обоим отрезкам. В этом случае отрезки
(отрезки должны пересекаться), иначе
будет возвращен nil
13
Режим объектной привязки несомненно важен при интерактивной
работе в AutoCad. Иногда удобно определять точки по функции (osnap
<точка> <режим>), которая возвращает точку, являющуюся резуль-
татом применения объектной привязки, задаваемой в строке “режим”
для указанной точки. Режим – строковая константа, состоящая из одно-
го или более идентификаторов объектной привязки, разделенных запя-
тыми, как, например,
“_end” (конечная); “_nod” (узел) ,
“_mid” (середина); “_qua” (квадрант)
“_int” (пересечение) “_cen” (центр )
“_nea” (ближайшая)
Например, (setq pt2 (osnap pt1 “_end, _mid”))
4.2. Математические функции
AutoLisp включает в себя достаточно широкий набор встроенных
функций, позволяющих производить математические вычисления. Ар-
гументами математических функций являются числа, которые могут
быть как целыми, так и вещественными. Если все аргументы – целые
числа, то результат операции также будет целым числом, а любая дроб-
ная часть будет опущена. Если хотя бы один аргумент – вещественное
число, то результат операции будет вещественным числом (например,
число 2.0 считается вещественным, поскольку в нем присутствует де-
сятичная точка). К математическим функциям относятся:
Функция Назначение
(+ <число1> <число2> ...) Сумма всех аргументов
(setq a (+ 1 3))  4
(- <число1> <число2> ...) Разность
(setq a ( - 10 4 7))  - 1
Если число аргументов равно 1, то вычитание
производится из 0
(* <число1> <число2> ...) Возвращает произведение всех чисел
(/ <число1> <число2> ...) Делит число 1 на число 2 и возвращает частное
Если задано более двух аргументов, то первое
число делится на произведение всех остальных
(/ 3 2 )  1 (/ 5 7)  0
(/ 5 7.0)  0.714286
(1+ <число>) Увеличение или уменьшение целого или дейст-
(1- < число>) вительного числа на 1
14
Функция Назначение
(abs <число>) Вычисление абсолютного значения действи-
тельного или целого числа
(abs - 1.1)  1.1
(s in <число>) Возвращает значение синуса угла, заданного
аргументом в радианах
(cos <число>) Возвращает значение косинуса угла, заданного
аргументом в радианах
(atan <число1> Если не задано <число 2>, то возвращает арк-
[<число2>]) тангенс переменной <число 1> в радианах, об-
ласть допустимых значений – [pi, - pi] радиан.
Если заданы оба числа, то возвращается арктан-
генс переменной <число 1>/<число 2> в радиа- н
ах. Если <число 2> – нуль, то в зависимости от з
нака переменной <число 1> возвращается + или -
1.570796 радиан (+90 или –90 град)
(е хр <сте пе нь>) Вычисляет значение экспоненциальной функции
с основанием е и аргументом <степень>
(exp 1)  2.718… (exp 0)  1.0
(e xpt <основание > Вычисляет значение экспоненциальной функции
<сте пе нь>) с указанными основанием и степенью
(expt 2 2)  4 (expt - 2 2)  4
(expt 4 – 1)  0 (оба аргумента целые)
(expt 4 – 1.0)  0.25 (хотя бы один аргумент
вещественный)
4.3. Функции для работы со списками
Функция Описание
(lis t вы р1 вы р2 …) Составляет список из аргументов
(setq p0 (list 100 200 300)) – задание начальной точки
с координатами 100, 200, 300 (для двухмерного про-
странства достаточно двух аргументов)
(car список) Возвращает первый элемент списка – значение
(setq Xp (car p0)) – в переменной Xp содержится коор-
дината X точки p0
(cdr список) Возвращает все элементы списка, кроме первого. Ре-
зультат является списком
(setq U (cdr p0))
В переменной U содержится список (200 300)
15
Функция Описание
(cadr список) Возвращает второй элемент списка – значение.
Это эквивалентно (car (cdr p0)) (setq Yp (cadr p0))
В переменной Yp содержится координата Y точки p0
(caddr список) Возвращает третий элемент списка – значение.Это
эквивалентно (car (cdr (cdr p0))), например
(setq Zp (caddr p0)). В переменной Zp содержится
координата Z точки p0
(nth номе р список) Извлекает элемент списка с нужным номером.
Первый элемент списка имеет номер 0
(setq d '(11 12 13 14)) (nth 0 d)  11 (nth 4 d)  nil
(las t список) Возвращает последний элемент списка или nil, если
список пуст (last ‘( ))  nil (last ‘(16 23 90))  90
(re ve rs e список) Возвращает список с элементами, переставленными
в обратном порядке
(reverse ‘(11 12 13 14))  (14 13 12 11)
(reverse nil)  nil (reverse ‘( ))  nil
(le ngth список) Возвращает целое число, равное числу элементов
в списке (length ‘( ))  0 (length nil)  0
(length ‘(15 23 7 9))  4
(appe nd список1 Выполняет слияние списков в один. Все аргументы
список2 … должны быть списками
списокN) (append ‘(17 20 – 6 ’(10 8 1))  (17 20 – 6 10 8 1)
(cons <арг1> <арг2>) Добавляет к списку первый элемент или создает
точечную пару
(cons 50 ‘(10 20))  (50 10 20)
(cons ‘(10 20) ‘(20 45)  ((10 20) 20 45)
(cons 2 4)  (2 . 4) (cons 8 “0”)  (8 . “0”)
(cons 262 nil)  (262)
(me mbe r <эле ме нт> Проверяет принадлежность элемента списку. Если
<список>) функция обнаруживает <элемент> в списке, то воз-
вращает остаток списка или возвращает nil, если не
обнаруживает
(member 1‘(4 20 1 3))  (1 3)
(member 4 ‘(4 2 3 6))  (4 2 3 6)
(member 0 ‘(2 4 5))  nil (member (80 nil))  nil
(s ubs t <новы й> Заменяет в списке старый элемент на новый
<старый> <список>) (subst 6 5 ‘(11 5 7 0))  (11 6 7 0)
(vl-re move Удаляет элемент с заданным значением из списка
<эле ме нт> (vl- remove 4 ‘(0 3 6 4 4 8))  (0 3 6 8)
<список>) (vl- remove 5 ‘(0 3 7 8))  (0 3 7 8)

16
Функция Описание
(apply ‘<ф ункция> Применяет функцию поочередно ко всем элементам
<список>) списка (apply ‘* (list 2 3 5))  30. Это эквивалентно (* 2 3 5)
(apply ‘max (list 2 3 5))  5 т. е. возвращает максималь-
ное значение
(e val <список>) Вычисляет список как выражение. В списке на первом
месте должно стоять имя функции
(setq a (list ‘max 2 4 6 3)) (eval a)  6
(fore ach <имя> Позволяет организовать циклическое выполнение
<список> <вы р1> выражений, поочередно подставляя вместо перемен-
<вы р2>…<вы рN>) ной цикла (<имя>) элементы списка
(setq a (list 1 2 3 4 5)) (setq s1 0 s2 1)
(foreach p a (setq s1 (+ s1 p)) (setq s2 (* s2 p)))  120
Результат: s1 = 15 s2 = 120
(mapcar Применяют функцию сначала к первым элементам каж-
‘<ф ункция> дого из последующих аргументов, затем ко вторым и
<список1> т. д. Результаты объединяются в новый список, который
<список2>… является возвращаемым значением
<списокN>) (mapcar ‘* ’(2 3) ’(1 5))  (2 15)
Схема выполнения: (* 2 1) (* 3 5)

4.4. Функции преобразования


Функция Описание
(fix <число>) Преобразование действительного числа в целое путем
отбрасывания дробной части
(fix – 10.05)  10 (fix 0.0)  0 (fix 40.45)  40
(float <число>) Преобразование целого числа в действительное
(float 15)  15.0
(rtos <число> Преобразование вещественного числа в строку
[<ре жим>] <число> – вещественное или целое число
[<точность>]) <режим> 1 – научный 2 – десятичный <точность> –
количество десятичных знаков в представлении вещест-
венного числа.
Если аргументы ре жим и точность не указаны, то ис-
пользуются значения по умолчанию, установленные
в системных переменных LUNITS – система единиц
и LUPREC – число знаков
(rtos 10.9453 1 3)  “1.095E+01”
(rtos 10.9453 2 3)  “10.945” (rtos 10.9453 2 0)  “11”
(itoa <це лое >) Возвращает результат преобразования целого числа
в строку
(itoa 16)  “16”
17
Функция Описание
(atoi <строка>) Возвращает результат преобразования строки в целое
число. Отсекается дробная часть: (atoi “2.5”)  2
(atof <строка>) Возвращает результат преобразования cтроки
в действительное число
(atof “14”)  14.0 (atof “–29.03”)  –29.03
(angtof <строка> Преобразование строки, представляющей значение уг-
[<пре дставле ние >]) ла в различных форматах в вещественное число, явля-
ющееся величиной угла в радианах
<представление> – соответствует системной перемен-
ной AUNITS:
0 – градусы десятичные, 1 – градусы, минуты, секунды,
2 – грады, 3 – радианы, 4 – топографические единицы
(angtof “30” 0)  0.523699
(angtof “33d27'54\”” 1)  0.584074
(angtos <угол> Преобразование значения угла в радианах в строку
[<пре дставле ние >] Если аргументы Представление и Точность не указаны,
[<точность>]) то используются значения по умолчанию, установлен-
ные в системных переменных
AUNITS - система единиц AUPREC – число знаков
(angtos 1 0 0)  “57” (angtos 1 1 3)  “57d17'45\””
(angtos 1 1 0)  “57d”
(dis tof <строка> Преобразование строки, представляющей вещественное
[<ре жим>]) значение в одном из форматов линейных единиц,
в вещественное. Обратная функции rtos.
(distof “1” 2)  1.0

4.5. Функции для работы со строками

(s trсat <строка1> Конкатенация строк


<строка2> …<строкаN>) (strcat (itoa 12) “- я линия”)  “12- я линия”
(s trle n <строка1> Вычисляет суммарную длину всех строк- аргу-
<строка2> …<строкаN>) ментов (strlen “ГУАП”)  4
(s ubs tr <строка> Выделяет подстроку с заданной позиции
<начало> [<количе ство>]) (substr “ABCDEF” 3 2)  “CD”
(chr <число>) Получает буквенно- цифровой символ по коду
действующей таблицы символов
(chr 192)  “A” (русское)
(ASCII <строка> Получает код первого символа строки текста
по действующей таблице символов
(ascii “A”)  192

18
4.6. Логические функции AutoLisp
Логический оператор – это функция, сравнивающая между собой два
или больше аргумента. Результат сравнения (т. е. некоторое утверж-
дение, касающееся двух аргументов) может быть либо истиной (Т), либо
ложью (nil). Основные логические функции – это И (AND), ИЛИ (OR) и
НЕ (NOT):
Функция Описание
(and выр1 выр2 ...) Возвращает результат выполнения логического
И над списком выражений. Возвращается nil,
если любое (хотя бы одно) из выражений
имеет значение nil, в противном случае – Т
(and T nil)  nil (and T T 2)  T
(not эле ме нт) Возвращает результат выполнения логичес-
кого НЕ над своим аргументом
(or выр1 выр2 ...) Возвращает результат выполнения логичес-
кого ИЛИ над списком выражений. Возвра-
щается nil, если все аргументы имеют значе-
ние nil; если при оценке аргументов слева
направо встречается выражение не – nil,
возвращается Т
(= <арг1> <арг2> … <аргN>) Проверка равенства аргументов (числа и
строки) (= - 10.0 - 10 - 10.000) T
Лучше не сравнивать результат тригономет-
рических функций с константой:
(setq x (sin 0))  0.0
(setq y (sin (* 2.0 pi))  - 2.44921e- 016
(= x y)  nil
(/= <арг1> <арг2> … <аргN>) Проверка неравенства аргументов любого
типа (числа и строки)
(< <арг1> <арг2> … <аргN>) Проверяет расположение аргументов по воз-
растанию, слева направо (числа и строки)
(< 2 3 30)  Т (< 2 2 30)  nil
(< “a” “b” “k”)  T
(<= <арг1> <арг2> … <аргN>) Проверяет расположение аргументов по
неубыванию, слева направо (числа и строки)
(<= 2 2 30)  T
(> <арг1> <арг2> … <аргN>) Проверяет расположение аргументов по
убыванию, слева направо (числа и строки)
(> 30 5 3)  T
19
Функция Описание
(>= <арг1> <арг2> … <аргN>) Проверяет расположение аргументов по невоз-
растанию, слева направо (числа и строки)
(> =30 5 5)  T
(eq <арг1> <aрг2>) Проверяет равенство двух аргументов. Типы
аргументов – любые. Возвращаемое значение T
или nil
(eq 10 10.00)  T идентично =
(eq “abc” “ABC”)  nil идентично =
(setq a (list 1 1 1))
(setq b a) (eq b a)  T – две переменные ука-
зывают на один и тот же список
(setq a (list 1 1 1)) (setq b (list 1 1 1))
(eq a b)  nil Это два разных списка
(equal <арг1> <aрг2>[<допуск>]) Проверяет равенство двух объектов (для чисел
и списков из числовых величин сравнение
п роизводится в пределах допуска)
(equal – 10.0 –10)  T
(equal 3.0 3.002 0.002)  T
(equal ‘(1.00 2.13 2.99) ‘(1 2.13 3.0) 0.1)  T
Рекомендации по использованию функций = eq и equal
= – для сравнения только целых чисел и строк
eq – для проверки, не указывают ли две переменные на один и тот же
список
equal – для проверки равенства значений выражений (для чисел и спис-
ков с возможностью допуска
(minusp <число>) Проверка числа на отрицательность
(minusp 0)  nil (minusp (- 51 24 39))  T
(zerop <число>) Проверка числа на 0
(zerop 0.0)  0 (zerop 1)  nil
(null <арг>) Типы аргументов – любые
(null “tt”)  nil (null ‘( ))  T
(numberp <арг>) Проверяет, является ли аргумент целым или
действительным числом
(lisp <арг>) Проверяет, является ли аргумент списком

20
4.7. Функции условного ветвления программ
Функция Описание
(if <условие> <выр1> [<выр2>]) Выполняет условную операцию типа if-
then- else. Типы аргументов любые. Возвра-
щаемое значение: вычисленное значение
<выр1>, если <условие> – истинно или
значение <выр2>, если <условие> – nil
Если <выр2> отсутствует, то nil
(if (> a b) (+ a 10) (–b 10))
(progn Аналог операторных скобок в Паскале для
… сложных операторов
) (if (> a b)
(progn
(setq c – 1)
(setq d (–c а)
setq (e d)
);end progn
(progn
(setq c 2)
(setq d (* a b))
(setq e (* d b))
); end progn
); end if
(cond (<условие 1> <выр1>….) Условная операция типа cas e в Паскале
[(<условие 2> <выр2>….)] (defun mm()
(setq cc 1)
(cond
((= cc 1) (SETQ ABC “Красный”)
(COMMAND “_line” ‘(0 0 0) '(100 100 0)
‘(250 100 0) “_C”)
); end (=cc 1)
((= cc 2) (SETQ ABC “Красный”)
(COMMAND “_circle” ‘(0 0 0) 100)
); end (=cc 2)
(T “”); если сс>2 или сс<1
);end cond
); end defun

21
4.8. Функции цикла
Функция Описание
(while <условие> <выр1> Операция цикла по многократно прове-
[<выр2>….<вырN>]) ряемому условию. Типы аргументов – лю-
бые. Возвращаемое значение – последнее
выражение или nil
(setq i 1 factorial 1)
(while (< i n)
(setq i (+ i 1)
(setq factorial (* factorial i))
); end while
(re pe at <количе ство> <вы р1> Выполняет операцию цикла с фиксирован-
[<вы р2>….<вы рN>]) ным количеством повторений
<количество> – целое положительное
(setq i 1 factorial 1)
(repeat (1 – n)
(setq i (+ i 1) (setq factorial (* factorial i))
); end repeat

5. ВЫЗОВ КОМАНД AUTOCAD ИЗ ПРОГРАММЫ


Вызов команд AutoCad из программы на AutoLisp осуществляется с
помощью функции command:
(command “Имя_команды” aргумент1 аргумент2 …)
Имя команды – строковая константа.
Аргументы – строки, действительные или целые числа, точки.
Пустая строка “” равносильна нажатию пробела на клавиатуре.
Если требуется ввод данных с клавиатуры, то используется “\\” или
слово pause.
Имена команд должны начинаться с префикса “_.”, а опций – с
префикса “_”.
Точка в префиксе команды означает, что используется “ настоящая ”
команда, а не переопределенная пользователем.
П р и м е р ы записи команд:
1. LINE – Отрезок
(command “_.LINE” “ \\” “\\” … “”) – n точек
(command “_.LINE” pt1 pt2 … “”)
(command “_.LINE” ‘(10 30) ‘(40 50) … “”)

22
2. CIRCLE – Круг
(command “_.CIRCLE” pt1 R)
(command “_.CIRCLE” ‘(0 0) 100)
(command “_.CIRCLE” pt1 ”_D” D) – задание диаметра
(command “_.CIRCLE” ”_2P” pt1 pt2) – по двум точкам
(command “_.CIRCLE” ”_3P” pt1 pt2 pt3) – по трем точкам
(command “_.CIRCLE” ”_TTR” “\\” “\\” R) – касательная, каса-
тельная, радиус
3. ARC – Дуга
(command “_.ARC” pt1 pt2 pt3) – по трем точкам
(command “_.ARC” pt1 “_C” pt2 “_A” 120) – начало, центр, угол
(command “_.ARC” pt1 “_C” pt2 “_L” 100) – начало, центр, хорда
(command “_.ARC” pt1 “_E” pt2 “_A” 120) – начало, конец, угол
4. ERASE – Cотри
(command “_.ERASE” e “”) – e – набор объектов, может состоять
из одного объекта
(command “_.ERASE” e1 e2 e3 “”) – стирание нескольких объектов
5. OFFSET – Подобие
(command “_.OFFSET” a e pt1) – а – величина смещения
e – примитив
(command “_.OFFSET” 50 e ‘(30 200))
6. MOVE – Перенос
(command “_.MOVE” e “” pt1 pt2) – e – примитив
7. COPY – Копирование
(command “_.COPY” e “” pt1 pt2)
8. ROTATE – Поворот
(command “_.ROTATE” e “” pt1 A) – A – угол поворота, e – прими-
тив; pt1 – центр вращения
(command “_.ROTATE” e “” pt1 “_R” pt2 pt3 A) – pt2 pt3 – точки
задания характерного отрезка, A – абсолютное значение угла.
9. SCALE – Масштабирование
(command “_.SCALE” e “” pt1 m) – pt1 – опорная точка, m – масш-
табный коэффициент.
(command “_.SCALE” e “” pt1 “_R” pt2 pt3 L)- – pt2 pt3 – точки зада-
ния характерного отрезка, L – значение длины отрезка.
10. MIRROR –Зеркало
(command “_MIRROR” ee “” pt1 pt2 “_N”) – ee – примитив или набор
примитивов, pt1 и pt2 – точки оси отражения
23
11. ARRAY – Массив
(command “_.ARRAY” e “” “_P” p1 n 360 “_Y”) – круговой массив,
n – число элементов
(command “_.ARRAY” e “” “_R” n_row n_col –30 50) – прямоуголь-
ный массив
12. DIVIDE – Деление примитива
(command “_.DIVIDE” e n)
13. MEASURE – Деление отрезка на отрезки заданной длины
(command “_.MEASURE” e L)
14. EXPLODE – Расчленить
(command “_.EXPLODE” e)
15. TEXT – Текст
(command “_.TEXT” pt0 “0” “ПРИМЕР”) – текст с заранее установ-
ленным стилем текста
(command “_.TEXT” “_C” pt0 “0” “ПРИМЕР”) – центрированный
текст
(command “_.STYLE” name_st name_shrift “5” “0.9” “15” “” “” “”)
16. REGION –Область
(command “_.REGION” e1 … en “”)
17. UCS – ПСК
(command “_.UCS” “_O” pt1) – перемещает точку отсчета в новую
(command “_.UCS” “_3P” pt1 pt2 “”) – задание ПСК по 3 точкам
(command “_.UCS” “_S” “a1”) – сохранение ПСК под именем a1
(command “_.UCS” “_W”) – переход в мировую систему координат
(command “_.UCS” “_R” “a1”) – переход в ранее созданную ПСК
18. POLYGON – Многоугольник (МН-угол)
(command “_.POLYGON” n “_E” pt1 pt2) – многоугольник по стороне
pt1 и pt2 – начало и конец стороны
(command “_.POLYGON” n ptc “_I “ R) – вписанный многоугольник
(command “_.POLYGON” n ptc “_C “ R) – описанный многоугольник
19. DONUT – Кольцо
(command “_.DONUT” dv dn ptc1 ptc2 “”)
20. LAYER – Слой
(command “_.LAYER” “_N” “OSI “ “_L” “CENTER” “OSI “ “_C” “1”
“_OSI “ “_S” “_OSI “ “ “)
N – создание нового слоя; L – задание типа слоя;
С – задание цвета слоя; S – установка текущего слоя, если он создан;
M – установка текущего слоя, если такого нет, то создает;
24
LO – блокировка слоя; U – разблокировка слоя;
ON – включает видимость слоя; OFF – отключает видимость слоя;
F – замораживает слой; T – разморозить слой
Если в программе используется функция COMMAND, то в начале
программы надо отключить объектную привязку, а в конце программы
вернуть ее в прежнее состояние.
П р и м е р:
(defun С:My()
(setvar ”CMDECHO” 0) ; отключение эхо-вывода (запросы команд и
; ответы на них не отображаются на экране
(setq old_osmode (getvar “OSMODE”));сохранение текущей объектной
;привязки в переменной
(setvar “OSMODE” 0); отключение объектной привязки
(setq a nil b nil ……) ; обнуление всех переменных внутри программы


(setvar “ORTHOMODE” 1); включение режима OРТO;


(setvar “ORTHOMODE” 0); отключение режима OРТO;


(setvar “OSMODE” old_osmode); включение ранее сохраненной
; объектной привязки
(setvar “CMDECHO” 1); включение эхо-вывода
(setq C:COIL nil); освобождение оперативной памяти, занимаемой
;функцией
)
6. ДОСТУП К ПРИМИТИВАМ И СРЕДСТВАМ AUTOCAD
Любой, создаваемый в АutoCad, чертеж состоит из отдельных при-
митивов, геометрическое описание которых хранится в специальном
формате в файле чертежа. В сеансе редактирования каждый примитив
имеет имя, по которому его распознает сам AutoCad. Имена меняют-
ся от сеанса к сеансу. В программе на AutoLisp надо сначала найти
имя примитива в базе данных с тем, чтобы впоследствии извлекать
геометрические характеристики.

25
Функция Описание
(entlast) Возвращает имя последнего примитива
(setq e (entlast))
(e ntge t e ) Доступ к данным, связанным с примитивом
В переменной e хранится имя примитива
Функция возвращает список, состоящий из под-
списков, в которых все данные о примитиве
(геометрические, слой, цвет и т. п.) сгруппиро-
ваны по функциональному назначению
Например,
((- 1 . <Имя объекта:2020500>
(0 . “LINE”)
(8 . “0”)
(10. 73.478 160.222 0.0)
(11. 250.654 224.473 0.0)…)
(assoc код список_данных) Выбор данных из списка данных по коду
(assoc 0 ed) – возвращает точечную пару (0 .“LINE”)
(cdr (assoc 0 ed)) – имя примитива (“LINE”)
(setq P1 (cdr (assoc 10 ed))) – точка начала отрезка
(setq X (car (cdr (assoc 10 ed)))) – X – координата
начала отрезка
(e nts e l [подсказка]) Функция возвращает список, первый элемент ко-
торого есть имя выбранного примитива, а вто-
рой – координаты точки, использованной для
указания примитива. В аргументе [подсказка] со-
держится текст запроса на указание примитива
Аргумент не является обязательным
(setq e (entsel “\nУкажите элемент”))
Возвращаемый список:
(<Entity name:600014> (3.00 5.00 0.00))
Для доступа к списку данных примитива e следу-
ет ввести выражение (setq ed (entget (car e)))
(entnext [<имя При вызове без аргумента эта функция возвращает
примитива>]) имя первого, не удаленного примитива в базе
рисунка (setq e1 (entnext))
Если имеется аргумент, функция возвращает имя
следующего примитива или nil, если в качестве
аргумента указано имя последнего примитива
рисунка (setq e2 (entnext e1))
26
Функция Описание
Можно использовать в сочетании с функцией
e nts e l:
(setq e3 (entnext (car (entsel “Укажи примитив”))))
(e ntde l <имя Элемент, указанный в аргументе, удаляется из те-
примитива>) кущего чертежа и восстанавливается на чертеже,
если он был удален перед этим в текущем сеансе
редактирования. Удаляемые примитивы уничто-
жаются из чертежа после окончания сеанса редак-
тирования
(setq e1 (entnext)) – присваивается имя первого
примитива в рисунке
(entdel e1) – удаление e1
(entdel e1) – восстановление e1
Практически все команды редактирования работают не с отдель-
ными примитивами, а с группой примитивов. Функции для работы с
набором примитивов представлены в таблице.

Функция Описание
(ssget) Выби рает п о одн ому п ри ми ти в посредством
указания на экране. На экране будет каждый
раз появляться запрос Выберите объект
(selection object). Функция возвращает имя
набора в виде, например:
<Selection set: 2>
(ssget “_L”) Выбирает последний примитив без запроса
(ssget “_W” ‘(0 0) ‘(200 100)) Выбирает примитивы, находящиеся в рамке,
заданной координатами ‘(0 0) и ‘(200 100)
(ssget '(10 20)) Выби рает п ри ми ти в , п роходящи й через точ-
ку ‘(10 20).
(setq ss (ssget))
(s s le ngth набор) Возвращает число примитивов в наборе
(setq ss (ssget)) (setq n (sslength ss))
(ssname набор номер) Возвращает имя примитива под номе ром из
набора. Перв ы й п ри ми ти в в н аборе и меет
н омер 0.
(setq e (ssname ss 0)) – возвращает имя первого
примитива из набора
(setq sset (ssget)) – создает набор с именем sset
27
Функция Описание
(setq ent1 (ssname sset 0)) – получает имя перво-
го примитива в sset
(setq ent4 (ssname sset 3)) – получает имя чет-
вертого примитива
(s s me mb имя_примитива Проверяет, входит ли примитив в набор. Возв-
набор) ращается имя примитива, если он входит в рас-
сматриваемый набор, или nil – если не входит.
(setq nabor (ssget “_L”)) – создает набор их пос-
леднего примитива и возвращает имя набора
<Selection set:7>
(ssmemb (entlast) nabor) – возвращает имя при-
митива, так как последний примитив содер-
жится в наборе
Создает новый набор без единого примитива
(ssadd) (setq ss (ssadd))
Создает набор, содержащий один примитив
(setq ss1 (ssadd e1))
(ssadd имя_примитива) Примитив добавляется в уже существующий
(ssadd имя_примитива набор
набор) (setq e1 (entnext)) – в e1 имя первого примитива
в рисунке
(setq ss (ssadd)) – устанавливает нулевой набор
(0 элементов)
(ssadd e1 ss) – возвращает набор, в котором
добавлен примитив по имени e1
(setq e2 (entnext e1)) – получает примитив,
следующий за e1
(ssadd e2 ss) – возвращает набор ss, в котором
добавлен примитив, следующий за e2
(s s de l имя_примитива Уничтожает имя примитива из набора. Воз-
набор) вращаемое значение – имя набора, если опе-
рация удаления выполнена, или nil, если при-
митив не содержится в наборе и удалить его
нельзя
(ssdel e1 ss)

28
7. ОРГАНИЗАЦИЯ ДИАЛОГА В AUTOLISP

7.1. Использование функций семейства GET


для ввода данных
Простейший способ организации диалога – ввод данных с клавиату-
ры. Для этого существует семейство функций GET. Все функции GET
ожидают ответа пользователя, т. е. приостанавливают выполнение про-
граммы до тех пор, пока не будет осуществлен ввод (нажата клавиша
ENTER). Ввод может быть произведен как с клавиатуры, так и при
помощи устройства указания мыши. Все вводимые данные автомати-
чески преобразуются в нужный тип данных. Ниже приведены функции
семейства GET. В квадратных скобках указаны необязательные аргу-
менты. Знак \n указывает на то, что текст запроса будет вводиться с
новой строки в поле команды.

Функция Описание
(getint [текст запроса]) Вводится целое число
(setq m (getint “\nКоличество рядов”))
(ge tre al [те кст запроса]) Ввод действительного числа
(setq rast (getreal “\nВведите длину стороны А”))
(getstring [текст запроса] ) Ввод строки
(setq st (getstring “\nВведи слово”))
(ge tpoint [точка] [те кст Ожидает ввода координат точки X и Y, если
запроса]) не указан аргумент [точка], иначе рисует “рези-
новую линию” от точки, указанной в аргументе
[точка], до положения курсора. Возвращает список
(setq pt1 (getpoint “\Введи точку”))
(getdist [точка] [текст Возвращает действительное число, если указан
запроса]) аргумент [точка]. В этом случае указывается
вторая точка. Если аргумент [точка] не указан,
то вводится расстояние – целое или действи-
тельное число
(setq s (getdist “\n Введи расстояние”))
(ge tkword [запрос- Запрашивает у пользователя ключевое слово,
подсказка]) определенное ранее при помощи функции
INITGET. Если ответ не совпадает ни с одним
определенным ключевым словом, AutoCad
попросит повторить ввод. Если ответ совпадает
29
Функция Описание
с ключевым словом, функция GETKWORD
возвращает это ключевое слово как строковую
константу
(initget 1 “Да Нет”)
(setq reply (getkword “Продолжить ?[Да/Нет]:”))
(initget [флаг] [строка]) Задает ограничения последующего ввода дан-
ных. Вызов функции initget должен предшест-
вовать в программе обращению к функциям
getint, getreal, getdist, getangle, getpoint. Аргумент
[флаг] может принимать следующие значения:
1 – не разрешает пустой ввод (пустой ввод –
это нажатие клавиши <ENTER>)
2 – не разрешает ввод 0
4 – не разрешает ввод отрицательных чисел
Аргумент [строка] используется для задания
списка ключевых слов при вводе
(initget 1) – запрет пустого ввода
(initget 3) – запрет пустого ввода (1) и ввода 0 (2)
(initget 7) – запрет пустого ввода (1), ввода 0
(2) и ввода отрицательных чисел (4)
(initget 6) – разрешает пустой ввод, но запрещает
ввод 0 (2) и отрицательных чисел (4)
(initget 1 “Да Нет”)

7.2. Диалоговое окно


Программа на языке AUTOLISP с использованием диалогового окна
состоит из двух файлов:
файла описания диалогового окна на языке DCL (файла .dcl) ;
файла на языке АutoLisp (файла .lsp).
Файл на языке DCL состоит из логических единиц – директив, рас-
полагаемых в файле последовательно. Каждая директива описывает
поле или способ группировки полей. Все элементы языка DCL являют-
ся чувствительными к регистру. Для записи директив используются
только латинские буквы. В каждом диалоговом окне содержатся одно
или несколько полей, определяющих функции окна. К основным типам
полей относятся базовые поля: клавиши, кнопки, текстовые поля, поля
изображений. Поля могут обрамляться рамкой. В Autocad включены
файлы base.dcl и acad.dcl. Файл base.dcl содержит определения базо-
30
вых, предварительно определенных полей общего пользования. Пред-
варительно определенные поля не могут быть переопределены пользо-
вателем. Этот файл не следует модифицировать! Файл acad.dcl содер-
жит определения всех стандартных диалоговых окон. Все определенные
пользователем DCL-файлы автоматически ссылаются на поля, опре-
деленные в файле base.dcl. Каждое поле может иметь атрибуты.
Для просмотра DCL-файла без его запуска в редакторе VisualLisp
следует использовать пункт Interface Tools (Инструменты интерфейса)
в меню TOOLS (Сервис). Директива описания диалога использует имя,
ключевое слово dialog и метку label с названием диалогового окна.

Тип поля Описание


:e dit_box Текстовое поле. Поле, в котором пользователь вводит или
редактирует текстов ую строку. Ecли вводимый текст пре-
вышает размеры текстового поля, его можно "прокрутить"
в горизонтальном направлении
Атрибуты Значение
Label= Строка (запрос или название вводимой информации),
заключенная в кавычки
Edit_width= Ширина редактируемой части поля, ограниченной рамкой
текстового поля в единицах ширины символа. Если атри-
бут не указан или установлен в 0, то рамка расширяется
настолько, насколько это возможно
Edit _limit = Максимальное число символов, которое может ввести
пользователь в текстовое поле. По умолчанию – 132, мак-
симум – 256
Value= Строка, заключенная в кавычки (по умолчанию – пустая
– “ ”). Исходное значение текстовое, размещенное в рамке
:column Колонка полей. Все элементы колонки располагаются вер-
тикально в порядке расположения в DCL- файле. Колонка
может содержать любые типы полей (за исключением
отдельной кнопки выбора), включая ряды и другие колонки
:boxed_column Колонка, имеющая нарисованную вокруг нее рамку
(границу)
Атрибут Значение
Label= Значение строка (название колонки в рамке). Атрибут
labe l выводится как поле в верхнем левом углу колонки,
заключенной в рамку
31
Тип поля Описание
:row Ряд. Аналогичен колонке, но его поля расположены
горизонтально в порядке расположения в DCL- файле
:boxed_row Ряд, имеющий нарисованную вокруг него рамку (границу)
Атрибут Значение
Label= Значение строка (название ряда в рамке). Атрибут labe l
выводится как поле в верхнем левом углу ряда, заключен-
ного в рамку
:image Прямоугольник, внутри которого отображается векторное
изображение. Изображение используется для показа слай-
да чертежа с формальными параметрами
Атрибуты Значение
Color= Цвет фона рисунка, определенный как номер цвета, при-
нятый в Autocad, или одно из символьных имен (по умол-
чанию 7):
Dialog_line – текущий цвет линий диалогового окна;
Dialog_foreground – текущий цвет символов диалогового
окна (для текста);
Dialog_background – текущий цвет фона диалогового окна;
Graphic_background – текущий цвет фона графического экрана;
Black – цвет 0 (черный) (на черном фоне отображается
как белый);
Red – цвет 1 (красный); Yellow – цвет 2 (желтый);
Green – цвет 3 ( зеленый); Cyan – цвет 4 (голубой);
Blue – цвет 5 (синий); Magenta – цвет 6 (фиолетовый);
White – цвет 7 (белый)
Aspect_ratio= Определяет отношение ширины изображения к его высоте
Если значение равно нулю (0.0), то поле подгоняется под
размеры изображения
Width= Высота и ширина поля
Height=
:Radio_button Кнопка выбора. Одна или группа кнопок, объединенных
в колонку или ряд выбора. Если выбрана одна из кнопок,
то любая другая кнопка будет отключена. Кнопки выбора
появляются только в колонках или рядах выбора. Если кноп-
ка выбора размещена вне колонки или ряда выбора, то
появляется сообщение об ошибке

32
Тип поля Описание
Атрибуты Значение
Label= Это текст, выводимый слева от клавиши выбора
Value= Заключенная в кавычки строка. Если значение атрибута –
единица, то кнопка выбора включена, если – нуль, то отк-
лючена; любые другие значения аналогичны нулю. Если
по каким- то причинам несколько кнопок имеют атрибут
Value, равный единице, будет включена только последняя
из них
:Boxed_ Колонка выбора, имеющая нарисованную вокруг нее рамку
radio_column (границу). Метка трактуется аналогично метке колонки
в рамке
:Boxed_radio_row Ряд выбора, имеющий нарисованную вокруг него рамку
Spacer Пустое поле, разделитель. Используется только в целях ком-
поновки и влияет на размер и расположение смежных полей
Errtile Поле ошибки. Это поле надписи, которое, как правило,
появляется внизу диалогового окна. По умолчанию оно
пусто, но программа может отобразить в нем сообщение,
присвоив значение полю с ключом “error”

Ниже приведено описание общих атрибутов, пригодных для любых


полей.
Тип атрибута Описание
Key= Значение – строка, заключенная в кавычки. Ключ опреде-
ляет имя в символах ASCII и используется программой
для ссылки на это поле. Каждое активное поле должно
иметь свой ключ, значение которого уникально для диало-
гового окна. Значение, присвоенное полю, может изменять-
ся во время работы
Fixed_ eight= Фиксированная высота поля. Высота поля не растет при
компоновке диалогового окна. Возможные значения True
или False (по умолчанию False)
Fix ed_widt h= Ф и кси ров ан н ая ши ри н а п оля. Ши ри н а п оля н е растет
п ри компоновке диалогового окна. Возможные значения
True или False (по умолчанию False)

33
Предусмотрены клавиши выхода из диалогового окна.
Клавиша Описание
Ok_only Единственная клавиша Да (OK). Ключ key клавиши Да
имеет значение “accept”
Ok_cancel Комбинация клавиш Да и Отмена (OK and Cancel) – стан-
дартная комбинация для диалоговых окон, в которых мо-
гут вноситься изменения в данные. Ключ key клавиши
Отмена (Cancel) имеет значение “cancel”
Ok_cancel_help Группа ok_cancel скомбинирована со стандартной клави-
шей Помощь (Help). Ключ key клав и ши Помощь и меет
зн ачен и е “help”

7.3. Пример диалогового окна


Текст содержится в файле COIL.dcl.
COIL : dialog {
label = ”Введите исходные данные”;
:row {
: edit_box {
label=”Высота h, mm ”;
key = “edit1”;
fixed_width=true;
edit_limit = 6;
}

: edit_box {
label=”Ширина L, mm”;
key = “edit2”;
fixed_width=true;
edit_limit = 6;
}
}

:row {
: edit_box {
label=”Радиус скругления R, mm “;
fixed_width=true;
key = “edit3”;
34
edit_limit = 6;
}
: edit_box {
label=”Толщина b, mm “;
fixed_width=true;
key = “edit4”;
edit_limit = 6;
}
}

: row {
: boxed_column {
label = ”Точка вставки”;
: button {
label =”Укажите точку вставки >”;
key = “pick_pt”;
}
: row {
: edit_box {
label = “X:”;
key = “x_pt”;
edit_width = 7;
}
: edit_box {
label = “Y:”;
key = “y_pt”;
edit_width = 7;
}
}
}
}
:row {
spacer;
:image {
key=”cir_image”;
height=8;
width=14;

35
color=0;
}
spacer;
}
spacer;
ok_cancel;
errtile;
}

Экранная форма этого меню показана на рис. 2. Рисунок в диалого-


вом окне представляет собой слайд. Для его создания используется
команда MSLIDE (ДСЛАЙД), которая создает файл с расширением
.sld. Созданный слайд не подлежит редактированию.

Рис. 2. Экранная форма меню для приложения COIL.lsp

П р и м е р колонки с кнопками выбора:


: boxed_radio_column{
label=”Direction”;
fixed_height=true;
fixed_width=true;

36
:radio_button {
label=”LEFT”;
key=”L”;
fixed_height=true;
fixed_width=true;
}
:radio_button {
label=”Right”;
key=”R”;
fixed_height=true;
fixed_width=true;
}
}

7.4. Управление диалоговым окном


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

Название функции Описание


(load_dialog имя Загружает указанный DCL- файл. Возвращает целое значе-
файла) ние (dcl_id), используемое в последующих вызовах функ-
ций new_dialog и unload_dialog.
ВНИМАНИЕ! В имя файла не следует вставлять расширение
(unload_dialog Выгружает указанный DCL- файл. Всегда возвращает nil
dcl_id)
(ne w_dialog имя Начинает управление диалоговым окном, выводит его на
окна dcl_id) экран. Аргумент имя окна – строка. Аргумент dcl_id опре-
деляет DCL- файл (определяется вызовом функции
load_dialog). При успешном завершении функции
(new_dialog) возвращает T (true), в противном случае – nil.
Всегда следует проверять возвращаемое функцией
ne w_dialog значение

37
Название функции Описание
(start_dialog) Начинает диалог в диалоговом окне. Диалоговое окно долж-
но быть предварительно инициализировано вызовом функ-
ции ne w_dialog. Окно остается активным, пока выражение
дей ств и я и ли фун кц и я в ызов а с в озв ратом н е в ызов ут
функцию done _dialog. Обычно вызов функции done _dialog
св язан с п олем, и меющи м ключ “acce pt” (обычн о кла-
в и ша “Ok”) и ли “cance l” (обычн о клав и ша “Отме на”)
(done_dialog Завершает диалог в диалоговом окне и убирает его с экра-
[cостояние]) на. Аргумент состояние не является обязательным. Если
аргумент иcпользуется, то ему следует присвоить некоторое
целое число
(action_tile ключ Присваивает действие, которое будет выполняться после
выражение выбора пользователем определенного поля. Аргумент ключ
действия) представляет имя поля, которое будет вызывать действие
Аргумент выражение действия вычисляется после выбора
пользователем поля. Выражение может обращаться к те-
кущему значению поля (атрибут поля v alue), определен-
ному, например, как $value к его имени, определенному
как $key. Аргументы ключ и выражение действия являют-
ся строками
Обработка полей и атрибутов
(set_tile ключ Устан ав ли в ает зн ачен и е для указан н ого п оля. Аргумен т
значение) ключ определяет поле, аргумент значение – присваиваемое
значение. Все аргументы являются строками
(ge t_tile ключ) Запрашивает значение поля. Возвращает строку
Создание изображений
Функции возвращают размеры поля в единицах диалогового
окна. Ключ определяет поле.
(dimx_tile ключ) Возвращает ширину поля
(dimy_tile ключ) Возвращает высоту поля
(s tart_image Запускает процесс создания указанного изображения
ключ) в поле, определенном аргументом ключ
(slide_image x1 y1 Отображает слайд (.sld) в диалоговом окне. Начало (0 0)
x2 y2 имя слайда) находится в левом верхнем углу. Слайд может быть отдель-
ным файлом (*.sld) или находиться в составе библиотеки
слайдов (*.slb). При вызове из библиотеки сначала указы-
вается имя библиотеки, затем в круглых скобках имя слайда.
X1 Y1 – точка вставки слайда, X2 Y2 – второй угол слайда
(end_image) Завершение создания изображения

38
7.5. Пример программы на языке AutoLisp
(prompt “\nЖдите.. Программа загружается …”); необязательная
; строка
(defun rs_error ()
(set_tile “error” “”) ;удаление содержимого поля ошибки в диало-
;говом окне
)
; Проверка ввода координаты X.
(defun do_x_pt()
(check_real (setq x_pt (get_tile “x_pt”)) “x_pt”) ;
)
; Проверка ввода координаты Y.
(defun do_y_pt()
(check_real (setq y_pt (get_tile “y_pt”)) “y_pt”) ;
)
; Проверка ввода координаты. Она возвращает либо real_number, либо
; nil
(defun check_real (real_number coord);
(if (distof real_number 2); функция distof c аргументом 2 – преоб-
; разование строки в вещественное число в десятичном виде
(progn ; координата введена правильно
(rs_error) ; удаление содержимого поля ошибки в диалоговом
; окне
real_number
)
(progn ; координата введена неправильно
(set_tile «error» ; установка сообщения в поле ошибки диа-
; логового окна
(strcat “Incorrect coordinate”
(strcase (substr coord 1 1))
“.”
)
)
nil
);end progn
);end if
);end defun check_real
39
; Функция отображает введенные значения в соответствующих полях
; диалогового окна, либо устанавливает исходные значения по умолча
; нию.
(defun defaults()
(if x_pt
(set_tile “x_pt” x_pt)
(progn
(set_tile “x_pt” (rtos 0.0000 2))
(setq x_pt (rtos 0.0000 2))
);end progn
);end if
(if y_pt
(set_tile “y_pt” y_pt)
(progn
(set_tile “y_pt” (rtos 0.0000 2))
(setq y_pt (rtos 0.0000 2))
)
)
(if h ; поле Высота
(set_tile “edit1” h)
(progn ; по умолчанию
(set_tile “edit1” “40”)
(setq h “40”)
)
)
(if L ; поле Ширина
(set_tile “edit2” L)
(progn ; по умолчанию
(set_tile “edit2” “30”)
(setq L “30”)
)
)

(if r ; поле Радиус сопряжения


(set_tile “edit3” r)
(progn ; по умолчанию
(set_tile “edit3” “3”)
40
(setq r “5”)
)
)

(if b ; поле Толщина S


(set_tile “edit4” b)
(progn ; по умолчанию
(set_tile “edit4” “3”)
(setq b “3”)
)
)
);end defun

; Проверка введенных данных на возможность геометрического по-


; строения

(defun check_dat ()
(setq h (get_tile “edit1”)) ;
(setq L (get_tile “edit2”))
(setq r (get_tile “edit3”))
(setq b (get_tile “edit4”))
(if (or (<= (atof h) (* 2.0 (atof r)))
(<= (atof h) 0) (< (atof r) 0) (<= (atof b) 0) (<= (atof L) 0)
(>= (* (atof r) 2.0) (atof L))
)
(progn
(if (<= (atof h) 0)
(progn
(set_tile “error” “ ОШИБКА: Надо h > 0 !!! “)
nil
)
(if (<= (atof L) 0)
(progn
(set_tile “error” “ОШИБКА: Надо L > 0 !!! “)
nil
)
(if (< (atof r) 0)
41
(progn
(set_tile “error” “ ОШИБКА: Надо r >= 0 !!! “)
nil
)
(if (<= (atof b) 0)
(progn
(set_tile “error” “ ОШИБКА: Надо b > 0 !!! “)
nil
)
(if (>= (* (atof r) 2.0) (atof L))
(progn
(set_tile “error” “ ОШИБКА: Надо L > 2*r !!! “)
nil
)
(if (<= (atof h) (* 2.0 (atof r)))
(progn
(set_tile “error” “ “ ОШИБКА: Надо h > 2*r !!! “)
nil
)
);end if
);end if
);end if
);end if
);end if
);end if
);end progn
(progn ; ошибок нет
(rs_error) ; очистка поля ошибки диалогового окна
(done_dialog 1) ; завершение диалога
(setq what_next 1)
)
); end if
);end defun check_dat

(defun C:COIL (); основная функция


; Отключение эхо-вывода (запросы команд и ответы на них не
; отображаются на экране
42
(setvar “CMDECHO” 0);
; сохранение текущей объектной привязки в переменной
(setq old_osmode (getvar “OSMODE”))
(setvar “OSMODE” 0); отключение объектной привязки
; “обнуление” всех переменных, участвующих в диалоговом окне
(setq h nil L nil R nil x_pt nil y_pt nil b nil)
(if (< (setq dcl_id (load_dialog “COIL”)) 0) (exit)); загрузка DCL-
; файла диалога и досрочный выход из программы, если dcl_id об-
; ращается в 0,
; т. е. файл не найден
(setq what_next 6)
(while (< 2 what_next)
(if (not (new_dialog “COIL” dcl_id)) (exit)); досрочный выход из
; про граммы в случае неудачного завершения функции
(defaults); вызов функции задания исходных значений по умол-
; чанию
(setq x (dimx_tile “cir_image”) ; определяет ширину и высоту изоб-
; ражения
y (dimy_tile “cir_image”))
(start_image “cir_image”); запуск процесса создания изображе-
; ния в поле
(slide_image 0 0 x y “COIL”); отображает слайд COIL.sld в окне
; диалога
(end_image); завершение создания изображения
(action_tile “accept” “(check_dat)”); при нажатии клавиши “ОК” –
; вызов функции; проверки введенных данных
(action_tile “cancel” “(done_dialog 0)”); при нажатии клавиши
; “Cancel” завершение диалога (отмена диалогового окна)
(action_tile “edit1” “(setq h $value)”); присвоение значений полям
(action_tile “edit2” “(setq L $value)”)
(action_tile “edit3” “(setq R $value)”)
(action_tile “edit4” “(setq b $value)”)
(action_tile “pick_pt” “(done_dialog 4)”); завершение диалога без
; его отмены
(action_tile «x_pt» “(do_x_pt)”); присвоение полям X и Y введен-
; ных значений
(action_tile “y_pt” “(do_y_pt)”)
43
(setq what_next (start_dialog)); Начинает диалог в диалоговом
; окне.
(if (= what_next 4)
(progn
(setq pt1 (getpoint “ ”)); запрос точки вставки чертежа в графи-
; ческом поле
(setq x_pt (rtos (car pt1) 2 4))
(setq y_pt (rtos (cadr pt1) 2 4))
)
);end if
); end while
(unload_dialog dcl_id); выгрузка DCL-файла.

(if (/= what_next 0)


(progn
(setq h (atof h)) (setq L (atof L)) (setq r (atof r)) (setq b
; (atof b))
(setq x_pt (atof x_pt)) (setq y_pt (atof y_pt))
(setq pt1 (list x_pt y_pt)) ; точка вставки чертежа
; определение вспомогательных точек
(setq p2 (polar pt1 0 (/L 2.0)));
(setq p21 (polar p2 (/ PI 2.0) b))
(setq pt11 (polar pt1 0 r))
(setq pt12 (polar pt1 (/ pi 2.0) r))
(setq p3 (polar (polar pt1 0 b) (/ pi 2) b))
(setq p31 (polar p3 0 r))
(setq p32 (polar p3 (/ pi 2.0) r))
(setq p4 (polar pt1 (/ PI 2.0) (/ (+ h b b) 2.0)))
(setq p41 (polar p4 0 b))
(setq pc (polar (polar pt1 0 r) (/ PI 2.0) r))
(setq pc1 (polar (polar p3 0 r) (/ PI 2.0) r))
(_$mark “$COIL”); задание начала набора $COIL (см. в фай-
; ле acad.lsp)
(_$mark “$COIL1”); задание начала набора $COIL1 (см. в
; файле acad.lsp)
(if (= r 0)
(progn
44
(command “–·LINE” p2 pt1 p4 “”)
(command “–·LINE” p21 p3 p41 “”)
)
(progn
(command “–·LINE” pt11 p2 “”)
(command “–·LINE” pt12 p4 “”)
(command “–·LINE” p21 p31 “”)
(command “–·LINE” p32 p41 “”)
(command “–·ARC” “_C” pc pt12 pt11)
(command “–·ARC” “_C” pc1 p32 p31)
)
);end if
(command “–·MIRROR” (_$endmark “$COIL”) “” p4 (polar p4 0 L)
“_N”)
; $endmark – функция, возвращающая набор $COIL
(command “–·PLINE” p4 “_W” “0.5” “0.5” p41 “”)
(command “–·MIRROR” (_$endmark “$COIL1”) “” p2 (polar p2 (/ pi
2.0) h) “_N”)
(command “–·PLINE” p2 “_W” “0.5” “0.5” p21 “”)
(setq e1 (entlast))
(command “–·MIRROR” e1 “” p4 p41 “_N”)
)
) ;end if
(command “–·ZOOM” “_E”)
(command “–·REDRAW”)
(setq C:COIL nil)
; включение ранее сохраненной объектной привязки
(setvar “OSMODE” old_osmode)
(setvar “CMDECHO” 1)
(princ);тихий выход из программы
)

45
7.6. Библиотека часто встречающихся функций
Обычно часто повторяющиеся в разных программах функции
располагают в отдельном файле. Таким файлом может быть ACAD.lsp
или файл ACADDOC.lsp. При запуске AutoCad всегда производится
поиск файла ACAD.lsp по библиотечному пути поиска. При обнаруже-
нии этого файла его содержимое загружается в оперативную память,
и функции становятся доступными для любой программы. По умол-
чанию файл ACAD.lsp загружается только один раз – при запуске
AutoCad. Если требуется, чтобы часто встречающиеся функции заг-
ружались всегда при открытии или создании чертежа, необходимо для
этих целей использовать файл ACADDOC.lsp, в который поместить
эти функции. Загрузкой файла ACAD.lsp с каждым вновь открывае-
мым чертежом можно управлять с помощью опции Load ACAD.LSP
with Every Drawing (Загружать ACAD.lsp с каждым рисунком), нахо-
дящейся на вкладке System (Система) диалогового окна Options (На-
стройка). Если этот флажок не установлен, в чертежи будет автома-
тически загружаться только файл ACADDOC.lsp. Оба файла
представляют собой обычные текстовые файлы. Ниже представлены
функции, которые могут составить основу файлов ACAD.lsp или
ACADDOC.lsp.

(defun _$rtd ($a) ; функция преобразования радианы в градусы


(* (/ 180.0 pi) $a)
(defun _$dtr ($a) ; функция градусы в радианы
(* (/ pi 180.0) $a)) (defun arcsin (x /)
; функция Arcsin угла, заданного в радианах
(cond
((= x 0.0) 0.0)
((= x 1.0) (/ pi 2))
((= x –1.0) (/ (- 0 pi) 2))
(t (atan (/ x (sqrt (abs (- 1 (* x x)))))))
)
)
(defun arccos (x /); функция Arccos угла, заданного в радианах
(cond
((= x 0.0) (/ PI 2.0))
((= x 1.0) 0.0)

46
((= x –1.0) PI)
(t (- (/ PI 2.0) (atan (/ x (sqrt (abs (- 1 (* x x))))))))
)
)

(defun _$mark ($mark) ; установка маркера начала формирования


; набора; примитивов
(if (set (read $mark) (entlast))
nil
(progn
(command “_POINT” “@”)
(set (read $mark) (entlast));
(entdel (eval (read $mark)));
)
)
)
(defun _$endmark ($mark); конец формирования набора примитивов;
; возвращает набор примитивов
(if (eval (read $mark))
(progn
(setq $ss (ssadd))
(while (set (read $mark) (entnext (eval (read $mark))))
(ssadd (eval (read $mark)) $ss)
)
)
)
)

(defun _$rline (); ожидание нажатия клавиши ENTER


(prompt “\n <<< To continue press <ENTER> >>>”)
(read-line)
)

47
8. ОРГАНИЗАЦИЯ ВВОДА-ВЫВОДА ИЗ ФАЙЛА

Функция Назначение
(getfiled <заголовок> Вызывает диалоговое окно поиска файла
<имя> <расширение> Заголовок – название диалогового окна
<флаг>) Имя – имя файла или папки, с которой начинается поиск
Расширение – расширение файла. (“” заменяется на “*”)
Флаг – опция функции
1 – при создании нового файла (нельзя использовать
для выбора существующего файла)
4 – разрешает вводить имя файла с любым расшире-
нием (или без него)
16 – аргумент имя трактуется как имя папки, в кото-
рой надо искать файл
(getfiled “Выберите файл” “D:/Труды” “doc” 16) выби-
рается каталог для поиска файла
(getfiled “Cохраните файл” “D:/Труды” “doc” 17) выби-
рается каталог для сохранения файла без указания
имени файла в поле диалога
(getfiled “Cохраните файл” “D:/Труды./a” “doc” 1)
выбирается каталог для сохранения файла с указанием
имени файла в поле диалога
(findfile <файл>) Ищет файл по имени (краткому или полному). Если
аргумент содержит имя файла без полного пути, то
поиск выполняется в рабочем каталоге и по стандарт-
ным для AutoCad путям поиска. Возвращает полное
имя файла или nil, если файла нет
(open <файл> Открывает файл для чтения, записи или дополнения
<режим>) Режим – строка из одного символа:
“w” – запись
“r” – чтение
“a” – дополнение
Возвращает дескриптор файла или nil
(setq f (open “A.TXT” “w”))
(close <дескриптор>) Закрывает файл по дескриптору файла (close f)
(read- line Считывает строку символов с клавиатуры или из
<дескриптор>) открытого файла. Возвращаемое значение – текстовая
строка. Если достигнут конец файла, то возвращается nil
(setq st (read- line f)) – из файла
(setq st1 (read- line)) – c клавиатуры

48
Функция Назначение
(read- char Считывает символ из буфера клавиатуры или из отк-
<дескриптор>) рытого файла. Возвращает целое число – код про-
читанного символа
(write- line строка Записывает строковую константу в открытый файл
<дескриптор >) или на экран. Функция возвращает строку, взятую
в кавычки, и опускает кавычки при записи в файл
(write- line “ПРИМЕР” f)
(write- char <код> Записывает буквенно- цифровой символ с заданным
<дескриптор >) кодом в файл или на экран. Возвращаемое значение
– целое число (код выведенного символа). Нельзя за-
писать символ с кодом 0. (write- char 50) – выводится
цифра 2 и возвращаемое значение 50
(vl- file- delete <файл>) Удаляет файл, возвращает значение T, если удаление
выполнено; nil – если удаление не выполнено.
(vl- file- delete “a.txt”)
Дополнительные функции
(prompt <сообщение>) Выводит сообщение на экран. Возвращаемое значе-
ние nil
(alert <сообщение>) Выводит сообщение на экран в диалоговом окне с
кнопкой OK. Возвращаемое значение nil
Если необходимо вывести несколько строк:
(setq st (strcat “Это AutoLisp\nЯзык программирования\n
в среде AutoCad”))
(alert st)
(princ ) Тихий выход. Не возвращает никакого значения. Ис-
пользуется в конце программы
(terpri) Переводит курсор на новую строку. Очередное сооб-
щение выводится с новой строки

П р и м е р:
(setq jj (open “limit.dat” “r”))
(if jj
(progn
(setq bz (atof (read-line jj)))
(setq hj (atof (read-line jj)))
)

49
(progn
(setq bz 0.8)
(setq hj 4.0)
)
)
9. СОЗДАНИЕ VLX-ПРИЛОЖЕНИЯ
В состав приложения могут входить не только LSP-файлы, но и DCL-
файлы диалоговых окон, FAS-файлы, DVB-файлы Visual Basic for
Applications и текстовые файлы (ТХТ-файлы). Все включаемые компо-
ненты собираются в единый файл приложения с расширением vlx. Свой-
ства приложения сохраняются в одноименном файле с расширением prv,
который используется в случае повторной сборки приложения. Для со-
здания нового VLX-приложения следует воспользоваться пунктом Make
Application (Собрать приложение) меню File (Файл). Пункт имеет сле-
дующие подпункты:
New Application Wizard (Мастер новых приложений);
Existing Application Properties (Свойства имеющихся приложений);
Make Application (Собрать приложение);
Rebuild Application (Перекомпилировать приложение).
Для создания нового приложения следует выбрать подпункт New
Application Wizard (Мастер новых приложений), который открывает диа-
логовое окно Wizard Mode (Режим Мастера), приведенное на рис. 3.

Рис. 3. Окно Wizard Mode


50
В этом окне необходимо задать режим, определяющий тип приложе-
ния: Simple (Простой) или Expert (Сложный). Простое приложение может
состоять только из файлов с LISP-программами (аналогично FAS-прило-
жению), а сложное может включать DCL-файлы, DVB-файлы и т. д.
В случае выбора положения переключателя Expert (Сложный) и щел-
чка по кнопке Next (Далее) открывается диалоговое окно Application
Directory (Папка приложения). Здесь нужно заполнить поле (рис. 4)
Application Name (Имя приложения), а в поле Application Location (Рас-
положение приложения) ввести полное имя папки, в которую будут запи-
саны файл приложения с расширением vlx и файл свойств приложения с
расширением prv (основная часть имени этого файла будет взята из
имени приложения).

Рис. 4. Окно Application Directory

Папку удобнее выбирать с помощью кнопки Browse (Обзор). После


задания имени приложения поле Target File (Целевой файл) покажет имя
файла нового приложения с расширением vlx. Нажатие кнопки Next (Да-
лее) приводит к следующему окну (рис. 5) – Application Options (Пара-
метры приложения). По умолчанию в данном окне флажок Separate
Namespace (Отдельное именное пространство) не установлен. Это оз-
начает, что функции и глобальные переменные вашего приложения бу-
дут доступны другим приложениям. Следующее окно (рис. 6) – LISP
Files to Include (LISP-файлы для сборки приложения) дает возможность
перечислить все файлы с расширениями lsp (исходные тексты), fas (ком-
51
Рис. 5. Окно Application Options

Рис. 6. Окно LISP Files to Include


пилированные файлы) и prv (файлы проектов), которые необходимо ин-
тегрировать в создаваемое приложение. Кнопки Add (Добавить) и
Remove (Удалить) позволяют, соответственно, добавлять или удалять
компоненты. Кнопками Тор (Начало), Up (Вверх), Down (Вниз) и Bottom
(Нижняя) можно регулировать порядок включения элементов LISP-про-
52
грамм в приложение. Раскрывающий список имеет три строки (LISP
source files (Исходные LISP-файлы),
Compiled LISP files (Скомпилированные LISP-файлы) и Visual LISP
project files (Файлы проектов Visual LISP)), помогающие добавлять в
приложение компоненты нужного типа. Кнопки Add (Добавить) и Remove
(Удалить) позволяют, соответственно, добавлять или удалять компо-
ненты. Кнопками Тор (Начало), Up (Вверх), Down (Вниз) и Bottom (Ниж-
няя) можно регулировать порядок включения элементов LISP-программ
в приложение. Раскрывающий список имеет три строки (LISP source
files (Исходные LISP-файлы), Compiled LISP files (Скомпилированные
LISP-файлы) и Visual LISP project files (Файлы проектов Visual LISP)),
помогающие добавлять в приложение компоненты нужного типа.

Рис. 7. Окно Resource Files to Include

Диалоговое окно (рис. 7) Resource Files to Include (Файлы ресур-


сов) не появится, если выбран режим простого приложения. В качестве
дополнительных ресурсов к вашему приложению могут быть добавле-
ны элементы, перечисленные в раскрывающемся списке (три первых
типа могли быть выбраны в предыдущем окне):
LISP source files (Исходные LISP-файлы);
Compiled LISP files (Скомпилированные LISP-файлы);
Visual LISP project files (Файлы проектов Visual LISP);
53
DCL files (DCL-файлы);
DVB files (DVB-файлы);
Text files (Текстовые файлы).
После задания всех дополнительных ресурсов появляется окно (рис. 8)
– Application Compilation Options (Параметры компиляции приложения).
В этом окне нужно выбрать режим компиляции Standard (Стандартная)
или Optimize and Link (Оптимизация и связывание). Оптимизация
уменьшает размер объектного кода и время загрузки приложения, но при
неправильном использовании зарезервированных символов может привес-

Рис. 8. Окно Application Compilation Options

Рис. 9. Окно Review Selections / Build Application


54
ти к неправильной работе приложения и системы AutoCAD. Последнее
окно (рис. 9), в которое можно попасть с помощью Мастера создания ново-
го приложения, – диалоговое окно Review Selections / Build Application
(Просмотр параметров/Сборка приложения). Если в данном окне ос-
тавить включенным флажок Build Application (Собрать приложение) и щел-
кнуть по кнопке Finish (Завершить), Visual LISP создаст файлы приложе-
ния (с расширением vlx) и свойства приложения (с расширением prv). Если
флажок снять и нажать на кнопку Finish (Завершить), будет создан
только PRV-файл, по которому можно в дальнейшем собрать приложе-
ние. Для этого нужно воспользоваться подпунктом Make Application
(Собрать приложение) одноименного пункта меню File (Файл). Под-
пункт Existing Application Properties (Свойства имеющихся при-
ложений) позволяет просмотреть и изменить свойства или состав при-
ложения, а подпункт Rebuild Application (Перекомпилировать
приложение) – перекомпилировать приложение, если изменились ка-
кие-либо его компоненты (DCL-файлы, LSP-файлы и т. д.). Загрузить в
среде Visual LISP собранное приложение можно с консоли с помощью
функции LISP load или пункта Load File (Загрузить файл) меню File
(Файл). Если приложение необходимо загрузить в сеансе AutoCAD без
среды Visual LISP, используют либо функцию load, либо пункт AutoLISP,
Load (Загрузить) меню Tools (Сервис) или пункт Load Application
(Приложения) того же меню.
10. МЕТОДИЧЕСКИЕ УКАЗАНИЯ К ВЫПОЛНЕНИЮ
КУРСОВОЙ РАБОТЫ
Цель курсовой работы: освоение на практике программирования в
среде VisualLisp и разработка программы параметрического чертежа
по заданию преподавателя.
Студент должен:
1. Выявить набор необходимых и достаточных размеров для напи-
сания программы.
2. Составить DCL-файл диалогового окна для решаемой задачи.
3. Создать слайд чертежа с указанием необходимых и достаточных
формальных размеров.
4. Написать LSP-программу построения параметрического чертежа.
Программа должна содержать функцию проверки вводимых данных на
предмет возможности правильного построения геометрии.

55
5. Отладить LSP-программу.
6. Запустить на выполнение разработанную программу и получить
чертеж в среде AutoCad.
7. Оформить пояснительную записку, которая должна содержать:
постановку задачи;
эскиз с формальными параметрами-размерами;
эскиз с указанием точек, использованных при разработке программы;
текст DCL-файла;
копию экрана с разработанным диалоговым окном;
текст LSP-файла с комментариями;
чертеж, построенный с помощью разработанной программы.
В Приложении приведены примеры заданий для выполнения курсо-
вой работы. В разрабатываемых программах число повторяющихся
элементов должно быть произвольным и заданным в диалоговом окне.

Библиографический список
1. Полещук Н. Н. Visual LISP и секреты адаптации AutoCad. СПб.:
БХВ-Петербург, 2001. 576 c.
2. Кудрявцев Е. AutoLisp.Программирование в AutoCad 14. М.: ДМК,
1999. 365 c.
3. Кречко Ю. AutoCad: программирование и адаптация. М.: Диа-
лог-МИФИ, 1995. 235 c.
4. Полещук Н. Н. AutoCad 2002. СПб.: БХВ-Петербург, 2003. 1200 c.
5. Зуев C. А., Полещук Н. Н. САПР на базе AutoCad – как это де-
лается. СПб.: БХВ-Петербург, 2004. 1168 с.
6. Харрингтон Д., Барчард Б., Питцер Д.AutoCad 2002 для конструкторов.
Искусство проектирования. Киев: ООО «ТИД ДС», 2002. 944 с.

56
ПРИЛОЖЕНИЕ

ПРИМЕРЫ ЗАДАНИЙ ДЛЯ КУРСОВОЙ РАБОТЫ

1 2

3 4

5 6

7 8

57
Продолжение прил.

9 10

11 12

13 14

15 16

58
Окончание прил.

17 18

19 20

21 22

23 24

59
СОДЕРЖАНИЕ

Предисловие ...................................................................................................... 3
1. Характеристика языка AutoLisp .................................................................. 4
1. 1. Типы данных ......................................................................................... 4
1.2. Системные переменные AutoCad ........................................................ 5
1.3. Функция присвоения ............................................................................ 6
2. Структура программы на языке AutoLisp ................................................... 6
3. Правила отладки в среде VISUALLISP .......................................................... 8
3.1. Синтаксические ошибки ....................................................................... 8
3.2. Устранение синтаксических ошибок .................................................... 8
3.3. Форматирование текста программы ................................................... 9
3.4. Загрузка и выполнение программы .................................................... 10
3.5. Устранение ошибок на стадии выполнения программы ................... 11
4. Встроенные функции .................................................................................... 13
4.1 Геометрические функции ...................................................................... 13
4.2. Математические функции .................................................................... 14
4.3. Функции для работы со списками ....................................................... 15
4.4. Функции преобразования ..................................................................... 17
4.5. Функции для работы со строками ........................................................ 18
4.6. Логические функции AutoLisp ............................................................ 19
4.7. Функции условного ветвления программ ........................................... 21
4.8. Функции цикла ..................................................................................... 22
5. Вызов команд AutoCad из программы ....................................................... 22
6. Доступ к примитивам и средствам AutoCad .............................................. 25
7. Организация диалога в AutoLisp .................................................................. 29
7.1. Использование функций семейства GET для ввода данных ................ 29
7.2. Диалоговое окно ................................................................................... 30
7.3. Пример диалогового окна .................................................................... 34
7.4. Управление диалоговым окном из программы на языке AutoLisp ... 37
7.5. Пример программы на языке AutoLisp .............................................. 39
7.6. Библиотека часто встречающихся функций ........................................ 46
8. Организация ввода-вывода из файла ............................................................ 48
9. Создание VLX-приложения ........................................................................... 50
10. Методические указания к выполнению курсовой работы ..................... 55
Библиографический список ............................................................................. 56
Приложение ....................................................................................................... 57

60