◆ 명령어 :
1. TUN : 병합 (합집합)
2. TINT : 겹치는 부분만 (합집합)
3. TSU : 겹치는 것을 빼고 (차집합)
◆ 소개 :
- 이 리습은 세가지 기능이 있습니다.
1. 트림하면서 병합(Union)
2. 겹치는 부분만 남겨놓고 트림(Intersect)
3. 겹치는 부분을 빼내고 트림(Subtract)
트림후에 객체를 하나의 폴리선으로 합쳐주기때문에 몇번의 과정을 줄여준다는 장점이 있습니다.
◆ 사용법 :
1. 명령어 실행
2. Select First Set of Objects : 트림 기준이 되는 객체를 선택합니다.
3. Select Objects to perform : 트림할 객체를 선택합니다.
- 병합 (tun)

- 겹치는 부분만 (tint)

- 겹치는 부분을 뺌 (tsu)

- 여러 객체 선택시
단일 객체뿐만 아니라 여러개의 객체를 한번에 선택할 수도 있습니다.
아래 그림은 여러개의 객체를 병합하는 예제입니다.

◆ 실행절차
① Select First Set of Objects : 트림 기준이 되는 객체를 선택합니다.
② Select Objects to perform : 트림할 객체를 선택합니다.
◆ 다운로드
◆ 명령어를 변경하려면
리습 파일을 열고 맨 위 (defun c:tun 문자에서 빨간 글자만 원하는 명령으로 변경 후
다시 로드하면 됩니다.
(defun c:tun nil (_ApplyBooleOperation "_.UNION"))
(defun c:tint nil (_ApplyBooleOperation "_.INTERSECT"))
(defun c:tsu nil (_ApplyBooleOperation "_.SUBTRACT"))
(defun _ApplyBooleOperation ( method / chk ss sss ssss qaf _entsels _makeregion doc lst obj1 obj2 reg1 reg11 reg11ss reg2 reg22 reg22ss k )
(defun _entsels ( msg filter / sel k entlst )
(princ msg)
(setvar 'NOMUTT 1)
(setq sel (vl-catch-all-apply 'ssget (list filter)))
(setvar 'NOMUTT 0)
(if (and sel (not (vl-catch-all-error-p sel)))
(repeat (setq k (sslength sel))
(setq entlst (cons (ssname sel (setq k (1- k))) entlst))
)
)
entlst
)
(defun _makeregion ( doc obj / result )
(if
(null
(vl-catch-all-error-p
(setq result
(vl-catch-all-apply 'vlax-invoke
(list (vla-objectidtoobject doc (vla-get-ownerid obj)) 'addregion (list obj))
)
)
)
)
(car result)
(prompt (strcat "\n" (vl-catch-all-error-message result)))
)
)
(setq lst '((-4 . "<OR") (0 . "ELLIPSE,CIRCLE") (-4 . "<AND") (0 . "SPLINE,LWPOLYLINE") (-4 . "&=") (70 . 1) (-4 . "AND>") (-4 . "OR>"))
doc (vla-get-activedocument (vlax-get-acad-object))
)
(setq obj1 (_entsels "\nSelect First Set of Objects: " lst))
(setq obj2 (_entsels (strcat "\nSelect Objects to perform " method ": ") lst))
(foreach obj obj1
(setq reg1 (_makeregion doc (vlax-ename->vla-object obj)))
(setq reg11 (cons (vlax-vla-object->ename reg1) reg11))
)
(setq reg11ss (ssadd))
(repeat (setq k (length reg11))
(ssadd (nth (setq k (1- k)) reg11) reg11ss)
)
(vl-cmdf "_.UNION" reg11ss "")
(setq reg11 (entlast))
(foreach obj obj2
(setq reg2 (_makeregion doc (vlax-ename->vla-object obj)))
(setq reg22 (cons (vlax-vla-object->ename reg2) reg22))
)
(setq reg22ss (ssadd))
(repeat (setq k (length reg22))
(ssadd (nth (setq k (1- k)) reg22) reg22ss)
)
(vl-cmdf "_.UNION" reg22ss "")
(setq reg22 (entlast))
(setq ss (ssadd))
(ssadd reg11 ss)
(ssadd reg22 ss)
(setq sss (ssget "_X"))
(ssdel reg11 sss)
(ssdel reg22 sss)
(if (eq method "_.SUBTRACT")
(vl-catch-all-apply 'vl-cmdf (list method reg11 "" reg22 ""))
(vl-catch-all-apply 'vl-cmdf (list method ss ""))
)
(setq ssss (ssget "_X"))
(repeat (setq k (sslength sss))
(ssdel (ssname sss (setq k (1- k))) ssss)
)
(repeat (setq k (length obj1))
(if (or (eq (cdr (assoc 0 (entget (nth (setq k (1- k)) obj1)))) "ELLIPSE") (eq (cdr (assoc 0 (entget (nth k obj1)))) "SPLINE")) (setq chk (cons T chk)) (setq chk (cons nil chk)))
)
(repeat (setq k (length obj2))
(if (or (eq (cdr (assoc 0 (entget (nth (setq k (1- k)) obj2)))) "ELLIPSE") (eq (cdr (assoc 0 (entget (nth k obj2)))) "SPLINE")) (setq chk (cons T chk)) (setq chk (cons nil chk)))
)
(if (vl-remove nil chk)
(progn
(prompt "\nOne or more objects is/are ELLIPSE or SPLINE - creating REGIONS instead")
(getstring "\nEnter to continue")
)
(progn
(setq qaf (getvar 'qaflags))
(setvar 'qaflags 1)
(vl-cmdf "_.EXPLODE" ssss "")
(if (eq (cdr (assoc 0 (entget (ssname (ssget "_P") 0)))) "REGION") (vl-cmdf "_.EXPLODE" (ssget "_P") ""))
(vl-cmdf "_.PEDIT" "M" (ssget "_P") "" "" "j" "" "")
(setvar 'qaflags qaf)
)
)
(foreach obj obj1
(entdel obj)
)
(foreach obj obj2
(entdel obj)
)
(princ)
)
(vl-load-com) (princ)
'Auto Cad > AutoLISP' 카테고리의 다른 글
| 레이어를 알아서 지정해 그리는 리습 (0) | 2016.07.16 |
|---|


tun.lsp