;;; ------------------------------------------------------------
;;; AutoCATS ¸®½À ÀÚ·á½Ç
;; ¸í·É: OBJCOUNT
;; ±â´É: ¼±ÅÃÇÑ °´Ã¼¸¦ CAD °´Ã¼ À¯Çüº°·Î Áý°è
;; ÃâÃ³: https://www.autocats.co.kr/lisp/object-count
;; ¹öÀü: 1.0 (2026-07-27)
;; ¶óÀÌ¼±½º: ÀÚÀ¯ »ç¿ë¡¤¼öÁ¤, Àç¹èÆ÷ ½Ã ÃâÃ³(autocats.co.kr) Ç¥±â
;; ¾ÈÀü: *error* ÇÚµé·¯, Á¶È¸ Àü¿ëÀ¸·Î µµ¸é °´Ã¼¸¦ º¯°æÇÏÁö ¾ÊÀ½
;;; ------------------------------------------------------------

(defun autocats-objcount-add (name rows / found)
  (if (setq found (assoc name rows))
    (subst (cons name (1+ (cdr found))) found rows)
    (cons (cons name 1) rows)))

(defun autocats-objcount-data (ss / idx ent rows)
  (setq idx 0 rows nil)
  (while (< idx (sslength ss))
    (setq ent (ssname ss idx)
          rows (autocats-objcount-add (cdr (assoc 0 (entget ent))) rows)
          idx (1+ idx)))
  (vl-sort rows '(lambda (left right) (< (car left) (car right)))))

(defun c:OBJCOUNT (/ *error* ss rows)
  (defun *error* (msg)
    (if (and msg (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*EXIT*,*Ãë¼Ò*")))
      (princ (strcat "\n[OBJCOUNT] Áß´Ü: " msg)))
    (princ))

  (princ "\n[OBJCOUNT] Áý°èÇÒ °´Ã¼¸¦ ¼±ÅÃÇÏ¼¼¿ä.")
  (setq ss (ssget))
  (if ss
    (progn
      (setq rows (autocats-objcount-data ss))
      (princ "\n[OBJCOUNT] °´Ã¼ À¯Çüº° °³¼ö")
      (foreach row rows
        (princ (strcat "\n  " (car row) ": " (itoa (cdr row)))))
      (princ (strcat "\n  TOTAL: " (itoa (sslength ss)))))
    (princ "\n[OBJCOUNT] ¼±ÅÃµÈ °´Ã¼°¡ ¾ø½À´Ï´Ù."))
  (princ))

(princ "\n[AutoCATS] OBJCOUNT ·Îµå ¿Ï·á - ¸í·ÉÇà¿¡ OBJCOUNT ¸¦ ÀÔ·ÂÇÏ¼¼¿ä.")
(princ)
