AutoLISP в среде Visual LISP
Функции вычислений
К основным вычислительным функциям относятся следующие функции:
- (fix <число>) - усечение числа до целого (отбрасывается дробная часть);
- (rem [<число1> [<число2> ... [<числоN>] ... ]]) - получение остатка от деления аргументов <число1> на <число2>, затем остатка от деления результата на аргумент <число3> и т. д.;
- (mах [<число1> [<число2> ... [<числоN>] ... ]]) - определение максимального из чисел;
- (min [<число1> [<число2> ... [<число1N>] ... ]]) - определение минимального из чисел;
- (gcd <число1> <число2>) - вычисление наибольшего общего делителя для двух положительных целых чисел;
- (angle <точка1> <точка2>) - вычисление угла, в радианах, между осью Х текущей системы координат и вектором, идущим из точки, заданной аргументом >точка1< в точку, заданную аргументом >точка2<;
- (distance <точка1> <точка2>) - вычисление расстояния между двумя точками, заданными аргументами <точка1> и <точка2>;
- (sqrt <число>) - вычисление квадратного корня;
- (sin <число>) - вычисление синуса угла;
- (cos <число>) - вычисление косинуса угла;
- (atan <число1> [<число2>]) - вычисление арктангенса; если второй аргумент опущен, то вычисляется арктангенс от первого аргумента <число1>; если заданы оба аргумента, то вычисляется арктангенс частного от деления первого аргумента на второй <число1>/<число2>; если аргумент <число2> равен нулю, то возвращается угол +pi/2 или -pi/2 (знак выбирается по знаку аргумента >число1<);
- (ехр <число>) - вычисление натурального антилогарифма- результата возведения в степень постоянной е (2.71828);
- (expt <основание> >степень<) - возведение числа в степень;
- (log <число>) - вычисление натурального логарифма.
Примеры:
(fix -10.083) - возвращает -10; (fix 40.45) - возвращает 40; (rem 14 2) - возвращает 0 (результат целый, т. к. оба аргумента целые); (rem 12.9 3.5) - возвращает 2.4; (max 7 3.4 2.0092) - возвращает 7.0 (результат вещественный, поскольку есть вещественные аргументы); (min 7 3.4 2.0092) - возвращает 2.0092; (gcd 42 12) - возвращает 6; (angle ' (0 0) ' (50.0 50.0)) - возвращает 0.785398; (distance ' (0 0) ' (250.0 0.0)) - возвращает 250.0; (sqrt 25) - возвращает 5.0; (sin 0.0) - возвращает 0.0; (cos 0.0) - возвращает 1.0; (atan 1) - возвращает 0. 785398; (atan -1 0) - возвращает -1.5708; (ехр 1) - возвращает 2.71828; (expt 2 2) - возвращает 4 (оба аргумента целые); (expt -2 2.0) - возвращает 4.0; (log 1) - возвращает 0.0.
К вычислительным можно отнести также функции побитовых операций:
- (logand [<число1> [<число2> ... [<числоN> ]...]]) - вычисление побитового "и" для списка целых чисел;
- (logior [<число1> [<число2> ... [<числоN>]...]]) - вычисление побито-вого "или" для списка целых чисел;
- (lsh [<число> [<сдвиг>] ]) - вычисление побитового сдвига целого числа;
- (Boole <оператор> <число1> [<число2> ... ] ]) - универсальная побитовая булева функция.
Все функции побитовых операций работают с целыми аргументами и возвращают целые значения.
Функция logand (побитовое "и") работает следующим образом. Каждое целое число может быть представлено в двоичном виде (иначе говоря, в виде суммы степеней числа 2, в которой перед степенью 2 стоит множитель 0 или 1; показатель степени в данной сумме может быть от 0 до 30). Например:
31-й (старший) разряд в таком представлении отводится под знак (минусу соответствует 1, плюсу соответствует 0). После перевода всех чисел в двоичное представление, выполняется поразрядная (побитовая) операция "и" по следующему правилу:
(logand 0 0)= (logand 1 0)= (logand 0 1)= 0; (logand 1 1) = 1.
Если аргументы не заданы, то возвращается 0. Если задан только один аргумент, то возвращается <число1>.
Пример:
(logand 3 5) - возвращает 1.
Функция logior (побитовое "или") работает по следующему правилу:
(logior 1 0)= (logior 0 1)= (logior 1 1)= 1; (logior 0 0) = 0.
Если аргументы не заданы, то возвращается 0. Если задан только один аргумент, то возвращается <число1>.
Примеры:
(logior 3 5) - возвращает 7; (logior 2) - возвращает 2.
Побитовый сдвиг (функция lsh) выполняется для двоичного представления чисел. Побитовый сдвиг выполняется влево, если аргумент <сдвиг> положителен, и вправо, если - отрицателен. Целые числа могут иметь не более чем 32 бита (нумерация битов от 0 для младшего разряда до 31 - этот разряд является знаковым), поэтому если старшие разряды при сдвиге влево выходят за 31-й разряд, то они теряются. При сдвиге вправо младшие разряды теряются.
Если аргументы не заданы, то возвращается 0. Если задан только один аргумент или аргумент <сдвиг> равен 0, то возвращается >число<.
Примеры:
(lsh 2 l) - возвращает 4; (lsh 3 30) - возвращает -1073741824.
В функции Boole аргумент <оператор> должен иметь значение от 0 до 15, что соответствует 16-ти вариантам булевых функции. Остальные аргументы - произвольные целые числа.
Все булевые функции двуместные, т. е. имеют два аргумента, каждый из которых может быть 0 или 1. Номер любой булевой функции кодируется следующим образом:
- если функция для пары (1 1) возвращает 1, то к ее номеру добавляется 1=2^0;
- если функция для (1 0) возвращает 1, то добавляется 2=2^1;
- если функция для (0 1) возвращает 1, то добавляется 4=2^2;
- если функция для (0 0) возвращает 1, то добавляется 8=2^3.
При таком кодировании рассмотренные выше функции logand и logior получат номера 1 и 7.
Булева функция применяется побитно к аргументам <число1> и <число2>, затем к результату и аргументу <число3> и т. д. Если заданы только два аргумента (<оператор> и <число1>), то возвращается <число1>.
Примеры:
(Boole 15 -3 45) - возвращает - l; (Boole 8 16 17) - возвращает - 18.
Функции преобразований
Функция type позволяет определять тип символа AutoLISP:
(type <символ>)
Тип аргумента: <символ> (имя функции или переменной).
Если аргумент <символ> не является именем функции или переменной с присвоенным значением, то возвращается nil. Другие варианты возвращаемого значения:
- ENAME - имя примитива AutoCAD;
- EXRXSUBR - имя приложения ObjectARX;
- FILE - указатель (дескриптор) файла;
- INT - целое число;
- LIST - список;
- PAGETB - таблица диспетчера страничной организации памяти;
- PICKSET - набор выбора;
- REAL - вещественное число;
- SAFEARRAY - безопасный массив;
- STR - строка;
- SUBR - встроенная функция AutoLISP;
- SYM - символ;
- VARIANT - вариант;
- USUBR - пользовательская функция AutoLISP;
- VLA-object - объект Visual LISP, использующий технологию ActiveX.
Некоторые из перечисленных вариантов возвращаемого значения доступны только при использовании других средств разработки приложений.
Примеры:
(type 15) - возвращает INT; (type l+) - возвращает SUBR; (type "15") - возвращает STR; (type '(l5 16 17)) - возвращает LIST.
К функциям преобразовании относятся следующие:
- (float <число>) - преобразование целого числа в вещественное;
- (itoa <целое>) - преобразование целого числа в строку;
- (rtos <число> [<режим> [<точность>]]) - преобразование вещественного числа в строку;
- (atoi <строка>) - преобразование строки в целое число;
- (atof <строка>) - преобразование строки в вещественное число;
- (angtof <строка> [<представление>]) - преобразование строки, представляющей значение угла в различных форматах, в вещественное число, являющееся величиной угла в радианах;
- (angtos <угол> [<представление> [<точность>]]) - преобразование значения угла в радианах в строку, в соответствии с форматом;
- (distof <строка> [<режим>]) - преобразование строки, представляющей вещественное значение в одном из форматов линейных единиц, в вещественное число;
- (trans <точка> <СК-из> <СК-в> [<признак>]) - преобразование координат точки из одной системы координат (СК) в другую.
Примеры:
(float 15) - возвращает 15.0; (float -l5) - возвращает -15.0; (itoa -29031) - возвращает "-29031"; (itoa 0) - возвращает "0"; (atoi "-29031") - возвращает -29031; (atof "-29.03l") - возвращает -29. 031.
Функция rtos, преобразующая вещественное число в строку, имеет следующие аргументы:
- <число> - вещественное или целое число;
- <режим> - целое (номер режима представления вещественных чисел);
- <точность> - количество десятичных знаков в представлении вещественных чисел.
Аргументы <режим> и <точность> имеют тот же смысл и принимают те же значения, что и системные переменные LUNITS и LUPREC. Если аргументы <режим> и <точность> опущены, то в качестве их значений принимаются текущие значения LUNITS и LUPREC. На форму возвращаемого значения может оказывать влияние системная переменная UNITMODE.
Допустимые значения аргумента <режим>:
- 1 - научный;
- 2 - десятичный;
- 3 - инженерный (футы и дюймы);
- 4 - архитектурный (футы и дюймы);
- 5 - дробный.
Возвращается строка, являющаяся результатом преобразования аргумента <число> в символьное представление с заданной точностью.
Примеры:
(rtos 10.9453 1 3) - возвращает "1.095Е+01"; (rtos 10.9453 2 3) - возвращает "10.945".
Функция angtof преобразует строку, представляющую значение угла в различных форматах, в вещественное число, являющееся величиной угла в радианах. Функция angtof по своему действию является обратной к функции angtos.
Аргументы функции angtof: <строка> - строка, <представление> - целое число. Значения аргумента <представление> соответствуют значениям системной переменной AUNITS. Если аргумент <представление> опущен, то в качестве его значения принимается текущее значение переменной AUNITS.
Допустимые значения аргумента <представление>:
- градусы;
- градусы, минуты, секунды;
- грады;
- радианы;
- топографические единицы.
Возвращается вещественное значение угла в радианах, для которого аргумент <строка> является строковым представлением (возможно, в другом формате представления углов). Если аргумент <строка> задан в неправильном формате, то возвращается nil.
Примеры:
(angtof "30" 0) - возвращает 0.523599 (перевод угла из градусов в радианы); (angtof "334.365g" 2) - возвращает 5.25219.
Функция angtos преобразует значения угла в радианах в строку, в соответствии с форматом (функция angtos является обратной к функции angtof).
Аргументы функции angtos:
- <угол> - вещественное или целое значение угла в радианах;
- <представление> и <точность> - целые числа.
Значения аргумента <представление> соответствуют значениям системной переменной AUNITS, значения аргумента <точность> - значениям системной переменной AUPREC. Если аргументы <представление> и <точность> опущены, то в качестве их значений принимаются текущие значения переменных AUNITS и AUPREC.
Возвращается строка, являющаяся строковым представлением значения угла. На форму результата оказывает влияние значение системной переменной UNITMODE. Необходимо также учитывать значение переменной ANGBASE.
Примеры:
(angtos l.00 0) - возвращает "57.296"; (angtos 1 0) - возвращает "57.296"; (angtos 3.14000 0) - возвращает "179.909".
Функция distof выполняет преобразование строки, представляющей вещественное значение в одном из форматов линейных единиц, в обычное вещественное число. Функция distof является обратной по отношению к функции rtos.
Аргументы: <строка> - строка, представляющая число в одном из форматов; <режим> - целое число, значения которого соответствуют значениям системной переменной LUNITS (см. описание функции rtos). Если аргумент <режим> опущен, то в качестве его значения принимается текущее значение системной переменной LUNITS.
Возвращаемое значение - вещественное число. Если аргумент <строка> имеет неправильную структуру, то возвращается nil.
Примеры:
(distof "l" 2) - возвращает 1.0; (distof "1.0945E+01" l) - возвращает 10.945.
Функция trans преобразует координаты точки из одной системы координат (СК) в другую. Аргументы функции:
- <точка> - точка (список из двух или трех чисел, соответствующий двумерной или трехмерной точке);
- <СК-из> - код СК, в которой аргументом <точка> задана точка (т. е. СК, из которой нужно преобразовать точку), может быть целым числом или именем примитива AutoCAD;
- <СК-в> - код СК, в которую нужно преобразовать точку, заданную аргументом <точка>, может быть целым числом или именем примитива AutoCAD;
- <признак> - необязательный аргумент, если он задан и отличен от nil (например, Т), то меняет интерпретацию аргумента <точка>. В этом случае список из двух или трех чисел рассматривается не как координаты точки, а как координаты вектора перемещения.
Аргументы <СК-из> и <СК-в> могут принимать следующие значения:
- имя примитива (в том виде, в каком оно возвращается функциями ssname, entsel, nentsel, entnext, entlast);
- трехмерный вектор выдавливания (вектор нормали к плоскости);
- цифровой код от 0 до 3 (объясняется ниже).
Цифровой код системы координат может принимать такие значения:
- 0 - мировая СК (МСК) ;
- 1 - пользовательская (текущая) СК (ПСК) ;
- 2 - экранная СК (ЭСК) ;
- 3 - экранная СК листа (ЭСКЛ).
Имеются определенные условия использования этих кодов в аргументах <СК-из> и <СК-в> (иначе говоря, не всякое значение аргумента <ск-из> сочетается с любым значением аргумента <СК-в>, и наоборот).
Коды 0 и l могут использоваться в аргументах <СК-из> и <СК-в> в любых сочетаниях. Это означает, что если <СК-из> = 0, то аргумент <СК-в> может быть или любым цифровым кодом (от 0 до 3), или именем примитива, или вектором выдавливания; аналогично: если <СК-в> = о, то аргумент <СК-из> может быть или любым цифровым кодом (от 0 до 3), или именем примитива, или вектором выдавливания.
Цифровой код 2 сочетается с разными вариантами, но его интерпретация зависит от цифрового кода другой СК. Если вторая СК имеет код 0 или l, то первая СК (с кодом 2) является ЭСК текущего видового экрана. Если вторая СК имеет код 3, то первая СК (с кодом 2) является ЭСК текущего видового экрана в пространстве модели.
Цифровой код 3 (ЭСКЛ) используется только в паре с цифровым кодом 2 другой СК (разобран в предыдущем абзаце).
Имя примитива в качестве аргумента <СК-из> используется в том случае, когда координаты точки, хранящейся вместе с примитивом (например, начальная или конечная точки отрезка, центр окружности, вершина полилинии и т. п.), нужно пересчитать из системы координат объекта (СКО) в другую СК. В некоторых операциях (например, при работе с функцией entmake) возникает необходимость пересчитать точку в СКО - здесь имя примитива будет фигурировать в качестве аргумента <СК-в>.
Некоторые объекты (например, трехмерные полилинии) не имеют особой СКО и хранят свои данные в МСК.
Свои преимущества имеет и способ, когда трехмерный вектор выдавливания применяется в качестве аргументов <СК-в> или <СК-из> (например, при проектировании объекта на плоскость с известным вектором нормали). Этот способ не может использоваться для тех объектов, у которых в качестве СКО фигурирует МСК.
Возвращаемым значением функции trans является список из трех координат точки (или вектора перемещения) в новой СК. Если значения аргументов <СК-из> и <СК-в> заданы противоречиво, то возвращается nil, - например, если функция trans вызывается с цифровым кодом СК, равным 3, из пространства модели, а не из пространства листа.
Как было сказано выше, в качестве аргумента <точка> может фигурировать двумерная точка. В этом случае AutoCAD преобразует точку из двумерной в трехмерную, добавляя координату Z по следующему алгоритму.
Если задан аргумент <признак> и его значение отлично от nil (т. е. аргумент <точка> интерпретируется не как точка, а как вектор перемещения), то добавляемая координата Z получает значение 0. Если признак не задан или равен nil, то значение координаты Z зависит от аргумента <СК-из> и выбирается по табл. 3.1..
Рассмотрим пример. Предположим, в качестве ПСК выбрана система координат, у которой оси параллельны осям МСК, а начало находится в точке X=10, Y=10, Z=10. Тогда:
(trans '(1 1 1) 0 1) - возвращает (-9.0 -9.0 -9.0); (trans '(1 1 1) 0 1 T) - возвращает (1.0 1.0 1.0).