선·호 폴리선 상호 변환 리습 (LINE2PL)

연결된 LINE·ARC 체인을 폴리선으로 결합하고 LWPOLYLINE·POLYLINE을 다시 선과 호로 분해합니다.

코드 전문 공개 · 다운로드 파일과 100% 동일 · 출처 표기 후 자유 사용

Join과 Explode를 한 명령에서

선과 호의 연결 체인을 폴리선으로 묶거나 기존 폴리선을 기본 선·호 객체로 되돌립니다.

모호한 체인은 변경하지 않음

  • Join은 같은 평면에서 끝점이 허용오차 안에 있는 체인을 처리합니다.
  • 세 갈래 이상 분기되거나 길이가 0인 체인은 거부합니다.
  • AutoCAD PEDIT 결합을 사용해 호 구간을 bulge로 유지합니다.
HOW TO USE

사용 순서

리습 로드가 처음이라면
  1. 1

    APPLOAD로 line-to-polyline.lsp를 로드합니다.

  2. 2

    LINE2PL을 입력합니다.

  3. 3

    Join 또는 Explode 모드를 선택합니다.

  4. 4

    대상 객체를 선택하고 Join이면 연결 허용오차를 입력합니다.

SOURCE

코드 전문

명령 LINE2PL

다운로드 파일은 아래 코드와 100% 동일합니다. 붙여넣기보다 파일 다운로드 후 APPLOAD 로드를 권장합니다.

.lsp 다운로드
;;; ------------------------------------------------------------
;;; 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)
COMPATIBILITY

호환 CAD

AutoCAD 2021AutoCAD 2026

위 환경에서 확인했습니다. 목록에 없는 CAD는 샘플 도면에서 먼저 결과를 대조한 뒤, CAD 종류·버전과 함께 네이버 카페에 알려주세요.

ONE-CLICK ALTERNATIVE

이 기능, CATS Pro에는 버튼으로 있습니다

PG_LINE2PL / CATS_PG_LINE2PLCATS Pro에서는 변환 통계와 고급 편집 흐름을 패널에서 함께 제공합니다.

CATS Pro는 계속 무료입니다. 리습 로드 없이 버튼 클릭으로 같은 작업을 처리할 수 있습니다.

WORKS WELL WITH

함께 쓰면 좋은 CATS 명령

전체 명령 보기
PG_LINE2PL / CATS_PG_LINE2PLCATS Pro에서 Line·Arc 체인과 Polyline을 Join 또는 Explode 방식으로 상호 변환합니다.
FAQ

자주 묻는 질문

분기된 선도 하나의 폴리선으로 만들 수 있나요?

폴리선은 한 경로만 표현하므로 세 갈래 이상 분기된 선택은 안전을 위해 거부합니다.

서로 떨어진 여러 체인을 함께 선택할 수 있나요?

각 체인이 비분기이고 같은 평면이면 AutoCAD가 연결 가능한 체인별로 변환합니다.

WORKFLOW PRODUCTS

업무 분야에 맞는 전용 자동화도 확인해 보세요.

공통 CAD 작업은 CATS Pro로, 분야별 도면과 산출 업무는 전용 제품으로 이어갈 수 있습니다.

FREE LISP + FREE ADD-IN

리습과 CATS Pro를 함께 쓰세요.

리습은 가볍게, 반복 작업은 CATS Pro 버튼으로. 둘 다 무료입니다.