Применение функций AutoLISP

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

Описанные ниже функции, если не сопровождаются примером, представлены в виде:

(функция аргумент1 аргумент2 …).

При необходимости сохранить результат работы функции в какой-либо переменной следует воспользоваться функцией setq:

(setq переменная (функция аргумент1 аргумент2 …)).

Аргументами некоторых функций являются точки. Точки понимаются в обычном геометрическом смысле. Они определяют размеры, конфигурацию и положение графических объектов AutoCAD а на плоскости или в пространстве. Для AutoLISP а точка – это список из двух или трех переменных или констант, которые определяют координаты точки – (x y) или (x y z).

Замечание: точечная пара и точка – это разные объекты!

Арифметические функции

Функция Описание и пример использования
+ Сумма чисел. (+ a1 a2 … aN) вычисляет a1+a2+…+aN. Пример: вычислить y = x1 + x2 + x3: (setq y (+ x1 x2 x3))
Разность чисел. (a1 a2 … aN) вычисляет a1a2aN. Частный случай: (a1) вычисляет 0a1, то есть –a1. Пример: вычислить y = x1 + x2x3: (setq y (– (+ x1 x2) x3))
* Произведение чисел. (* a1 a2 … aN) вычисляет a1*a2*…*aN. При перемножении больших целых чисел произведение может превысить предел -32768 или 32767, и результат будет непредсказуемым. Пример: вычислить y = 3x2: (setq y (* 3 x x))
/ Частное чисел. (/ a1 a2 … aN) вычисляет a1/(a2*a3*…*aN). Замечание. (/ 8 9) приводит к результату 0, так как LISP генерирует результат того же типа, что и аргументы. Список (/ 8 9.0) возвращает значение 0,88889.
abs Модуль числа. (abs a) вычисляет ½ a ½.

Логические функции

Функция Описание и пример использования
= Проверка равенства аргументов. При совпадении значений всех аргументов возвращается T, в противном случае – nil. В качестве аргументов можно смешивать целые и вещественные числа. Пример. (setq z (= 5 x y)). z примет значение T, если x=y=5.
/= Проверка неравенства аргументов. При совпадении значений всех аргументов возвращается nil, в противном случае – T.
< Проверка расположения аргументов по возрастанию. Список (< a1 a2 … aN) примет значение T, если a1 < a2 < … < aN.
<= Проверка расположения аргументов по неубыванию. Функция <= аналогична функции <, за исключением того, что смежные аргументы могут быть равны друг другу.
> Проверка расположения аргументов по убыванию. Список (> a1 a2 … aN) примет значение T, если a1 > a2 > … > aN.
>= Проверка расположения аргументов по невозрастанию. Функция >= аналогична функции >, за исключением того, что смежные аргументы могут быть равны друг другу.
and Логическое И. Пример. Точка на плоскости имеет координаты x, y. Проверить, находится ли точка в первом квадранте. (if (and (> x 0) (> y 0)) …)
or Логическое ИЛИ. Пример. Точка на плоскости имеет координаты x, y. Написать условие, что точка не находится в четвертом квадранте. (if (or (> x 0) (> y 0)) …)
not Операция логического отрицания. Пример. Точка на плоскости имеет координаты x, y. Написать условие, что точка находится в четвертом квадранте. (if (not (or (> x 0) (> y 0))) …)
if Выполнение условной операции типа if-then-else. Функция имеет две формы записи: 1. (if условие выражение1) – если условие=T, то выполняется выражение1. 2. (if условие выражение1 выражение2) – если условие=T, то выполняется выражение1, иначе – выражение2. Если в функции if необходимо выполнить более одного выражения, то они объединяются функцией progn.
Функция Описание и пример использования
progn Объединение не менее двух выражений в одно. Пример. Точка задана координатами x, y. Если точка находится в первом квадранте, то необходимо вычислить расстояние r от точки до начала координат и провести отрезок от точки до начала координат. (if (and (> x 0) (> y 0)) (progn (setq r (sqrt (* x x) (* y y))) (command “_line” ‘(0 0) (list x y)) ) )
cond Условный оператор типа case. (cond (условие1 выражение1) (условие2 выражение2) (…) ) Выполняется то выражение, для которого условие=T. Просмотр оставшихся условий не производится. Например, если условие2=T, то не производится проверка условия3, условия4 и т.д.
equal Проверка равенства двух аргументов в пределах допуска. Пример. Список (equal a1 a2 d) примет значение T, если ï a1 – a2 ï £ d. Если d не задан, то считается, что d=0.
while Условный оператор цикла. (while условие выражение1 выражение2 ) Выражения выполняются в цикле до тех пор, пока условие=T. Если условие=T, то среди выражений должна находиться функция, которая каким-либо образом изменяет значения переменных, входящих в условие. В противном случае программа зациклится.
repeat Выполнение операции цикла с заданным количеством повторений. (repeat количество выражение1 выражение2 … )

