오토캐드(AutoCAD) 문자복사 리습(LISP) 직접 만들기 — 코드 작성부터 등록까지




AutoCAD · AutoLISP · 문자 복사

도면 작업 중 같은 문자를 여러 곳에 반복 입력해야 하는 상황이 자주 있습니다. MA(속성 일치)로 서식을 맞출 수는 있지만, 문자 “내용” 자체를 다른 텍스트에 덮어쓰는 기능은 캐드 기본 명령에 없습니다.

“원본 텍스트 클릭, 대상 텍스트 클릭 — 그게 전부입니다. AutoLISP으로 만드는 문자 복사 리습(MM) 코드 작성부터 등록까지 한 번에 정리합니다.”

이번 글에서는 리습이 처음인 분도 따라 할 수 있도록, 완성 코드 복사 → 저장 → 캐드 로드 → 실행의 전 과정을 단계별로 정리합니다.


1. AutoLISP(리습)이란?

AutoLISP은 AutoCAD 전용 프로그래밍 언어입니다. 캐드 안에서 반복 작업을 자동화하거나, 기본 명령에 없는 기능을 직접 만들어 쓸 수 있게 해 줍니다.

  • 파일 확장자는 .lsp이며, 일반 메모장으로도 작성할 수 있습니다.
  • 별도 설치가 필요 없고, AutoCAD (Full) 버전에 기본 내장되어 있습니다.
  • 한 줄짜리 간단한 매크로부터 수백 줄짜리 자동화 프로그램까지 만들 수 있습니다.
⚠️ AutoCAD LT에서는 리습을 사용할 수 없습니다

LT 버전은 가격이 저렴한 대신 커스터마이징 기능이 제한되어 있어, AutoLISP과 VBA가 빠져 있습니다. Full 버전(또는 AutoCAD 구독)에서만 사용 가능합니다.

💡 리습을 몰라도 괜찮습니다

이번 글에서는 프로그래밍 지식 없이도 따라 할 수 있도록, 완성된 코드를 그대로 복사-붙여넣기하여 사용하는 방법을 안내합니다. 코드의 원리가 궁금한 분을 위해 각 줄의 의미도 함께 설명합니다.


2. 문자복사 리습 코드 — 완성본 (MM 명령)

아래 코드를 메모장에 복사한 뒤, MM.lsp라는 이름으로 저장하면 됩니다. 이 리습은 VLA(ActiveX) 방식을 사용하여 TEXT와 MTEXT를 모두 안정적으로 처리하며, 텍스트가 아닌 객체를 잘못 선택해도 오류 없이 안내 메시지를 출력합니다.

;;; ============================================
;;; MM (MatchText) — 문자 내용 복사 리습
;;; TEXT / MTEXT 모두 지원
;;; ============================================

