자동화 도구를 한 번 썼더니 객체 스냅이 꺼져 있거나 치수 글자 크기가 달라져 있다면, 실무자는 두 번 다시 그 도구를 켜지 않습니다. CAD 자동화에서 가장 중요한 예의는 화려한 기능이 아니라 쓰기 전과 똑같은 상태로 돌려놓는 것입니다. 도면 작도 도구를 만들며 이 원칙을 어떻게 코드로 강제했는지 정리합니다.
문제는 command가 남기는 흔적이다
AutoLISP에서 표준 명령을 부르려면 시스템 변수를 잠시 바꿔야 할 때가 많습니다. 객체 스냅이 켜져 있으면 원치 않는 점에 객체가 붙으니 osmode를 끄고 명령창이 지저분해지지 않게 cmdecho를 끕니다. 치수를 그릴 때는 치수 글자 높이나 축척 같은 치수 변수도 원하는 값으로 맞춰야 합니다.
문제는 이 변경을 되돌리지 않으면 그대로 사용자에게 남는다는 점입니다. 도구가 osmode를 끈 채 끝나면 사용자의 스냅이 꺼진 상태가 되고 치수 변수를 바꾼 채 끝나면 이후 사용자가 그리는 모든 치수가 도구가 정한 크기로 나옵니다. 자동화 도구가 사용자의 작업 환경을 몰래 바꾼 셈입니다.
저장하고, 쓰고, 되돌린다
기본 패턴은 단순합니다. 명령에 진입하면 앞으로 바꿀 시스템 변수의 현재 값을 먼저 저장합니다. 작업을 하는 동안 필요한 값으로 바꿔 쓰고 작업이 끝나면 저장해 둔 값으로 하나씩 되돌립니다. 이 저장과 복원을 한 쌍으로 묶어 두면 도구가 무엇을 바꾸든 흔적이 남지 않습니다.
치수 부분에서는 이 패턴을 더 촘촘하게 적용했습니다. 치수 명령을 부르기 전에 관련 치수 변수를 통째로 스냅샷으로 저장하고 도구가 원하는 값으로 바꿔 치수를 그린 뒤, 명령이 끝날 때 저장한 스냅샷으로 되돌립니다. 그 덕에 도구는 도구대로 일관된 크기의 치수를 그리면서도 사용자의 치수 설정은 건드리지 않은 것처럼 유지됩니다.
진짜 어려운 건 중단 상황이다
정상적으로 끝나는 경우는 쉽습니다. 어려운 건 중간에 멈추는 경우입니다. 사용자가 삽입점을 클릭하려다 ESC를 누르거나, 예상치 못한 입력으로 오류가 나면 명령은 그 자리에서 중단됩니다. 이때 복원 코드가 명령의 끝부분에만 있으면 실행되지 못하고 바꿔 놓은 시스템 변수가 그대로 남습니다. 오히려 중단됐을 때가 흔적이 남기 가장 쉬운 순간입니다.
그래서 오류 핸들러를 둡니다. AutoLISP은 명령 실행 중 오류나 취소가 발생하면 지정한 오류 처리 함수를 부르는데, 이 함수 안에서 시스템 변수 복원을 수행하게 했습니다. 정상 종료든 ESC든 오류든 어느 경로로 끝나도 같은 복원이 실행되도록 만들었습니다. 복원 자체도 일부 실패를 허용하도록 감싸서 한 변수의 복원이 막혀도 나머지는 되돌아가게 했습니다.
되돌릴 것이 애초에 없게
가장 좋은 복원은 되돌릴 것이 없는 상태입니다. 이 도구가 도형 생성에 entmake를 쓴 것도 같은 맥락입니다. entmake는 시스템 변수를 읽지도 바꾸지도 않으므로, 도형을 그리는 대부분의 작업에는 저장하고 복원할 것이 아예 없습니다. 부작용이 불가피한 치수 부분만 좁게 격리해 저장·복원으로 감쌌습니다.
결국 전략은 두 겹입니다. 되도록 부작용 없는 방식으로 그려 복원할 거리를 줄이고 부작용이 남는 부분은 저장·복원과 오류 핸들러로 어느 경로로 끝나든 원래대로 되돌립니다. 이 두 겹 덕분에 실무자는 도구를 쓴 뒤 자기 도면이 그대로라는 걸 신경 쓰지 않아도 됩니다. 신경 쓰지 않아도 된다는 감각이야말로 자동화 도구가 실무에 자리 잡는 조건입니다.
부작용 없는 도형 생성 방식은 entmake로 도형, command로 치수에서 더 자세히 다룹니다. 이 도구가 두 CAD에서 함께 도는 설계는 AutoCAD와 CADian 양립 설계에서, 전체 사례는 AutoCAD 도면 작도 자동화 도구에서 볼 수 있습니다.
자주 묻는 질문
시스템 변수를 왜 저장하고 복원해야 하나요?
표준 명령을 안전하게 실행하려면 객체 스냅이나 명령 에코 같은 시스템 변수를 잠시 바꿔야 하는데, 이를 되돌리지 않으면 도구를 쓴 뒤에도 그 변경이 사용자에게 그대로 남습니다. 진입할 때 저장하고 끝날 때 복원하면 도구가 무엇을 바꾸든 흔적 없이 원래 설정이 유지됩니다.
ESC로 중단해도 설정이 복원되나요?
네. 복원 코드를 명령의 끝에만 두면 중단 시 실행되지 못하므로, AutoLISP 오류 핸들러 안에 복원을 넣었습니다. 정상 종료든 ESC든 오류든 어느 경로로 끝나도 같은 복원이 실행되도록 했고 복원 과정도 일부 실패를 허용하게 감싸 한 변수의 복원이 막혀도 나머지는 되돌아갑니다.
복원할 것을 아예 줄일 수는 없나요?
있습니다. 시스템 변수를 건드리지 않는 entmake로 도형을 그리면 저장하고 복원할 것 자체가 생기지 않습니다. 이 도구도 도형은 대부분 entmake로 처리하고 부작용이 불가피한 치수 부분만 좁게 격리해 저장·복원과 오류 핸들러로 감쌌습니다.