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

AutoLISP в среде Visual LISP

Аннотация: AutoLISP является языком функционального программирования. Поэтому для составления процедур нужно прежде всего изучить основные встроенные функции языка. Изучение функций построено на создании из них процедур в среде Visual LISP.

Цель лекции: приобрести навыки работы с функциями AutoLISP.

Выражения AutoLISP

Основным средством разработки приложений в системе AutoCAD является язык программирования AutoLISP - вариант языка LISP, в который добавлены функции доступа к объектам и таблицам AutoCAD. Основой языка LISP является работа со списками, которые могут иметь произвольную длину и включать элементы разной природы (числа, текстовые строки и т. д.). В то же время в языке пользователю доступны обычные арифметические вычисления, логические операции, работа с файлами и т. д.

С помощью AutoLISP можно писать программы или вводить в командной строке выражения, которые затем выполняет система AutoCAD. Для чтения и разбора выражений в систему AutoCAD встроен интерпретатор AutoLISP.

Интерпретатор AutoLISP, начинает работать, если вы в командной строке в ответ на стандартную подсказку Command: введете открывающую скобку. В этот момент AutoCAD настраивается на прием и вычисление выражения AutoLISP. Это выражение, которое должно иметь форму списка, т. е. начинаться открывающей скобкой и заканчиваться закрывающей скобкой, а элементы списка должны отделяться друг от друга пробелами.

Например, для получения суммы трех чисел вы можете ввести выражение:

(+ 223.75 16.002 89.899) 

Как только вы завершите ввод своего выражения нажатием на клавишу <Enter< , система AutoCAD вычислит его и выдаст результат (рис.3.1). Точка в вещественных числах играет роль разделителя между целой и дробной частями.

 Вычисление выражений интерпретатором AutoLISP

Рис. 3.1. Вычисление выражений интерпретатором AutoLISP

Клавиатурный ввод выражений AutoLISP встречается сравнительно редко. Обычно выражения AutoLISP записываются в текстовый файл с расширением lsp, который затем загружается в AutoCAD с помощью функции load.

В приведенном примере для вычисления было дано выражение, открывающееся и закрывающееся круглыми скобками и состоящее из четырех элементов: первый - имя функции сложения ("+"), остальные - аргументы функции, т. е. слагаемые (223.75, 16.002 и 89.899). Это иллюстрирует форму вычисляемых выражений языка AutoLISP:

(<функция< [<аргумент1> [<аргумент2> ... [<аргументN> ]...]]) 

Здесь <функция> - это имя функции; <аргумент1>, <аргумент2>, ... , <аргументN> - аргументы функции, разделяемые, по крайней мере, одним пробелом. Квадратные скобки в приведенной форме указывают на то, что, начиная с некоторого места, аргументы могут быть опущены. Количество аргументов зависит от синтаксиса функции. Существуют функции, которые вызываются без аргументов.

С точки зрения AutoLISP все, что заключено в круглых скобках, является списком, который нужно обработать как вычисляемое выражение. Метод обработки определяет функция, которая должна стоять сразу после открывающей скобки. Если список содержит только аргументы (данные), то перед скобкой нужно поставить апостроф.

Основное правило AutoLISP - баланс скобок, т.е. сколько скобок открыто, столько должно быть и закрыто. Иначе AutoCAD, обнаружив дисбаланс (например, если пользователь забыл ввести конечную скобку), выдаст об этом соответствующее сообщение (рис. 3.2).

 Сообщение о дисбалансе скобок

Рис. 3.2. Сообщение о дисбалансе скобок

Для разрешения ситуации, изображенной на рис. 3.2, необходимо ввести закрывающую скобку и нажать клавишу <Enter>. После этого вы получите результат вычисления. В интегрированной среде разработки Visual LISP предусмотрены механизмы проверки скобок в файлах с текстами программ.

Выражения AutoLISP могут быть как простыми, так и составными. В выражениях могут в качестве элементов использоваться другие выражения, причем разделяющими знаками являются круглые скобки, пробелы и двойные кавычки, которые ограничивают с двух сторон текстовые константы. Например:

(- (+ 56.022 78.11) (+ 123.77 78.0))

Здесь "-" - имя функции (вычитание), имеющей два аргумента в виде выражений, каждое из которых является операцией сложения. Сначала интерпретатор AutoLISP вычислит выражения во внутренних скобках (в нашем примере получатся результаты 134.132 и 201.77), а затем подставит полученные значения и вычислит выражение (-134.132 201.77), что должно дать результат -67.638.

