오토캐드 리습(AutoLISP)은 AutoCAD 환경에서 반복 작업을 자동화하거나, 사용자 정의 명령을 추가하기 위한 스크립트 언어입니다. 건축·기계·설계 전문가들이 매번 마우스 클릭·명령어 입력으로 반복하던 단순 작업을 자동화함으로써 설계 속도를 크게 향상시킬 수 있습니다.
리습 설치 및 로드 방법
- 리습(.lsp) 파일을 준비한다.
- AutoCAD 실행 → 명령창에
APPLOAD
입력 → 파일 선택 → Load 클릭. - 시작 시 자동으로 로드하려면 Startup Suite에 등록하거나,
acad.lsp
/acaddoc.lsp
에(load "파일경로\\파일명.lsp")
코드를 추가합니다.
유용한 리습 모음
1. 좌표계 변환 리습 (COORDSYS)
- 기능: 월드(World) 좌표계와 사용자 좌표계(UCS)를 손쉽게 전환
- 사용 방법:
COORDSYS
입력 →W
또는U
선택 - 코드 스니펫:
(defun c:COORDSYS (/ ans) (setq ans (getkword "\n[W]orld or [U]cs? ")) (cond ((= ans "W") (command "UCS" "W")) ((= ans "U") (command "UCS" "O")) ) (princ) )
2. 치수 공차 일괄 변경 (DIMCHAMFER)
- 기능: 선택한 치수에 동일한 챔퍼(Chamfer) 설정 적용
- 사용 방법:
DIMCHAMFER
입력 → 챔퍼 거리 입력 → 객체 선택 - 코드 스니펫:
(defun c:DIMCHAMFER (/ d1 d2 ss) (setq d1 (getdist "\n첫 번째 챔퍼 거리: ") d2 (getdist "\n두 번째 챔퍼 거리: ")) (setq ss (ssget '((0 . "DIMENSION")))) (if ss (repeat (setq i (sslength ss)) (setq d (ssname ss (setq i (1- i)))) (command "DIMCHAMFER" d d1 d2) ) ) (princ) )
3. 블록 순차 삽입 (BLKINSER)
- 기능: 지정 간격, 열/행 수에 따라 블록을 배열
- 사용 방법:
BLKINSER
입력 → 블록 이름→ 행·열→ 간격 입력 - 코드 스니펫:
(defun c:BLKINSER (/ blk rows cols dx dy x y r c) (setq blk (getstring "\n블록 이름: ") rows (getint "\n행 수: ") cols (getint "\n열 수: ") dx (getdist "\nX 간격: ") dy (getdist "\nY 간격: ")) (setq y 0) (repeat rows (setq x 0) (repeat cols (command "INSERT" blk (list x y 0) "" "" 0) (setq x (+ x dx)) ) (setq y (+ y dy)) ) (princ) )
4. 레이어 일괄 변경 (LAYERCHANGE)
- 기능: 선택 객체의 레이어를 지정 레이어로 일괄 이동
- 사용 방법:
LAYERCHANGE
입력 → 대상 레이어명 → 객체 선택 - 코드 스니펫:
(defun c:LAYERCHANGE (/ lay ss i ent) (setq lay (getstring "\n이동할 레이어 이름: ") ss (ssget)) (if ss (progn (setq i 0) (repeat (sslength ss) (setq ent (ssname ss i)) (entmod (subst (cons 8 lay) (assoc 8 (entget ent)) (entget ent))) (setq i (1+ i)) ) (entupd (ssname ss 0)) ) ) (princ) )
5. 객체 면적 합계 (SUMAREA)
- 기능: 선택한 폐쇄 객체(폴리라인, 서클 등)의 면적을 합산하여 출력
- 사용 방법:
SUMAREA
입력 → 객체 선택 - 코드 스니펫:
(defun c:SUMAREA (/ ss i total ent dat) (setq ss (ssget '((0 . "LWPOLYLINE,CIRCLE,ELLIPSE")))) (setq total 0.0 i 0) (if ss (repeat (sslength ss) (setq ent (ssname ss i) dat (entget ent)) (cond ((= (cdr (assoc 0 dat)) "CIRCLE") (setq total (+ total (* pi (expt (cdr (assoc 40 dat)) 2))))) ((= (cdr (assoc 0 dat)) "LWPOLYLINE") (setq total (+ total (vlax-curve-getarea (vlax-ename->vla-object ent))))) ) (setq i (1+ i)) ) ) (princ (strcat "\n총 면적: " (rtos total 2 3))) (princ) )
6. 자동 번호 매기기 (AUTONUM)
- 기능: 선택한 문자 객체에 연속 번호를 부여
- 사용 방법:
AUTONUM
입력 → 시작 번호 입력 → 객체 선택 순서대로 번호 적용 - 코드 스니펫:
(defun c:AUTONUM (/ ss start i ent) (setq start (getint "\n시작 번호: ") ss (ssget '((0 . "TEXT,MTEXT")))) (setq i 0) (if ss (repeat (sslength ss) (setq ent (ssname ss i)) (entmod (subst (cons 1 (itoa (+ start i))) (assoc 1 (entget ent)) (entget ent))) (setq i (1+ i)) ) ) (princ) )
7. 폴리라인 → 스플라인 변환 (PL2SPL)
- 기능: 매끄러운 곡선 표현을 위해 폴리라인을 스플라인으로 일괄 전환
- 사용 방법:
PL2SPL
입력 → 폴리라인 선택 - 코드 스니펫:
(defun c:PL2SPL (/ ss i pl) (setq ss (ssget '((0 . "LWPOLYLINE")))) (setq i 0) (if ss (repeat (sslength ss) (setq pl (ssname ss i)) (command "PEDIT" pl "Y" "S" "") (setq i (1+ i)) ) ) (princ) )
8. 자동 백업 생성 (AUTOBACKUP)
- 기능: 저장할 때마다 지정 폴더에 날짜·시간 기반 백업 파일(.bak) 자동 복사
- 사용 방법:
acad.lsp
등에 아래 코드 추가 - 코드 스니펫 (
acaddoc.lsp
등)(vl-load-com) (defun s::SAVESELECTION () (let* ((doc (vla-get-ActiveDocument (vlax-get-acad-object))) (fpath (vl-filename-directory (vla-get-FullName doc))) (fname (vl-filename-base (vla-get-FullName doc))) (bakdir (strcat fpath "\\Backup")) (bkname (strcat bakdir "\\" fname "_" (rtos (getvar "DATE") 2 6) ".bak"))) (if (not (vl-file-directory-p bakdir)) (vl-mkdir bakdir)) (vl-file-copy (vla-get-FullName doc) bkname) ) (prin1) )
소개한 리습들은 오토캐드 작업 시간을 획기적으로 줄여주고, 실수를 예방하는 데 도움을 줍니다. 각 리습을 자신의 업무 프로세스에 맞게 수정·응용해 보세요.