Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Книги_AutoCad_2 / Настройка AutoCAD_Sham_Tickoo-Customizing_2006г

.pdf
Скачиваний:
182
Добавлен:
09.04.2015
Размер:
9.06 Mб
Скачать

Использование AutoLISP

421

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

Функция setvar

Функция setvar позволяет присваивать требуемые значения системным переменным AutoCAD. Имя системной переменной должно указываться в кавычках. Функция setvar имеет следующий формат:

(setvar "имя_переменной" значение)

где

имя_переменной имя системной переменной AutoCAD;

значение значение, присваиваемое системной переменной.

Примеры

(setvar "cmdecho" 0) (setvar "dimscale" 1.5) (setvar "ltscale" 0.5) (setvar "dimcen" -0.25)

Пример 2

Напишите программу на языке AutoLISP, которая позволила бы начертить фаску, при этом укажите угол скоса и один из линейных размеров. Для построения фаски в программе AutoCAD используются значения, присвоенные системным переменным CHAMFERA и CHAMFERB. При выборе команды CHAMFER (ФАСКА) линейные размеры фаски (горизонтальный и вертикальный) автоматически присваиваются системным переменным CHAMFERA и CHAMFERB, а затем используются указанной командой для вычерчивания фаски. Тем не менее, в машиностроительном черчении более предпочтительным способом определения фаски является задание угла и одного из линейных размеров, как показано на рис. 12.5.

Входные данные

Первый размер фаски (D)

Угол скоса (А)

Выходные данные

• Фаска между двумя выбранными линиями

Рис. 12.5. Фаска, заданная углом А и размером D

422

Глава 12

Шаг 1: знакомство с алгоритмом программы

Обработка данных

1.Вычисление второго размера фаски.

2.Присвоение этих значений системным переменным CHAMFERA и CHAMFERB.

3.Вычерчивание фаски с помощью команды CHAMFER.

Вычисления

x/d = tan a

x = d * (tan a) = d * [(sin a) / (cos a)]

Шаг 2: запись программы AutoLISP

Для записи программы на языке AutoLISP можно использовать любой текстовый редактор. Ниже приведен листинг программы для примера 3. Номера строк в правой части листинга не являются частью программного кода, а используются только для ссылок.

;Эта программа дает вам возможность начертить фаску,

1

;введя угол скоса и линейный размер фаски.

2

;

3

(defun c:chamf (/d a)

4

(setvar "cmdecho" 0)

5

(graphscr)

6

(setq d (getdist "\n Enter chamfer distance: "))

7

(setq a (getangle "\n Enter chamfer angle: "))

8

(setvar "chamfera" d)

9

(setvar "chamferb" (* d (/ (sin a) (cos a))))

10

(command "chamfer")

11

(setvar "cmdecho" 1)

12

(princ)

13

)

14

Пояснения

Строка 7

(setq d (getdist "\n Enter chamfer distance: "))

Функция getdist создает паузу, которая позволяет ввести размер фаски. Затем функция setq присваивает это значение переменной d.

Строка 8

(setq a (getangle "\n Enter chamfer angle: "))

Функция getangle создает паузу, которая позволяет ввести угол скоса. Затем функция setq присваивает это значение переменной а.

Строка 9

(setvar "chamfera" d)

Функция setvar присваивает значение переменной d системной переменной chamfera, используемой в программе AutoCAD.

Использование AutoLISP

423

Строка 10

(setvar "chamferb" (* d (/ (sin a) (cos a))))

Функция setvar присваивает значение, полученное при вычислении выражения

(* d (/ (sin a) (cos a))), системной переменной chamferb.

Строка 11

(command "chamfer")

Функция Command вызывает команду CHAMFER, которая создает фаску на чертеже.

Шаг 3: загрузка программы, написанной на языке AutoLISP

Сохраните текстовый файл в виде файла с расширением .lsp, а затем загрузите программу AutoLISP, выполнив процедуру, описанную в примере 1.

Упражнение 2

Напишите программу AutoLISP, которая вычертит фигуры, показанные на рис. 12.6. Эта программа также должна вывести приглашение, позволяющее указать местоположение точек Р1 и Р2 и определить величины диаметров D1 и D2.

Рис. 12.6. Концентрические окружности, соединенные отрезком

