;;; AutoCATS - draft, not a public download.
;; 명령: PLASUM
;; 출처: AutoCATS 자체 작성 (공개 전 초안)
;; 버전: 0.1 (2026-10-22)
;; 라이선스: 자유 사용·수정, 재배포 시 출처(autocats.co.kr) 표기
;; Read-only sum of closed LWPOLYLINE areas; no union or hole subtraction.
;; API reference: Autodesk AutoLISP vlax-curve-getArea.

(vl-load-com)

(defun autocats-plasum-value (ent / data result)
  (setq data (entget ent))
  (if (and (= "LWPOLYLINE" (cdr (assoc 0 data)))
           (= 1 (logand 1 (cdr (assoc 70 data)))))
    (progn
      (setq result
        (vl-catch-all-apply 'vlax-curve-getArea
          (list ent)))
      (if (and (not (vl-catch-all-error-p result)) (numberp result))
        (abs result)))))

(defun autocats-plasum-total (ss / idx value total counted skipped)
  (setq idx 0 total 0.0 counted 0 skipped 0)
  (if ss
    (repeat (sslength ss)
      (setq value (autocats-plasum-value (ssname ss idx)))
      (if value
        (setq total (+ total value) counted (1+ counted))
        (setq skipped (1+ skipped)))
      (setq idx (1+ idx))))
  (list total counted skipped))

(defun c:PLASUM (/ *error* ss result)
  (defun *error* (msg)
    (if (and msg (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*EXIT*,*취소*")))
      (princ (strcat "\n[PLASUM] 중단: " msg)))
    (princ))
  (princ "\n[PLASUM] 면적을 합산할 경량 폴리라인을 선택하세요.")
  (setq ss (ssget '((0 . "LWPOLYLINE"))))
  (if ss
    (progn
      (setq result (autocats-plasum-total ss))
      (princ (strcat "\n[PLASUM] 면적 합계: " (rtos (car result) 2 6)
        " (합산 " (itoa (cadr result)) "개 / 제외 " (itoa (caddr result))
        "개, 도면 단위의 제곱값)")))
    (princ "\n[PLASUM] 선택된 경량 폴리라인이 없습니다."))
  (princ))

(princ)
