안녕하세요 LISP 을 전문적으로는 배우지 못하고 그냥 사람들이 제작한것들을 짜집기해서 명령어 위주로 조합해서 사용하고있는데요
캐드의 region 객체들이 union subtract intersect 가 되는 것을보고
폴리라인이나 스플라인들을 region 으로 변경한후
region 끼리 합/차/교차 명령어를 실행한뒤
다시 폴리라인이나 스플라인으로 변경하는 명령어를 만들고있습니다.
그러던중 풀리지않는곳이있어 질문드립니다.
현재 제작한 코드는 아래에 있습니다.
문제가되는부분은 빨간부분으로
영역객체를 닫힌폴리라인이나 닫힌스플라인으로 변환하는 방법을 몰라 검색해보니
단순히 EXPLODE 후 JOIN 을 통해서 변환을 한다고 하더라구요
그래서
(vl-cmdf “explode” (ssget “P”))
(vl-cmdf “join” (ssget “p”) “”)
를 써봤지만
EXPLODE 후에 (ssget “P”)에서 객체를 다불러들이지 못하는 현상이있습니다.
제 짧은 지식으로는 해결할 방법을 찾기가 힘들어서 질문드립니다~!
(DEFUN C:BU(/ acadObj Doc ssa ssb n en ssi ni eni)
(vl-load-com)
(setq acadObj (vlax-get-acad-object))
(setq Doc (vla-get-ActiveDocument acadObj))
(vla-startundomark Doc)
(prompt “nUNION”)
(setq ssa (ssget))
(setq n (sslength ssa))
(if (> n 1)
(progn
(setq ssb (ssadd))
(while (<= 1 n)
(setq n (- n 1))
(setq en (ssmemb (ssname ssa n) ssa))
(vl-cmdf “region” en “”)
(ssadd (entlast) ssb)
)
(vl-cmdf “union” ssb “”)
(vl-cmdf “explode” (ssget “P”))
(setq ssi (ssget “P”))
(if (= “REGION” (cdr (assoc 0 (entget (ssmemb (ssname ssi 0) ssi)))))
(progn
(setq ni (sslength ssi))
(while (<= 1 ni)
(setq ni (- ni 1))
(setq eni (ssmemb (ssname ssi ni) ssi))
(vl-cmdf “explode” eni “”)
(vl-cmdf “join” (ssget “p”) “”)
)
)
(vl-cmdf “join” (ssget “p”) “”)
)
(prompt “nSuccess”)
)
(prompt “nFail”)
)
(vla-endundomark Doc)
(princ)
)
리습은 볼줄 알지만 캐드를 모르는 입장에서 설명 하기가 애매한데 레기온이 뭔지 몰라서…
REGION 은 영역 객체의 영어표기 입니다. REGION 명령어는 닫힌 커브들을 영역객체로 바꿔주는 명령어구요. 캐드상에 유니온명령어가 영역객체들만 적용됐기때문에
아 검색중에 찾았습니다.