Урок 3. Интегрированная среда разработки Visual LISP
1. Запуск среды Visual LISP
2. Создание процедуры
3. Редактирование и запуск процедуры
4. Загрузка файла AutoLISP
5. Справочная система
6. Синтаксис AutoLISP
7. Упражнения
В этом уроке будет показана возможность программирования в среде AutoCAD 2007 на языке AutoLISP (LISt Processing). Результатом развития языка явилось создание среды Visual LISP, облегчающей работу пользователя.
Выражения AutoLISP могут быть введены непосредственно в командную строку. Но чаще они оформляются в виде файла, который можно сохранить, а затем выполнить. Код AutoLISP представляет собой процедуры, в которых записаны команды для выполнения чертежных операций. Библиотеки таких процедур имеются на многих Web-сайтах САПР.
Файл с текстовым кодом AutoLISP можно создавать в блокноте. Однако пользователям предлагается специальный удобный интерфейс — IDE (Integrated Development Environment). Интегрированная среда разработки предназначена для создания кода, отладки его и тестирования программы AutoLISP. Запуск среды производится по команде Tools — AutoLISP — Visual LISP Editor. Можно также набрать в командной строке команду Vlide. Окно Visual LISP показано на рис. 3.1.
Рис. 3.1. Окно среды Visual LISP
В строке заголовка приведен адрес открытого файла в окне AutoCAD. Ниже строки меню расположены панели инструментов:
· Standard;
· Search;
· Debug;
· View;
· Tools.
В рабочей области размещены три окна:
· файл AutoLisp с расширением .LSP, открытый по команде File — Open File;
· консоль Visual LISP Console;
· отладчик Trace.
В среде заголовка файла AutoLISP отображается пиктограмма в виде чистого листа бумаги. Если в файл внесены изменения, то к пиктограмме добавляется изображение карандаша.
Выполните команду File —
New File. В окне введите текст процедуры, который вы видите на
рис. 3.1. Воспроизведем его еще
раз:
(defun
c:line10 (/ pt) ;Creates a line of length 10 relative X
(princ
"Please click a point: ")
(setq pt
(getpoint))
(command
"_line" pt "@10,0" "")
)
Хотя текст здесь разбит на строки, это сделано только для наглядности. Все тело процедуры и каждый оператор в отдельности заключены в круглые скобки. Количество открывающих и закрывающих скобок должно быть одинаковым. Позиция закрывающей скобки несущественна. Если имеются встроенные скобки, то интерпретатор обрабатывает в первую очередь выражение во внутренних скобках. Результат этой обработки используется далее для обработки выражения во внешних скобках.
Любой текст после точки с запятой считается комментарием. Слова «Creates a line of length 10 relative X» интерпретатором не обрабатываются. Эти слова пишут, чтобы облегчить понимание процедуры читающими их людьми.
Первая строка начинается со слова defun (DEfine FUNction) — определение функции. Далее идет имя функции с:line10. Можно было бы написать просто line10. Но тогда для запуска процедуры в AutoCAD нужно набирать в командной строке (line10), т.е. это имя в скобках. Задание имени процедуры с префиксом с: позволяет вызывать ее как простую команду путем набора имени line10.
Последним элементом в первой строке является выражение (/pt). pt — это переменная (от слова point). Так как перед именем переменной стоит слеш (прямая косая черта), то это локальная переменная. Она хранит какое-то значение, которое используется только в данной процедуре. Чтобы эта переменная была доступной и в других процедурах, надо сделать ее глобальной. Для этого нужно записать ее определение без слеша — (pt). При задании нескольких переменных они перечисляются через пробел. Если переменные не задаются, то круглые скобки оставляют пустыми.
Вторая строка выводит в командной строке текст Please click a point: (Пожалуйста, укажите точку:). В командную строку выводится текст в кавычках, стоящий после оператора princ.
В третьей строке вначале выполняется команда getpoint, заключенная во внутренних скобках. Можно перевести это как «получить координаты точки, заданной пользователем». При этом пользователь вправе воспользоваться любым методом задания координат: набрать числа в командной строке, щелкнуть в нужном месте экрана или использовать объектную привязку. В любом случае программа считывает заданные координаты. Говорят, что функция getpoint «возвращает свое значение».
Следующей выполняется команда в наружной паре скобок: setq pt (getpoint). Оператор setq присваивает переменной pt значение, возвращаемое функцией getpoint. Например, мы щелкнули в точке с координатами 5,10. Тогда переменная pt примет значение 5,10.
В четвертой строке процедуры стоит выражение command "_line" pt "@10,0" "". Функция command просто отправляет на выполнение любую следующую команду AutoCAD, заключенную в кавычки. В данном случае это команда построения отрезка line.
При выполнении этой команды вначале запрашиваются координаты первой точки. Затем запрашиваются координаты второй точки. В соответствии с этими запросами после имени команды записаны параметры команды. На запрос Specify first point: берется значение переменной pt. На запрос Specify next point or [Undo]: берется значение @10,0 . Напомним, что знак @ означает задание относительных координат.
Четвертая строка заканчивается пустыми кавычками. Это эквивалентно нажатию клавиши ENTER, т.е. приводит к окончанию операции.
Таким образом, программирование в среде AutoLISP сводится
к заданию всех параметров команды в том порядке, какой наблюдается при черчении
в пространстве модели. AutoCAD делает запрос о выборе параметра команды или о значении
параметра. Ответ он находит в процедуре AutoLISP.
Редактор Visual LISP автоматически раскрашивает набранный текст в зависимости от элемента синтаксиса:
голубой встроенные функции и защищенные символы;
пурпурный текстовые строки;
зеленый целые числа;
цвет морской волны действительные числа;
пурпурный на сером фоне комментарии;
красный скобки;
черный нераспознанные элементы.
Для форматирования кода процедуры можно нажать кнопку Format Edit Window панели инструментов Tools или запустить команду Tools — Format Code in Editor. Если вы хотите форматировать только выделенный фрагмент процедуры, то нужно щелкнуть по кнопке Format Selection.
Типичные ошибки в синтаксисе (несоответствие скобок, неверное употребление функций и пр.) можно обнаружить, щелкнув по кнопке Check Edit Window (Check Selection). Результаты проверки отобразятся в окне Build Output.
При необходимости можно преобразовать выделенный операторный блок программы в комментарий нажатием кнопки Comment Block. Такая операция часто применяется при настройке программы.
Для выполнения процедуры в AutoCAD выполните следующие действия:
· загрузите код программы в активное окно AutoCAD щелчком по кнопке Load active edit window;
· в окне Console введите выражения (c:line10Ã) — откроется окно AutoCAD с приглашением: Command: 'VLIDE Please click a point:;
· укажите точку любым способом — щелкните мышью по экрану или наберите координаты в командной строке. В пространстве модели будет построен отрезок. Затем снова откроется окно Visual LISP;
· щелкните в окне текстового редактора и сохраните файл в папке \AutoCAD 2007\Support как Line10.lsp.
Задание 2.1
Зумирование чертежа
В окне Visual LISP добавьте к файлу Line10.lsp команду
(command "_zoom" "all" "")
Далее выполните следующие действия:
· загрузите процедуру щелчком по кнопке «Load edit active window»;
· перейдите в окно AutoCAD щелчком по кнопке «Activate AutoCAD»;
· наберите в командной строке Line10Ã;
· вернитесь в окно Visual LISP и сохраните файл;
· закройте окно Visual LISP.
Чтобы использовать в данном чертеже AutoCAD процедуру AutoLISP, необходимо ее в этот чертеж загрузить. Это можно сделать либо в среде AutoLISP, либо непосредственно в пространстве AutoCAD.
В среде AutoLISP нужно открыть файл по команде File — Open File. Для его загрузки, как описано выше, нужно выполнить команду Tools — Load Text in Editor.
В среде AutoCAD загрузить процедуру AutoLISP можно двумя способами. По первому способу для загрузки процедуры Line10.lsp нужно в командной строке набрать (load “line10”)Ã. Имя без расширения заключается в кавычки. Круглые скобки показывают интерпретатору командной строки, что это выражение AutoLISP. В ответ будет выдано имя функции. Протокол командной строки будет выглядеть следующим образом:
Command: (load
"line10")
C:LINE10
Command:
Чтобы запустить загруженную процедуру, наберите в командной строке имя функции как простую команду: line10. В ответ на приглашение укажите точку. В протоколе операции будут отображены таким образом:
Command: line10
Please
click a point: _line Specify first point:
Specify
next point or [Undo]:
@10,0
Specify
next point or [Undo]:
Command: nil
После запуска команды (load "line10") программа ищет файл Line10.lsp во всех каталогах (папках) поддержки. Маршруты поиска файлов поддержки можно просмотреть в диалоговом окне, открываемом по команде Tools — Options — Files (рис. 3.2):
Рис. 3.2. Списки маршрутов поиска файлов поддержки
Маршруты поиска файлов поддержки можно редактировать: удалять, добавлять, изменять порядок списка. Рекомендуется создать отдельную папку LISP для файлов .lsp и ввести ее адрес в список маршрутов.
Для совместного использования функций в нескольких открытых чертежах вместо команды (load “ИМЯ ФАЙЛА”) нужно применить команду (vl-load-all “ИМЯ ФАЙЛА”). Это эквивалентно помещению процедуры AutoLISP в файл acaddoc.lsp.
Второй способ загрузки процедуры AutoLISP состоит в использовании команды Tools —Load Application. Можно просто набрать в командной строке AppLoad. После запуска команды активизируется диалоговое окно Load/Unload Application (рис. 3.3). Для облегчения поиска нужно указать тип файлов lsp.
Рис. 3.3. Диалоговое окно Load/Unload Application
Задание 3.2
Загрузка файла процедуры в чертеж
1. Откройте Блокнот и наберите в нем следующий текст:
;;; Coздание окружности радиусом 30 мм
(defun
c:circle30 (/ pt) ;Creates a circle of radius 30
(princ
"Please click a center: ")
(setq pt
(getpoint))
(command
"_circle" pt "30")
(command "zoom" "extents")
)
2. Сохраните файл как Circle30.lsp в папке AutoCAD 2007\Support.
3. Загрузите файл в чертеж, набрав в командной строке (load “Circle30”)Ã
4. По приглашению укажите центр окружности
5. Откройте файл Circle30.lsp в среде Visual LISP. Измените его так, чтобы с его помощью можно было бы построить прямоугольник. Обе точки должны задаваться пользователем.
6. Закрасьте контур прямоугольника красным цветом по команде ChProp. Сравните свой текст процедуры с таким вариантом:
(defun
c:RecRed (/ startpt endpt)
(setq startpt (getpoint "Select the start point:"))
(setq endpt (getpoint "Select the end point"))
(command "_rectang" startpt endpt)
(command "_chprop" "_last"
"" "_color" "t" "255,0,0" "")
(command "zoom" "extents" "")
)
Задание 3.3
Процедуры для трехмерного пространства
Откройте новый чертеж. В среде Visual LISP создайте две процедуры для построения трехмерных объектов.
;;;Параллелепипед с параметрами:
;;;координаты начальной точки 0,0,0;
;;;габариты 15,10,5;
;;;цвет red.
(defun
c:box1 ()
(command "_box" "0,0,0"
"_L" "15" "10" "5" "")
(command "_chprop"
"_last" "" "_color" "blue"
"")
(command "_view" "_seiso"
"")
(command "_zoom"
"extents" "" )
)
;;;Примечание: В конце команды ставится "" (Enter).
;;;Гантель с параметрами:
;;;длина цилиндра Solid 30;
;;;центры сфер - центры оснований цилиндра;
;;;радиусы сфер 2,5.
(defun
c:Gantel ()
(command "_cylinder"
"0,0,0" "2.5" "30" "")
(command "_sphere"
"0,0,0" "10" "")
(command "_sphere"
"0,0,30" "10" "")
(command "_shapemode"
"_o" "")
(command "_view" "_seiso"
"")
(command "_chprop" "last"
"" "_color" "red" "")
(command "_zoom" "extents" "")
)
Проанализируйте эти процедуры. Запустите в модели AutoCAD команды chprop, shapemode, view, zoom. Рассмотрите параметры этих команд. Установите рабочее пространство 3DModeling. Запустите процедуры. В процедуре Gantel закрашивается только одна сфера. Исправьте процедуру так, чтобы закрашивался весь объект.
Справку по любому термину AutoLISP можно получить в общей справочной системе AutoCAD. Но среда AutoLISP располагает своей справочной службой HELP (рис. 3.4).
Рис. 3.4. Диалоговое окно справки AutoLISP
В справке три основных раздела, относящихся к программированию на AutoLISP:
· AutoLISP Reference (Справочник по AutoLISP). Здесь собраны все команды и все функции AutoLISP;
· Visual LISP Developer’s Guide (Руководство разработчика на Visual LISP). Здесь содержатся все основные алгоритмы с примерами применения языка на практике;
· Visual LISP Tutorial (Учебник по Visual LISP) — хорошее пособие для начинающих пользователей.
Задание 3.4
Найти в справке основные операторы для работы с числами и текстом
В окне Visual LISP for AutoCAD выберите команду HELP — Visual LISP Help Topics — Содержание — AutoLISP Functions —Operators. В левой части окна откроется список операторов, а в правой части помещены комментарии и примеры (рис. 3.5). Например, об операторе сравнения (= numstr [numstr] ...) сказано, что он применим и к числам и к тексту. Здесь numstr — число или строка. Оператор возвращает значение TRUE, если аргументы или строки равны, иначе возвращает NIL.
Примеры:
(= 4 4.0) returns
T, |
(= 499 499 500) returns nil, |
(= 20 388)
returns nil, |
(= "me" "me") returns T, |
(= 2.4 2.4 2.4) returns T, |
(= "me" "you") returns nil.
|
Рис. 3.5. Диалоговое окно справочной системы
Прежде, чем выполнять задания по составлению практических программ в среде Visual LISP, рассмотрим правила синтаксиса и работу некоторых функций.
Программа представляет собой набор операторных блоков. Каждый блок заключен в круглые скобки. Внутри пары круглых скобок на первом месте стоит оператор (функция), а далее следуют операнды (параметры, аргументы функции). Разделителем элементов являются пробелы.
(ОПЕРАТОР ПАРАМЕТР1 ПАРАМЕТР2 ПАРАМЕТР3 ПАРАМЕТР4)
(ФУНКЦИЯ АРГУМЕНТ1 АРГУМЕНТ2 АРГУМЕНТ3 АРГУМЕНТ4)
Рассмотрим для примера арифметические операторы для операций с числами. Арифметические операторы имеют следующие обозначения:
+ сложение;
- вычитание;
* умножение;
/ деление.
Наберите в командной строке следующее выражение
(sqrt (- (* 5.5 9.5) 3.25)) Ã
Здесь (sqrt num) — функция, возвращающая вещественный корень квадратный из целого или вещественного числа num.
Вначале производится умножение, затем вычитание, затем извлекается корень квадратный. В ответ программа выдаст число 7.0.
В качестве другого примера рассмотрим строковые функции
STRCAT функция конкатенации, объединяет строки-операнды;
SUBSTR возвращает часть строки. Первый аргумент задает строку, второй — позицию первого символа, третий — количество символов подстроки.
STRLEN возвращает количество символов строки, включая пробелы.
Наберите в командной строке такие выражения. Оставьте пробелы после I и Love.
(strcat “I
” “Love ” “You” “.”)Ã
(substr “I love you.” 3 4) Ã
(strlen “I
love you.”) Ã
Программа даст ответы: “I Love You.”, “love”, 11
Приведем еще несколько функций для работы с числами.
Функция |
Описание |
= |
Сравнение на равенство. Возвращает True, если аргументы равны между собой. Иначе возвращает nil. |
/= |
Сравнение на неравенство. Возвращает True, если аргументы не равны между собой. Иначе возвращает nil. |
< |
Сравнение меньше. Возвращает True, если каждый аргумент численно меньше следующего. Иначе возвращает nil. |
> |
Сравнение больше. Возвращает True, если каждый аргумент численно больше следующего. Иначе возвращает nil. |
<= |
Сравнение меньше или равно. Возвращает True, если каждый аргумент численно меньше или равен следующему. Иначе возвращает nil. |
>= |
Сравнение больше или равно. Возвращает True, если каждый аргумент численно больше или равен следующему. Иначе возвращает nil. |
Полный список функций можно найти в справке AutoLISP в разделе AutoLISP Developer’s Guide — Appendxes — AutoLISP Function Synopsis — Basic Functions (рис. 3.6).
Рис. 3.6. Список базовых функций в справочной системе Auto Lisp
Создать программы AutoLISP по приведенным текстам. Изменить параметры. Сохранить файлы в новой папке LISP. Включить папку в маршруты поддержки.
1. Построение домика с крышей по заданным размерам. После построения замкнутого многоугольника запускаем команду зумирования с параметром Extents.
(defun
c:domik ()
(command "_pline" "0,2" "0,0" "2,0"
"2,2" "2.5,2" "1,3" "-0.5,2" "0,2"
"")
(command "_zoom" "_e"))
2. Построение линии длиной 50 от указанной точки вдоль оси Y. Попробуйте дополнить программу: как в предыдущем задании, зумированием растяните изображение на весь экран.
(defun
c:line50 (/ pt) ;Creates a line of length 50 relative Y
(princ "Please click a point:")
(setq pt (getpoint))
(command "_line" pt "@0,50"
"")
)
3. Построение окружности радиуса 30 с центром в указанной точке. Измените программу. Введите в параметры вторую переменную rad. Значение этой переменной также должно запрашиваться.
(defun c:circle30
(/ pt) ;Creates a circle of radius 30
(princ "Please click a point: ")
(setq pt (getpoint))
(command "_circle" pt "30"
"")
)
4. Построение красной линии между указанными точками
(defun
c:redline (/ startpt endpt)
(setq startpt (getpoint "Select the
redline start point:"))
(setq endpt (getpoint "Select the redline
end point"))
(command "_line" startpt endpt
"")
(command "_chprop" "_last"
"" "_color" "red" "" )
)
5. Последняя
команда CHPROP (Изменить свойства)
имеет много параметров. Поэтому посмотрите протокол прохождения в AutoCAD этой процедуры:
Command: redline
Select the
redline start point:Select the redline end point_line Specify first
point:
Specify
next point or [Undo]:
Specify
next point or [Undo]:
Command:
_chprop
Select
objects: _last 1
found
Select
objects:
Enter
property to change
[Color/LAyer/LType/ltScale/LWeight/Thickness/Material]:
_color
New color
[Truecolor/COlorbook] <BYLAYER>: red
Enter
property to change [Color/LAyer/LType/ltScale/LWeight/Thickness/Material]:
Command: nil
6. Запустите отдельно команду CHPROP, чтобы закрасить линию желтым цветом. Программа подсказывает, по какой форме задать цвет Truecolor: Red,Green, Blue:. Поэтому желтый цвет нужно задать как 255,255,0.Протокол операций будет выглядеть следующим образом:
Command: chprop
Select objects:
1 found
Select
objects:
Enter
property to change [Color/LAyer/LType/ltScale/LWeight/Thickness/Material]: c
New color
[Truecolor/COlorbook] <BYLAYER>: t
Red,Green,Blue:
255,255,0
Enter property
to change [Color/LAyer/LType/ltScale/LWeight/Thickness/Material]:
Command: *Cancel*
7. В задании 3.3 была создана процедура построения гантели с двумя сферами. Дополните процедуру дополнительными построениями, так чтобы получилась фигура, изображенная на рис. 3.7.
Рис. 3.7. Рисунок для построения