Join과 Explode를 한 명령에서
선과 호의 연결 체인을 폴리선으로 묶거나 기존 폴리선을 기본 선·호 객체로 되돌립니다.
모호한 체인은 변경하지 않음
- Join은 같은 평면에서 끝점이 허용오차 안에 있는 체인을 처리합니다.
- 세 갈래 이상 분기되거나 길이가 0인 체인은 거부합니다.
- AutoCAD PEDIT 결합을 사용해 호 구간을 bulge로 유지합니다.
사용 순서
- 1
APPLOAD로 line-to-polyline.lsp를 로드합니다.
- 2
LINE2PL을 입력합니다.
- 3
Join 또는 Explode 모드를 선택합니다.
- 4
대상 객체를 선택하고 Join이면 연결 허용오차를 입력합니다.
코드 전문
다운로드 파일은 아래 코드와 100% 동일합니다. 붙여넣기보다 파일 다운로드 후 APPLOAD 로드를 권장합니다.
;;; ------------------------------------------------------------
;;; AutoCATS 리습 자료실
;; 명령: LINE2PL
;; 기능: 비분기 LINE 및 ARC 체인과 폴리선의 상호 변환
;; 출처: https://www.autocats.co.kr/lisp/line-to-polyline
;; 버전: 1.0 (2026-07-27)
;; 라이선스: 자유 사용·수정, 재배포 시 출처(autocats.co.kr) 표기
;; 안전: *error* 핸들러 + UNDO 그룹, 분기 및 3D 체인 변경 방지
;;; ------------------------------------------------------------
(vl-load-com)
(defun autocats-line2pl-locked-p (ent / row)
(setq row (tblsearch "LAYER" (cdr (assoc 8 (entget ent)))))
(and row (= 4 (logand 4 (cdr (assoc 70 row))))))
(defun autocats-line2pl-arc-point (center radius angle)
(list
(+ (car center) (* radius (cos angle)))
(+ (cadr center) (* radius (sin angle)))
(if (caddr center) (caddr center) 0.0)))
(defun autocats-line2pl-endpoints (ent / data kind center radius)
(setq data (entget ent)
kind (cdr (assoc 0 data)))
(cond
((= kind "LINE")
(list (cdr (assoc 10 data)) (cdr (assoc 11 data))))
((= kind "ARC")
(setq center (cdr (assoc 10 data))
radius (cdr (assoc 40 data)))
(list
(autocats-line2pl-arc-point center radius (cdr (assoc 50 data)))
(autocats-line2pl-arc-point center radius (cdr (assoc 51 data)))))
(T nil)))
(defun autocats-line2pl-near-count (point points tolerance / count)
(setq count 0)
(foreach other points
(if (<= (distance point other) tolerance)
(setq count (1+ count))))
count)
(defun autocats-line2pl-valid-p (ss tolerance / idx endpoints pair base-z valid)
(setq idx 0 endpoints nil valid T)
(while (and valid (< idx (sslength ss)))
(setq pair (autocats-line2pl-endpoints (ssname ss idx)))
(if (or (null pair) (<= (distance (car pair) (cadr pair)) tolerance))
(setq valid nil)
(setq endpoints (append endpoints pair)))
(setq idx (1+ idx)))
(if endpoints (setq base-z (caddr (car endpoints))))
(foreach point endpoints
(if (or (> (abs (- (caddr point) base-z)) tolerance)
(> (autocats-line2pl-near-count point endpoints tolerance) 2))
(setq valid nil)))
valid)
(defun autocats-line2pl-editable-set (ss / idx ent result)
(setq idx 0 result (ssadd))
(while (< idx (sslength ss))
(setq ent (ssname ss idx))
(if (not (autocats-line2pl-locked-p ent))
(ssadd ent result))
(setq idx (1+ idx)))
result)
(defun autocats-line2pl-join (ss tolerance / old-accept result)
(setq old-accept (getvar "PEDITACCEPT"))
(setvar "PEDITACCEPT" 0)
(setq result
(vl-catch-all-apply
'(lambda ()
(command "_.PEDIT" "_Multiple" ss "" "_Yes" "_Join" tolerance "")
T)))
(setvar "PEDITACCEPT" old-accept)
(if (vl-catch-all-error-p result) nil result))
(defun autocats-line2pl-explode (ss / result)
(setq result
(vl-catch-all-apply
'(lambda ()
(command "_.EXPLODE" ss "")
T)))
(if (vl-catch-all-error-p result) nil result))
(defun c:LINE2PL (/ *error* doc undo-open mode tolerance raw editable old-accept result)
(defun *error* (msg)
(if old-accept (setvar "PEDITACCEPT" old-accept))
(if undo-open
(progn (vla-EndUndoMark doc) (setq undo-open nil)))
(if (and msg (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*EXIT*,*취소*")))
(princ (strcat "\n[LINE2PL] 중단: " msg)))
(princ))
(initget "Join Explode")
(setq mode (getkword "\n[LINE2PL] 변환 [Join/Explode] <Join>: "))
(if (null mode) (setq mode "Join"))
(if (= mode "Join")
(progn
(princ "\n[LINE2PL] 결합할 LINE 및 ARC를 선택하세요.")
(setq raw (ssget '((0 . "LINE,ARC"))))
(if raw
(progn
(initget 6)
(setq tolerance (getdist "\n[LINE2PL] 연결 허용오차 <0.01>: "))
(if (null tolerance) (setq tolerance 0.01))
(setq editable (autocats-line2pl-editable-set raw))
(if (or (= 0 (sslength editable))
(not (autocats-line2pl-valid-p editable tolerance)))
(princ "\n[LINE2PL] 동일 평면의 비분기 연결 체인만 결합할 수 있습니다.")
(progn
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object))
old-accept (getvar "PEDITACCEPT"))
(vla-StartUndoMark doc)
(setq undo-open T
result (autocats-line2pl-join editable tolerance))
(vla-EndUndoMark doc)
(setq undo-open nil old-accept nil)
(if result
(princ (strcat "\n[LINE2PL] 완료: " (itoa (sslength editable))
"개 선·호를 폴리선으로 변환했습니다."))
(princ "\n[LINE2PL] 결합하지 못한 객체가 있습니다.")))))
(princ "\n[LINE2PL] 선택된 선 또는 호가 없습니다.")))
(progn
(princ "\n[LINE2PL] 분해할 폴리선을 선택하세요.")
(setq raw (ssget '((0 . "LWPOLYLINE,POLYLINE"))))
(if raw
(progn
(setq editable (autocats-line2pl-editable-set raw))
(if (= 0 (sslength editable))
(princ "\n[LINE2PL] 편집 가능한 폴리선이 없습니다.")
(progn
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
(vla-StartUndoMark doc)
(setq undo-open T
result (autocats-line2pl-explode editable))
(vla-EndUndoMark doc)
(setq undo-open nil)
(if result
(princ (strcat "\n[LINE2PL] 완료: " (itoa (sslength editable))
"개 폴리선을 분해했습니다."))
(princ "\n[LINE2PL] 폴리선을 분해하지 못했습니다.")))))
(princ "\n[LINE2PL] 선택된 폴리선이 없습니다."))))
(princ))
(princ "\n[AutoCATS] LINE2PL 로드 완료 - 명령행에 LINE2PL 를 입력하세요.")
(princ)
호환 CAD
위 환경에서 확인했습니다. 목록에 없는 CAD는 샘플 도면에서 먼저 결과를 대조한 뒤, CAD 종류·버전과 함께 네이버 카페에 알려주세요.
이 기능, CATS Pro에는 버튼으로 있습니다
PG_LINE2PL / CATS_PG_LINE2PLCATS Pro에서는 변환 통계와 고급 편집 흐름을 패널에서 함께 제공합니다.CATS Pro는 계속 무료입니다. 리습 로드 없이 버튼 클릭으로 같은 작업을 처리할 수 있습니다.
함께 쓰면 좋은 CATS 명령
자주 묻는 질문
분기된 선도 하나의 폴리선으로 만들 수 있나요?
폴리선은 한 경로만 표현하므로 세 갈래 이상 분기된 선택은 안전을 위해 거부합니다.
서로 떨어진 여러 체인을 함께 선택할 수 있나요?
각 체인이 비분기이고 같은 평면이면 AutoCAD가 연결 가능한 체인별로 변환합니다.