제가 다른분에게 물어봐서 일단 어느정도 리습은 만들어 놨습니다.
제가하고자 하는 리습이 뭐냐면.. 일단 chamfer는 챔퍼인데 좀 다른방식으로 챔퍼를 하는 리습입니다.
챔퍼를 할경우 객체1과 객체2를 클릭하면 제가 원하는 chamfer에대한 대각선 라인을 그릴수 있습니다.
그치만 chamfer명령어는 블록안에 들어가있는 라인이나, arc, spline등에는 먹히지 않습니다.
그래서 저는 캐드작업할때 circle명령어의 ‘ttr’명령을 이용해서 원을 그린후, 그원과 객체1 ,객체2사이의 교차점이 생깁니다. 이 두 교차점을 이어서 라인을 그은 후 원을 삭제하는 방식으로 작업을 하는데요.
이 작업을 하나의 명령어로 만들어 내고 싶습니다.
저는 설계할때 챔퍼가 무조건 CHAMFER5 CHAMFER10 두가지입니다.
그렇기때문에 명령어 중간에 챔퍼 몇으로 할것이냐? 라는 질문은 필요없고
두개의 명령어를 만들어서 하나는 챔퍼5 하나는 챔퍼 10의 명령어를 만들고 싶네요
(예를들면 챔퍼5는 TF , 챔퍼10은 TD~~~ 그리고 챔퍼5는 파이10짜리원, 챔퍼10은 파이20짜리 원이 되겠네요)
사진 세장 첨부드립니다…
그리고 아래는 제가 다른분께 질문해서 작성해 주신 리습인데 .. 이게 원까지만 그려진 후에
p2:error: bad argument type: lentityp nil 에러가 뜬후에 되지 않는데 리습이 정상 작동 하게끔 만들고 싶습니다… 리습 고수분들 검토부탁드립니다.. 감사합니다..
(defun c:hh(/ _Line _intersect flag1 flag2 p1 p2 p3 p4 cir e1 e2) ; dist는 전역변수입니다 여기에 설정하면 안되요 ^^;;
(defun _Line (p1 p2)
(entmakex (list (cons 0 “LINE”)
(cons 10 p1)
(cons 11 p2))))
(defun _intersect (obj1 obj2 / interxy)
(setq interxy (vlax-invoke obj1 ‘intersectwith obj2 acextendnone))
interxy
)
(setq flag1 1 flag2 2)
(or dist (setq dist 5))
;(setq dist(cond((getreal (strcat “n챔퍼 값:<“(rtos dist)”>:”)))(dist)))
(setvar ‘OSMODE 512)
(while flag1
(setq p1(osnap (getpoint “np1:”) “_nea”))
(if p1 (setq flag1 nil))
)
(while flag2
(setq p2(osnap (getpoint “np2:”) “_nea”))
(if p2 (setq flag2 nil))
)
(command “_.circle” “ttr” p1 p2 “10”)
(setq cir(entlast))
(setq e1(car(nentselp (trans p1 1 0 ))) e2(car(nentselp(trans p2 1 0))))
(setq obj1(vlax-ename->vla-object e1)
obj2(vlax-ename->vla-object e2)
obj3(vlax-ename->vla-object cir)
)
(setq p3 (_intersect obj1 obj3) p4(_intersect obj2 obj3))
(_Line p3 p4)
(entdel cir)
;osmode 복귀 구문 넣을것..
(princ)
)
(vl-load-com)
따라지님 말로는 중학교 수준의 수학이라는데 헐~~ 난 초등 저학년에서 멈춤 ㅜ.ㅜ;;;
ㅜㅜ 이게 생각처럼 간단치가 않은것 같네요 ㅜㅜ
여기 안되면 저기 올리시고 저기 안되면 여기 올리시고.gif)
제가 이렇게저렇게 바꿔가면서 시도해보는데 너무 안되서요..
여기 계신분이 저기도 계시고 그런거 알지만 그래도 더 많은분 보시면 도움얻을수 있을까 해서요. 제가 공부해서 만들기에는 너무 수준이 높은지라 질문글 또 올리게 되었네요… 안좋게 보이셨으면 죄송합니다
다른건 다 그렇다쳐도
블록안에있는건
해당블록을 한번 파괴해도 된다는건가요.
수정해버리면 동일한 블록명으로 된건 다 수정될텐데
그걸 다 새로 지정하라는건가요?
좀 현실성 있는걸 말씀해주세요.
전 블록을 파괴해도 된다고 한적 없고 그렇기때문에 그걸 다 새로지정할 필요도 없는데요 ..?
CIRCLE , TTR명령어는 객체가 블록이든 원이든 상관없이 탄젠트 오스냅이 걸리기때문에
전 이걸 수작업으로 할떄에도 블록은 건드리지 않아요 ..
객체가 블록일지라도 TANGENT오스냅은 잡히잖아요 ? 그 TANGENT ,TANGENT , RADIUS를 이용해서 원을 그리는걸 말하는거얘요..
설명이 부족해 죄송합니다..
;꼼수로~ 혹 사용하시다 오류나도 몰러유~ ㅋㅋㅋ
(defun c:hh(/ *error* _Line r os p1 p2 es tmp circle ip n a360 ang ag pt sp ep)
(defun *error* ( msg )
(if os (setvar ‘osmode os))
(if (not (wcmatch (strcase msg t) “*break,*cancel*,*exit*”))
(princ (strcat “n오류: ” msg))
)
(princ)
)
(defun _Line (p1 p2)
(entmakex (list (cons 0 “LINE”) (cons 10 p1) (cons 11 p2)))
)
(setq r 10) ;반지름
(setq os (getvar ‘osmode))
(setvar ‘osmode 512)
(while (null (setq p1 (osnap (getpoint “np1:”) “_nea”))))
(while (null (setq p2 (osnap (getpoint “np2:”) “_nea”))))
(setq tmp (entlast) es (cons (car (nentselp p2)) (cons (car (nentselp p1)) es)))
(setvar ‘osmode 0)
(command “_.circle” “ttr” p1 p2 (rtos r))
(if (null (equal tmp (setq circle (entlast))))
(progn
(setq ip (cdr (assoc 10 (entget circle))) a360 (+ pi pi) ang 0 ag (/ pi 180))
(while (and (or (null sp) (null ep)) (< ang a360))
(if (and
(progn
(redraw circle 1)
(setq pt (osnap (polar ip ang r) “_int”))
(redraw circle 2)
pt
)
(equal (distance pt ip) r 1e-8)
(member (car (nentselp pt)) es)
)
(cond
((null sp) (setq sp pt))
((null (equal pt sp)) (setq ep pt))
)
)
(setq ang (+ ang ag))
)
(if (and sp ep)
(_Line sp ep)
)
(entdel circle)
)
)
(setvar ‘osmode os)
(princ)
)
우와!!!! 뭐하남님 정말 감사드립니다 .ㅜㅜㅜㅜ 맞아요 제가 이렇게 라인그어지는걸 말한건데요 그대로네요 ..
UCS WORLD 상태에서만 원위치에 라인이 그어지는데 이건 변경 불가할까요 ??
UCS변경하는 일이 일할떄 너무 많아서요 ㅜㅜ… UCS가 어디에있든 관계없이 작도 되도록은 불가능할까요 ?
회사 직원분들이 이 리습보고 엄청 좋아하시네요 ㅜㅜㅜ
정말 감사드립니다 !!
;ucs는 수정했습니다. 허나 솔직히 말하자면 이런식은 선이 겹치거나 근처에 교차점이 있으면 오류가 납니다. 나중에 공부하셔서 잘 만들어보세요 ㅋ
(defun c:hh(/ *error* _Line r os p1 p2 es tmp circle ip n a360 ang ag pt sp ep)
(defun *error* ( msg )
(if os (setvar ‘osmode os))
(if (not (wcmatch (strcase msg t) “*break,*cancel*,*exit*”))
(princ (strcat “n오류: ” msg))
)
(princ)
)
(defun _Line (p1 p2)
(entmakex (list (cons 0 “LINE”) (cons 10 p1) (cons 11 p2)))
)
(setq r 10) ;반지름
(setq os (getvar ‘osmode))
(setvar ‘osmode 512)
(while (null (setq p1 (osnap (getpoint “np1:”) “_nea”))))
(while (null (setq p2 (osnap (getpoint “np2:”) “_nea”))))
(setq tmp (entlast) es (cons (car (nentselp p2)) (cons (car (nentselp p1)) es)))
(setvar ‘osmode 0)
(command “_.circle” “ttr” p1 p2 (rtos r))
(if (null (equal tmp (setq circle (entlast))))
(progn
(setq ip (trans (cdr (assoc 10 (entget circle))) 0 1) a360 (+ pi pi) ang 0 ag (/ pi 180))
(while (and (or (null sp) (null ep)) (< ang a360))
(if (and
(progn
(redraw circle 1)
(setq pt (osnap (polar ip ang r) “_int”))
(redraw circle 2)
pt
)
(equal (distance pt ip) r 1e-8)
(member (car (nentselp pt)) es)
)
(cond
((null sp) (setq sp pt))
((null (equal pt sp)) (setq ep pt))
)
)
(setq ang (+ ang ag))
)
(if (and sp ep)
(_Line (trans sp 1 0) (trans ep 1 0))
)
(entdel circle)
)
)
(setvar ‘osmode os)
(princ)
)
감사드립니다 ㅜㅜ.. 덕분에 사용할수 있게되었네요
뭐하남님 말씀대로 근처에 교차점 있을경우는 잘안되는군요 .. ㅜㅜ
일단은 만들어주신대로 사용해봐야겠네요
정말감사드립니다 ^^
;마지막으로 보완을 좀 했숨다…
(defun c:hh (/ *error* _Copynested _Line r os p1 p2 es tmp circle ip nen1 nen2 n a360 ang ag tmp1 tmp2 pt sp ep)
(vl-load-com)
(defun *error* ( msg )
(if os (setvar ‘osmode os))
(if (not (wcmatch (strcase msg t) “*break,*cancel*,*exit*”))
(princ (strcat “n오류: ” msg))
)
(princ)
)
(defun _Copynested (en mat / _fixdxfdata ent)
(defun _fixdxfdata (ent) (vl-remove-if ‘(lambda ( pair ) (member (car pair) ‘(5 6 8 102 330))) ent))
(if
(setq en
(cond
((= “VERTEX” (cdr (assoc 0 (setq ent (entget en)))))
(entmakex (_fixdxfdata (entget (setq en (cdr (assoc 330 ent))))))
(setq en (ennext en) ent (entget en))
(while (/= “SEQEND” (cdr (assoc 0 ent)))
(entmakex (_fixdxfdata ent))
(setq en (ennext en)
ent (entget en)
)
)
(cdr (assoc 330 (entget (entmakex (_fixdxfdata ent)))))
)
((entmakex (_fixdxfdata ent)))
)
)
(if mat (vla-transformby (vlax-ename->vla-object en) (vlax-tmatrix mat)))
)
en
)
(defun _Line (p1 p2)
(entmakex (list (cons 0 “LINE”) (cons 10 p1) (cons 11 p2)))
)
(setq r 10) ;반지름
(setq os (getvar ‘osmode))
(setvar ‘osmode 512)
(while (null (setq p1 (osnap (getpoint “np1:”) “_nea”))))
(while (null (setq p2 (osnap (getpoint “np2:”) “_nea”))))
(setq tmp (entlast) nen1 (nentselp p1) nen2 (nentselp p2))
(setvar ‘osmode 0)
(command “_.circle” “ttr” p1 p2 (rtos r))
(if (null (equal tmp (setq circle (entlast))))
(progn
(setq ip (trans (cdr (assoc 10 (entget circle))) 0 1) a360 (+ pi pi) ang 0 ag (/ pi 180))
(setq tmp1 (_Copynested (car nen1) (caddr nen1)) tmp2 (_Copynested (car nen2) (caddr nen2)) es (list tmp1 tmp2))
(while (and (or (null sp) (null ep)) (< ang a360))
(if (and
(progn
(redraw circle 1)
(setq pt (osnap (polar ip ang r) “_int”))
(redraw circle 2)
pt
)
(equal (distance pt ip) r 1e-8)
(member (car (nentselp pt)) es)
)
(cond
((null sp) (setq sp pt))
((null (equal pt sp 1e-8)) (setq ep pt))
)
)
(setq ang (+ ang ag))
)
(if (and sp ep)
(_Line (trans sp 1 0) (trans ep 1 0))
)
(mapcar ‘entdel (list tmp1 tmp2 circle))
)
)
(setvar ‘osmode os)
(princ)
)
감사합니다 뭐하남님 ^^
수정해주신 리습 사용중에 간혹
오류: bad argument type: lentityp nil
라는 오류뜰때가 있는데 이런경우는 어떤경우인가요 ? 어떤점이 수정된지 몰라 다시한번만 더 질문드립니다 .ㅜㅜ 죄송합니다..
챔퍼라인은 그전보다 좀더 잘찾아 지는것 같네요 ^^ 감사드립니다 정말