;;; AutoCATS 리습 자료실
;; 명령: DSUM
;; 기능: 선형·정렬 치수의 원시 측정값을 합산하고 개수·평균을 출력합니다.
;; 출처: https://www.autocats.co.kr/lisp/dimension-sum
;; 버전: 1.0 (2026-10-23)
;; 라이선스: 자유 사용·수정, 재배포 시 출처(autocats.co.kr) 표기
;; 안전: 잠긴 레이어·외부참조 보호, 변경은 UNDO 그룹, 명령별 범위는 상세 가이드 참고

(vl-load-com)

(defun autocats-dsum-get (ent property)
  (cdr (assoc 42 (entget ent))))

(defun autocats-dsum-data (ss / index ent value total count)
  (setq index 0 total 0.0 count 0)
  (repeat (sslength ss)
    (setq ent (ssname ss index))
    (if (and (= "DIMENSION" (cdr (assoc 0 (entget ent))))
        (member (logand 7 (cdr (assoc 70 (entget ent)))) '(0 1))
        (setq value (autocats-dsum-get ent 'Measurement)))
      (setq total (+ total value) count (1+ count)))
    (setq index (1+ index)))
  (list count total (if (> count 0) (/ total count) 0.0)))

(defun c:DSUM (/ *error* undo-open result 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[DSUM] 중단: " msg)))
    (princ))

  (setq selection (ssget '((0 . "DIMENSION"))))
  (if selection (progn
      (setq result (autocats-dsum-data selection))
      (princ (strcat "\n개수: " (itoa (car result)) " / 원시 합계: " (rtos (cadr result) 2 4) " / 평균: " (rtos (caddr result) 2 4)))))

  (princ))

(princ "\n[AutoCATS] DSUM 로드 완료")
(princ)
