Опубликован: 21.02.2012 | Доступ: свободный | Студентов: 2072 / 508 | Оценка: 4.20 / 4.40 | Длительность: 19:35:00
Специальности: Разработчик аппаратуры
Лекция 3:

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). Например:

5 = 1*2 \wedge 0 + 0*2 \wedge 1 + 1*2 \wedge 2 = 101_2 , 3 = 1*2 \wedge 0 + 1*2 \wedge 1 + 0*2 \wedge 2 = 11_2

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..

Таблица 3.1. Выбор функцией trans координаты Z для двумерной точки
СК-из Значение Z
МСК 0.0
ПСК Текущий уровень (значение системной переменной ELEVATION)
СКО 0.0
ЭСК В проекции на текущую плоскость построений (т. е. плоскость ТСК + текущий уровень)
ЭСКЛ В проекции на текущую плоскость построений (т. е. плоскость ТСК + текущий уровень)

Рассмотрим пример. Предположим, в качестве ПСК выбрана система координат, у которой оси параллельны осям МСК, а начало находится в точке 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).
Алексей Тимонин
Алексей Тимонин
Алексей Потапкин
Алексей Потапкин

Здравствуйте.

Подскажите, пожалуйста, каким образом можно передать параметры в макрос написанный в Autocad на VBA? Например, есть процедура, которая отрисовывает заштрихованный прямоугольник (см. ниже). Как её изменить, чтобы на входе от пользователя требовалось ввести также в качестве параметров координаты углов прямоугольника?

Public Sub DrawHatchedBox()

...

End Sub