;;; ------------------------------------------------------------
;;; AutoCATS ¸®½À ÀÚ·á½Ç
;; ¸í·É: DPREC
;; ±â´É: ¼±ÅÃ Ä¡¼öÀÇ ±âº» ´ÜÀ§ Ç¥½Ã ¼Ò¼ö ÀÚ¸® ÀÏ°ý º¯°æ
;; ÃâÃ³: https://www.autocats.co.kr/lisp/dimension-precision
;; ¹öÀü: 1.0 (2026-07-27)
;; ¶óÀÌ¼±½º: ÀÚÀ¯ »ç¿ë¡¤¼öÁ¤, Àç¹èÆ÷ ½Ã ÃâÃ³(autocats.co.kr) Ç¥±â
;; ¾ÈÀü: *error* ÇÚµé·¯ + UNDO ±×·ì, Áö¿øÇÏÁö ¾Ê´Â Ä¡¼ö °Ç³Ê¶Ü
;;; ------------------------------------------------------------

(vl-load-com)

(defun autocats-dprec-locked-p (ent / row)
  (setq row (tblsearch "LAYER" (cdr (assoc 8 (entget ent)))))
  (and row (= 4 (logand 4 (cdr (assoc 70 row))))))

(defun autocats-dprec-apply (ent precision / old-value result)
  (setq old-value (getvar "DIMDEC")
        result
        (vl-catch-all-apply
          '(lambda ()
             (setvar "DIMDEC" precision)
             (command "_.DIMOVERRIDE" "DIMDEC" precision "" ent "")
             T)))
  (setvar "DIMDEC" old-value)
  (if (vl-catch-all-error-p result) nil result))

(defun autocats-dprec-value (ent / xdata items result)
  (setq xdata (assoc -3 (entget ent '("ACAD")))
        items (if xdata (cdr (car (cdr xdata))) nil)
        result nil)
  (while (and items (null result))
    (if (and (= (caar items) 1070)
             (= (cdar items) 271)
             (cadr items)
             (= (caadr items) 1070))
      (setq result (cdadr items))
      (setq items (cdr items))))
  result)

(defun c:DPREC (/ *error* doc undo-open precision ss idx ent changed skipped)
  (defun *error* (msg)
    (if undo-open
      (progn (vla-EndUndoMark doc) (setq undo-open nil)))
    (if (and msg (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*EXIT*,*Ãë¼Ò*")))
      (princ (strcat "\n[DPREC] Áß´Ü: " msg)))
    (princ))

  (initget 4)
  (setq precision (getint "\n[DPREC] Ç¥½Ã ¼Ò¼ö ÀÚ¸® 0~8 <2>: "))
  (if (null precision) (setq precision 2))
  (if (> precision 8)
    (princ "\n[DPREC] ¼Ò¼ö ÀÚ¸®´Â 0ºÎÅÍ 8±îÁö ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù.")
    (progn
      (princ "\n[DPREC] Á¤¹Ðµµ¸¦ º¯°æÇÒ Ä¡¼ö¸¦ ¼±ÅÃÇÏ¼¼¿ä.")
      (setq ss (ssget '((0 . "DIMENSION"))))
      (if ss
        (progn
          (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))
                idx 0 changed 0 skipped 0)
          (vla-StartUndoMark doc)
          (setq undo-open T)
          (while (< idx (sslength ss))
            (setq ent (ssname ss idx))
            (if (or (autocats-dprec-locked-p ent)
                    (not (autocats-dprec-apply ent precision)))
              (setq skipped (1+ skipped))
              (setq changed (1+ changed)))
            (setq idx (1+ idx)))
          (vla-EndUndoMark doc)
          (setq undo-open nil)
          (princ (strcat "\n[DPREC] ¿Ï·á: " (itoa changed)
                         "°³ º¯°æ / " (itoa skipped) "°³ °Ç³Ê¶Ü")))
        (princ "\n[DPREC] ¼±ÅÃµÈ Ä¡¼ö°¡ ¾ø½À´Ï´Ù."))))
  (princ))

(princ "\n[AutoCATS] DPREC ·Îµå ¿Ï·á - ¸í·ÉÇà¿¡ DPREC ¸¦ ÀÔ·ÂÇÏ¼¼¿ä.")
(princ)