Функции вычислений

Функция Описание и пример использования
atan Арктангенс в радианах. Примеры. (atan a1) вычисляет arctg(a1). (atan a1 a2) вычисляет arctg(a1/a2), при этом a2 может быть равен нулю.
cos (cos u) вычисляет косинус угла в радианах.
exp (exp a) вычисляет .
expt (expt a b) вычисляет .
fix Отбрасывание дробной части. Пример. (setq c (fix v)). В переменной c сохранится целая часть v.
log (log a) вычисляет ln(a).
max (max a1 a2 a3 …) определяет максимум из указанных аргументов. Если функцию max необходимо применить к списку, то это делается с помощью функции apply. Пример. Найти максимум из элементов списка sp и сохранить его в переменной y. (setq y (apply ‘max sp)) При этом имя функции max употребляется с одиночной кавычкой.
min (min a1 a2 a3 …) определяет минимум из указанных аргументов. Функция min применяется к спискам аналогично функции max.
sin (sin u) вычисляет синус угла в радианах.
sqrt (sqrt a) вычисляет квадратный корень.
angle Вычисляет угол (в радианах) между осью X и вектором, идущим из точки p1 в точку p2. (setq p1 (getpoint “\n Введите точку 1”) p2 (getpoint “\n Введите точку 2”) u (angle p1 p2))
distance Вычисление расстояния между точками p1 и p2. (setq r (distance p1 p2))
inters Вычисление точки пересечения двух отрезков, заданных парами двумерных или трехмерных точек. Результат сохраняется в виде списка из двух или трех координат. Примеры. (setq t (inters p1 p2 p3 p4)). Первый отрезок определяют точки p1 и p2, второй – точки p3 и p4. (setq t (inters p1 p2 p3 p4 nil)) – точка пересечения будет найдена на продолжении отрезков.
Функция Описание и пример использования
polar Вычисление точки по начальной точке p1, углу a в радианах (между отрезком r и осью X) и расстоянию r. (setq p2 (polar p1 a r))

В процессе работы программы может возникнуть ситуация, когда аргументу функции присвоено значение, не соответствующее требуемому. Например, в строке программы (setq p2 (polar p1 a r)) в переменной p1 хранится не список из двух чисел, а какой-либо другой объект. В этом случае генерируется сообщение о неправильном типе данных:

error: bad argument type: нужныйтип фактическийтип.

Функции преобразования данных

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

Функция Описание и пример использования
float Преобразование целого числа в вещественное число. (float c)
itoa Преобразование целого числа в строку. Список (itoa c) возвращает строковое представление целого числа c.
rtos Преобразование вещественного числа в строку. Пример. Для получения строки s из вещественного числа v необходимо воспользоваться выражением (setq s (rtos v Режим Точность)) Режим: 1 – научный (экспоненциальный); 2 – десятичный; 3 – инженерный (футы и дюймы); 4 – архитектурный (футы и дюймы); 5 – дробный. Точность – количество знаков после десятичной точки. (rtos 10.9453 1 3) возвращает “ 1.095E+01 ”. (rtos 10.9453 2 3) возвращает “ 10.945 ”.