Функция list

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

Примеры

(setq

x

(list

2.5 3 56))

возвращает (2.5 3 56)

(setq

x

'(2.5

3 56))

возвращает (2.5 3 56)

Совет

Функция list, содержащая целые или вещественные числа, может быть заключена в одинарные круглые скобки. Одинарная кавычка, используемая для обозначения функции list, обычно выносится за скобки.

424 Глава 12

Функции car, cdr и cadr

Функция car

Функция car возвращает первый элемент списка. Если в списке нет ни одного элемента, функция car возвращает значение nil. Не забывайте, что перед использованием этой функции вам необходимо с помощью функции list перечислить элементы списка.

Функция car имеет следующий формат:

(car list)

где

car — функция, возвращающая первый элемент;

list — список элементов.

Примеры

(car

'(2.5

3 56))

 

возвращает 2.5

(car

'(x y

z))

 

возвращает X

(car

'((15

20) 56))

возвращает (15 20)

(car

'( ))

 

4))

возвращает “nil”

(car '(list 2 3.0

возвращает 2

(car

'(A B

C))

 

возвращает A

Одинарная кавычка обозначает список элементов.

Функция cdr

Функция cdr возвращает список, из которого удален первый элемент. Функция cdr имеет следующий формат:

(cdr list)

где

cdr — функция, возвращающая список, из которого удален первый элемент;

list — список элементов.

Примеры

(cdr

'(2.5

3 56))

возвращает (3 56)

(cdr

'(x y

z))

возвращает (Y Z)

(cdr

'((15

20) 56))

возвращает (56)

(cdr

'( ))

 

возвращает “nil”

Функция cadr

Функция cadr возвращает второй элемент списка, последовательно выполняя две операции: cdr и car. Функция cdr удаляет первый элемент списка, а функция car возвращает первый элемент нового списка. Функция cadr имеет следующий формат:

(cadr list)

где

cadr — функция, выполняющая две операции (car (cdr ‘(x y z));

list — список элементов.

Использование AutoLISP

425

Примеры

(cadr

'(2

3))

возвращает 3

(cadr

'(2

3

56))

возвращает 3

(cadr

'(x

y

z))

возвращает Y

(cadr

'((15

20) 56 24))

возвращает 56

В этих примерах функция cadr выполняет следующие операции:

(cadr '(x y z)) = (car (cdr '(x y z))) = car (y z))

и в итоге возвращает элемент y.

Примечание

Помимо функций car, cdr и cadr существует ряд других функций, которые могут быть использованы для извлечения различных элементов из списка. Ниже приведены некоторые из этих функций. В данном случае функция f представляет собой список

'((x y) z w)).

(setq f'((x y) z w))

(caar f) = (car (car f))

возвращает x

(cdar f) = (cdr (car f))

возвращает (y)

(cadar f) = (car (cdr (car f)))

возвращает y

(cddr f) = (cdr (cdr f))

возвращает (w)

(caddr f) = (car (cdr (cdr f)))

возвращает w

last f

возвращает w

Функции graphscr, textscr, princ и terpri

Функция graphscr

Функция graphscr обеспечивает переход из текстового окна в окно графического редактора, позволяя работать в системе с одним монитором. Если в системе используется два монитора, эта функция игнорируется.

Функция textscr

Функция textscr обеспечивает переход из окна графического редактора в текстовое окно, позволяя работать в системе с одним монитором. Если в системе используется два монитора, эта функция игнорируется.

Функция princ

Функция princ печатает (или выводит на экран) значение переменной. Если переменная заключена в кавычки, эта функция выводит на печать (или на экран) выражение в кавычках. Функция princ имеет следующий формат:

(princ [переменная или выражение])

Примеры

(princ)

a)

выводит на печать (или на экран) пустую строку

