가공기호 리습 인데요 ..
이게 오스냅이 off되잇는 상태에서 s2 입력후 f3버튼을 눌러 오스냅을 on시켜서 가공기호를 표시하고나면 다시 명령어입력 전인 off 상태로 돌아갑니다… 이게 *error*함수때문에 off로 돌아가는 것인데..
저는 리습에서 osmode명령어로 리습을 바꾸는 것떄문에 error명령어를 넣은것인데 사용자가 f3을 눌러 on&off하는 경우는 예외로 하고싶습니다.. 그렇게할수 없을까요?
그렇다고 해서 error뺴고 중간중간에 osmode0이랑 osmode 161을 뺴보앗더니 가공기호가 이상하게 그려지네요 ㅜㅜ 뭔가 오스냅을 이용해서 그리는것같네요 ..
명령어가 완료되엇을떄 osmode가 161로 끝나기떄문에 error을 넣은거라서 … error을 뺴버릴수도 없고 ㅜㅜ 어쩌면 좋을지 모르겟네요 …
(defun c:s2 (/ p1 dis p2 p3 p4 p5 p6)
;->*error* start ; 작업중 취소 또는 에러 발생시 오스냅,레이어 복원함
(defun *error* (msg)(princ “error: “)(princ msg) (setvar “osmode” osm) (setvar “clayer” cla) (princ))
;-<*error* end
(setq osm (getvar “osmode”)) ; 현재 오스냅 저장
(setq cla (getvar “clayer”)) ; 현재 레이어 저장
(command “undo” “be”)
(defun dtr (a) (* pi (/ a 180.0)))
(defun rtd (a) (* 180.0 (/ a pi)))
(setq p1 (getpoint “n start point:”))
(setq p6 (getpoint “n second point:”))
(setvar “osmode” 0)
(setq p2 (polar p1 (dtr 120) 5.2))
(setq p3 (polar p2 (dtr 0) 5.2))
(setq p4 (polar p3 (dtr 0) 5.2))
(setq p5 (polar p4 (dtr 240) 5.2))
(command “pline” p1 p2 p3 p4 p5 p3 p1 “”)
(command “change” “l” “” “p” “la” “7” “”)
(command “rotate” “l” “” p1 p6″”)
(setvar “osmode” 161)
(command “undo” “e”)
(setvar “osmode” osm) ; 저장했던 오스냅으로 복원
(setvar “clayer” cla) ; 저장했던 레이어로 복원
(princ)
);defun s2 END
;————————————————————
공유
1. *error* 함수는 리습이 끝났을 때가 아니라 오류(ESC) 발생시 작동함
2. 사용자 입력(getpoint) 후 (setq osm (getvar “osmode”)), (setvar “osmode” 0), (setvar “osmode” osm)을 해야 바뀐 값을 다시 되돌림.
그리고 (setvar “osmode” 161) 이 구문은 의미 없습니다. 아마도 만든 사람이 즐겨쓰던 오스넵 모드였던 것 같네요.
감사합니다 이렇게하니까 해결되었네요 .
원리가 뭔지 설명부탁드려도 될까요 ? 응용해서 다른 리습들도 응용하고싶습니다!
(defun c:s2 ( / *error* dtr rtd p1 p2 p3 p4 p5 p6 osm cla)
(defun *error* (msg)(princ “error: “)
(princ msg)
(setvar “osmode” osm)
(setvar “clayer” cla)
(princ)
)
(defun dtr (a) (* pi (/ a 180.0)))
(defun rtd (a) (* 180.0 (/ a pi)))
(setq p1 (getpoint “n start point:”))
(setq p6 (getpoint p1 “n second point:”))
(setq p2 (polar p1 (dtr 120) 5.2))
(setq p3 (polar p2 (dtr 0) 5.2))
(setq p4 (polar p3 (dtr 0) 5.2))
(setq p5 (polar p4 (dtr 240) 5.2))
(setq osm (getvar “osmode”))
(setq cla (getvar “clayer”))
(command “undo” “be”)
(setvar “osmode” 0)
(command “pline” p1 p2 p3 p4 p5 p3 p1 “”)
(command “change” “l” “” “p” “la” “7” “”)
(command “rotate” “l” “” p1 p6)
(command “undo” “e”)
(setvar “osmode” osm)
(setvar “clayer” cla)
(princ)
)
제가 이렇게 바꿔보았는데요 ..
오스냅은 해결되엇는데 ucs가 0,0,0 일떄는 정상적으로 그려지는데 ucs를 옮기면 전혀다른곳에 가공기호가 그려지네요 ..ㅜㅜㅜㅜㅜ 다시검토좀 부탁드려도될까요 ??
(defun c:s44 (/ _LWPoly p1 dis p2 p3 p4 p5 p6 dtr rtd)
;->*error* start ; 작업중 취소 또는 에러 발생시 레이어 복원함
;(defun *error* (msg)(princ “error: “)(princ msg) (setvar “clayer” cla) (princ))
;-<*error* end
; (setq cla (getvar “clayer”)) ; 현재 레이어 저장
(command “undo” “be”)
(defun _LWPoly (lst cls)
(entmakex (append (list (cons 0 “LWPOLYLINE”)
(cons 100 “AcDbEntity”)
(cons 100 “AcDbPolyline”)
(cons 90 (length lst))
(cons 70 cls))
(mapcar (function (lambda (p) (cons 10 p))) lst))))
(defun dtr (a) (* pi (/ a 180.0)))
(defun rtd (a) (* 180.0 (/ a pi)))
(setq p1 (getpoint “n start point:”))
(setq p6 (getpoint p1 “n second point:”))
(setq p2 (polar p1 (dtr 120) 5.2))
(setq p3 (polar p2 (dtr 0) 5.2))
(setq p4 (polar p3 (dtr 0) 5.2))
(setq p5 (polar p4 (dtr 240) 5.2))
(_LWPoly (list p1 p2 p3 p4 p5 p3) 1)
(command “change” “l” “” “p” “la” “7” “”)
(command “rotate” “l” “” p1 p6″”)
(command “undo” “e”)
;(setvar “clayer” cla) ; 저장했던 레이어로 복원
(princ)
)
리습 사용후에 자꾸 오스냅이 전부 꺼지네요 …?
그리고 UCS를 옮겨놓으면 다른곳에 가공기호가 그려집니다 ㅜㅜ UCS를 이리저리 옮기면서 설계해야 하거든요 ㅠㅠ
OSMODE 0을 지우면 가공기호가 이상하게 그려집니다
혹시 OSMODE0 명령어가 없어도 정상적으로 그려지게 할수있는 방법 있을까요 ??
그럼 모든것이 해결될수 있습니다 ㅜㅜ