이럴 때 사용하세요
면적을 계산하기 전 열린 경계를 명시적으로 닫습니다. 마지막 구간이 의도한 경계인지 먼저 확인하세요.
지원 범위와 주의사항
- 경량 폴리선(LWPOLYLINE)만 지원하며 꼭짓점 수가 3개 이상이어야 합니다.
- 마지막 점에서 첫 점으로 연결됩니다. 마지막 꼭짓점의 벌지 값이 있으면 닫는 구간도 호가 됩니다.
- 자기 교차·작은 틈·중복 정점은 자동 보정하지 않습니다.
- 잠긴 레이어는 건너뜁니다. U 한 번으로 되돌릴 수 있습니다.
코드에서 살펴볼 부분
c:PLCLOSE는 입력을 받고, autocats-plclose-로 시작하는 함수가 실제 처리를 맡습니다. 객체 선택 조건과 입력값 검사를 먼저 확인하면 다른 도면 작업에도 응용할 수 있습니다.
각 파일은 단독으로 로드할 수 있습니다. CATS Pro 설치가 필요하지 않으며, 같은 이름의 사용자 명령이 있다면 defun c: 이름을 바꿔 사용하세요.
사용 순서
- 1
autocats-polyline-close.lsp를 다운로드하고 APPLOAD로 로드합니다.
- 2
PLCLOSE를 입력합니다.
- 3
명령행 안내에 따라 값을 입력하거나 기준 객체를 고릅니다.
- 4
대상 객체를 선택하고 Enter를 누른 뒤 결과를 확인합니다.
코드 전문
다운로드 파일은 아래 코드와 100% 동일합니다. 붙여넣기보다 파일 다운로드 후 APPLOAD 로드를 권장합니다.
;;; AutoCATS 리습 자료실
;; 명령: PLCLOSE
;; 기능: 선택한 경량 폴리선의 열린 끝을 닫습니다.
;; 출처: https://www.autocats.co.kr/lisp/polyline-close
;; 버전: 1.0 (2026-10-23)
;; 라이선스: 자유 사용·수정, 재배포 시 출처(autocats.co.kr) 표기
;; 안전: 잠긴 레이어·외부참조 보호, 변경은 UNDO 그룹, 명령별 범위는 상세 가이드 참고
(vl-load-com)
(defun autocats-plclose-safe-p (ent / data row block)
(setq data (entget ent)
row (tblsearch "LAYER" (cdr (assoc 8 data))))
(and data row (= 0 (logand 4 (cdr (assoc 70 row))))
(or (/= "INSERT" (cdr (assoc 0 data)))
(and (setq block (tblsearch "BLOCK" (cdr (assoc 2 data))))
(= 0 (logand 12 (cdr (assoc 70 block))))))))
(defun autocats-plclose-replace-pair (code value data)
(if (assoc code data) (subst (cons code value) (assoc code data) data)
(append data (list (cons code value)))))
(defun autocats-plclose-put (ent property value / data)
(if (autocats-plclose-safe-p ent)
(progn
(setq data (autocats-plclose-replace-pair 70 (logior 1 (cdr (assoc 70 (entget ent)))) (entget ent)))
(if (entmod data) (progn (entupd ent) T)))))
(defun autocats-plclose-batch (selection action / index changed skipped ent result)
(setq index 0 changed 0 skipped 0)
(if selection
(repeat (sslength selection)
(setq ent (ssname selection index)
result (if (autocats-plclose-safe-p ent) (vl-catch-all-apply action (list ent))))
(if (and result (not (vl-catch-all-error-p result)))
(setq changed (1+ changed))
(setq skipped (1+ skipped)))
(setq index (1+ index))))
(princ (strcat "\n[PLCLOSE] 완료: " (itoa changed) " / 건너뜀: " (itoa skipped)))
(list changed skipped))
(defun autocats-plclose-apply (ent value)
(and (= "LWPOLYLINE" (cdr (assoc 0 (entget ent)))) (>= (cdr (assoc 90 (entget ent))) 3) (autocats-plclose-put ent 'Closed value)))
(defun c:PLCLOSE (/ *error* undo-open value selection)
(defun *error* (msg)
(if undo-open (progn (command-s "_.UNDO" "_End") (setq undo-open nil)))
(if (and msg (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*EXIT*,*취소*")))
(princ (strcat "\n[PLCLOSE] 중단: " msg)))
(princ))
(setq value :vlax-true)
(if value (progn
(princ "\n대상 객체를 선택하세요: ")
(setq selection (ssget '((0 . "LWPOLYLINE"))))
(if selection
(progn
(command "_.UNDO" "_Begin")
(setq undo-open T)
(autocats-plclose-batch selection '(lambda (ent) (autocats-plclose-apply ent value)))
(command "_.UNDO" "_End")
(setq undo-open nil)))))
(princ))
(princ "\n[AutoCATS] PLCLOSE 로드 완료")
(princ)
호환 CAD
위 환경에서 확인했습니다. 목록에 없는 CAD는 샘플 도면에서 먼저 결과를 대조한 뒤, CAD 종류·버전과 함께 네이버 카페에 알려주세요.
함께 쓰면 좋은 CATS 명령
자주 묻는 질문
CATS Pro와 기능이 완전히 같은가요?
이 예제는 기본 폴리선 편집 리습입니다. CATS Pro의 LOADLISPSATFOLDER는 다운로드 폴더의 리습을 한 번에 로드하는 관련 도구입니다.
변경을 되돌릴 수 있나요?
도면을 변경하는 명령은 한 UNDO 그룹으로 묶습니다. 완료 후 U로 되돌릴 수 있습니다. 집계·조회 명령은 도면을 변경하지 않습니다. 작업 전 복사본에서 결과를 확인하세요.