Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_ПГК_2009.doc
Скачиваний:
4
Добавлен:
31.12.2019
Размер:
614.4 Кб
Скачать

6. Применение функций 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 + x2 x3:

(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 сохранится информация о выбранном примитиве.