숫자 문자 사칙연산 리습 (TCALC)

도면에 적힌 숫자 문자 여러 개에 같은 사칙연산을 적용합니다. 쉼표와 공백이 있는 숫자를 읽고 숫자가 아닌 문자는 건너뜁니다.

코드 전문 공개 · 다운로드 파일과 100% 동일 · 출처 표기 후 자유 사용

도면 숫자를 엑셀 없이 바로 계산

표고 보정, 수량 환산, 단위 변경처럼 여러 숫자에 같은 값을 더하거나 곱해야 할 때 사용합니다.

숫자만 안전하게 처리

  • 1,234.5처럼 쉼표와 공백이 포함된 숫자를 인식합니다.
  • P-001처럼 숫자 외 문자가 섞인 내용은 변경하지 않습니다.
  • 0 나누기를 차단하고 소수 자릿수는 현재 DIMDEC를 기본으로 사용합니다.
HOW TO USE

사용 순서

리습 로드가 처음이라면
  1. 1

    APPLOAD로 text-calculate.lsp를 로드합니다.

  2. 2

    TCALC를 입력하고 연산 종류를 선택합니다.

  3. 3

    연산값과 소수 자릿수를 입력합니다.

  4. 4

    숫자 문자를 선택하고 결과를 확인합니다.

SOURCE

코드 전문

명령 TCALC

다운로드 파일은 아래 코드와 100% 동일합니다. 붙여넣기보다 파일 다운로드 후 APPLOAD 로드를 권장합니다.

.lsp 다운로드
;;; ------------------------------------------------------------
;;; AutoCATS 리습 자료실
;; 명령: TCALC
;; 기능: 숫자로만 구성된 TEXT/MTEXT/ATTRIB에 사칙연산 일괄 적용
;; 출처: https://www.autocats.co.kr/lisp/text-calculate
;; 버전: 1.0 (2026-07-23)
;; 라이선스: 자유 사용·수정, 재배포 시 출처(autocats.co.kr) 표기
;; 안전: *error* 핸들러 + UNDO 그룹, 0 나누기 차단, 잠긴 레이어 건너뜀
;;; ------------------------------------------------------------

(vl-load-com)

