
- •1. Введение
- •2. Неавтоматизированное создание чертежей в AutoCad
- •3. Программирование в AutoCad
- •4. Элементы языка AutoLisp
- •5. Интегрированная среда Visual lisp
- •6. Применение функций AutoLisp
- •7. Функции вывода графических примитивов
- •8. Диалоги и диалоговые окна
- •Атрибуты заголовка диалога
- •Работа с диалогами из lisp-программ
- •Элементы диалога
- •Атрибуты элементов диалога
- •Переменные действия
- •Функции, работающие с графическими элементами
- •9. Управление работой AutoCad с помощью системных переменных
- •10. Меню и адаптации
- •11. Введение в технологию ActiveX
- •Безопасные массивы
- •Объекты и семейства
- •Варианты
- •Свойства
- •Другие функции ActiveX
- •События и реакторы
- •12. Программы, созданные на платформе AutoCad спдс GraphiCs
- •13. Специализированные программы для архитектуры и строительства
- •Ат Венцы
- •Комплекс программных продуктов, объединенных компанией аскон
- •Лоцман: спдс
- •Компас-график
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) вычисляет a1–a2–…–aN. Частный случай: (– a1) вычисляет 0–a1, то есть –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 данные файловыйдескриптор) |
Функция аналогична princ. Отличие заключается в том, что перед выводом данных функция print переходит на новую строку, а в конце данных добавляет пробел. |
|
read-line |
Чтение строки из файла (или ввод с клавиатуры, если файловый дескриптор не указан). См. пример к функции read. |
Кроме того, существуют функции копирования, удаления, переименования файлов, чтения атрибутов файлов, создания папок и т.д.
Функции доступа к графическим примитивам
Функция |
Описание и пример использования |
entlast |
Чтение информации о последнем начерченном примитиве рисунка. Например, с помощью функции command построено несколько графических примитивов (линий, окружностей и т. д.). После выполнения функций (setq b (entlast)) в переменной b сохранится информация о последнем изображенном примитиве. В дальнейшем переменная b может быть использована для редактирования примитива. Если необходимо сохранять каждый примитив рисунка, то за каждым вызовом функции command должен следовать вызов функции entlast с сохранением информации о примитивах в различных переменных. |
entsel |
Выбор примитива мышью. (setq b (entsel “Укажите … ”)). В переменной b сохранится информация о выбранном примитиве. |