Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
4.4. Вычерчивание болта
Ранее уже говорилось о том, что оформление стандартных элементов чертежей (узлов, деталей и т. п.) в виде блоков приводит к разрастанию графической базы данных до немыслимых размеров. Целесообразнее написать программу, которая обрисовывала бы часто используемые детали в соответствии с заданными параметрами. Рассмотрим структуру такой программы на примере вычерчивания болта (рис.1).
Основными параметрами болта являются: наружный d и внутренний dвн диаметры резьбы, длина стержня l и длина нарезки l0 . Для упрощения демонстрационной программы установим высоту головки болта hг равной 0.7d, большую хорду головки в плане равной 2d, глубину нарезки равной 0.87t, где t - шаг резьбы. Эти параметры соответствуют стандарту метрической резьбы. Болт изобразим в упрощенном виде, т. е. без обрисовки фасок на головке и стержне. В качестве точки вставки примем точку пересечения оси болта с линией опорной поверхности головки (точка p5 на рис.1). Предполагаем, что в чертеже созданы ранее необходимые слои (например, путем загрузки описанных выше стандартных форматов).
p7 p6 p15 p10 p3
p4
p16 p14
p17
p1 p5 p2 p13
p12 p11
p8 p9
Рис. 1. Условное изображение болта.
Обозначения точек соответствуют идентификаторам,
принятым в программе
Обозначение точек на чертеже соответствует идентификаторам, используемым в программе.
;;; ===========================================
(defun C:BOLT ()
;;; Ввод параметров болта
(setq p5 (getpoint “Insertion point:_”))
(setq dia (getdist “\nInput diameter:_”))
(setq l1 (getdist “\nInput length of bolt:_”))
(setq l2 (getdist “\nInput length of screw:_”))
;;; Угловые точки головки болта
(setq p6 (polar p5 (/ pi 2.0) dia))
(setq p7 (polar p6 pi (* dia 0.7)))
(setq p8 (polar p7 (+ pi (/ pi 2.0)) (* 2.0 dia)))
(setq p9 (polar p8 0.0 (* dia 0.7)))
;;; Концевые точки ребер головки
(setq p1 (polar p8 (/ pi 2.0) (* dia 0.5)))
(setq p4 (polar p1 (/ pi 2.0) dia))
;;; Угловые точки стержня болта
(setq p2 (polar p1 0.0 (+ l1 (* dia 0.7))))
(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”))
;;; Вычерчивание болта в нужных слоях
;;; и создание набора примитивов.
;;; (О наборах см. п. 6.4)
(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): <N>“))
(if (= x “Yes”)
(command “rotate” ss1 ss2 ss3 ss4 ss5 ss6 “”
p5 pause)
)
(initget “Yes No”)
(setq x (getkword “\nMove bolt? (Yes or No): <N>“))
(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 элемент) возвращает nil, если элемент является списком, и Т − в противном случае,
(listp элемент) возвращает Т, если элемент является списком, и nil − в противном случае. Примеры:
(setq a ‘(x y z))
(atom ‘a) возвращает Т,
(atom a) возвращает nil,
(atom ‘(a b c)) возвращает nil,
(listp ‘(a b c)) возвращает Т,
(listp ‘a) возвращает nil,
(listp 4.38) возвращает nil.
Формирование списков
Основной функцией формирования списков является list. Эта функция принимает любое количество выражений и собирает их в один список. Очень часто она используется для указания координат точки в двух - или трехмерном пространстве. В общем случае формат функции выглядит следующим образом:
(list выражение … ).
Примеры списков:
(list a b c) возвращает (A B C),
(list a (b c) d) возвращает (A (B C) D),
(list 2.1 4.8) возвращает (2.1 4.8).
Если ни одно из выражений не содержит переменных или неопределенных элементов, функция list может быть заменена функцией quote. Для Автолиспа эквивалентны выражения
(list 2.1 4.8) и ‘(2.1 4.8).
(append список …). Функция принимает любое количество списков и объединяет их в один.
(append ‘(a b) ‘(c d)) возвращает (A B C D),
(append ‘((a) (b)) ‘((c) (d))) возвращает ((A) (B) (C) (D)).
(cons новый_элемент список). Функция принимает новый элемент в качестве первого, добавляя его к уже существующему списку, и возвращает новый список.
(cons ‘a ‘(b c d)) возвращает (A B C D),
(cons ‘(a) ‘(b c d)) возвращает ((A) B C D).
Если место аргумента список занимает атом, функция формирует уже упоминавшуюся ранее точечную пару.
(cons ‘a 2) возвращает (A. 2).
(reverse список). Функция обращает список, располагая его элементы в обратном порядке.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |


