Программирование в AutoCAD

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

Разбить на страницы
Показывать лекцию целиком

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

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

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

(рис 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.

    (рис 2.3) Диалоговое окно Load/Unload Application

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

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

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

    (рис 2.4) Диалоговое окно справки AutoLISP

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

  • AutoLISP Reference (Справочник по AutoLISP). Здесь собраны все команды и все функции AutoLISP;
  • Visual LISP Developer's Guide (Руководство разработчика на Visual LISP). Здесь содержатся все основные алгоритмы с примерами применения языка на практике;
  • Visual LISP Tutorial (Учебник по Visual LISP) - хорошее пособие для начинающих пользователей.
  • Задание 2.4

    Найти в справке основные операторы для работы с числами и текстом.

    В окне Visual LISP for AutoCAD выберите команду HELP - Visual LISP Help Topics - Содержание - AutoLISP Functions -Operators. В левой части окна откроется список операторов, а в правой части помещены комментарии и примеры (рис. 2.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.
    
    (рис 2.5) Диалоговое окно справочной системы

    Синтаксис 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 (рис. 2.6).

    (рис 2.6) Список базовых функций в справочной системе Auto Lisp

    Более подробное описание языка AutoLISP приведено в следующей лекции.

    Упражнения

    Создать программы AutoLISP по приведенным текстам. Изменить параметры. Сохранить файлы в новой папке LISP. Включить папку в маршруты поддержки.

  • Построение домика с крышей по заданным размерам. После построения замкнутого многоугольника запускаем команду зумирования с параметром 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"))
    
  • Построение линии длиной 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" "")
    )
    
  • Построение окружности радиуса 30 с центром в указанной точке. Измените программу. Введите в параметры вторую переменную rad. Значение этой переменной также должно запрашиваться.

    (defun c:circle30 (/ pt) ;Creates a circle of radius 30
      (princ "Please click a point: ")
      (setq pt (getpoint))
      (command "_circle" pt "30" "")
    )
    
  • Построение красной линии между указанными точками

    (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" "" )
    )
    
  • Последняя команда 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
    
  • Запустите отдельно команду 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*
    
  • В задании 2.3 была создана процедура построения гантели с двумя сферами. Дополните процедуру дополнительными построениями, так чтобы получилась фигура, изображенная на рис. 2.7.

    (рис 2.7) Рисунок для построения
  • Ключевые термины

    IDE - Integrated Development Environment - интегрированная среда разработки, часть пользовательского интерфейса.

    Visual Lisp - среда AutoCAD для программирования на языке Auto Lisp.

    Маршрут поиска файлов поддержки - список адресов файлов, в которых программа производит поиск заданных процедур.

    Краткие итоги

    Хотя выражения AutoLisp могут вводиться непосредственно в командную строку, удобно представлять их в виде кода процедуры, которую можно хранить в файле. Процедура представляет собой команды для выполнения чертежных операций. Составление и отладка процедуры производятся в среде Visual Lisp.

    Вопросы

  • Как открыть Visual LISP Editor?
  • Какие окна и панели инструментов имеет Visual LISP Editor?
  • Какие элементы процедуры заключаются в круглые скобки?
  • Как отделяются комментарии?
  • Как загружаются файлы Auto LISP в программу AutoCAD?
  • Как добавить файл в список маршрутов поиска файлов поддержки?
  • Страницы:

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

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

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

    (рис 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.

    (рис 2.3) Диалоговое окно Load/Unload Application

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

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

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

    (рис 2.4) Диалоговое окно справки AutoLISP

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

  • AutoLISP Reference (Справочник по AutoLISP). Здесь собраны все команды и все функции AutoLISP;
  • Visual LISP Developer's Guide (Руководство разработчика на Visual LISP). Здесь содержатся все основные алгоритмы с примерами применения языка на практике;
  • Visual LISP Tutorial (Учебник по Visual LISP) - хорошее пособие для начинающих пользователей.
  • Задание 2.4

    Найти в справке основные операторы для работы с числами и текстом.

    В окне Visual LISP for AutoCAD выберите команду HELP - Visual LISP Help Topics - Содержание - AutoLISP Functions -Operators. В левой части окна откроется список операторов, а в правой части помещены комментарии и примеры (рис. 2.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.
    
    (рис 2.5) Диалоговое окно справочной системы

    Синтаксис 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 (рис. 2.6).

    (рис 2.6) Список базовых функций в справочной системе Auto Lisp

    Более подробное описание языка AutoLISP приведено в следующей лекции.

    Упражнения

    Создать программы AutoLISP по приведенным текстам. Изменить параметры. Сохранить файлы в новой папке LISP. Включить папку в маршруты поддержки.

  • Построение домика с крышей по заданным размерам. После построения замкнутого многоугольника запускаем команду зумирования с параметром 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"))
    
  • Построение линии длиной 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" "")
    )
    
  • Построение окружности радиуса 30 с центром в указанной точке. Измените программу. Введите в параметры вторую переменную rad. Значение этой переменной также должно запрашиваться.

    (defun c:circle30 (/ pt) ;Creates a circle of radius 30
      (princ "Please click a point: ")
      (setq pt (getpoint))
      (command "_circle" pt "30" "")
    )
    
  • Построение красной линии между указанными точками

    (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" "" )
    )
    
  • Последняя команда 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
    
  • Запустите отдельно команду 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*
    
  • В задании 2.3 была создана процедура построения гантели с двумя сферами. Дополните процедуру дополнительными построениями, так чтобы получилась фигура, изображенная на рис. 2.7.

    (рис 2.7) Рисунок для построения
  • Ключевые термины

    IDE - Integrated Development Environment - интегрированная среда разработки, часть пользовательского интерфейса.

    Visual Lisp - среда AutoCAD для программирования на языке Auto Lisp.

    Маршрут поиска файлов поддержки - список адресов файлов, в которых программа производит поиск заданных процедур.

    Краткие итоги

    Хотя выражения AutoLisp могут вводиться непосредственно в командную строку, удобно представлять их в виде кода процедуры, которую можно хранить в файле. Процедура представляет собой команды для выполнения чертежных операций. Составление и отладка процедуры производятся в среде Visual Lisp.

    Вопросы

  • Как открыть Visual LISP Editor?
  • Какие окна и панели инструментов имеет Visual LISP Editor?
  • Какие элементы процедуры заключаются в круглые скобки?
  • Как отделяются комментарии?
  • Как загружаются файлы Auto LISP в программу AutoCAD?
  • Как добавить файл в список маршрутов поиска файлов поддержки?
  • Вернуться к учебному плану