Книга

Об авторах | Содержание

Предыдущий раздел ! | Следующий раздел !

Глава 12. AutoLISP в среде Visual LISP.

Часть 2.

12.4. Встроенные функции

Мы уже рассмотрели некоторые функции-AutoLISP, встроенные в систему AutoCAD (setq, load, command). В этом разделе освещаются остальные функции.

Встроенные функции по своему назначению можно классифицировать следующим образом:

  • арифметические функции;
  • логические функции;
  • функции вычислений;
  • функции преобразований;
  • функции, работающие со строками;
  • функции, работающие со списками и точечными парами;
  • функции ввода данных и указания объектов;
  • функции доступа к файлам;
  • функции доступа к примитивам;
  • функции доступа к табличным данным;
  • функции, работающие с расширенными данными;
  • функции, использующие технологию ActiveX.

Вопросы создания функций пользователя рассмотрены в разд. 12.5, а особенности работы с объектами рисунка AutoCAD - в разд. 12.6.

Полный перечень функций AutoLISP (в алфавитном порядке) приведен в приложении 8.

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

К арифметическим относятся следующие функции (вместе с описанием функций приводится их синтаксис):

  • (+ [<число1> [<число2> ... [<числоN>] ... ] ]) - сложение любого количества чисел;
  • (- [<число1> [<число2> ... [<числоN>] ... ]]) - вычитание из первого числа суммы любого количества чисел;
  • (* [<число1> [<число2> ... [<числоN>] ... ]]) - перемножение любого количества чисел;
  • (/ [<число1> [<число2> ... [<числоN>] ... ]]) -деление первого числа на произведение любого количества чисел;
  • (1+ <число>) - увеличение числа на 1;
  • (1- <число>) - уменьшение числа на 1;
  • (~ <число>) - дополнение числа до - 1;
  • (abs <число>) - абсолютная величина числа.

Все арифметические функции допускают работу с аргументами целого или вещественного типа. Если все аргументы целые, то возвращается целое значение. Если хотя бы один аргумент вещественный, то результатом будет вещественное число. Некоторые арифметические функции допускают вызов без аргументов - в этом случае возвращается 0 (целое число).

Примеры:

(+1 3) - возвращает 4;

(- -2 1.1 0.3) - возвращает - 3.4;

(* -2 1.1 0.3) - возвращает - 0.66;

(/ -2 1.1 0.3) - возвращает - 6.06061;

(/ 5 12) - возвращает 0 (оба аргумента целые!);

(1 + 1.1) - возвращает 2.1;

(1 - 1.1) - возвращает 0.1;

(~ 3) - возвращает - 4;

(abs -1.1) - возвращает 1.1.

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

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

Следующие функции выполняют операции сравнения:

  • (= <аргумент1> [<аргумент2> ... [<аргументN> ]...]) - проверка на равенство любого количества аргументов (рекомендуется использовать для чисел или строк);
  • (/= <аргумент1> [<аргумент2> ... [<аргументN> ]...]) - проверка на неравенство любого количества аргументов (рекомендуется использовать для чисел или строк);
  • (< <аргумент1> [<аргумент2> ... [<аргументN> ]...]) - проверка на возрастание любого количества аргументов, слева направо (для чисел или строк);
  • (> <аргумент1> [<аргумент2> ... [<аргументN> ]...]) -Проверка на убывание любого количества аргументов, слева направо (для чисел или строк);
  • (<= <аргумент1> [<аргумент2> ... [<аргументN> ]...]) - Проверка на неубывание любого количества аргументов, слева направо (для чисел или строк);
  • (>= <аргумент1> [<аргумент2> ... [<аргументN> ]...]) - Проверка на невозрастание любого количества аргументов, слева направо (для чисел или строк).

При сравнении строк на возрастание (убывание) используются коды буквенно-цифровых знаков строк, начиная с первого, по действующей таблице кодировки символов. Возвращается логическое значение (T или nil), nil эквивалентно значению "ложь".

Примеры:

(= -10.0 -10 -10.000) - возвращает T;

(= "STR56" "str56" "Str56") - возвращает nil;

(= "abcde" "abcde") - возвращает Т;

(/= -1.0 -1) - возвращает nil;

(/= "STR56" "Str56" "Str56") - возвращает T;

(/= "abcde" "abcde") - возвращает nil;

(< "a" "b" "k") - возвращает T;

(> 2 2 30) - возвращает nil;

