금형설계쪽이라 점과 선에 접하는 호를 그리는 경우가 종종 있어 리습을 만들어 봤는데요,
마지막이 조금 아쉽네요. 도움 부탁 드립미다.
교점은 vlisp에 함수가 있다고 하는데, 무식하게 수학공식이용. 내가봐도 무식하다.ㅋ ㅋ
혹~ 점과 직선에 접하는 호 그리는 다른 방법 있으시면 조언부탁요^^
;Circle touching line and point with radius
(defun c:crt ()
(setq pt1 (getpoint “Specify first point”)) 첫 번째점
(setq radi (getreal “Enter radius”)) 원 반경 입력
(setvar “osmode” 0)
(setq l1 (entsel)) 첫 번째 선 [접할 선 선택]
(setq pt2 (getpoint “Which side do you want to offset?”)) 첫번째 선 옵셋 방향
(command “offset” radi l1 pt2 “”) 첫번째 선 옵셋 [원 반경 만큼]
(setq l2 (entlast)) 두 번째 선 [옵셋된 선]
(setq dxf1 (entget l2))
(setq x1 (car (cdr (assoc 10 dxf1))))
(setq y1 (cadr (cdr (assoc 10 dxf1))))
(setq x2 (car (cdr (assoc 11 dxf1))))
(setq y2(cadr (cdr (assoc 11 dxf1))))
(setq v1 (/ (- y2 y1) (- x2 x1)))
(setq v2 (- y1 (* v1 x1)))
(command “circle” pt1 radi “”) [1번 원] 첫번째 점을 중심으로 주어진 반경으로 원 그리기
(setq c1 (entlast))
(setq dxf2 (entget c1))
(setq a (car (cdr (assoc 10 dxf2))))
(setq b (cadr (cdr (assoc 10 dxf2))))
(setq r (cdr (assoc 40 dxf2)))
(setq v3 (- v2 b))
(setq a1 (+ 1.0 (expt v1 2.0)))
(setq b1 (* -2 (- a (* v1 v3))))
(setq c (+ (expt a 2.0) (expt v3 2.0) (* -1 (expt r 2.0))))
(setq x11 (/ (+ (* -1 b1) (sqrt (- (expt b1 2.0) (* 4.0 a1 c)))) (* 2.0 a1)))
(setq x22 (/ (- (* -1 b1) (sqrt (- (expt b1 2.0) (* 4.0 a1 c)))) (* 2.0 a1)))
(setq y11 (+ (* v1 x11) v2))
(setq y22 (+ (* v1 x22) v2))
(if (> (car pt2) (car pt1)) (setq pt3 ( if (= x11 (max x11 x22)) (list x11 y11) (list x22 y22)))
(setq pt3 ( if (= x11 (min x11 x22)) (list x11 y11) (list x22 y22))))
위의 잡다한 식은 첫 번째 원과 옵셋한 선의 교점을 직선 방정식과 원 방정식을 이용해서
이차방정식의 근을 구해 두 교점을 구한다는 내용입니다. 만다꼬 이랬을 꼬…ㅎㅎ
(command “circle” pt3 radi “”)
[2번 원] 1번 원과 두 번째 선의 교점을 중심으로 주어진 반경의 원 그리기
[2번 원] 1번 원과 두 번째 선의 교점을 중심으로 주어진 반경의 원 그리기
(setq c2 (entlast))
(command “erase” c1 l2 “”) 1번 원과 두 번째 선 지우고
(command “trim” l1 c2 (ssget “x” ‘((0 . “line”))) “”) 첫 번째 선과 2번 원, 모든 직선을 선택 트림할려구요!
(setvar “osmode” (+ 1 32 128 2048))
(princ)
)
————————————————————————–
그러니까 질문은요? ^^
1. 좀 더 효율적이고 스마트하게 하는 방법 조언부탁.
2. 마지막에 trim할 때 개체선택에서 ssget 부분인데요, 첫 번째 점 주위 반경 5mm안에 있는
개체를 선택하고 싶은데요, ssget에서 윈도우, 펜스를 사용 했는데 계속 오류가 뜨는거예요.
고 걸 어케 해결해 주실 분.
(command “trim” l1 c2 [pt1 인근에 있는 객체] “”) 요렇게 요. 위의 주언진 변수를 이용해서
한번 더 손이 가지 않게 부탁드려봅니다.
3. (setq x1 (car (cdr (assoc 10 dxf1)))) 여기서 x1좌표가 소수 두 자리까지만 입력 됩니다.
왜 그럴까요? 소수 네 자리까지 입력 어케 하면 될까요?
3. (setq x1 (car (cdr (assoc 10 dxf1)))) 여기서 x1좌표가 소수 두 자리까지만 입력 됩니다.
왜 그럴까요? 소수 네 자리까지 입력 어케 하면 될까요?