Выбрать главу

Основными параметрами болта являются: наружный d и внутренний dвн диаметры резьбы, длина стержня l и длина нарезки l0 . Для упрощения демонстрационной программы ycтановим высоту головки болта hг равной 0.7d, большую хорду головки в плане равной 2d, глубину нарезки равной 0.87t, где t - шаг резьбы. Эти параметры соответствуют стандарту метрической резьбы. Болт изобразим в упрощенном виде, т.е. без обрисовки фасок на головке и стержне. В качестве точки вставки примем точку пересечения оси болта с линией опорной поверхности головки (точка p5 на рис. 1). Предполагаем, что в чертеже созданы ранее необходимые слои (например, путем загрузки описанных выше стандартных форматов). Обозначение точек на чертеже соответствует идентификаторам, используемым в программе.

Рис. 1. Условное изображение болта. Обозначения точек соответствуют идентификаторам, принятым в программе

;;; ===============================================

(defun C:BOLT ()

;;; Ввод параметров болта

(setq p5 (getpoint “Insertion point:_"))

(setq dia (getdist “\nInput diameter:_”))

(setq l1 (getdist “\nInput length of bolt:_"))

(setq I2 (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”))

;;; Вычерчивание болта в нужных слоях

;;; и создание набора примитивов

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