Урок 3. Интегрированная среда разработки Visual LISP

 

1.          Запуск среды Visual LISP

2.          Создание процедуры

3.          Редактирование и запуск процедуры

4.          Загрузка файла AutoLISP

5.          Справочная система

6.          Синтаксис AutoLISP

7.          Упражнения

 

В этом уроке будет показана возможность программирования в среде AutoCAD 2007 на языке AutoLISP (LISt Processing). Результатом развития языка явилось создание среды Visual LISP, облегчающей работу пользователя.

Выражения AutoLISP могут быть введены непосредственно в командную строку. Но чаще они оформляются в виде файла, который можно сохранить, а затем выполнить. Код AutoLISP представляет собой процедуры, в которых записаны команды для выполнения чертежных операций. Библиотеки таких процедур имеются на многих Web-сайтах САПР.

 

1.   Запуск среды Visual LISP

 

Файл с текстовым кодом 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 отображается пиктограмма в виде чистого листа бумаги. Если в файл внесены изменения, то к пиктограмме добавляется изображение карандаша.

 

2.   Создание процедуры

 

Выполните команду 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.

 

3.   Редактирование и запуск процедуры

 

Редактор 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.

 

4.   Загрузка файла AutoLISP

 

Чтобы использовать в данном чертеже AutoCAD процедуру AutoLISP, необходимо ее в этот чертеж загрузить. Это можно сделать либо в среде AutoLISP, либо непосредственно в пространстве AutoCAD.

В среде AutoLISP нужно открыть файл по команде File — Open File. Для его загрузки, как описано выше, нужно выполнить команду Tools — Load Text in Editor.

В среде AutoCAD загрузить процедуру AutoLISP можно двумя способами. По первому способу для загрузки процедуры Line10.lsp нужно в командной строке набрать (loadline10”)Ã. Имя без расширения заключается в кавычки. Круглые скобки показывают интерпретатору командной строки, что это выражение 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.      Загрузите файл в чертеж, набрав в командной строке (loadCircle30”)Ã

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 закрашивается только одна сфера. Исправьте процедуру так, чтобы закрашивался весь объект.

 

5.   Справочная система

 

Справку по любому термину AutoLISP можно получить в общей справочной системе AutoCAD. Но среда AutoLISP располагает своей справочной службой HELP (рис. 3.4).

 

 

Рис. 3.4. Диалоговое окно справки AutoLISP

 

В справке три основных раздела, относящихся к программированию на AutoLISP:

·        AutoLISP Reference (Справочник по AutoLISP). Здесь собраны все команды и все функции AutoLISP;

·        Visual LISP Developers 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. Диалоговое окно справочной системы

 

6.   Синтаксис AutoLISP

 

Прежде, чем выполнять задания по составлению практических программ в среде 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

 

 

 

7.   Упражнения

 

Создать программы 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. Рисунок для построения

Hosted by uCoz