(princ

выводит на печать (или на экран) значение переменной а

(princ

"Welcome")

выводит на печать (или на экран) выражение Welcome

426 Глава 12

Функция terpri

Функция terpri выводит на экран новую строку, т.е. выполняет то же действие, что и выражение \n. Эта функция используется для отображения строки, следующей после функции terpri.

Примеры

(setq p1 (getpoint "Enter first point: ")) (terpri) (setq p2 (getpoint "Enter second point: "))

Первая строка (Enter first point:) появится на экране в командной строке. Функция terpri выполняет возврат каретки в исходное положение; таким образом, вторая строка (Enter second point:) будет отображена в следующей строке, непосредственно под предыдущей строкой. Если функция terpri будет пропущена, оба выражения будут показаны в одной строке (Enter first point: Enter second point:).

Пример 3

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

Шаг 1: разработка алгоритма программы

Входные данные

Координаты точки Р1

Координаты точки Р3

Выходные данные

• Прямоугольник

Обработка данных

1.Вычисление координат точек Р2 и Р4

2.Вычерчивание следующих линий:

линия от точки Р1 до точки Р2;

линия от точки Р2 до точки Р3;

линия от точки Р3 до точки Р4;

линия от точки Р4 до точки Р1

Рис. 12.7. Прямоугольник Р1Р2Р3Р4

Использование AutoLISP

427

Координаты X и Y точек Р2 и Р4 можно определить с помощью функций car и cadr. В частности, функция car позволяет извлечь координату X из списка введенных данных, а функция cadr может быть использована для получения координаты Y.

Координата X точки p2

x2 = x3

x2 = car (x3 y3)

x2 = car p3

Координата Y точки p2

y2 = y1

y2 = cadr (x1 y1)

y2 = cadr p1

Координата X точки p4

x4 = x1

x4 = car (x1 y1)

x4 = car p1

Координата Y точки p4

y4 = y3

y4 = cadr (x3 y3)

y4 = cadr p3

Точки p2 и p4 определяются следующим образом:

p2 = (list (car p3) (cadr p1))

p4 = (list (car p1) (cadr p3))

Шаг 2: запись программы AutoLISP

Для записи программы на языке AutoLISP используется любой текстовый редактор. Ниже приведен листинг программы для примера 3. Номера строк в правой части листинга не являются частью программного кода, а используются только для ссылок.

;Эта программа вычерчивает прямоугольник,

1

;заданный координатами двух противоположных вершин

2

;

3

(defun c:RECT1 (/ p1 p2 p3 p4)

4

(graphscr)

5

(setvar "cmdecho" 0)

6

(prompt "RECT1 command draws a rectangle")(terpri)

7

setq p1 (getpoint "Enter first corner"))(terpri)

8

setq p3 (getpoint "Enter opposite corner")"(terpri)

9

(setq p2 (list (car p3) (cadr p1)))

10

(setq p4 (list (car p1) (cadr p3)))

11

(command "line" p1 p2 p3 p4 "c")

12

(setvar "cmdecho" 1)

13

(princ)

14

)

15

428 Глава 12

Пояснения

Строки 1–3

В первых трех строках содержатся комментарии, которые описывают назначение этой программы. Строка комментариев всегда начинается точкой с запятой (;). При загрузке программы строки, начинающиеся с этого символа, игнорируются.

Строка 4

