[카테고리:] 리습 공유

클릭이 세 번을 넘어가면, 그건 귀찮은 일이다.
저는 업무할 때 되도록이면 손을 많이 안 움직이려고 합니다. 귀찮아서요.

그건 코딩을 할 줄 아는 지금이나, 코딩을 몰랐던 과거나 마찬가지였습니다. 귀찮은 건 절대로 못 참았어요.

대 AI 시대가 도래하면서, 누구나 바이브 코딩으로 코딩을 할 수 있는 시대가 되었습니다. 그러면서 저는 본격적으로 리습을 만들기 시작했습니다.

그렇다고 해서 제가 코딩을 잘 아냐? 그건 아닙니다. 하지만 저는 문제를 파악하고, 좀 더 쉽게 할 수 있는 방법, 좀 더 효율적으로 할 수 있는 방법을 고안하기 위해 고민할 뿐이에요. 3시간 걸릴 이슈에 대해 앞서 30분만 고민하면, 전체 시간이 2시간으로 짧아지니까요.

다시 말하지만 저는 문제를 찾습니다. 코딩은 제미나이와 클로드가 교차검증을 해줍니다. 구동이 안되면 원인을 파악하고 다시 코딩을 다듬습니다. 현재 주어진 실무 상황에서 가장 최적으로 문제를 해결할 수 있는 방식을 찾고, 다른 사람들도 사용할 수 있도록 쉽게 만드는 것이 제가 꿈꾸는 일하기입니다.

