(setq p3 (polar p2 (/ pi 2.0) dia))
;;; Точки, ограничивающие длину резьбы:
;;; 1. по внешнему диаметру резьбы
(setq p10 (polar p3 pi l2))
(setq p11 (polar p2 pi l2))
;;; 2. по внутреннему диаметру резьбы
(setq p12 (polar p2 (/ pi 2.0) (* dia 0.08)))
(setq p13 (polar p12 (/ pi 2.0) (* dia 0.84)))
(setq p14 (polar p12 pi l2))
(setq p15 (polar p13 pi l2))
;;; Концевые точки осевой линии
(setq p16 (polar p5 pi dia))
(setq p17 (polar p5 0.0 (+ l1 10.0)))
;;; Сохранение имени рабочего слоя
(setq old_lay (getvar “clayer”))
;;; Вычерчивание болта в нужных слоях
;;; и создание набора примитивов
(command “layer” “set” “contur” “”)
(command “pline” p1 “w” “0.8” “” p2 p3 p4 “”)
(ssget ss1 “L”)
(command “pline” p6 p7 p8 p9 “C”)
(ssget ss2 “L")
(command "layer" "set" "0" "")
(command “line” p10 p11 “”)
(ssget ss3 “L”)
(command “line” p12 p14 “”)
(ssget ss4 “L”)
(command “line” p13 p15 “”)
(ssget ss5 “L”)
(command “layer” “set” “center” “”)
(command “line” p16 p17)
(ssget ss6 “L”)
;;; Поворот и перемещение изображения
(initget “Yes No”)
(setq x (getkword “\nRotate bolt? (Yes or No):
(if (= x “Yes”)
(command “rotate” ss1 ss2 ss3 ss4 ss5 ss6 “” p5 pause)
)
(initget “Yes No”)
(setq x (getkword “\nMove bolt? (Yes or No):
(if (= x “Yes”)
(command “move” ss1 ss2 ss3 ss4 ss5 ss6 “” p5 pause)
)
;;; Восстановление рабочего слоя
(command “layer” “set” old_lay “”)
(command “redraw”)
(princ)
)
Здесь есть смысл остановиться на одном вопросе, не имеющем прямого отношения к Автолиспу, а именно на вопросе точности выполнения чертежа. Хороший сталь графики предполагает точное соответствие размеров назначенных размерам истинным. Однако в практике проектирования нередки случаи, когда не требуется большая точность изображения. В частности, это относится к рассмотренному примеру. Размеры резьбы, установленные в программе, соответствуют основной резьбе. Для мелких резьб внутренний диаметр нарезки будет другим. Однако при работе на ватмане конструктор не обращает строгого внимания на положение линий внутреннего диаметра, определяя параметры болта в спецификации. Поэтому предложенная программа может быть использована для изображения болтов и с основной и с мелкими резьбами. Читателю, которого такое положение не устраивает, предлагается трансформировать программу таким образом, чтобы она воспринимала в качестве параметра шаг резьбы и прочерчивала линии впадин резьбы в нужном положении.
Есть еще одно замечание по поводу программы. В ней создано шесть наборов, каждый из которых содержит один примитив, а именно - последний, созданный в чертеже. Конечно, это не лучшее решение. В практике обычно используется другой принцип, позволяющий отобрать нужные примитивы с помощью фильтров и описанный ниже (см. разд. 6.4).
5. РАБОТА СО СПИСКАМИ
Все обрабатываемые данные Автолисп делит на две большие группы: атомы и списки. Под атомом понимается некоторая программная единица, рассматриваемая Автолиспом как единое целое. Список, по определению разработчиков [5], представляет собой группу связанных элементов, разделенных пробелами и заключенных в скобки. Он служит эффективным средством хранения связанных величин и может содержать данные любого типа. При необходимости идентификации элемента с атомом или списком можно воспользоваться одной из двух функций:
(atom
(listp
(setq а ‘(х у z))
(atom ‘а) возвращает
(atom а) возвращает
(atom ‘(a b c)) возвращает
(listp '(abc)) возвращает
(listp ‘а) возвращает
(listp 4.38) возвращает
5.1. Формирование списков
Основной функцией формирования списков является list. Эта функция принимает любое количество выражений и собирает их в один список. Очень часто она используется для указания координат точки в двух- или трехмерном пространстве. В общем случае формат функции выглядит следующим образом:
(list
Примеры списков:
(list a b с) возвращает
(list a (b с) d) возвращает
(list 2.1 4.8) возвращает
Если ни одно из
(list 2.1 4.8) и ‘(2.1 4.8).
(append
(append ‘(a b) ‘(с d)) возвращает
(append ‘((a) (b)) ‘((с) (d))) возвращает
(cons
(cons ‘a ‘(b с d)) возвращает
(cons ‘(a) ‘(b с d)) возвращает
Если место аргумента