;;; ------------------------------------------------------------
;;; AutoCATS ¸®½À ÀÚ·á½Ç
;; ¸í·É: BSCALE
;; ±â´É: ¼±ÅÃÇÑ ÀÏ¹Ý ºí·Ï ÂüÁ¶ÀÇ X, Y, Z ÃàÃ´ ÀÏ°ý º¯°æ
;; ÃâÃ³: https://www.autocats.co.kr/lisp/block-scale
;; ¹öÀü: 1.0 (2026-07-27)
;; ¶óÀÌ¼±½º: ÀÚÀ¯ »ç¿ë¡¤¼öÁ¤, Àç¹èÆ÷ ½Ã ÃâÃ³(autocats.co.kr) Ç¥±â
;; ¾ÈÀü: *error* ÇÚµé·¯ + UNDO ±×·ì, Xref ¹× Àá±ä ·¹ÀÌ¾î °Ç³Ê¶Ü
;;; ------------------------------------------------------------

(vl-load-com)

(defun autocats-bscale-locked-p (ent / row)
  (setq row (tblsearch "LAYER" (cdr (assoc 8 (entget ent)))))
  (and row (= 4 (logand 4 (cdr (assoc 70 row))))))

(defun autocats-bscale-xref-p (ent / name row flags)
  (setq name (cdr (assoc 2 (entget ent)))
        row (tblsearch "BLOCK" name)
        flags (if row (cdr (assoc 70 row)) 0))
  (/= 0 (logand flags 12)))

(defun autocats-bscale-replace (code value data)
  (if (assoc code data)
    (subst (cons code value) (assoc code data) data)
    (append data (list (cons code value)))))

(defun autocats-bscale-apply (ent x y z / data updated)
  (setq data (entget ent)
        data (autocats-bscale-replace 41 x data)
        data (autocats-bscale-replace 42 y data)
        data (autocats-bscale-replace 43 z data)
        updated (entmod data))
  (if updated (progn (entupd ent) T) nil))

(defun c:BSCALE (/ *error* doc undo-open x y z 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[BSCALE] Áß´Ü: " msg)))
    (princ))

  (initget 2)
  (setq x (getreal "\n[BSCALE] X ÃàÃ´ <1>: "))
  (if (null x) (setq x 1.0))
  (initget 2)
  (setq y (getreal (strcat "\n[BSCALE] Y ÃàÃ´ <" (rtos x 2 4) ">: ")))
  (if (null y) (setq y x))
  (initget 2)
  (setq z (getreal (strcat "\n[BSCALE] Z ÃàÃ´ <" (rtos x 2 4) ">: ")))
  (if (null z) (setq z x))
  (princ "\n[BSCALE] ÃàÃ´À» º¯°æÇÒ ºí·ÏÀ» ¼±ÅÃÇÏ¼¼¿ä.")
  (setq ss (ssget '((0 . "INSERT"))))
  (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-bscale-locked-p ent)
                (autocats-bscale-xref-p ent)
                (not (autocats-bscale-apply ent x y z)))
          (setq skipped (1+ skipped))
          (setq changed (1+ changed)))
        (setq idx (1+ idx)))
      (vla-EndUndoMark doc)
      (setq undo-open nil)
      (princ (strcat "\n[BSCALE] ¿Ï·á: " (itoa changed)
                     "°³ º¯°æ / " (itoa skipped) "°³ °Ç³Ê¶Ü")))
    (princ "\n[BSCALE] ¼±ÅÃµÈ ºí·ÏÀÌ ¾ø½À´Ï´Ù."))
  (princ))

(princ "\n[AutoCATS] BSCALE ·Îµå ¿Ï·á - ¸í·ÉÇà¿¡ BSCALE ¸¦ ÀÔ·ÂÇÏ¼¼¿ä.")
(princ)