Функции обработки строк

Функция Описание и пример использования
read Чтение аргумента, являющегося строкой, до первого пробела. Если прочитанная строка имеет вид числа или списка, то она сохраняется в виде числа или списка. Пример. Чтение данных из внешнего файла с сохранением прочитанной строки в виде списка: (defun myf () (setq df (open “имяфайла” “r”) a (read (strcat “(“ (read-line df) “)”));a – список. ) (close df) ) Функция read-line описана в блоке функций доступа к файлам.
strcat Сцепление строк. См. пример к функции read.

Функции работы со списками

Функция Описание и пример использования
append Слияние списков в один список. (setq a 0.0 b 10.0 c (list a b); с – список ‘(0.0 10.0) d (append c (list 20.0))); d – список ‘(0.0 10.0 20.0)
apply Применение функции ко всем элементам списка. Функция apply удобна, когда какую-либо операцию необходимо выполнить над аргументами, количество которых заранее не известно. Пример. Вычислить произведение элементов списка. (setq a ‘(1 2 3 4 5) p (apply ‘* a); p=1*2*3*4*5=120 am (apply ‘max a)); am=5
car Извлечение первого элемента списка. Продолжение примера к функции append: (setq e (car d)); e=0.0
cons Добавление к списку элемента на первую позицию. Продолжение примера к функции append: (setq f (cons -1.0 d)); f – список ’(-1.0 0.0 10.0 20.0)
Функция Описание и пример использования
foreach Организация вычислений над каждым элементом списка. (foreach переменная список выражение1 выражение2 …) Пример. (setq s1 0 s2 1 a ‘(1 2 3 4 5)) (foreach p a (setq s1 (+ s1 p)); s1 = s1 + элемент списка a (setq s2 (* s2 p))); s2 = s2 * элемент списка a В переменную p поочередно подставляются элементы списка a и выполняются действия.
last Извлечение последнего элемента списка. Продолжение примера к функции append: (setq g (last d)); g = 20.0
length Вычисление длины (количества элементов) списка. Продолжение примера к функции append: (setq h (length d)); h = 3
list Создание списка из элементов. См. пример к функции append.
mapcar Применение функции к первым элементам списков, затем – ко вторым элементам списков и т.д. (setq a ‘(1 2 3 4 5) b ‘(6 7 8 9 10) p (mapcar ‘* a b); p – список ’(6 14 24 36 50).
nth Извлечение из списка элемента по порядковому номеру. Нумерация элементов списка начинается с 0. Продолжение примера к функции append: (setq i (nth 1 d)); i = 10.0
reverse Перестановка элементов списка в обратном порядке. Продолжение примера к функции append: (setq j (reverse d)); j – список ‘(20.0 10.0 0.0)
vl-position Вычисление номера позиции элемента в списке. Нумерация элементов списка начинается с 0. Продолжение примера к функции append: (setq k (vl-position 20.0 d)); k = 2.
vl-remove Удаление элементов с указанным значением из списка. Пример. (setq m (vl-remove 2 ‘(1 2 12 2 1))); m = ‘(1 12 1)
Функция Описание и пример использования
vl-sort Сортировка элементов в списке таким образом, чтобы после сортировки тест-функция выдавала результат T. Повторяющиеся элементы могут удаляться. Пример. (setq n (vl-sort ‘(0 4 0 2 2 1) ‘<)); n = ‘(0 1 2 4)

В AutoLISP встроено еще одно удобное средство работы со списками – функция lambda. Она позволяет создавать безымянные пользовательские функции одноразового применения. В некоторых случаях это улучшает выразительность и читабельность исходных текстов программ.

Обращение к функции lambda осуществляется с помощью функций apply или mapcar.

Пример: вычислить выражение b=x+ ï 2y ï +3z для, например, x=4.7, y=-3.2, z=10.5.

(setq b (apply ‘(lambda (x y z) (+ x (abs (* 2 y)) (* 3 z))) ‘(4.7 -3.2 10.5))).

Значения x, y, z будут приняты равными элементам списка (4.7, -3.2, 10.5 соответственно).

Структура вышеприведенного выражения выглядит следующим образом:

(setq b (apply ‘(lambda ( параметры ) ( выражение )) список )).

Пример: вычислить выражение b=1+q+q2+q3 для q = 1.7, 2.2, 5.8, 3,1.

(setq b (mapcar ‘(lambda (q) (+ 1.0 q (* q q) (* q q q))) ‘(1.7, 2.2, 5.8, 3,1))).

Согласно функции mapcar, выражение 1+q+q2+q3 применяется поочередно к каждому элементу списка. В переменной b сохранится список из четырех элементов с результатами вычислений.

Структура вышеприведенного выражения выглядит следующим образом:

(setq b (mapcar ‘(lambda ( параметр ) ( выражение )) список )).

Функции ввода данных

Функция Описание и пример использования
getint Ввод целого числа. (setq b (getint “\n Введите …”)) Текст приглашения к вводу появляется в командной строке AutoCAD. Символы \n являются управляющими символами и переводят курсор на следующую командную строку AutoCAD. Введенное число сохранится в переменной b.
Функция Описание и пример использования
getpoint Ввод точки с клавиатуры или мышью. (setq b (getpoint “\n Введите …”)) При вводе точки с клавиатуры координаты друг от друга отделяются запятыми.
getreal Ввод вещественного числа.
getstring Ввод строки. Функция getstring допускает применение параметров T или nil. (setq b (getstring T “\n Введите …”)) – во вводимой строке допускаются пробелы. Признаком окончания ввода является нажатие на клавишу ENTER. (setq b (getstring nil “\n Введите …”)) – во вводимой строке не допускаются пробелы. Признаком окончания ввода является нажатие на клавишу ПРОБЕЛ или ENTER.
getvar Чтение значения системной переменной. Например, (setq b (getvar “Angbase”)).
setvar Установка значения системной переменной. Например, (setvar “Angbase” 0.0). Результат, формируемый функцией setvar, не обязательно сохранять в какой-либо переменной.

Функции доступа к файлам

Функция Описание и пример использования
open Открытие файла. (setq файловыйдескриптор (open имяфайла параметр)). Режим работы с файлом зависит от параметра: “r” – открытие файла для чтения (read); “w” – открытие файла для записи (write); “a” – открытие файла для записи с сохранением содержимого файла (append). Файловый дескриптор используется в операциях чтения/записи файла и в функции закрытия файла (см. пример к функции read).
close Закрытие файла (см. пример к функции read).
princ Запись любых данных в файл (или вывод на экран, если файловый дескриптор не указан). (princ данные файловыйдескриптор)
print Функция аналогична princ. Отличие заключается в том, что перед выводом данных функция print переходит на новую строку, а в конце данных добавляет пробел.
read-line Чтение строки из файла (или ввод с клавиатуры, если файловый дескриптор не указан). См. пример к функции read.

Кроме того, существуют функции копирования, удаления, переименования файлов, чтения атрибутов файлов, создания папок и т.д.

Функции доступа к графическим примитивам

Функция Описание и пример использования
entlast Чтение информации о последнем начерченном примитиве рисунка. Например, с помощью функции command построено несколько графических примитивов (линий, окружностей и т. д.). После выполнения функций (setq b (entlast)) в переменной b сохранится информация о последнем изображенном примитиве. В дальнейшем переменная b может быть использована для редактирования примитива. Если необходимо сохранять каждый примитив рисунка, то за каждым вызовом функции command должен следовать вызов функции entlast с сохранением информации о примитивах в различных переменных.
entsel Выбор примитива мышью. (setq b (entsel “Укажите … ”)). В переменной b сохранится информация о выбранном примитиве.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: