[[Lisp]]사각박스 그리기 리습 입니다.. 폴리라인의 방향성에 따라 어떻게 vla-offset 값이 안쪽/바깥쪽이 정해지는 건지 궁금 합니다.
작성자아부라카다부라작성시간12.06.04조회수841 목록 댓글 11
성심 성의껏 질문을 작성하여 주세요, 대충하시면 답변도 대충작성합니다.^^
- 제목 작성시 금지어
만들어주세요? 해주세요? 안되는데 이렇게 변경해주세요? 등등
- 특정분과 질문은 제목에 분과삽입 [건축]
좋은예) [분과]무엇에 대해 문의합니다. /[분과]B로 바꾸는 방법을 알고싶습니다.
- 말머리 필수
① CAD 종류 : 오토캐드
② VERSION : 2011
③ 운영 체제 :win7
아래 리습은 3:16님 도움으로 나름 정리를 하여 문자에 사각박스를 그리는 리습 입니다..
이 리습에서 옵션으로 옵셋값을 줘서 문자크기보다 약간 크게 하려고 하니 옵셋방향성 문제가 있는거 같습니다.
폴리라인을 그릴때 방향에 따라 옵셋 방향이 달라지는지 궁금 합니다..또 방향성을 어떻게 확인 할수 있는지도요???
좌표순서를 바꿔봐도 똑같네요...ㅡㅡ
(vl-cmdf "_.RECTANG" (car lst) (cadr lst)) 커멘더 함수로 했을땐 완전 잘 되었는데..ㅡㅡ
(defun c:tb (/ offset os ss *error* PTE:pt->cen PTE:boundingbox KT:RECTANG);(setq obj (vlax-ename->vla-object (car (nentsel))))
(vl-load-com)
(defun *error* (msg)(princ "error: ")(princ msg)
(command "undo" "e")
(setvar 'osmode os)
(princ)
)
(defun PTE:pt->cen (p1 p2)
(mapcar '(lambda (a b) (/ (+ a b) 2)) p1 p2)
)
(defun PTE:boundingbox ( obj / mi ma )
(vla-getboundingbox obj 'mi 'ma)
(setq mi (vlax-safearray->list mi)
ma (vlax-safearray->list ma)
)
(list mi ma
(abs(- (car ma) (car mi)))
(abs(- (cadr ma) (cadr mi)))
)
)
(defun KT:RECTANG (mi ma)
(entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(8 . "0") '(100 . "AcDbPolyline")(cons 90 4) '(70 . 1)
(cons 10 mi)(cons 10 (list (car mi)(cadr ma)))
(cons 10 ma)(cons 10 (list (car ma)(cadr mi)))
)
)
)
(command "undo" "be")
; (setq offset 1)
(setq os (getvar 'osmode))
(setvar 'osmode 0)
(prompt "\n 문자를 선택 하시오:")
(setq ss (ssget (list (cons 0 "TEXT"))))
(mapcar
'(lambda (x / getRo lst Cen ent)
(setq getRo (vla-get-rotation x))
(setq lst (PTE:boundingbox x)
Cen (PTE:pt->cen (car lst) (cadr lst)))
(if (= (vl-some '(lambda (x) (= x getRo)) (list pi (* pi 0.5) (* pi 1.5) (* pi 2.0))) nil)
(progn
(vla-rotate x (vlax-3d-point cen) (- 0 getRo))
(setq lst (PTE:boundingbox x)
Cen (PTE:pt->cen (car lst) (cadr lst)))
(KT:RECTANG (car lst) (cadr lst))
(vla-rotate (vlax-ename->vla-object (entlast)) (vlax-3d-point cen) getRo)
(vla-rotate x (vlax-3d-point cen) getRo)
)
(KT:RECTANG (car lst) (cadr lst))
)
; (setq ent (entlast))
; (vla-offset (vlax-ename->vla-object (entlast)) offset)
; (entdel ent)
)
(mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
)
(setvar 'osmode os)
(command "undo" "e")
(princ)
)
참고로 아래 [☆별☆]님이 만들어 주신 사각박스 그리기 리습이 속도는 최고 네요....
(defun c:test()
(and
(setq ss (ssget '((0 . "TEXT"))))
(foreach ent (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(setq ip (cdr (assoc 10 ent)) bp (list (car ip) (cadr ip)) ro (cdr (assoc 50 ent)))
(setq box (mapcar '(lambda (pt) (list (car pt) (cadr pt))) (textbox ent)))
(setq ps (list (car box) (list (caar box) (cadadr box)) (cadr box) (list (caadr box) (cadar box)) (car box)))
(setq ps (mapcar '(lambda (pt) (setq pt (mapcar '+ bp pt)) (cons 10 (polar bp (+ (angle bp pt) ro) (distance bp pt)))) ps))
(entmakex (append (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 (length ps))) ps))
; (setq ent (entlast))
; (vla-offset (vlax-ename->vla-object (entlast)) offset)
; (entdel ent)
)
)
(princ)
)
위 리습으로 문자,치수,블럭내 문자를 선택(ssget으로 선택해서 nentsel 효과를 나타내었음 좋겠습니다..)하면 사각박스가 똑같이 그려지게 가능할까요???
※ 유의사항
- ①말머리 : 말머리를 달아야 구분이 쉽겠죠^^
- ②Screenshot : 이해를 돕기위해 삽입요망.
- ③파일 첨부 : 상위버전에서 테스트할 파일이 아니면 가급적 하위버전으로 저장후 첨부.
해당리습/해당파일(DWG) 도 같이 첨부하여 주세요.
- ④제 목 : 질문 내용 반영(개략적인 내용), 예) 해치를 만들고 싶어요, pline을 연결할려면?
- ⑤질문글 삭제금지 : 질문후 댓글이 달린글은 삭제금지.
여러 리플러들이 소중한 시간을 내어서 고민한후 댓글을 작성한 이상 "강력조치" 토록 하겠음.
※ 정답만이 댓글은 아닙니다. 그 답이 맞던 틀리던 그건 그 댓글로서 존중되어야 합니다.
회원님들이 글을 읽었다는것과 댓글을 달았다는건 그만큼 관심을 가지고 있고 또 그 답을 해주기 위해
검색도 해보고 도움말도 보고 고민도 하는 일련의 과정을 거치면서 나오기 때문이죠.
이에 대한 고마움과 감사함을 모르는 테러행위(?)는 없었으면 합니다.
댓글
댓글 리스트-
작성자3:16 작성시간 12.06.05 설마...
위 리습으로 문자,치수,블럭내 문자를 선택(ssget으로 선택해서 nentsel 효과를 나타내었음 좋겠습니다..)하면 사각박스가 똑같이 그려지게 가능할까요??? <-- 이거요?? -
답댓글 작성자3:16 작성시간 12.06.05 이게 무슨 소린데요?^^;;; ㅎㅎㅎㅎㅎ
-
답댓글 작성자아부라카다부라 작성자 본인 여부 작성자 작성시간 12.06.05 지금은 text만 선택이 되는데 치수나 블럭내에도 text가 존재하잖아요!! 그 위치에도 사각박스가 그려지게 하고 싶어요...ㅡㅡ
-
답댓글 작성자3:16 작성시간 12.06.05 샘플 파일 좀^^;
-
답댓글 작성자아부라카다부라 작성자 본인 여부 작성자 작성시간 12.06.05 넵~^^