(defun c:RECT1 (/ p1 p2 p3 p4)

Функция defun определяет функцию RECT1.

Строка 5

(graphscr)

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

Строка 6

(setvar "cmdecho" 0)

Функция setvar присваивает системной переменной CMDECHO значение 0, что приводит к выключению командной строки. Когда значение переменной CMDECHO равно 0, командная строка в окне программы не отображается.

Строка 7

(prompt "RECT1 command draws a rectangle")(terpri)

Функция prompt выводит на экран информацию, содержащуюся в кавычках ("RECT1 command draws a rectangle"). Функция terpri возвращает каретку в исходное положение, в результате чего последующее текстовое сообщение выводится на экран (или на печать) в отдельной строке.

Строка 8

(setq p1 (getpoint "Enter first corner"))(terpri)

Функция getpoint создает паузу, которая используется для определения одной из вершин прямоугольника. Затем функция setq присваивает введенное значение переменной p1.

Строка 9

(setq p3 (getpoint "Enter opposite corner")"(terpri)

Функция getpoint создает паузу, которая используется для определения координат точки (противоположной вершины прямоугольника). Функция setq присваивает введенное значение переменной p3.

Строка 10

(setq p2 (list (car p3) (cadr p1)))

Функция cadr извлекает координату Y точки р1, а функция car — координату X точки p3. Функция list формирует список, состоящий из полученных значений (т.е. из координат X и Y). Эти значения функция setq присваивает переменной p2.

Использование AutoLISP 429

Строка 11

(setq p4 (list (car p1) (cadr p3)))

Функция cadr извлекает координату Y точки р3, а функция car — координату X точки p1. Функция list формирует список, состоящий из полученных значений (т.е. из координат X и Y). Эти значения функция setq присваивает переменной p4.

Строка 12

(command "line" p1 p2 p3 p4 "c")

Функция command, содержащаяся в этой строке, вызывает команду LINE, которая вычерчивает линии, соединяющие точки p1, p2, p3 и p4. Опция c (close) позволяет замкнуть контур, т.е. соединить последнюю точку (p4) с первой (p1).

Строка 13

(setvar "cmdecho" 1)

Функция setvar присваивает системной переменной CMDECHO значение 1, что обеспечивает отображение командной строки на экране.

Строка 14

(princ)

Функция princ выводит на экран (или на печать) пустую строку. Если это выражение удалить, AutoCAD выведет на экран значение, полученное при вычислении последнего выражения. Это значение не повлияет на работу программы, но его появление будет отвлекать внимание пользователя. В данном случае функция princ используется для того, чтобы предотвратить отображение последнего выражения в командной строке.

Строка 15

Закрывающая круглая скобка завершает определение функции RECT1 и заканчивает программу.

Примечание

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

;Эта программа обеспечивает построение прямоугольника

;в режиме перетаскивания, используя для этого функцию getcorner (defun c:RECT2 (/ p1 p2 p3 p4)

(graphscr)

(setvar "cmdecho" 0)

(prompt "RECT2 command draws a rectangle")(terpri)

(setq p1 (getpoint "Enter first corner"))(terpri)

(setq p3 (getcorner "Enter opposite corner")"(terpri)

(setq p2 (list (car p3) (cadr p1))) (setq p4 (list (car p1) (cadr p3)))

(command "line" p1 p2 p3 p4 "c") (setvar "cmdecho" 1)

(princ)

)

430 Глава 12

Шаг 3: загрузка программы, написанной на языке AutoLISP

Сохраните введенный текст в виде файла с расширением .lsp, а затем загрузите его с помощью команды APPLOAD, как описывается в примере 1.

Функции getangle и getorient

Функция getangle

Функция getangle создает паузу, во время которой вы сможете ввести величину угла, а затем возвращает введенное значение в радианах. Функция getangle имеет следующий формат:

(getangle [point] [prompt])

где

point — первая точка определяемого угла;

prompt — текст приглашения, которое необходимо вывести на экран.

Примеры

(getangle)

(setq ang (getangle))

(setq ang (getangle pt1)), где pt1 — ранее определенная точка

(setq ang (getangle "Enter taper angle"))

(setq ang (getangle pt1 "Enter second point of angle"))

Величина введенного угла зависит от используемых параметров настройки. Требуемые параметры настройки углов можно установить, используя команду UNITS или изменяя значения системных переменных ANGBASE и ANGDIR. Ниже приведены стандартные настройки системы измерения угловых величин.

Угол измеряется относительно положительной оси X (по горизонтали). Значение этого параметра сохраняется в системной переменной ANGBASE.

Угол, измеряемый против часовой стрелки, считается положительным, а угол, измеряемый по часовой стрелке, — отрицательным. Значение этого параметра сохраняется в системной переменной ANGDIR.

Если 135-градусный угол, показанный на рис. 12.8, а, имеет стандартные настройки, то функция getangle возвратит значение, равное 2,35619 радиан.

Пример

Функция (setq ang (getangle "Enter angle")) возвращает значение 2,35619 радиан (для угла 135 градусов).

На рис. 12.8, б показаны новые настройки системы измерения угловых величин, в которой ось Y располагается под углом 0 градусов, а положительным считается угол, измеряемый по часовой стрелке. В этом случае функция getangle возвращает значение 3,92699 радиан (для угла 135 градусов). Это связано с тем, что функция getangle вычисляет значение угла, измеряя его против часовой стрелки, т.е. игнорируя направление, заданное значением системной переменной ANGDIR. Измерение угла выполняется в соответствии с параметрами, определенными системной переменной ANGBASE (рис. 12.9, б).

Соседние файлы в папке Книги_AutoCad_2