CAFE

◆ [열공] Auto LISP

[[따라지]]리습을 하시는분을 위한 조언..6부 (장공(長孔)에 대하여)

작성자따라지|작성시간07.08.14|조회수1,229 목록 댓글 8

장공에 대해서 설명 합니다. 장공(長孔)이라함은 긴 구멍 입니다. 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에 대해서는 요걸로 ...

 

   === 따라지 ===

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
  • 작성자행복한하루 | 작성시간 07.06.08 아무래도 따라지님은 수학과 출신인거 같아염..^^;;
  • 작성자그린 | 작성시간 07.08.13 왠지 웃음만...^^
  • 작성자doolycth | 작성시간 07.12.22 학교다닐때수학은살아가는데사칙연산만알면된다고생각하고말하곤했는데이게이렇게뒷통수를치나...ㅜ.ㅜ
  • 작성자지훈맘 | 작성시간 08.11.24 아..........어렵다.ㅡㅜ 뭔말인지 하나도 모르겠음...ㅡㅡ;;
  • 작성자표준인생 | 작성시간 11.03.16 멀고도 험한 함수들
댓글 전체보기
맨위로

카페 검색

카페 검색어 입력폼