(<= "q" "qa") - возвращает T;

(>= "qa" "q") - возвращает T.

Следующие функции выполняют логические операции:

  • (and [<аргумент1> [<аргумент2> ... [<аргументN>]...]]) - операция логического "и" для любого количества аргументов (все, что отлично от nil, рассматривается как т);
  • (or [<аргумент1> [<аргумент2> ... [<аргументN>]...]]) - операция ло-гического "или" для любого количества аргументов (все, что отлично от nil, рассматривается как т);
  • (not <аргумент>) - операция логического "не" (все, что отлично от nil, рассматривается как т);
  • (null <аргумент>) - операция проверки на nil (все, что отлично от nil, рассматривается как т); идентична функции not.

Примеры:

(and т т nil) - возвращает nil;

(and "a" "b" "k") - возвращает T;

(or т nil т) - возвращает T:

(or "а" "b" "k") - возвращает T;

(not nil) - возвращает T;

(not 15.88) - возвращает nil;

(null ' ()) - возвращает T;

(null "Tram") - возвращает nil.

Условная операция типа if-then-else (если-то-иначе) осуществляется с помощью функции if:

(if <условие> <выражение1> (<выражение2>] )

Типы аргументов: любые.

Возвращаемое значение: вычисленное значение <выражение1>, если значение <условие> отлично от nil (nil в логических операциях используется как "ложь"); или значение <выражение2>, если значение <условие> равно nil (когда <выражение2> опущено, тогда вместо <выражение2> возвращается nil).

Примеры:

(if (> a b) 1 10) - возвращает 1, если a>b, и 10 - в других случаях;

(if (= h1 h2) (+ h1 15) (* h1 2.5)) - возвращает результат вычисления выражения (+ h1 15), если значения h1 и h2 равны; иначе- результат вычисления выражения (* h1 2.5);

(if (< a b) "a<b") - возвращает строку "а<b" или nil (т.к. <выражение2> опущено);

(if nil "Point") - возвращает nil (т. к. <условие> всегда ложно).

Если функция if используется для выполнения по условию не одного выражения, а нескольких, то эти выражения следует объединить с помощью функции рrоgп (иначе будет синтаксическая ошибка, вызванная неправильным количеством аргументов при обращении к функции if):

(рrоgn <выражение1> <выражение2> ... [<выражениеN>])

Функция объединяет несколько (не менее двух!) выражении в одно, когда по синтаксису языка AutoLISP может использоваться только одно (как в функции if).

Типы аргументов: любые.

Рассмотрим использование функции progn на таком примере. Пусть при выполнении условия (> а b) нужно выполнить выражения (setq с -1), (setq d (-cab)) и (* d b), а при невыполнении условия - выполнить выражения (setq с 2), (setq d (* а Ь) ) И (* d с).

Листинг 12.4. Пример совместного использования функций if и progn

(if (> а b)

(progn

(setq с -1)

(setq d (-cab))

(* d b)

); конец progn

(progn

(setq с 2)

(setq d (* а b))

(* d с)

) ; конец progn

); конец if

Для удобства чтения в этом фрагменте текста программы в начале некоторых строк добавлены пробелы, чтобы открывающая скобка оказалась на одном уровне с закрывающей, а внутренние выражения были смещены относительно ближайших внешних на две позиции вправо. К закрывающим скобкам даны комментарии, согласно правилам их написания (см. разд. 12.1).

Условная операция типа case с любым количеством условий осуществляется с помощью функции cond:

(cond (<условие1> [<выражение1> ... ] ) [ (<условие2> [<выражение2> ... ])] ...)

Аргументы: любое количество списков, в каждом из которых на первом месте стоит проверяемое условие, а затем следуют выражения, которые должны быть выполнены (вычислены), если это условие оказалось истинным.

Возвращаемое значение функции cond - последнее вычисленное выражение. Если вычисляемое выражение отсутствует (не задано в списке), то возвращается результат вычисления последнего аргумента <условие>. Если аргументы функции cond не заданы, то возвращается nil.

Примеры:

(cond) - возвращает nil;

(cond (14)) - возвращает 14.

Впрочем, использование функции cond с неполным количеством аргументов не имеет особого смысла.

Рассмотрим задачу: переменной mycolor нужно присвоить текстовое значение с наименованием одного из основных цветов AutoCAD ("красный", "желтый", "зеленый", "голубой", "синий") в зависимости от текущего значения переменной сс, которая принимает значения 1, 2, 3, 4, 5. В случае если значение переменной ее оказалось отличным от перечисленных, то переменной mycolor нужно присвоить "" (пустая строка).

Листинг 12.5. Пример 1 использования функции cond

(setq mycolor (cond

((= cc 1) "красный")

((= cc 2) "желтый")

((= cc 3) "зеленый")

((= cc 4) "голубой")

((= cc 5) "синий")

(Т "")

); конец cond

); конец setq

Функция setq присваивает переменной mycolor результат вычисления функции cond. Значение, возвращаемое функцией cond, вычисляется по следующей схеме. Сначала рассматривается список, заданный в качестве первого аргумента- ((= cc 1) "красный") - и проверяется условие, являющееся первым элементом этого списка. Если оказалось, что значение переменной cc равно 1 и, значит, первое условие возвращает "истину", то дальнейшее рассмотрение аргументов функции cond не выполняется, а в качестве возвращаемого значения принимается "красный". Если первое условие не вычислилось как "истина", то проверяется второе условие и т. д. В качестве последнего, шестого, условия стоит т (т. е. "истина" при любых значениях), поэтому, если значение переменной cc не совпало с 1, 2, 3, 4, 5, то в качестве возвращаемого значения функции cond будет принято "" (пустая строка).

Еще один пример иллюстрирует случай, когда по истинности значения <условие> выполняются несколько операторов.

Листинг 12.6. Пример 2 использования функции cond

(cond

((= cc 1) (setq abc "красный")

(command "_PLINE" "-50,120.45" "97.66,23.124" "45.7,800" "_С")

) ; = cc 1

((= cc 2) (setq abc "желтый")

(command "_CIRCLE" "-50,120.45" "100")

) ; = cc 2

) ; конец cond

В этом примере функция cond проверяет значение переменной cc. Если оно равно 1, то функция setq присваивает переменной abc значение "красный", а затем AutoCAD рисует замкнутую полилинию с тремя вершинами. Если значение cc равно 2, то функция setq присваивает переменной abc значение "желтый", a AutoCAD рисует окружность радиуса 100. Если окажется, что значение cc не равно ни 1, ни 2, то функция cond вернет nil, не изменяя при этом значения переменной abc и не строя никаких новых примитивов AutoCAD. Поскольку функция command является последним выражением, как в первом, так и во втором условиях функции cond, то во всех трех случаях будет возвращено значение nil (nil является возвращаемым значением функции command - см. разд. 12.3). Однако в данном примере функция cond применена не ради возвращаемого значения, а ради изменения значения переменной abc и построения дополнительной полилинии или окружности.

Существует несколько проверочных функций, которые проверяют конкретные значения или типы:

  • (minusp <число>) - проверка числа на отрицательность;
  • (zerop <число>) - проверка числа на ноль;
  • (numberp <аргумент>) - проверка типа аргумента на число;
  • (listp <аргумент>) - проверка типа аргумента на список;
  • (boundp <символ>) - проверка, присвоено ли значение символу AutoLISP; для указания на имя функции его следует предварять апострофом.

Все эти функции возвращают значение т, если аргумент удовлетворяет требуемому условию, и nil - если не удовлетворяет.

Примеры:

(minusp (-52 24 39)) -возвращает т;

(zerop 0.0) - возвращает т;

(numberp -10.0) - возвращает т;

(numberp "1") - возвращает nil;

(listp "1") - возвращает nil;

(listp ' (-21.82)) - возвращает т;

(boundp ' +) - возвращает т.

Функция eq проверяет равенство двух аргументов (аналогична функции =):

(eq <аргумент1> <аргумент2>)

Типы аргументов: любые.

Тип возвращаемого значения: логическое (т, если значения аргументов совпали, и nil, если не совпали).

Примеры:

(eq -10.0 -10) - возвращает т;

(eq о 3) - возвращает nil;

(eq "abc" "АBC") - возвращает nil.

Функция equal проверяет равенство двух объектов (для чисел и списков из числовых величин равенство проверяется в пределах допуска):

(equal <аргумент1> <аргумент2> [<допуск>])

Типы аргументов: любые.

Тип возвращаемого значения: логическое (т, если абсолютная величина разности аргументов не превосходит значение аргумента <допуск>, и nil, если не совпали; если <допуск> не задан, то его значение считается равным нулю). Для аргументов, не являющихся числами или списками из чисел, <допуск> не используется.

Примеры:

(equal -10.0 -10) - возвращает т;

(equal 3.000 3.002 0.002) - возвращает т;

(equal "font" "font") - возвращает т;

(equal ' (1.00 2.13 2.99) ' (1 2.13 3.0) 0.1) - возвращает Т.

Функция while позволяет организовывать операции цикла по многократно проверяемому условию:

(while <условие> <выражение1> [<выражение2> ... [<выражениеN>] ... ] )

Типы аргументов: любые.

Возвращаемое значение функции while: значение <выражением>, когда последнее вычисленное значение аргумента <условие> отлично от nil. При неудачном задании цикл, организуемый с помощью функции while, может оказаться бесконечным.

Рассмотрим следующий пример. Пусть надо вычислить значение n! (факториал), т. е. произведение целых чисел от 1 до n. В данном разделе восклицательный знак используется как знак функции факториала.

Листинг 12.7. Пример использовании функции while (вычисление факториала)

(setq i 1 factorial 1)

(while (< i n)

(setq i (1+ i))

(setq factorial (* factorial i))

); конец while

Рассмотрим работу примера, когда число n равно 11 (т. е. вычисляется 11!).

В программе используются переменные i (это переменная, являющаяся счетчиком цикла) и factorial (переменная, которая накапливает произведение чисел, формирующее факториал). Перед входом в цикл они получают начальные значения - соответственно, 1 и 1 (по определению 1! считается равным 1).

Функция while проверяет условие (< i n) для текущего значения i и, если результат вычисления условия отличен от nil, то выполняет внутренние операции (две операции с участием функции setq). Таким образом, при первом входе в цикл i равно 1, проверяемое условие (< 1 n) возвращает значение т ("истина"), и функция while увеличивает i на l (получается i=2) и умножает переменную factorial на i: factorial=l*2 (не что иное как 2!).

Далее снова передается управление на вход в цикл (уже при i=2). Проверка условия опять дает результат "истина", поэтому i получает значение 3 (2+1), a factorial - 6 (2*3). И так далее, пока i не станет равным n (11) и программа покинет цикл, не выполняя внутренних операций. Результат: при n=11 factorial=39, 916,800 (запятые разделяют триады цифр).

Функция repeat используется для организации цикла с фиксированным количеством повторений:

(repeat <количество> [<выражение1> ...] )

Типы аргументов: <количество> - целое число (имеют смысл только положительные числа), <выражение1> - любое выражение. После аргумента <выражение1> могут идти другие выражения, которые нужно выполнить внутри цикла.

Возвращаемое значение - значение последнего вычисленного выражения. Если аргумент <количество> имеет нулевое или отрицательное значение, или после аргумента <количество> не заданы выражения, то функция repeat возвращает nil.

Переработаем предыдущий пример (см. листинг 12.7) - вместо while воспользуемся функцией repeat.

Листинг 12.8. Пример использования функции repeat (вычисление факториала) I

(setq i 1 factorial 1)

(repeat (1- n)

(setq i (1+ i))

(setq factorial (* factorial i))

); конец repeat

Поскольку входные значения i=1 и factorial = l! =1, то остается умножить factorial на 2, 3, ... , n. Количество таких умножении равно n-1, что на языке AutoLISP записывается как (i- n). Остальное работает как в предыдущем примере.

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

К основным вычислительным функциям относятся следующие функции:

  • (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) - возвращает о (результат целый, т. к. оба аргумента целые);

(rem 12.9 3.5) - возвращает 2.4;

(max 7 3.4 2.0092) - возвращает 7.о (результат вещественный, поскольку есть вещественные аргументы);

(min 7 3.4 2.0092) - возвращает 2.0092;

(gcd 42 12) - возвращает б;

(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^0 + 0*2^1 + 1*2^2 = 1012 , 3 = 1*2^0 + 1*2^1 + 0*2^2 = 112

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) выполняется для двоичного представления чисел (по поводу двоичного представления см. функцию logand). Побитовый сдвиг выполняется влево, если аргумент <сдвиг> положителен, и вправо, если - отрицателен. Целые числа могут иметь не более чем 32 бита (нумерация битов от 0 для младшего разряда до 31 - этот разряд является знаковым), поэтому если старшие разряды при сдвиге влево выходят за 31-й разряд, то они теряются. При сдвиге вправо младшие разряды теряются.

Если аргументы не заданы, то возвращается о. Если задан только один аргумент или аргумент <сдвиг> равен о, то возвращается <число>.

Примеры:

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

12.4.4. Функции преобразований

Функция type позволяет определять тип символа AutoLISP:

(type <символ>)

Тип аргумента: <символ> (имя функции или переменной).

Если аргумент <символ> не является именем функции или переменной с присвоенным значением, то возвращается nil. Другие варианты возвращаемого значения:

  • ENAME - имя примитива AutoCAD;
  • EXRXSUBR - имя приложения ObjectARX;
  • FILE - указатель (дескриптор) файла;
  • INT - целое число;
  • LIST - список;
  • PAGETB - таблица диспетчера страничной организации памяти;
  • PICKSET - набор выбора;
  • REAL - вещественное число;
  • SAFEARRAY - безопасный массив;
  • STR - строка;
  • SUBR - встроенная функция AutoLISP;
  • SYM - символ;
  • VARIANT - вариант;
  • USUBR - пользовательская функция AutoLISP;
  • VLA-объект - объект Visual LISP, использующий технологию ActiveX.

Некоторые из перечисленных вариантов возвращаемого значения доступны только при использовании других средств разработки приложений. Типы данных, доступные в Visual LISP, приведены в разд. 12.2.

Примеры:

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

Допустимые значения аргумента <представление>:

  • 1 - градусы;
  • 2 - градусы, минуты, секунды;
  • 3 - грады;
  • 4 - радианы;
  • 5 - топографические единицы.

Возвращается вещественное значение угла в радианах, для которого аргумент <строка> является строковым представлением (возможно, в другом формате представления углов). Если аргумент <строка> задан в неправильном формате, то возвращается 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) является ЭСК текущего видового экрана. Если вторая СК имеет код з, то первая СК (с кодом 2) является ЭСК текущего видового экрана в пространстве модели.

Цифровой код 3 (ЭСКЛ) используется только в паре с цифровым кодом 2 другой СК (разобран в предыдущем абзаце).

Имя примитива в качестве аргумента <СК-из> используется в том случае. когда координаты точки, хранящейся вместе с примитивом (например, начальная или конечная точки отрезка, центр окружности, вершина полилинии и т. п.), нужно пересчитать из системы координат объекта (СКО) в другую СК. В некоторых операциях (например, при работе с функцией entmake) возникает необходимость пересчитать точку в СКО - здесь имя примитива будет фигурировать в качестве аргумента <СК-в>.

Замечание

Некоторые объекты (например, трехмерные полилинии) не имеют особой СКО и хранят свои данные в МСК.

Свои преимущества имеет и способ, когда трехмерный вектор выдавливания применяется в качестве аргументов <СК-в> или <СК-из> (например, при проектировании объекта на плоскость с известным вектором нормали). Этот способ не может использоваться для тех объектов, у которых в качестве СКО фигурирует МСК.

Возвращаемым значением функции trans является список из трех координат точки (или вектора перемещения) в новой СК. Если значения аргументов <СК-из> и <СК-в> заданы противоречиво, то возвращается nil (например, если функция trans вызывается с цифровым кодом СК, равным 3, из пространства модели, а не из пространства листа).

Как было сказано выше, в качестве аргумента <точка> может фигурировать двумерная точка. В этом случае AutoCAD преобразует точку из двумерной в трехмерную, добавляя координату Z по следующему алгоритму.

Если задан аргумент <признак> и его значение отлично от nil (т. е. аргумент <точка> интерпретируется не как точка, а как вектор перемещения), то добавляемая координата Z получает значение 0. Если признак не задан или равен nil, то значение координаты Z зависит от аргумента <СК-из> и выбирается по табл. 12.1.

Таблица 12.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).

12.4.5. Функции, работающие со строками

К функциям, работающим со строками, относятся следующие:

  • (chr <целое>) - получает буквенно-цифровой символ (строку из одного буквенно-цифрового символа) по коду действующей таблицы символов;
  • (ascii <строка>) - получает код первого символа строки текста по действующей таблице символов;
  • (read <строка>) - читает строку-аргумент до первого пробела (или до конца, если пробелов нет) и возвращает прочитанное значение как символ AutoLISP (т. е. имя функции или переменной);
  • (strcase <строка> [<признак>]) - преобразует строку в верхний или нижний регистр (если аргумент <признак> опущен или равен nil, то функция strcase выполняет преобразование всех буквенно-цифровых символов строки в верхний регистр; если аргумент <признак> задан, и его значение отлично от nil, то выполняется преобразование строки в нижний регистр);
  • (strcat [<строка1> [<строка2> ... [<строкаN>] ... ]]) - конкатенация (сцепление)строк;
  • (strlen [<строка1> [<строка2> ... [<строкаN>] ... ]]) - вычисляет суммарную длину всех строк-аргументов (длина строки - это количество буквенно-цифровых знаков в строке);
  • (substr <строка> <начало> [<количество>]) - выделяет подстроку, начиная с заданной позиции; если количество аргументом <количество> не задано или задано больше, чем осталось в строке, определяемой аргументом <строка>, начиная с позиции, определяемой аргументом <начало>, то возвращается полный остаток строки от заданного места.

Примеры:

(chr 192) - возвращает "А" (русская буква);

(chr 48) - возвращает "0";

(ascii "A") - возвращает 192 (русская буква);

(ascii "A") - возвращает 65 (латинская буква);

(ascii "ABCDEFGH") - возвращает 65 (все буквенно-цифровые знаки, кроме первого, игнорируются);

(read "B C D E F") - возвращает B;

(read "23. 55") - возвращает 23.55;

(read "10 масса") - возвращает 10;

(strcase "AbcdE FGh-38") - возвращает "ABCDE FGH-38";

(strcase "AbcdE FGh-38" Т) - возвращает "abcde fgh-38";

(strcat "Happy N" "ew " "Year") - возвращает "Happy New Year";

(strcat (itoa 12) "-я линия") - возвращает "12-я линия";

(strlen "Happy N" "ew " "Year") - возвращает 14;

(strien "Петербург") - возвращает 9;

(substr "Happy New Year" 7 3) - возвращает "New";

(substr "Happy New Year" 7) - возвращает "New Year".

Функция wcmatch проверяет строку на соответствие образцу (шаблону):

(wcmatch <строка> <образец>)

Аргументы: <строка> - строка, структуру которой нужно проверить; <образец> - особая строка, определяющая требования к проверяемой структуре. Аргумент <образец> может содержать как обычные алфавитно-цифровые знаки, так и специальные групповые знаки (wild-card-characters), рассматриваемые в табл. 12.2. Можно в строке, определенной аргументом <образец>, задать сразу несколько шаблонов, на соответствие каждому из которых аргумент <строка> будет проверен; шаблоны должны разделяться с помощью запятой.

Таблица 12.2. Специальные знаки, которые можно использовать в образце

Знак

Назначение

#

Заменяет одну любую цифру

@

Заменяет одну букву

. (точка)

Заменяет любой символ, не являющийся ни буквой, ни цифрой

*

Заменяет любую последовательность любых символов, даже пустую; может использоваться в любом месте аргумента <образец>

?

Заменяет ровно один любой символ

~

Если стоит в начале образца, заданного аргументом <образец>, то означает "все, кроме определенного аргументом <образец>"

[...]

Заменяет любой из символов, перечисленных в скобках

[~. . .]

Заменяет любой символ, кроме перечисленных в скобках

-

Между двумя однотипными знаками указывает на диапазон

, (запятая)

Разделяет два шаблона

' (обратный апостроф)

Превращает специальный знак в обычный


 

В квадратных скобках любой знак рассматривается не как специальный, поэтому его не надо предварять обратным апострофом. Символ "\" является служебным, поэтому его использование отвечает правилам, изложенным в разд. 12.2.

Возвращаемое значение: т - если аргумент <строка> соответствует аргументу <образец>, nil - если не соответствует.

Примеры:

(wcmatch "Happy New Year" "H*") - возвращает T, т. к. проверяемая строка начинается с буквы "Н";

(wcmatch "Happy New Year" "h*") - возвращает nil (при проверке внутри строк символы "Н" и "h" считаются разными);

(wcmatch "Happy New Year" "??ppy*, *New*, * * *") - возвращает Т, т. к. все три шаблона соблюдены;

(wcmatch "Happy New Year" "*#*") - возвращает nil, т. к. нет ни одной цифры;

(wcmatch "Happy New Year" "H[adgt]*") - возвращает Т;

(wcmatch "Happy***day" "Happy'*'*'**") - возвращает Т;

(wcmatch "Year 2000" "@[email protected] [1-6]000") - возвращает Т.

Предыдущий раздел ! | Следующий раздел !

©2002 Малинин В.В. - редактор
электронной версии
©2002 ЦИТ СГГА - издатель
Все права защищены.