장공에 대해서 설명 합니다. 장공(長孔)이라함은 긴 구멍 입니다. Slot 이라고도 합니다. 즉 아래와 같은 형식으로 나타납니다.
즉 볼트(BOLT) 체결시 고정위치가 불확실할경우 길게 구멍을 만드는겁니다.
1번 이 보통 이고
2번은 볼트를 미리 체결 해놓고 볼트 머리를 큰 구멍에 넣어서 아래로 내린다음 완전히 조일때 사용하죠..
3번은 1번의 작도중에 일반적인 형태입니다.
3번을 해결하면 1번은 자동으로 해결되죠.
3번은 벨트 등을 걸었을때 벨트 길이를 나타냅니다.
1번은 3번중에서 큰직경과 작은 직경이 같다고 보시면 됩니다.
제가 설명 드리려는건 3번입니다.
여기서 점A,B,E,F의 좌표를 구하는게 핵심 입니다.
중학교에서 배웠을겁니다. 피타고라스 정리
접선길이 선분AB의 길이는 선분C,P2의길이와 같습니다.
접선길이 선분 AB의 길이는
중심점 P1,P2 와 각각의 반지름 R1,R2가 주어졌을때
(defun $delta_ab (p1 p2 r1 r2)
(sqrt (- (expt (distance p1 p2) 2) (expt (- r1 r2) 2)))
)
로 나타납니다.
각 $ang1의 크기는
(setq $ang1 (atan (/ ($delta_ab p1 p2 r1 r2) (- r1 r2))))
가 되는 겁니다.
그러므로 점A의 위치는 polar함수를 사용하여
(setq a (polar p1 (+ (angle p1 p2) $ang1) r1))
이 되고
점F의 위치는
(setq a (polar p2 (- (angle p1 p2) $ang1) r2))가 되는 겁니다.
그리고 pline으로 점A에서 시작하여 "arc" "CE" p1 "a" 각도는 (360 - (2 x (RTD $ang1)))
점F, 그리고 다시 "arc" "ce" p2 "a" 각도는 (2 x (RTD $ang1)) "l" "c"해주시면 장공이 형성 됩니다.
그럼 리습으로 구성하면(defun $slot (p1 p2 r1 r2)
(setq $ang1 (atan (/ ($delta_ab p1 p2 r1 r2) (- r1 r2))))
(command "pline" (polar p1 (+ (angle p1 p2) $ang1) r1) "a" "ce" p1 "a"
(- 360 (* 2 (rtd $ang1))) "l" (polar p2 (- (angle p1 p2) $ang1) r2) "a" "ce" p2 "a"
(* 2 (rtd $ang1)) "l" "cl")
)
) ;if
)
(defun $delta_ab (p1 p2 r1 r2)
(sqrt (- (expt (distance p1 p2) 2) (expt (- r1 r2) 2)))
) ; 접선길이 SUB루틴
그러나 R1,R2가 같을경우는 $ang1이 (* 0.5 pi) 즉 90도가 되므로
(command "pline" (polar p1 (+ (angle p1 p2) (* 0.5 pi)) r1) "a"
"180" "l"
(polar p2 (- (angle p1 p2) (* 0.5 pi)) r2) "a" "180"
"l" "cl")
이 되는 겁니다.
이때 R1값이 R2값보다 작을경우 계산이 안되므로
서로 바꾸어야 합니다.
(setq $temp p1
p1 p2
p2 $temp
$temp r1
r1 r2
r2 $temp
)
요걸 써서...
전체적으로 리습을 구성하면
(defun $slot (p1 p2 r1 r2)
(if (< r1 r2)
(setq $temp p1
p1 p2
p2 $temp
$temp r1
r1 r2
r2 $temp
)
)
(if (= r1 r2)
(command "pline" (polar p1 (+ (angle p1 p2) (* 0.5 pi)) r1) "a" "ce" p1 "a" "180" "l"
(polar p2 (- (angle p1 p2) (* 0.5 pi)) r2) "a" "ce" p2 "a" "180" "l" "cl")
(progn
(setq $ang1 (atan (/ ($delta_ab p1 p2 r1 r2) (- r1 r2))))
(command "pline" (polar p1 (+ (angle p1 p2) $ang1) r1) "a" "ce" p1 "a"
(- 360 (* 2 (rtd $ang1))) "l" (polar p2 (- (angle p1 p2) $ang1) r2) "a" "ce" p2 "a"
(* 2 (rtd $ang1)) "l" "cl")
)
) ;if
)
(defun $delta_ab (p1 p2 r1 r2)
(sqrt (- (expt (distance p1 p2) 2) (expt (- r1 r2) 2)))
) ; 접선길이 SUB루틴
그러면 위루틴을 어떻게 써먹느냐....
1번 같이 원 두개가 있을경우..
(defun c:sd1 ()
(setq en1 (ENTGET (CAR (ENTSEL "\n원하나 찍어봐 : ~~ ")))
en2 (ENTGET (CAR (ENTSEL "\n나머지 원하나 찍어봐 : ~~ ")))
p1 (cdr (assoc 10 en1))
p2 (cdr (assoc 10 en2))
r1 (cdr (assoc 40 en1))
r2 (cdr (assoc 40 en2))
)
($slot p1 p2 r1 r2)
)
요렇게 써먹는겁니다.
그럼 2번같은경우는 중심 두점과 직경을 알경우..
(defun c:sd2 ()
(setq p1 (getpoint "\n장공 한점 찌거봐 짜샤 ~~~ : ")
p2 (getpoint p1 "\n장공 한점 나머지두 찌거봐 짜샤 ~~~ : ")
r1 (* 0.5 (getreal "\n직경은 월매루 할껴 ~~ : "))
)
($slot p1 p2 r1 r1)
)
그럼 3번같은경우 양끝 두점과 직경을 알경우..
(defun c:sd3 ()
(setq p1 (getpoint "\n장공 한점 찌거봐 짜샤 ~~~ : ")
p2 (getpoint p1 "\n장공 한점 나머지두 찌거봐 짜샤 ~~~ : ")
r1 (* 0.5 (getreal "\n직경은 월매루 할껴 ~~ : "))
)
(setq p1 (polar p1 (angle p1 p2) r1)
p2 (polar p2 (angle p2 p1) r1)
)
($slot p1 p2 r1 r1)
)
요렇게 다양하게 사용 하는겁니다.
입력 부분과 써브루틴 사용법을 같이 끝냈습니다.
SLOT에 대해서는 요걸로 끝...
=== 따라지 ===