Интерпретатор AutoLISP вычисляет значение каждого введенного выражения и возвращает его в среду AutoCAD. Возвращаемое значение, в свою очередь, либо может быть передано для дальнейших вычислений в выражение более высокого уровня, , либо может быть сохранено в переменной - в именованном участке памяти для хранения данных. Присвоение переменной значения производится с помощью функции присвоения setq, имеющей следующий синтаксис:

(setq <переменная1> <выражение1glt; [<переменная2> <выражение2> ... [<переменнаяN> <выражениеN>] ... ] )

Функция setq может использоваться с любым количеством аргументов, которое должно быть обязательно четным и не менее 2. В качестве аргументов <переменная> могут использоваться любые символы (имена) AutoLISP, не занятые в наименованиях функций. В качестве аргументов <выражение> могут использоваться выражения AutoLISP, имена переменных или константы (например, числа или строки).

Функция setq - основное средство для сохранения значений, возвращаемых другими выражениями. Сохраним результат вычислений в переменной result:

(setq result (- (+ 56.022 78.11) (+ 123.77 78.0)))

В дальнейшем прочитать значение переменной result можно с помощью операции ! (восклицательный знак). Если в командной строке системы AutoCAD в ответ на стандартную подсказку Команда: (Command:) ввести !result, то система выдаст текущее значение переменной result (в нашем примере: 329.651).

В текст программы полезно вставлять комментарии, поясняющие, например, особенности алгоритма. Комментарием считается часть строки, начиная с символа ";" (точка с запятой), после которого не следует сразу же символ "|", и кончая последним символом строки. Закомментированной может быть вся строка программы.

Если комментарий нужно вставить в середину строки, тогда началом комментария должны быть символы ";|", а концом комментария - символы "|;" (причем конец комментария может располагаться на другой строке).

Примеры (для наглядности комментарии подчеркнуты):

