Выполнение команд AutoCAD из AutoLISP — КиберПедия 

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

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Выполнение команд AutoCAD из AutoLISP

2021-06-30 40
Выполнение команд AutoCAD из AutoLISP 0.00 из 5.00 0 оценок
Заказать работу

Очень важной является функция command, которая имитирует ввод пользователя в командной строке AutoCAD с клавиатуры.

Синтаксис функции:

(command [<параметр1> [<параметр2>... [<параметрN>]... ] ])

Возвращаемое значение - nil.

Функция может вызываться без параметров - это равносильно нажатию клавиши <Esc>, что прерывает действие активной команды. Если параметры используются, то их количество может быть любым. Каждый из параметров обычно является текстовой строкой, имитирующей набор символов строки на клавиатуре с последующим нажатием клавиши <Enter>. Возвращаемое значение - nil.

Предположим, что нужно нарисовать отрезками рамку формата размером 210 на 297 (левый нижний угол рамки взять в точке 0,0 и верхний правый - в точке 210,297). Вспомним, что команда рисования отрезков в системе AutoCAD называется LINE. Если вы не уверены, что ваша программа будет работать на машине с русской версией AutoCAD, то используйте английские имена команд с подчеркиванием (в данном случае - _LINE). С такими именами команды будут выполняться в любой версии системы. Если бы вы выполняли задачу без программы, то вводили бы с клавиатуры следующие команды и опции:

_LINE 0,0 210,0 210,297 0,297 _С

По этим указаниям AutoCAD вызовет команду _LINE, возьмет в качестве первой точки 0,0, в качестве второй - 210,0, в качестве третьей - 210,297, в качестве четвертой - 0,297, а _С (соответствует опции Close) замкнет отрезки на первую точку (опции тоже желательно вводить английские и с подчеркиванием). Программа, имитирующая описанный алгоритм, занимает одну строку и выглядит так:

(command "_LINE" "0,0" "210,0" "210,297" "0,297" "_С")

Можно координаты точек задавать не как строку, а как списки из двух чисел целого или вещественного типа.

(command "_LINE" '(0 0) '(210 0) '(210 297) '(0 297) "_С")

Апостроф опускать нельзя, т. к. выражение (210 0) без апострофа будет рассматриваться как обращение к функции 210 с аргументом 0.

Там, где требуется ввод чисел, можно в качестве аргументов подавать функции command именно числа, а не строки с числами, например:

(command "_COLOR" "1") (command "_COLOR" 1)

Оба выражения выполняют одну и ту же операцию (в качестве текущего устанавливают красный цвет, который имеет номер 1), но в первом случае номер цвета задается как строка, а во втором - как целое число.

Можно в одной функции command обратиться сразу к нескольким командам системы AutoCAD, например:

(command "_COLOR" 1 "_ZOOM" "_E")

Эта программная строка выполнит команду COLOR для установки красного цвета и команду ZOOM с опцией EXTENTS (ГРАНИЦЫ).

Часто пользователь вместо ввода опции нажимает на клавишу <Enter>. Для имитации этого варианта в качестве параметра функции command выступает текстовая строка нулевой длины ("").

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

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

· арифметические функции;

· логические функции;

· функции вычислений;

· функции преобразований;

· функции, работающие со строками;

· функции, работающие со списками и точечными парами;

· функции ввода данных и указания объектов;

· функции доступа к файлам;

· функции доступа к примитивам;

· функции доступа к табличным данным;

· функции, работающие с расширенными данными;

· функции, использующие технологию ActiveX.

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

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

· (+ [<число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.

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

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

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

· (= <аргумент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оgn (иначе будет синтаксическая ошибка, вызванная неправильным количеством аргументов при обращении к функции if):

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

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

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

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

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

(if (>а b) (progn (setq с -1) (setq d (-cab)) (* d b));                конец progn (progn (setq с 2) (setq d (* а b)) (* d с));               конец progn);                        конец if

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

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

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

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

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

Примеры:

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

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

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

Пример 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 будет принято "" (пустая строка).

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

Пример 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). Однако в данном примере функция 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. В данном разделе восклицательный знак используется как знак функции факториала.

Пример использовании функции 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.

Воспользуемся функцией repeat вместо while в предыдущем примере.

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

(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 записывается как (1- n). Остальное работает как в предыдущем примере.

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

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

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

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

Поделиться с друзьями:

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.17 с.