건축은 물론 창의적 직무입니다. 그러나 그 창의가 현실에 구현되어야 하는 일이기도 합니다. 창의가 현실과 손잡기 위해서는 그 사이에 수많은, 그러나 필요한 ‘노가다’가 자리해야 합니다. 그 노가다를 줄일 수만 있다면, 어쩐지 일하는 과정이 같이 즐거워질 것만 같아요.

  • 도면 열면 리습이 알아서 — 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) 표기 시 수정 가능. 무단 재배포·상업적 판매 금지. 무보증이며 사용에 따른 모든 결과는 본인 책임입니다. (자세히)

  • 도면 600장, 도곽만 고르면 끝 — 멀티플롯 리습(RRAR)

    도면 출력은 별것 아닌 일이다. 한두 장이라면.

    그런데 600장이 되면 이야기가 달라진다. 영역을 일일이 잡고, 가로·세로 도면을 가려 용지 방향을 바꾸고, 출력을 걸고, 다시 다음 도면으로. 그게 600번 반복된다. 누군가는 다른 일을 다 제쳐두고 하루를 통째로 그 일에 바쳐야 한다. 나는 이게 사람이 할 일이 아니라고 생각했고, 그래서 RRAR이라는 도구를 만들었다.

    이 글은 그 도구가 무엇을, 어떤 환경에서, 어떻게 해주는지에 대한 기록이다. 비슷한 작업에 지쳐본 분이라면 받아서 바로 써보셔도 좋겠다.

    시작하기 전에 (이걸 모르면 헤맨다)

    이 도구를 받아서 쓰려면 몇 가지 전제가 맞아야 한다. 먼저 적어둔다.

    • 도곽은 블록(INSERT)으로 작성되어 있어야 한다. XREF로 연동되어 있어도 무방하다. 하지만 일반 객체로 그린 도곽은 인식되지 않는다.
    • 도면 번호는 표제란에 실제 글자(TEXT/MTEXT)로 있어야 한다. 영문+숫자 체계(예: A-101)일 때 파일명 추출이 가장 깔끔하게 된다.
    • Windows 환경 전용이다.
    • 첫 실행 때 한 번은 설정을 잡아줘야 한다. 출력 폴더·플로터·용지·CTB를 본인 환경에 맞추는 과정인데, 한 번 해두면 저장되어 다음부터는 바로 출력만 하면 된다.

    어떤 문제를 풀었나

    대량 출력의 번거로움은 한 군데에서 오는 게 아니다. 여러 손길이 겹쳐서 온다.

    • 도면마다 출력 영역을 일일이 지정해야 한다.
    • 가로 도면과 세로 도면이 섞여 있으면 용지 방향까지 바꿔줘야 한다.
    • 출력 순서를 의식하며 객체를 골라야 한다.
    • 파일을 저장할 때 이름도 하나하나 붙여야 한다.

    하나하나는 사소하다. 그런데 600번 곱하면, 그게 하루를 잡아먹는다.

    어떻게 동작하나

    핵심은 한 문장으로 정리된다. 사람은 도곽만 고른다. 나머지는 도구가 판단한다.

    • 도곽 인식 · 순서 비의존 — 도곽(블록)들을 선택하면 그 안의 내용을 출력 대상으로 잡는다. 순서는 신경 쓰지 않아도 된다.
    • 용지 방향 자동 판별 — 도곽의 가로·세로 비율을 보고 가로(Landscape)/세로(Portrait)를 알아서 정한다.
    • 크기 감지 후 축척 제안 — 도곽 크기를 측정해 권장 축척을 제시한다. 같은 크기의 도곽은 하나로 묶이기 때문에, 도면마다가 아니라 크기 종류마다 한 번씩만 축척을 입력하면 된다. (0을 넣으면 용지에 맞춤.)
    • 표제란 기반 파일명 자동 생성 — 도곽 모서리의 표제란 영역에서 가장 큰 글자를 읽어, 영문과 숫자를 가려 A-101 같은 형식으로 도면 번호를 만든다. 같은 이름이 있으면 자동으로 번호를 덧붙인다.
    • 흑백 출력 품질 보정 — 출력 직전, RGB(트루컬러)로 지정된 레이어를 잠시 검정으로 바꿨다가 출력이 끝나면 원래대로 되돌린다. 흑백 PDF가 지저분해지지 않도록 하는 장치다.

    여기에 더해, 작업 도중 중단하거나 오류가 나더라도 변경한 환경값과 레이어 색상을 자동으로 원래대로 되돌리도록 해 뒀다. 믿고 돌려도 도면이 망가지지 않는다.

    ZWCAD에서 겪은 것

    쉽지만은 않았다. ZWCAD 환경은 제 나름의 고집이 있어서, 잘 짠 코드도 그대로 도는 법이 드물다.

    한 예로, 폴리라인의 경계 상자(BoundingBox)를 표준 방식으로 물으면 ZWCAD에서는 엉뚱한 값이 돌아오는 경우가 있었다. 출력 영역을 잡는 데 이 값이 어긋나면 도면이 잘려 나온다. 그래서 표준 방식이 실패하면 폴리라인의 꼭짓점 좌표를 직접 읽어 경계를 다시 계산하도록 우회로를 만들어 뒀다. 도구를 ‘동작하게’ 만드는 일의 대부분은, 사실 이런 자리에 있었다.

    사용 환경

    이 글을 찾으신 분이 가장 궁금해할 부분일 것 같다.

    • 개발·검증 환경: ZWCAD 2023 (Windows)
    • 작성 언어: AutoLISP (ActiveX·레지스트리 사용)
    • 출력 방식: 내장 DWG to PDF.pc5 플로터 (기본값, 설정에서 변경 가능)
    • 기본 용지 / CTB: A3 풀블리드 / 사내 표준 CTB (둘 다 설정에서 변경 가능. 다만 용지의 전체 이름을 정확하게 입력해야 한다. ctb 또한 확장자 “.ctb”까지 입력하는 것을 권장한다). 축척 기준은 A3·A1.
    • AutoCAD 호환: 미검증. 플로터 설정이 ZWCAD 방식(.pc5)에 맞춰져 있어, AutoCAD에서 쓰려면 플로터·용지 설정 조정이 필요하다.
    • PDF 결합용 외부 도구(선택): 알PDF 등

    어떻게 쓰나

    1. 이 글에 첨부된 RRAR_-_다중플롯.lsp를 내려받는다.
    2. ZWCAD에서 APPLOAD 명령으로 리습을 로드한다.
    3. (선택) 출력할 도곽들을 미리 선택해 둔다.
    4. 명령창에 RRAR을 입력한다.
    5. 현재 설정으로 바로 출력하려면 P, 출력 폴더·플로터 등을 바꾸려면 S를 누른다.
    6. (미리 선택하지 않았다면) 출력할 도곽(블록)들을 선택한다.
    7. 크기 종류마다 축척을 한 번씩 입력한다. (입력 전에 도곽 크기를 인식한 권장값이 먼저 제시된다. 0은 용지 맞춤으로 플롯.)
    8. 도구가 방향·표제란·파일명을 인식해 도곽별로 PDF를 출력한다.
    9. (선택) 알PDF 등으로 PDF를 하나로 결합한다. 파일명이 이미 도면 번호로 정리돼 있어 순서를 맞출 필요가 없다.

    이렇게 하면, 예전엔 한 사람이 하루 종일 매달려야 했던 600장이 한 시간 안에 PDF로 떨어진다.

    아직 안 되는 것

    지금은 캐드 내장 플로터를 통한 출력만 지원한다. Adobe PDF 같은 외부 프로그램이나 실제 프린터 플롯은 아직 적용하지 못했다. 이 부분이 다음 숙제다.

    또 하나, 파일명 추출은 표제란이 일정한 규칙(모서리에 큰 글자로 도면 번호)을 따른다는 전제 위에서 동작한다. 템플릿이 많이 다르면 이름이 어긋나 Plot_Error_ 형태로 떨어질 수 있으니, 처음 쓸 때는 소량으로 한 번 확인해보길 권한다.

    받아 가기

    RRAR_다중플롯_다운로드(구글 드라이브 링크)

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

    짧은 회고

    자동화란 결국 무엇을 없애는 일인가. 도구 하나를 만들고 나서 나는 그 답이 화려한 코드에 있지 않다는 걸 다시 확인했다. 600장을 직접 출력해본 사람만 아는 그 지긋지긋함을 없애는 것. 그게 전부였다.

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