; Закомментирована вся строка
(setq two_pi (+ pi pi)) ; Закомментирован конец строки
(setq md (+ 56.022 ;| внутренний
комментарий |;78.11))
(command "_CIRCLE" '(0 0) 50); рисование окружности

Символы AutoLISP

Символы AutoLISP- это слова, состоящие из группы буквенно-цифровых знаков и являющиеся именами функций или переменных, используемых для хранения данных пользователя. В символах AutoLISP не должны использоваться разделители выражений, к которым относятся круглые скобки, пробелы и двойные кавычки, и служебные знаки -"." (точка), "," (запятая), ";" (точка с запятой), " ' " (апостроф), "/" (косая черта), "\" (обратная косая черта). Написание символов не должно соответствовать написанию чисел (символ не должен состоять из одних цифр).

Зарезервированными (служебными) являются символы, используемые как имена функций, а также некоторые обозначения констант. В именах символов AutoLISP регистр (верхний или нижний) не имеет значения. Поэтому setq, SETQ, SETq, Setq, SETQ обозначают одну и ту же функцию setq.

AutoLISP работает с объектами следующих типов:

  • целое число;
  • вещественное число;
  • строка;
  • список, точечная пара;
  • дескриптор файла;
  • указатель функции, приложения;
  • примитив AutoCAD;
  • набор выбора;
  • VLA-объект.

Символам AutoLISP могут быть присвоены значения любых типов. Тип символа может быть получен с помощью функции type. Есть функции, которые преобразуют значения из одного типа в другой (например, функции atoi, fix, float, rtos и др.). Пользователь в явном виде может задавать константы следующих типов: целые, вещественные, строковые и списки.

Целые числа могут быть как положительными, так и отрицательными или нулями. Диапазон допустимых значений варьируется от -2,147,483,648 до +2,147,483,647 (крайние значения включены в допустимые: запятые могут использоваться как разделители триад).

К целым числам относятся слова, состоящие только из цифр. Кроме того, целые числа могут иметь знак "+" или "-". Функция getint, запрашивающая ввод целого числа, допускает только значения в диапазоне между -32768 и +32767. Если пользователь пытается задать целое число, не лежащее между описанными выше предельными значениями, то вводимое число преобразуется в вещественное.

Вещественные числа - это слова, которые состоят из цифр и содержат внутри только одну десятичную точку. Могут иметь знак "+" или "-". В состав вещественного числа может входить латинский символ "е" или "Е" с показателем степени числа 10 (научная форма представления вещественных чисел).

Строковые константы начинаются и заканчиваются кавычками (сами кавычки в длину константы не входят) и содержат внутри себя текст, который может состоять из любых знаков, в том числе, пробелов, скобок, апострофов. Особо рассматривается знак "\", который является служебным и используется для ввода в текстовую строку некоторых специальных знаков (например, кавычек и самого знака "\"). Константа "" считается строкой нулевой длины. В строковые константы могут входить управляющие знаки печати, например: "\n" - переход на новую строку, "\t" - символ табуляции.

Списковые константы - это списки, состоящие из постоянных элементов любого типа (списки, как и функции, открываются и закрываются круглыми скобками). Для того чтобы система AutoCAD не вычисляла выражение как функцию, постоянные списки предваряются апострофом перед открывающей скобкой.

Примеры констант:

57 
-100092 
12.98207 
11.1e+8 
"string(2) for printing" 
"52\\_l" (первая косая черта является служебной, вторая - значащим символом; если распечатать такую строку, то получим 52\_1) 
'(1 5 100 -2) 
'("Аа" "Бб" "Вв" "Гг" "Дд" "Ее") 
'("Первый" 15 "online" 90.22 "") 

Функция setq возвращает значение, совпадающее со значением выражения, присваиваемого последней переменной (<переменная>), поэтому тип результата также совпадает с типом этого выражения.

К зарезервированным (предопределенным) символам, которые пользователям не рекомендуется применять, помимо имен функций, относятся следующие:

  • т - единственная логическая константа, имеющая значение "истина";
  • nil - пустое значение (оно же в логических операциях играет роль и значения "ложь"). Это значение не эквивалентно числу 0 или пустой строке ("");
  • pi - постоянная, равная отношению длины окружности к диаметру (3.14159);
  • pause - постоянная, позволяющая ввести паузу при работе команды системы AutoCAD (используется в функции command).

В функциях, требующих в качестве аргумента логическое значение, вместо т можно вводить любое значение, отличное от nil (например, число, строку и т. д.).

При введении пользователем новых переменных для хранения данных к той части оперативной памяти, которая отведена для текущего рисунка, добавляются участки, занимаемые переменными. Если переменной присвоить значение nil, то такая переменная из памяти удаляется и ее место освобождается для других операций AutoLISP.

В многодокументном режиме (когда в одном сеансе системы AutoCAD открыто несколько рисунков) переменные одного рисунка обычно недоступны в другом. Для передачи требуется экспортировать переменные во внедокументное пространство символов.

Переменные могут использоваться в любых выражениях, например:

(setq уу2 (+ 20.56 уу0))

Ввод в командную строку с клавиатуры выражений AutoLISP не всегда удобен. Поэтому обычно записывают предварительно строки на языке AutoLISP в файл с расширением lsp. Затем загружают этот файл с помощью функции load. Синтаксис функции load следующий:

(load <файл> [<сообщение>]) 

Здесь <файл> - это строка с именем загружаемого файла, а <сообщение> - это строка с текстом сообщения, которое нужно вывести, если загружаемый файл не будет обнаружен. Возвращаемое значение в случае удачной загрузки - результат последнего выражения или имя последней функции, если в файле находятся определения функций. В случае если загружаемый файл не найден, возвращается текст сообщения об ошибке.

Например:

(load "longwid.lsp" "Файл не найден") 

Аргумент <сообщение> может быть опущен, в этом случае при ошибке загрузки выдается стандартное сообщение AutoCAD. Аргумент <файл> обычно содержит только имя файла, который ищется в соответствии с настройкой рабочего каталога и путей поиска файлов поддержки. Однако можно указывать и полное имя с маршрутом, - например, "f:/Dis/Progs/longwid.lsp" или "f:\\Dis\\Progs\\longwid.lsp". В качестве разделителя каталогов может использоваться косая черта или обратная косая черта, но обратная черта должна обязательно удваиваться.

Если расширение в имени файла опущено, то система AutoCAD пытается выполнить загрузку, поочередно добавляя следующие расширения:

vix 
fas 
lsp 

Расширение vix соответствует файлам приложений, fas - компилированным LISP-файлам, lsp - исходным LISP-файлам. Для непосредственного редактирования пользователю доступны только файлы с расширением lsp, т. к. файлы с расширениями vix и fas не являются текстовыми.

Алексей Тимонин
Алексей Тимонин
Алексей Потапкин
Алексей Потапкин

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

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

Public Sub DrawHatchedBox()

...

End Sub