(DEFUN C:MM (/ source_ent source_obj source_text target_ent target_obj old_cmdecho)

  ;; ① 명령 에코 저장 및 끄기
  (setq old_cmdecho (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)

  (princ "\n텍스트 내용 복사 (MatchText)")

  ;; ② 원본 텍스트 선택
  (setq source_ent (entsel "\n내용을 복사할 원본 텍스트 선택: "))

  (if source_ent
    (progn
      (setq source_obj (vlax-ename->vla-object (car source_ent)))

      ;; ③ TEXT 또는 MTEXT인지 타입 체크
      (if
        (or (= (vla-get-ObjectName source_obj) "AcDbText")
            (= (vla-get-ObjectName source_obj) "AcDbMText")
        )
        (progn
          ;; ④ 원본 텍스트 내용 가져오기
          (setq source_text (vla-get-TextString source_obj))
          (princ (strcat "\n복사할 내용: \"" source_text "\""))
          (princ "\n대상 텍스트 선택 (Enter로 종료): ")

          ;; ⑤ 대상 텍스트를 반복 선택하며 내용 덮어쓰기
          (while (setq target_ent (entsel))
            (setq target_obj (vlax-ename->vla-object (car target_ent)))

            ;; 대상도 TEXT 또는 MTEXT인지 확인
            (if
              (or (= (vla-get-ObjectName target_obj) "AcDbText")
                  (= (vla-get-ObjectName target_obj) "AcDbMText")
              )
              (progn
                ;; 내용 복사
                (vla-put-TextString target_obj source_text)
                (princ "\n내용이 복사되었습니다. 계속 선택하거나 Enter로 종료: ")
              )
              (princ "\n선택한 객체가 텍스트가 아닙니다. 다시 선택: ")
            )
          )
          (princ "\n텍스트 내용 복사 완료!")
        )
        (princ "\n선택한 객체가 텍스트(TEXT 또는 MTEXT)가 아닙니다!")
      )
    )
    (princ "\n선택이 취소되었습니다.")
  )

  ;; ⑥ 명령 에코 복원
  (setvar "CMDECHO" old_cmdecho)
  (princ)
)

(princ "\n명령어: MM - 텍스트 내용 복사 (TEXT/MTEXT 지원)")
(princ)

3. 코드 한 줄씩 뜯어보기

위 코드가 실제로 어떤 원리로 동작하는지, 핵심 부분만 간단히 설명합니다.

코드 의미
DEFUN C:MM 캐드 명령창에 MM을 입력하면 실행되는 함수를 정의합니다. C:가 붙으면 캐드 명령어로 등록됩니다.
setvar “CMDECHO” 0 명령 에코를 끕니다. 리습 실행 중 명령창에 불필요한 메시지가 뜨는 것을 방지하며, 종료 시 원래 값으로 복원합니다.
entsel 사용자에게 화면에서 객체 하나를 클릭하도록 요청합니다. 선택된 객체의 엔티티 이름과 클릭 좌표를 반환합니다.
vlax-ename->vla-object 엔티티 이름을 VLA 객체(ActiveX 객체)로 변환합니다. 이렇게 하면 vla-get-, vla-put- 함수로 속성에 접근할 수 있습니다.
vla-get-ObjectName 객체의 타입 이름을 가져옵니다. “AcDbText”(단일행) 또는 “AcDbMText”(다중행)인지 확인하여 텍스트가 아닌 객체를 걸러냅니다.
vla-get-TextString 텍스트 객체에서 문자열 내용을 가져옵니다.
vla-put-TextString 대상 텍스트 객체의 내용을 새 문자열로 교체합니다.
while 대상 선택을 반복합니다. Enter를 누르면 nil이 반환되어 루프가 종료됩니다.
💡 entget 방식 vs VLA 방식 — 뭐가 다를까?

① entget/entmod (클래식 방식): DXF 코드 번호(1, 7, 40 등)를 통해 속성에 직접 접근합니다. 코드가 간결하지만, MTEXT의 복잡한 서식 코드를 다룰 때 문제가 생길 수 있습니다.

② VLA (ActiveX 방식): vla-get- / vla-put- 함수로 속성에 접근합니다. 코드가 좀 더 길어지지만, TEXT와 MTEXT를 동일한 방식으로 안정적으로 처리할 수 있고, 객체 타입 체크도 깔끔하게 할 수 있습니다. 이 글에서는 실무에서 검증된 VLA 방식을 사용합니다.


4. 리습 파일 저장하기

  1. 메모장(또는 VS Code 등 텍스트 에디터)을 열고, 위의 완성 코드를 붙여넣습니다.
  2. 파일 → 다른 이름으로 저장을 클릭합니다.
  3. 파일 형식을 “모든 파일 (*.*)”로 변경합니다.
  4. 파일 이름을 MM.lsp로 입력하고 저장합니다.
  5. 저장 위치는 기억하기 쉬운 곳(예: D:\CAD_리습 같은 전용 폴더)에 두는 것을 추천합니다.
⚠️ 인코딩 주의

메모장으로 저장할 때 인코딩을 UTF-8 또는 ANSI로 저장하세요. UTF-8 with BOM으로 저장하면 캐드에서 로드 시 오류가 발생할 수 있습니다. 안전하게 하려면 ANSI를 선택하는 것이 가장 무난합니다.


5. 캐드에서 리습 로드하기 (APPLOAD)

저장한 .lsp 파일을 캐드에 불러오는 방법입니다.

5-1. 일회성 로드 (현재 세션에서만 사용)

  1. 명령창에 APPLOAD (또는 단축키 AP) → 엔터
  2. “응용프로그램 로드/언로드” 대화상자에서 저장한 MM.lsp 파일을 찾아 선택
  3. “로드(L)” 버튼 클릭
  4. 하단 메시지에 “MM.lsp이(가) 로드되었습니다.”가 표시되면 성공

이 방법은 AutoCAD를 종료하면 리습이 해제되므로, 다음에 다시 로드해야 합니다.

5-2. 시작 프로그램 등록 (자동 로드)

매번 APPLOAD하기 번거롭다면, 시작하기 세트(Startup Suite)에 등록하면 캐드를 열 때마다 자동으로 로드됩니다.

  1. APPLOAD → 엔터
  2. 대화상자 오른쪽 하단의 “목차(Contents)” 버튼 클릭
  3. “시작하기 세트” 창에서 “추가(Add)” 클릭
  4. MM.lsp 파일을 선택하고 열기
  5. “닫기” → “닫기”로 대화상자를 닫으면 등록 완료

이후 AutoCAD를 실행할 때마다 MM 명령을 바로 사용할 수 있습니다.

💡 리습 파일 경로가 바뀌면 다시 등록해야 합니다

시작하기 세트에 등록한 .lsp 파일의 저장 위치(폴더)를 옮기면 로드에 실패합니다. 리습 파일은 한 곳에 모아두고 옮기지 않는 것이 좋습니다.


6. MM 명령 사용법

리습이 로드된 상태에서 명령창에 MM → 엔터를 입력하면 실행됩니다.

  1. MM → 엔터
  2. “내용을 복사할 원본 텍스트 선택” → 원본 텍스트 클릭
  3. 명령창에 복사할 내용이 표시됨 (예: 복사할 내용: “M6”)
  4. “대상 텍스트 선택” → 바꾸고 싶은 텍스트를 하나씩 클릭
  5. 필요한 만큼 반복 클릭한 뒤, Enter를 누르면 종료

예를 들어, 도면 표제란의 “작성자”, “검토자”, “승인자” 칸에 각각 다른 이름이 적혀 있는데 이것을 모두 “홍길동”으로 한 번에 통일하고 싶다면 — MM으로 원본(“홍길동”)을 선택한 뒤, 나머지 텍스트들을 하나씩 클릭하면 됩니다.

💡 같은 문자를 일괄 변경할 때는 FIND가 더 빠릅니다

“M5″를 모두 “M6″으로 바꾸는 것처럼 똑같은 문자를 다른 문자로 대체하는 작업이라면, 캐드 기본 명령인 FIND(찾기 및 바꾸기)를 사용하는 것이 훨씬 빠릅니다. MM 리습은 각기 다른 내용의 텍스트들을 하나의 원본 내용으로 통일할 때 진가를 발휘합니다.

💡 텍스트가 아닌 객체를 잘못 클릭해도 괜찮습니다

이 리습은 선택한 객체가 TEXT 또는 MTEXT인지 자동으로 체크합니다. 선(LINE)이나 치수(DIMENSION) 등을 잘못 클릭하면 “선택한 객체가 텍스트가 아닙니다”라는 안내 메시지가 뜨고, 오류 없이 다시 선택할 수 있습니다.


7. MM 리습의 핵심 설계 포인트

단순해 보이지만, 실무에서 안정적으로 쓸 수 있도록 몇 가지 중요한 설계가 들어가 있습니다.

설계 포인트 왜 필요한가
객체 타입 체크 텍스트가 아닌 객체(선, 치수, 블록 등)를 클릭해도 에러가 나지 않고 안내 메시지를 줍니다.
TEXT + MTEXT 동시 지원 단일행(DT) 문자와 다중행(MT) 문자 모두 처리합니다. 원본이 TEXT이고 대상이 MTEXT여도 문제없이 내용이 복사됩니다.
CMDECHO 저장/복원 리습 실행 중 명령창에 불필요한 메시지가 뜨는 것을 막고, 종료 시 원래 설정으로 돌려놓습니다.
복사 내용 미리보기 원본을 선택하면 복사할 내용을 명령창에 표시해 줍니다. 엉뚱한 텍스트를 골랐는지 바로 확인할 수 있습니다.
반복 선택 (while 루프) 대상 텍스트를 계속 클릭하며 내용을 바꿀 수 있습니다. Enter를 누르면 종료됩니다.

8. MM vs MA — 어떤 상황에 뭘 쓸까?

구분 MM (리습) MA (캐드 기본 명령)
복사 대상 텍스트 내용(문자열) 텍스트 서식 (높이, 스타일, 색상 등)
내용 변경 ✅ 원본 내용으로 덮어씀 ❌ 내용은 그대로 유지
서식 변경 ❌ 서식은 그대로 유지 ✅ 원본 서식으로 변경
활용 예시 각기 다른 텍스트(“김철수”, “이영희”…)를 모두 “홍길동”으로 통일 여러 텍스트의 글꼴·높이를 한 번에 통일

내용을 바꾸려면 MM, 서식을 바꾸려면 MA를 쓰면 됩니다. 두 명령을 조합하면(MM → MA 순서) 내용과 서식을 모두 맞출 수 있습니다.


9. 트러블슈팅 — 자주 만나는 오류

9-1. “알 수 없는 명령” 오류

  • 리습이 로드되지 않은 상태입니다. APPLOAD로 다시 로드하세요.
  • 또는 .lsp 파일 안에 오타(괄호 짝이 안 맞는 등)가 있는지 확인합니다.

9-2. “ActiveX/VLA 관련 오류”가 뜨는 경우

  • 이 리습은 VLA(ActiveX) 함수를 사용하므로, 먼저 (vl-load-com)이 실행되어야 합니다.
  • 보통 AutoCAD가 자동으로 로드하지만, 오류가 뜬다면 캐드 명령창에 (vl-load-com)을 입력한 뒤 다시 시도하세요.
  • 매번 입력하기 번거롭다면, MM.lsp 파일 맨 위에 (vl-load-com)을 한 줄 추가해 두면 됩니다.

9-3. “괄호 쌍이 맞지 않습니다” 오류

  • 리습 코드에서 여는 괄호 (와 닫는 괄호 )의 수가 일치하지 않는 경우입니다.
  • 메모장보다는 VS Code 같은 에디터에서 괄호 짝 맞춤(bracket matching) 기능을 활용하면 쉽게 찾을 수 있습니다.

9-4. 블록 안의 텍스트가 안 바뀌는 경우

  • 블록(INSERT) 안에 있는 텍스트는 일반 TEXT/MTEXT가 아니라 속성(ATTRIB)입니다.
  • 속성을 바꾸려면 블록 편집기(BEDIT)에서 직접 수정하거나, 속성 전용 리습을 따로 만들어야 합니다.
💡 VLIDE — 캐드 내장 리습 에디터

명령창에 VLIDE를 입력하면 캐드에 내장된 리습 전용 에디터가 열립니다. 괄호 짝 자동 확인, 구문 색상 표시, 즉시 실행 및 디버깅이 가능합니다. 리습에 익숙해지면 메모장 대신 VLIDE를 사용하는 것이 훨씬 편합니다.


명령어 한눈에 보기

명령어 단축키 기능
APPLOAD AP 리습 파일 로드 / 시작 프로그램 등록
VLIDE 캐드 내장 리습 에디터(Visual LISP IDE) 실행
MATCHPROP MA 객체 서식(속성) 일치 — 기본 명령
FIND 도면 내 문자 찾기 및 바꾸기
MM (리습) MM 텍스트 내용 복사 (이번 글에서 만든 리습)

마치며

리습(AutoLISP)은 처음 접하면 괄호 투성이 코드가 어려워 보이지만, 원리는 단순합니다 — 객체를 선택하고, 속성을 꺼내고, 바꾸고, 다시 넣는 것이 전부입니다. 오늘 만든 MM 리습 하나만으로도 반복적인 문자 수정 작업이 획기적으로 줄어듭니다.

  • 내용 복사는 MM, 서식 복사는 MA — 두 명령을 조합하면 텍스트 통일 작업이 훨씬 빠릅니다.
  • 리습 파일은 전용 폴더에 모아두고, 시작하기 세트에 등록해 캐드를 켤 때마다 자동 로드되게 설정하세요.
  • 한 번 만들어 두면 어떤 도면에서든 재사용할 수 있습니다. MM 리습을 시작으로, 다음에는 나만의 실무 자동화 리습을 만들어 보는 것은 어떨까요?

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