Книга

Об авторах | Содержание

Предыдущий раздел ! | Следующий раздел !

Глава 12. AutoLISP в среде Visual LISP.

Часть 1.

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

Рис. 12.1. Диалоговое окно Visual LISP для AutoCAD

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

Для написания и отладки программ и приложений на языке AutoLISP в состав системы AutoCAD 2000 введена интегрированная среда разработки Visual LISP, обращение к которой осуществляется через пункт AutoLISP, Редактор Visual LISP (Visual LISP Editor) падающего меню Сервис (Tools) или команду VLISP, которые вызывают диалоговое окно Visual LISP для AutoCAD (Visual LISP for AutoCAD) (рис. 12.1).

Большая часть излагаемых в данной главе вопросов языка может быть также использована и для изучения теми читателями, которые пишут или собираются писать программы на языке AutoLISP в версиях системы с 10-й по 14-ю.

 

12.1. Интерпретатор AutoLISP

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

(+ 223.75 16.002 89.899)

Как только вы завершите ввод своего выражения нажатием на клавишу <Enter>, система AutoCAD вычислит его и выдаст результат (рис. 12.2):

329.651 (замечу, что десятичная точка в вещественных числах играет роль разделителя между целой и дробной частями).

Рис. 12.2. Использование вычислителя выражений интерпретатора AutoLISP

Замечание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Значение выражения, которое вычислялось в примере, приведенном выше, будет сохранено в переменной my_d.

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

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

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

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

; Закомментирована вся строка

(setq two_pi (+ pi pi)) ; Закомментирован конец строки

(setq md (+ 56.022 ;| внутренний

комментарий | ;78.11))

(command "_CIRCLE" '(0 0) 50); рисование окружности

 

12.2. Символы AutoLISP

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

Зарезервированными являются символы, используемые как имена функций, а также некоторые обозначения констант. Полный перечень функций языка AutoLISP приведен в приложении 8.

Замечание

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

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

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

    Замечание

    Тип символа может быть получен с помощью функции type.

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

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

Замечание

Функция getint, запрашивающая ввод целого числа, допускает только значения в диапазоне между -32768 и +32767. Аналогичный диапазон значений целых чисел допускался в языке AutoLISP предыдущих версий.

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

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

Есть функции, которые преобразуют значения из одного типа в другой (например, функции atoi, fix, float, rtos и др.).

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

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

Рассмотренные четыре символа называются еще предопределенными символами.

Замечание

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

Для хранения данных пользователь может вводить свои символы (переменные), не совпадающие по написанию с зарезервированными или ранее занятыми. Появление новых переменных осуществляется с помощью функции setq, например:

(setq r1 15.33 s24 9)

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

Замечание

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

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

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

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

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

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

Например:

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

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

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

  • vix
  • fas
  • Isp

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

12.3. Выполнение команд AutoCAD из AutoLISP

Очень важной является функция command, которая имитирует ввод пользователя в командной строке AutoCAD с клавиатуры.

Синтаксис функции:

(command [<параметр1> [<параметр2> ... [<параметрN>] ... ] ] )

Возвращаемое значение - nil.

Функция может вызываться без параметров - это равносильно нажатию клавиши <Esc>, что прерывает действие активной команды. Если параметры используются, то их количество может быть любым. Каждый из параметров обычно является текстовой строкой, имитирующей набор символов строки на клавиатуре с последующим нажатием клавиши <Enter>. Возвращаемое значение - nil.

Предположим, что нужно нарисовать отрезками рамку формата размером 210 на 297 (левый нижний угол рамки взять в точке 0,0 и верхний правый - в точке 210,297). Вспомним, что команда рисования отрезков в системе AutoCAD называется ОТРЕЗОК (LINE). Если вы не уверены, что ваша программа будет работать на машине с русской версией AutoCAD, то используйте английские имена команд с подчеркиванием (в данном случае - _LINE). С такими именами команды будут выполняться в любой версии системы. Если бы вы выполняли задачу без программы, то вводили бы с клавиатуры следующие команды и опции:

_LINE

0,0

210,0

210,297

0,297

По этим указаниям AutoCAD вызовет команду _LINE, возьмет в качестве первой точки 0,0, в качестве второй - 210,0, в качестве третьей - 210,297, в качестве четвертой - 0,297, а _С (соответствует опции Замкнуть (Close)) замкнет отрезки на первую точку (опции тоже желательно вводить английские и с подчеркиванием). Программа, имитирующая описанный алгоритм, занимает одну строку и выглядит так:

Листинг 12.1. Построение прямоугольника (вариант 1)

(command "_LINE" "0,0" "210,0" "210,297" "0,297" "_С")

Можно указанное построение выполнить в несколько строк (в несколько обращений к функции command).

Листинг 12.2. Построение прямоугольника (вариант 2)

(command "_LINE" "0,0" "210,0")

(command "210,297" "0,297")

(command "_С")

В листинге 12.2 использовано трехкратное обращение к функции command, в каждом из которых количество параметров должно быть не меньше одного.

Можно координаты точек задавать не как строку, а как списки из двух чисел целого или вещественного типа.

Листинг 12.3. Построение прямоугольника (вариант 3)

(command "_LINE" '(00) ' (210 0) ' (210 297) ' (0 297) "_С")

Апостроф опускать нельзя, т. к. выражение (210 0) без апострофа будет рассматриваться как обращение к функции 210 с аргументом 0.

Там, где требуется ввод чисел, можно в качестве аргументов подавать функции command именно числа, а не строки с числами, например:

(command "_COLOR" "1") (command "_COLOR" 1)

Оба выражения выполняют одну и ту же операцию (в качестве текущего устанавливают красный цвет, который имеет номер 1), но в первом случае номер цвета задается как строка, а во втором - как целое число.

Можно в одной функции command обратиться сразу к нескольким командам системы AutoCAD, например:

(command "_COLOR" 1 "_ZOOM" "_E")

Эта программная строка выполнит команду ЦВЕТ (COLOR) для установки красного цвета и команду ПОКАЗАТЬ (ZOOM) с опцией ГРАНИЦЫ (EXTENTS).

Для имитации варианта, когда пользователь вместо ввода опции нажимает на клавишу <Enter>, в качестве параметра функции command выступает текстовая строка нулевой длины (""). Например, если бы вы в примере, приведенном в листинге 12.1, захотели завершить команду _LINE не опцией _с (замкнуть прямоугольник), а нажатием на клавишу <Enter> (не замыкать прямоугольник), то соответствующая программная строка выглядела бы так:

(command "_LINE" "0,0" "210,0" "210,297" "0,297" "")

Предыдущий раздел ! | Следующий раздел !

©2002 Малинин В.В. - редактор
электронной версии
©2002 ЦИТ СГГА - издатель
Все права защищены.