(defun autocats-tcalc-clean (value / result idx char)
  (setq result "" idx 1)
  (while (<= idx (strlen value))
    (setq char (substr value idx 1))
    (if (not (member char '("," " ")))
      (setq result (strcat result char)))
    (setq idx (1+ idx)))
  result)

(defun autocats-tcalc-number (value / clean idx char valid dots signs)
  (setq clean (autocats-tcalc-clean value)
        idx 1 valid (/= clean "") dots 0 signs 0)
  (while (and valid (<= idx (strlen clean)))
    (setq char (substr clean idx 1))
    (cond
      ((wcmatch char "#"))
      ((= char ".") (setq dots (1+ dots)) (if (> dots 1) (setq valid nil)))
      ((member char '("+" "-"))
       (setq signs (1+ signs))
       (if (or (> signs 1) (/= idx 1)) (setq valid nil)))
      (T (setq valid nil)))
    (setq idx (1+ idx)))
  (if (and valid (not (member clean '("+" "-" "." "+." "-."))))
    (distof clean 2)
    nil))

(defun autocats-tcalc-calculate (value operation operand)
  (cond
    ((= operation "Add") (+ value operand))
    ((= operation "Subtract") (- value operand))
    ((= operation "Multiply") (* value operand))
    ((and (= operation "Divide") (/= operand 0.0)) (/ value operand))
    (T nil)))

(defun autocats-tcalc-locked-p (ent / data row)
  (setq data (entget ent)
        row (tblsearch "LAYER" (cdr (assoc 8 data))))
  (and row (= 4 (logand 4 (cdr (assoc 70 row))))))

(defun autocats-tcalc-apply (ent operation operand precision / data target old number result updated)
  (setq data (entget ent)
        target (assoc 1 data)
        old (if target (cdr target) "")
        number (autocats-tcalc-number old))
  (if number
    (progn
      (setq result (autocats-tcalc-calculate number operation operand))
      (if result
        (progn
          (setq updated
                (entmod
                  (subst (cons 1 (rtos result 2 precision)) target data)))
          (if updated (progn (entupd ent) T) nil))
        nil))
    nil))

(defun c:TCALC (/ *error* doc undo-open operation operand precision ss idx ent changed skipped apply-result)
  (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[TCALC] 중단: " msg)))
    (princ))

  (initget "Add Subtract Multiply Divide")
  (setq operation
        (getkword
          "\n[TCALC] 연산 선택 [더하기(Add)/빼기(Subtract)/곱하기(Multiply)/나누기(Divide)] <Add>: "))
  (if (null operation) (setq operation "Add"))
  (setq operand (getreal "\n연산할 숫자: "))
  (if (null operand)
    (princ "\n[TCALC] 연산할 숫자를 입력하지 않아 종료합니다.")
    (if (and (= operation "Divide") (= operand 0.0))
      (princ "\n[TCALC] 0으로 나눌 수 없습니다.")
    (progn
      (setq precision (getint (strcat "\n소수 자릿수 <" (itoa (getvar "DIMDEC")) ">: ")))
      (if (or (null precision) (< precision 0) (> precision 8))
        (setq precision (getvar "DIMDEC")))
      (princ "\n[TCALC] 숫자 문자를 선택하세요.")
      (setq ss (ssget '((0 . "TEXT,MTEXT,ATTRIB"))))
      (if ss
        (progn
          (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))
                changed 0 skipped 0 idx 0)
          (vla-StartUndoMark doc)
          (setq undo-open T)
          (while (< idx (sslength ss))
            (setq ent (ssname ss idx))
            (if (autocats-tcalc-locked-p ent)
              (setq skipped (1+ skipped))
              (progn
                (setq apply-result
                      (vl-catch-all-apply
                        'autocats-tcalc-apply
                        (list ent operation operand precision)))
                (if (or (vl-catch-all-error-p apply-result) (null apply-result))
                  (setq skipped (1+ skipped))
                  (setq changed (1+ changed)))))
            (setq idx (1+ idx)))
          (vla-EndUndoMark doc)
          (setq undo-open nil)
          (princ (strcat "\n[TCALC] 완료: " (itoa changed)
                         "개 수정 / " (itoa skipped) "개 건너뜀")))
        (princ "\n[TCALC] 선택된 문자가 없습니다.")))))
  (princ))

(princ "\n[AutoCATS] TCALC 로드 완료 - 명령행에 TCALC 를 입력하세요.")
(princ)
COMPATIBILITY

호환 CAD

AutoCAD 2021AutoCAD 2026

위 환경에서 확인했습니다. 목록에 없는 CAD는 샘플 도면에서 먼저 결과를 대조한 뒤, CAD 종류·버전과 함께 네이버 카페에 알려주세요.

ONE-CLICK ALTERNATIVE

이 기능, CATS Pro에는 버튼으로 있습니다

TAD / CATS_TADCATS Pro의 문자 편집 도구에서 같은 계산 작업을 더 빠르게 실행합니다.

CATS Pro는 계속 무료입니다. 리습 로드 없이 버튼 클릭으로 같은 작업을 처리할 수 있습니다.

WORKS WELL WITH

함께 쓰면 좋은 CATS 명령

전체 명령 보기
TAD / CATS_TAD선택 문자 숫자에 사칙연산을 적용합니다. NAD / CATS_NAD선택 문자 숫자에 지정 값을 더합니다.
FAQ

자주 묻는 질문

P-100 같은 문자는 계산되나요?

아닙니다. 의도하지 않은 번호 변경을 막기 위해 내용 전체가 숫자인 문자만 계산합니다.

계산 결과의 소수 자릿수는 어떻게 정하나요?

명령에서 0~8 자릿수를 지정하며 Enter를 누르면 현재 도면의 DIMDEC 값을 사용합니다.

WORKFLOW PRODUCTS

업무 분야에 맞는 전용 자동화도 확인해 보세요.

공통 CAD 작업은 CATS Pro로, 분야별 도면과 산출 업무는 전용 제품으로 이어갈 수 있습니다.

FREE LISP + FREE ADD-IN

리습과 CATS Pro를 함께 쓰세요.

리습은 가볍게, 반복 작업은 CATS Pro 버튼으로. 둘 다 무료입니다.