Проектируемое изделие состоит из совокупности геометрических объектов. В процессе проектирования изделий необходимо определять геометрические параметры указанных объектов (длину, углы, точки пересечения и т. п.). Для этого в AutoLISPе существуют следующие встроенные функции.
(DISTANCE <точка1> <точка2>) – функция возвращает действительное число, равное расстоянию между < точкой1 > и <точкой2>.
(POLAR <точка> <угол> <расстояние>) – функция вычисляет координаты новой точки, находящейся от заданной <точки> на некотором <расстоянии> под <углом>, который задается в радианах и измеряется против часовой стрелки относительно координатной оси X.
(ANGLE <точка1> <точка2>) – функция вычисления угла в радианах, образованного вектором, направленным из <точки1> в <точку2>, и осью X. Этот угол измеряется против часовой стрелки.
(INTERS <точка1> <точка2> <точка3> <точка4> [<С>]) – функция вычисления точки пересечения двух отрезков, заданных <точкой1>, <точкой2> и <точкой3>, <точкой4>. Если признак <C> равен NIL, то будет определена точка пересечения линий бесконечной длины, наложенных на заданные отрезки. Если <С> имеет любое значение, отличное от NIL, или если аргумент <С> вообще отсутствует, то ищется точка пересечения только внутри отрезков. Если точка пересечения в этой ситуации не найдена, то функция INTERS возвращает NIL.
При получении параметрических изображений вначале выполняют расчет узловых точек данных изображений, которые в примере ниже имеют обозначения р1, р2,…. рn. Далее по расчетным узловым точкам необходимо построить в среде AutoCAD параметрические изображения видов, разрезов, сечений деталей и конструкций.
Пример. Написать программу на языке AutoLISP, выполняющую построение параметрического изображения (рис. 7.5).
Рисунок 7.5. Параметрическая модель изображения
(defun kontur ();функция построения параметрических изображений;
;расчет точек главного вида
(setq
x 50 y 50 l 100 l1 50 h1 25 h 50 d 20 u 0.78
p1 (list x y)
p2 (polar p1 0 l)
p3 (polar p2 1.57 h)
p4 (polar p3 3.14 5)
р5 (polar p1 u 5)
р6 (inters p1 p5 p3 p4 nil)
р7 (list (+ x l1) (+ y h1))
р8 (polar p1 4.71 10)
р9 (polar p1 4.71 20)
); окончание функции - setq
; формирование изображения главного вида
(command "line" p1 p2 p3 p6 p1 "" "circle" p7 (/ d 2))
; формирование изображения разреза
(command "рline" p10 p11 p12 p13 p10 "")
(command "рline" p14 p15 p16 p17 p14 "")
;нанесение изображения штриховки на разрезе
(command "hatch" "jis_wood" "10" "0" p10 р14 "")
(command "line" p15 p10 "" "line" p16 p13 "")
;нанесение размеров на чертеже
(command "dim" "horiz" P1 P2 P9 "" "horiz" P1 P7 P8 ""
"vertical" P3 P2 P19 ""
" vertical " p13 p16 p18 (strcat "%%c" (rtos d 2 0)) "exit")
); окончание функции – kontur
Функции работы со списками в языке AutoLISP
Имеются функции, позволяющие конструировать списки из данных, определенных ранее в программе.
(LIST <элемент>...) – функция формирует список из любого числа элементов (атомов или списков) и возвращает список.
(CONS <элемент> <список>) – функция добавляет <элемент> (атом или список) в качестве первого элемента к уже существующему списку и возвращает обновленный список.
(APPEND <список>...) – функция соединяет несколько списков в один общий список.
(REVERSE <список>) – функция возвращает список с элементами, расставленными в обратном порядке.
Пример
(SETQ A '(1.0 2.0))
(SETQ В '(С D Е))
(SETQ F (LIST А В)) создает в F список ((1.0 2.0)(С D Е)).
Выделение элементов списков
В AutoLISPе существуют функции, которые при работе со списками позволяют выделять элементы и другие части списков.
(CAR <список>) – функция возвращает первый элемент списка. Если список пуст, то возвращается NIL.
(CDR <список>) – функция возвращает новый список, отличающийся отсутствием первого элемента. Если список пуст, возвращается NIL. Если <список> представлен как точечная пара, то CDR возвращает второй элемент как атом, а не как список.
В AutoLISPе определены функции, обеспечивающие последовательное выполнение CAR и (или) CDR вплоть до четырех уровней вложенности: CAAR, CADR, CDDR, CADAR и т.д.
Пример
(CAAR X) эквивалентно записи (CAR (CAR X));
(CDAR X) эквивалентно записи (CDR (CAR X));
(CADAR X) эквивалентно записи (CAR (CDR (CAR X))) и т.п.
Функции типа CAR и CDR часто используются для выделения координат точек.
(LAST <список>) – функция возвращает последний элемент <списка>, который может быть атомом либо списком.
(MEMBER <элемент> <список>) – функция просматривает <список> и ищет в нем заданный <элемент>. Если <элемент> найден, то возвращается список от <элемента> до конца исходного <списка>. Иначе возвращается NIL.
(NTH <номер> <список>) –функция возвращает элемент <списка>, имеющий заданный <номер>. <Номер> должен иметь целое неотрицательное значение. Первый элемент списка имеет номер 0.
(ASSOC <элемент> <список>) – функция обеспечивает "ассоциативный поиск" в структурированном списке, т.е. в списке, элементы которого сами являются списками. Эти списки построены по схеме:
(< ключевой элемент > < значение >...)
Поиск проводится по совпадению <элемента>, заданного в функции ASSOC, с <ключевым элементом> в <списке>, заданного в ASSOC. Если поиск удался, то возвращается найденный список, иначе – NIL. Таким образом, осуществляется поиск данных по ключу в сложной структуре данных.
Пример
(SETQ DETAL '((КОД 123456) (КОДМ 001234) (М 1.45)));
(ASSOC 'КОДМ DETAL) возвращает (КОДМ 001234).
(SUBST <новый элемент> <старый элемент> <список>) – функция SUBST дополняет функцию ASSOC, позволяя заменять элементы в списке. Производится просмотр списка, и каждый найденный <старый элемент> заменяется на <новый элемент>. Возвращается обновленный список.