Что возвращает функция chr() в таком примере (chr (- 65 1))? |
Программирование в среде Visual LISP
Цель лекции: приобрести навыки работы с интегрированной средой разработки и составить простые процедуры.
Запуск среды Visual LISP
Файл с текстовым кодом AutoLISP можно создавать в блокноте. Однако пользователям предлагается специальный удобный интерфейс - IDE (Integrated Development Environment) . Интегрированная среда разработки предназначена для создания кода, отладки его и тестирования программы AutoLISP. Запуск среды производится по команде Tools - AutoLISP - Visual LISP Editor. Можно также набрать в командной строке команду Vlide. Окно Visual LISP показано на рис. 2.1.
В строке заголовка приведен адрес открытого файла в окне AutoCAD. Ниже строки меню расположены панели инструментов:
- Standard;
- Search;
- Debug;
- View;
- Tools.
В рабочей области размещены три окна:
- файл AutoLisp с расширением .LSP, открытый по команде File - Open File;
- консоль Visual LISP Console;
- отладчик Trace.
В среде заголовка файла AutoLISP отображается пиктограмма в виде чистого листа бумаги. Если в файл внесены изменения, то к пиктограмме добавляется изображение карандаша.
Создание процедуры
Выполните команду File - New File. В окне введите текст процедуры, который приведен ниже:
(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" "e" "")
Далее выполните следующие действия:
- загрузите процедуру щелчком по кнопке "Load edit active window";
- перейдите в окно AutoCAD щелчком по кнопке "Activate AutoCAD";
- наберите в командной строке Line10↵;
- вернитесь в окно Visual LISP и сохраните файл;
- закройте окно Visual LISP.
Загрузка файла AutoLISP
Чтобы использовать в данном чертеже 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 (рис.2.2):
Маршруты поиска файлов поддержки можно редактировать: удалять, добавлять, изменять порядок списка. Рекомендуется создать отдельную папку LISP для файлов .lsp и ввести ее адрес в список маршрутов.
Для совместного использования функций в нескольких открытых чертежах вместо команды (load "ИМЯ ФАЙЛА") нужно применить команду (vl-load-all "ИМЯ ФАЙЛА"). Это эквивалентно помещению процедуры AutoLISP в файл acaddoc.lsp.
Второй способ загрузки процедуры AutoLISP состоит в использовании команды Tools -Load Application. Можно просто набрать в командной строке AppLoad. После запуска команды активизируется диалоговое окно Load/Unload Application (рис. 2.3). Для облегчения поиска нужно указать тип файлов lsp.
Задание 2.2
Загрузка файла процедуры в чертеж
-
Откройте Блокнот и наберите в нем следующий текст:
;;; 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") )
- Сохраните файл как Circle30.lsp в папке AutoCAD 2010\Support.
- Загрузите файл в чертеж, набрав в командной строке (load "Circle30")↵
- По приглашению укажите центр окружности
- Откройте файл Circle30.lsp в среде Visual LISP. Измените его так, чтобы с его помощью можно было бы построить прямоугольник. Обе точки должны задаваться пользователем.
-
Закрасьте контур прямоугольника красным цветом по команде ChProp. Сравните свой текст процедуры с таким вариантом:
(defun c:RecRed (/ startpt endpt) (setq startpt (getpoint "Specify the start point:")) (setq endpt (getpoint "Specify the end point")) (command "_rectang" startpt endpt) (command "_chprop" "_last" "" "_color" "t" "255,0,0" "") (command "zoom" "extents" "") )
Задание 2.3
Процедуры для трехмерного пространства
Откройте новый чертеж. В среде Visual LISP создайте две процедуры для построения трехмерных объектов. В конце команды ставится "" (Enter) .
;;;Параллелепипед с параметрами: ;;;координаты начальной точки 0,0,0; ;;;габариты 15,10,5; ;;;цвет red. (defun c:box1 (); определили функцию (command "_box" "0,0,0" "_L" "15" "10" "5" ""); построили box (command "_chprop" "_last" "" "_color" "_blue" ""); закрасили цветом blue (command "_view" "_seiso" ""); установили юго-восточный вид (command "_zoom" "_extents" "" ); растянули изображение на весь экран ) ;;;Гантель с параметрами: ;;;длина цилиндра 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 "union" "all" "" ""); объединили в одно тело все три фигуры (command "_view" "_seiso" ""); установили юго-восточный вид (command "_chprop" "last" "" "_color" "t" "255,0,0" "" ""); закрасили красным (command "_zoom" "extents" ""); растянули изображение на весь экран )
Проанализируйте эти процедуры. Запустите в модели AutoCAD команды chprop, view, union, zoom. Рассмотрите параметры этих команд. Установите рабочее пространство 3DModeling. Запустите процедуры. В процедуре Gantel фигура закрашивается красным. Исправьте процедуру так, чтобы закрашивался весь объект. Измените число изолиний на нуль по команде isolines. В процедуре с:box1 введите визуальный стиль Realistic. Закрасьте box цветом cyan.
Попробуйте построить box и gantel вручную, набирая команды в командной строке. Предварительно для каждой фигуры создайте новый слой. Обратите особое внимание на параметры команд, которые предлагаются для выбора.