[태그:] 워크플로우자동화

  • 도면 열면 리습이 알아서 — acaddoc.lsp 과 LOADER.lsp으로 ZWCAD 상시 자동 로드

    리습을 다 만들고 나면, 그때부터가 또 일이었다.

    APPLOAD를 열고, 폴더를 뒤져서, 쓰던 리습들을 하나씩 골라 로드한다. ZWCAD를 새로 켤 때마다. 도면을 새로 열 때마다. 손에 익은 명령어 몇 개를 쓰려고 매번 같은 준비 동작을 반복했다. 정작 그리기를 시작하기도 전에. 만들어 둔 도구가 있는데도, 그 도구를 불러오는 일이 매일의 군더더기가 됐다.

    어떤 문제였나

    APPLOAD의 시작 그룹(StartUp Suite)에 등록해두는 방법도 있긴 하다. 그런데 PC를 바꾸거나, ZWCAD를 다시 깔거나, 리습 폴더 구조를 손대면 그 등록이 풀리거나 어긋났다. 그럴 때마다 어디에 뭘 등록했는지 기억을 더듬어야 했다.

    게다가 리습이 한두 개가 아니었다. 출력용, 도곽용, 정리용… 만들다 보니 리습의 수는 늘어났다. 그러다보니 새 리습을 만들 때마다 시작 그룹에 추가하는 걸 잊어버리기 일쑤였다. 분명 만들어 뒀는데 “어 이거 왜 안 되지” 하고 보면 로드를 안 한 거였다.

    결국 문제는 하나였다. 어떤 리습을 띄울지가 내 머릿속에만 있고, 그걸 매번 손으로 다시 시키고 있다는 사실.

    어떻게 풀었나

    CAD에는 약속된 파일 이름이 하나 있다. acaddoc.lsp. 도면이 열릴 때마다 ZWCAD가 ‘지원 파일 검색 경로’를 훑어서 이 이름의 파일을 찾고, 있으면 알아서 읽어 들인다. 내가 부르지 않아도 된다. 도면을 여는 것 자체가 신호가 된다.

    여기에 한 겹을 더 뒀다. acaddoc.lsp 안에는 딱 한 줄만 넣었다.

    (if (findfile "LOADER.lsp") (load (findfile "LOADER.lsp")))
    

    “검색 경로에서 LOADER.lsp를 찾고, 있으면 로드해라”는 뜻이다. 실제 일은 전부 LOADER.lsp가 한다.

    그리고 LOADER.lsp는 목록을 손으로 적는 방식이 아니다. 자기가 들어 있는 폴더를 스스로 들여다보고, 그 안의 .lsp 파일을 전부 찾아 로드한다. 자기 자신과 acaddoc.lsp만 빼고. 그래서 어떤 리습을 띄울지 어딘가에 따로 적어둘 필요가 없다. 폴더에 파일이 있으면 로드되고, 없으면 안 한다. 목록이 곧 폴더다.

    굳이 둘로 나눈 데는 이유가 있다. acaddoc.lsp는 CAD가 인식하는 고정된 이름이라, 한 번 자리만 잡아두면 다시 건드릴 일이 없는 뼈대다. 거기에 로직을 다 욱여넣는 대신, 실제로 손볼 가능성이 있는 부분은 전부 LOADER.lsp로 빼뒀다. 뼈대와 내용물을 분리한 셈이다. (if (findfile ...))로 감싼 것도 같은 이유다 — LOADER.lsp가 없으면 조용히 넘어가고, 에러를 내지 않는다.

    신경 쓴 건 하나 더 있다. 리습 하나가 깨져 있으면 로드 전체가 멈춰버리는 게 제일 곤란하다. 그래서 파일마다 로드를 따로 감싸서, 하나가 실패해도 나머지는 계속 올라가게 했다. 명령창에는 [OK], [오류], 못 찾은 파일은 [??]로 한 줄씩 찍힌다. 어떤 리습이 말썽인지 도면을 여는 순간 바로 보인다.

    어떻게 달라졌나

    이제 ZWCAD에서 도면을 열면, 쓰던 리습이 전부 올라온 채로 시작한다. APPLOAD를 열 일이 없다. 폴더를 뒤질 일도 없다.

    새 리습을 만들면, 그 폴더에 파일을 넣는 게 전부다. 목록을 고칠 일도, 어딘가에 등록할 일도 없다. 다음에 도면을 열 때부터 그 리습도 같이 따라온다. 도구를 불러오는 일을 더는 기억하지 않아도 된다는 게, 생각보다 컸다.

    사용 환경

    • 개발·검증 환경: Windows 10/11, ZWCAD 2023
    • 작성 언어: AutoLISP
    • 전제: 리습 파일들을 모아둔 폴더가 ZWCAD ‘지원 파일 검색 경로’에 등록되어 있어야 한다.
    • 참고: acaddoc.lsp는 CAD 공통 메커니즘이지만, 이 글의 설정은 ZWCAD 2023 기준으로만 검증했다. AutoCAD 호환은 확인하지 않았다.

    어떻게 쓰나

    먼저 리습들을 한 폴더에 모은다. 예를 들어 C:\CAD\LISP 같은 폴더를 하나 만들고, 쓰는 리습과 이번 글의 두 파일(acaddoc.lsp, LOADER.lsp)을 거기에 같이 둔다.

    그다음 그 폴더를 ZWCAD가 찾을 수 있게 등록한다.

    1. ZWCAD에서 OP(옵션)를 실행한다.
    2. ‘파일’ 탭 → ‘지원 파일 검색 경로’를 펼친다.
    3. ‘추가’ → ‘찾아보기’로 위 폴더를 선택하고 확인한다.
    4. (권장) 같은 ‘파일’ 탭의 ‘신뢰할 수 있는 위치’에도 그 폴더를 추가한다. 보안 경고 없이 자동 로드되게 하기 위해서다.

    이제 끝이다. LOADER.lsp를 열어 뭔가를 적을 필요가 없다. 같은 폴더에 둔 리습이 곧 로드 대상이다. ZWCAD를 새로 켜거나 도면을 새로 열면, 명령창에 [OK]로 시작하는 로드 메시지가 한 줄씩 뜬다. 그게 보이면 성공이다.

    앞으로 새 리습이 생기면 그 폴더에 파일만 넣으면 된다. 빼고 싶으면 폴더에서 꺼내면 된다. 자동 로드 목록을 관리한다는 감각 자체가 없어진다.

    아직 안 되는 것

    acaddoc.lsp는 검색 경로에서 처음 발견된 하나만 로드된다. 만약 다른 프로그램이나 설정이 이미 다른 acaddoc.lsp를 쓰고 있다면 둘이 충돌할 수 있다. 그럴 땐 기존 파일 안에 LOADER.lsp를 불러오는 한 줄을 합쳐 넣는 식으로 풀어야 한다.

    폴더를 통째로 읽는 방식이라 생기는 한계도 있다. 그 폴더의 .lsp는 가리지 않고 전부 로드한다. 그래서 자동 로드를 원치 않는 리습은 이 폴더에 두면 안 된다 — 테스트용이나 미완성 리습은 다른 곳에 둬야 한다. 로드 순서도 파일 이름 순서를 따르기 때문에, 리습끼리 로드 순서를 타는 의존 관계가 있으면 의도와 어긋날 수 있다. 그럴 땐 파일 이름 앞에 숫자를 붙여 순서를 잡아주면 된다.

    그리고 이건 ‘상시 로드’에 맞춘 구조다. 개발 중에 리습을 고쳐가며 빠르게 테스트하는 용도라면, 단축키로 즉시 로드하는 AutoHotkey 방식이 더 맞는다. 둘은 역할이 다르다 — 만드는 단계와 쓰는 단계.

    받아 가기

    파일: acaddoc.lsp, LOADER.lsp (구글 드라이브 링크)

    LOADER.lsp는 폴더 안의 .lsp를 자동으로 스캔해 로드하는 로더다. 안을 열어 고칠 일은 없다. 그냥 acaddoc.lsp와 함께 리습 폴더에 두기만 하면 된다.

    써보다가 막히는 곳이 있거나 “내 환경에선 이게 안 된다” 싶은 게 생기면, 댓글로 남겨주시면 좋겠다. 같은 길을 먼저 지나온 사람으로서, 아는 선에서 같이 들여다보겠다.

    짧은 회고

    좋은 자동화는 일을 대신 해주는 게 아니라, 기억해야 할 것을 하나 줄여준다.

    이용 조건 — 개인·비영리 목적 자유 사용, 출처(Talkative Archi) 표기 시 수정 가능. 무단 재배포·상업적 판매 금지. 무보증이며 사용에 따른 모든 결과는 본인 책임입니다. (자세히)

  • Ctrl+Shift+S 한 번으로 끝 — 리습 저장과 ZWCAD 로드 자동화

    코드를 짜는 시간보다, 짠 코드를 테스트하러 왕복하는 시간이 더 길었다.

    제미나이로 리습을 작성하면, 그다음이 문제였다. 클립보드에 코드를 복사하고, 파일로 저장하고, 탐색기에서 그 파일을 찾아 ZWCAD 창으로 드래그앤드롭해서 로드해야 했다. 매번 같은 동작을 반복했다. 코드 한 줄 고치고 테스트할 때마다. 구동이 안 될 때마다. 원하는 결과가 나오지 않을 때마다.

    RRAR 같은 리습을 만들때는 버전 번호가 40을 넘어가기 시작했다. 원하는 결과를 위해 수정을 마흔 번 했다는 이야기다.

    이건 자동화가 필요한 일이었다.

    어떤 문제였나

    흐름을 끊는 건 항상 사소한 것들이다. 창을 전환하고, 경로를 타이핑하고, 엔터를 치는 것. 한 번은 아무것도 아니지만, 하루에 수십 번 반복되면 이야기가 달라진다.

    탐색기에서 파일을 찾아 ZWCAD 창으로 드래그앤드롭하는 것도 보기엔 간단해 보이지만, 코드를 조금씩 고치면서 반복 테스트할 때는 이야기가 다르다. 크롬 → 저장 → 탐색기 → ZWCAD, 이 네 단계를 매번 손으로 밟아야 한다. 게다가 ZWCAD가 로드 명령을 받을 때 한/영 IME 상태에 따라 입력이 꼬이는 경우도 있어서, 단순해 보이는 과정이 생각보다 신경을 많이 잡아먹었다.

    어떻게 풀었나

    AutoHotkey로 단축키 하나를 만들었다. Ctrl+Shift+S.

    크롬이 활성화된 상태 — 그러니까 제미나이로 코드를 작성하고 있는 상태 — 에서 이 키를 누르면 세 가지가 순서대로 일어난다.

    1. 저장할 파일 경로를 선택하는 창이 뜬다.
    2. 클립보드의 코드가 그 파일로 저장된다.
    3. ZWCAD로 자동 전환되면서 (load "파일경로") 명령이 명령창에 입력되고 엔터까지 날아간다.

    IME 문제는 AHK의 {Text} 전송 모드로 해결했다. 한/영 상태나 단축키 충돌과 무관하게 문자열을 그대로 전송하는 방식이라, ZWCAD 명령창에 넣을 때도 안정적으로 동작한다. 그리고 백슬래시 경로는 슬래시로 변환해서 넘기도록 처리했다 — ZWCAD의 (load) 명령은 슬래시를 더 잘 인식하기 때문이다.

    어떻게 달라졌나

    크롬에서 코드를 복사하고 Ctrl+Shift+S를 누르는 것으로 끝이다. 저장 경로만 한 번 선택하면, 그다음은 전부 자동이다.

    코드 작성 → 저장 → 로드 → 테스트의 흐름이 한 번의 키 입력으로 이어진다. 창을 왔다 갔다 하고, 명령을 타이핑하던 시간이 사라졌다. 작아 보이지만, 집중을 유지한 채로 코드를 고치고 테스트하는 게 훨씬 수월해졌다.

    사용 환경

    • 개발·검증 환경: Windows 10/11, ZWCAD 2023
    • 작성 언어: AutoHotkey v1
    • 조건: 크롬 활성화 상태에서만 동작 (#IfWinActive chrome.exe)
    • 주의: 관리자 권한으로 실행해야 한다. 스크립트 실행 시 UAC 창이 한 번 뜨는 건 정상이다.
    • 추가 제안: 컴퓨터가 시작할 때 자동으로 구동되도록 시작프로그램 폴더에 넣어놓으면 ahk도 따로 로드할 필요가 없어진다.

    어떻게 쓰나

    1. 이 글에 첨부된 LAL_simple_v1_5.ahk를 내려받는다.
    2. 파일을 우클릭 → 관리자 권한으로 실행한다.
    3. 제미나이(또는 클로드: 클로드는 크롬에서 실행한 웹용 클로드에서만 작동한다)에서 리습 코드를 작성하고 전체 복사한다. 코드박스의 복사 버튼을 눌러도 완전히 작동한다.
    4. 크롬이 활성화된 상태에서 Ctrl+Shift+S를 누른다.
    5. 저장 경로를 선택하면 자동으로 저장 및 ZWCAD 로드까지 완료된다.

    처음 실행 전에 스크립트를 메모장이나 에디터로 열어서 defaultRoot 줄의 경로를 본인이 리습 파일을 저장하고 싶은 폴더 경로로 바꿔야 한다. 예를 들어 C:\Users\홍길동\Documents\LISP 같은 식이다. 이 경로가 저장 창의 기본 위치가 된다.

    아직 안 되는 것

    크롬이 활성화된 상태에서만 동작한다. 다른 에디터나 환경에서 쓰려면 #IfWinActive 조건을 수정해야 한다. 그리고 관리자 권한 실행이 필수라 시작 시 UAC 팝업이 뜨는 게 불편한 점으로 남아 있다.

    받아 가기

    다운로드: LAL_simple_v1_5.ahk

    써보다가 막히는 곳이 있거나 궁금한 점이 생기면, 댓글로 남겨주시면 좋겠다. 같은 작업에 지쳐본 사람으로서, 아는 선에서 답해 보겠다.

    짧은 회고

    자동화 도구의 가치는 아낀 시간보다 유지한 집중에 있다. 창을 전환하고 명령을 타이핑하는 10초가 아깝다기보다, 그 10초마다 흐름이 끊긴다는 게 진짜 문제였다. 그 흐름을 지키는 것. 그게 이 도구를 만든 이유였다.

    이용 조건 — 개인·비영리 목적 자유 사용, 출처(Talkative Archi) 표기 시 수정 가능. 무단 재배포·상업적 판매 금지. 무보증이며 사용에 따른 모든 결과는 본인 책임입니다. (자세히)