Опубликован: 21.02.2012 | Уровень: специалист | Доступ: платный
Лекция 2:

Программирование в среде Visual LISP

< Лекция 1 || Лекция 2: 12 || Лекция 3 >
Аннотация: В этой лекции будет показана возможность программирования в среде AutoCAD 2010 на языке AutoLISP (LISt Processing) . Результатом развития языка явилось создание среды Visual LISP, облегчающей работу пользователя. Выражения AutoLISP могут быть введены непосредственно в командную строку. Но чаще они оформляются в виде файла, который можно сохранить, а затем выполнить. Код AutoLISP представляет собой процедуры, в которых записаны команды для выполнения чертежных операций. Библиотеки таких процедур имеются на многих Web-сайтах САПР.

Цель лекции: приобрести навыки работы с интегрированной средой разработки и составить простые процедуры.

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

Файл с текстовым кодом AutoLISP можно создавать в блокноте. Однако пользователям предлагается специальный удобный интерфейс - IDE (Integrated Development Environment) . Интегрированная среда разработки предназначена для создания кода, отладки его и тестирования программы AutoLISP. Запуск среды производится по команде Tools - AutoLISP - Visual LISP Editor. Можно также набрать в командной строке команду Vlide. Окно Visual LISP показано на рис. 2.1.

 Окно среды Visual LISP

Рис. 2.1. Окно среды Visual LISP

В строке заголовка приведен адрес открытого файла в окне 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):

 Списки маршрутов поиска файлов поддержки

Рис. 2.2. Списки маршрутов поиска файлов поддержки

Маршруты поиска файлов поддержки можно редактировать: удалять, добавлять, изменять порядок списка. Рекомендуется создать отдельную папку LISP для файлов .lsp и ввести ее адрес в список маршрутов.

Для совместного использования функций в нескольких открытых чертежах вместо команды (load "ИМЯ ФАЙЛА") нужно применить команду (vl-load-all "ИМЯ ФАЙЛА"). Это эквивалентно помещению процедуры AutoLISP в файл acaddoc.lsp.

Второй способ загрузки процедуры AutoLISP состоит в использовании команды Tools -Load Application. Можно просто набрать в командной строке AppLoad. После запуска команды активизируется диалоговое окно Load/Unload Application (рис. 2.3). Для облегчения поиска нужно указать тип файлов lsp.

 Диалоговое окно Load/Unload Application

Рис. 2.3. Диалоговое окно Load/Unload Application

Задание 2.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 2010\Support.
  3. Загрузите файл в чертеж, набрав в командной строке (load "Circle30")↵
  4. По приглашению укажите центр окружности
  5. Откройте файл Circle30.lsp в среде Visual LISP. Измените его так, чтобы с его помощью можно было бы построить прямоугольник. Обе точки должны задаваться пользователем.
  6. Закрасьте контур прямоугольника красным цветом по команде 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 вручную, набирая команды в командной строке. Предварительно для каждой фигуры создайте новый слой. Обратите особое внимание на параметры команд, которые предлагаются для выбора.

< Лекция 1 || Лекция 2: 12 || Лекция 3 >
Алексей Тимонин
Алексей Тимонин
Алексей Потапкин
Алексей Потапкин

Здравствуйте.

Подскажите, пожалуйста, каким образом можно передать параметры в макрос написанный в Autocad на VBA? Например, есть процедура, которая отрисовывает заштрихованный прямоугольник (см. ниже). Как её изменить, чтобы на входе от пользователя требовалось ввести также в качестве параметров координаты углов прямоугольника?

Public Sub DrawHatchedBox()

...

End Sub

Сергей Ивков
Сергей Ивков
Россия, Геленджик
Юлия Мягчилова
Юлия Мягчилова
Россия