객체를 골라 명령어 하나만 치면 선택한 것들의 좌하단 구석이 원점(0,0)에 딱 붙는다. 캐드 원점 이동을 손으로 하다 보면 오스냅이 엉뚱한 점을 잡거나, 도곽 안에 XCLIP으로 잘라 둔 블록 때문에 화면에도 없는 좌표가 기준이 되어 도면이 저 멀리 날아가곤 했다. 그 두 가지를 다 막으려고 만든 리습이다.

캐드 원점 이동, 손으로 하면 늘 한 번씩 어긋난다
다른 파일에서 도면을 복사해 오거나, 낱장으로 쪼개 둔 파일을 열어 보면 객체가 원점에서 한참 떨어진 곳에 앉아 있다. ZOOM E를 치면 화면에는 잘 뜨니까 당장은 불편하지 않은데, 그 상태로 두면 뒤가 계속 꼬인다. 외부참조로 붙일 때 기준이 안 맞고, 블록으로 만들면 삽입점이 이상한 데 생기고, 협력업체나 인허가용으로 넘길 때는 결국 누군가 한 번은 정리해야 한다.
정리하는 절차 자체는 어렵지 않다. MOVE를 켜고, 도곽 좌하단 모서리를 기준점으로 찍고, 목적지에 0,0을 입력하면 된다. 문제는 그 “좌하단 모서리를 정확히 찍는” 한 동작이다.
일단 어디가 진짜 좌하단인지 눈으로 찾아야 한다. 도곽 밖으로 삐져나온 참조선이나 마커가 하나라도 있으면 그게 진짜 끝점이고, 그건 화면을 한참 끌어당겨야 보인다. 오스냅은 오스냅대로 근처의 다른 선이나 중간점을 물어 온다. 확대해서 찍고, 다시 확인하고, 아니면 되돌리고. 도면 한 장이면 그러려니 하는데 스무 장이면 얘기가 다르다.
그리고 더 고약한 함정이 하나 있다. XCLIP이다. 잘라 놓은 블록은 화면에 잘린 모습만 보이지만, 캐드에 그 블록의 경계를 물어보면 잘리기 전 원본 전체 범위를 돌려준다. 눈에 보이는 것과 데이터가 다른 것이다. 그래서 “자동으로 제일 왼쪽 아래를 찾아라”라고 시키면, 화면 어디에도 존재하지 않는 유령 좌표가 최소값으로 잡힌다. 그걸 기준으로 옮기면 도면 전체가 엉뚱한 방향으로 날아간다. 처음 만든 버전이 딱 이 함정에 빠졌다.
XCLIP을 빼고 재는 방식으로 원점 이동을 자동화했다
접근은 단순하다. 선택한 객체를 하나씩 돌면서 각자의 경계 상자에서 최소 X와 최소 Y를 뽑고, 그중 가장 작은 값을 모아 도면 전체의 좌하단으로 삼는다. 그리고 그 점에서 0,0으로 한 번 옮긴다.
핵심은 “하나씩 돌면서” 안에 넣은 예외 처리다.
XCLIP이 걸린 블록은 측정에서 통째로 뺀다. 블록의 확장 사전에 ACAD_FILTER가 붙어 있는지를 보고 판별한다. 잘라 놓은 블록이라는 뜻이니, 이 녀석이 돌려주는 경계값은 믿지 않고 그냥 건너뛴다. 앞에서 말한 유령 좌표가 여기서 걸러진다.
측정 자체가 실패하는 객체가 있어도 죽지 않는다. 프록시 객체처럼 경계를 물으면 오류를 뱉는 것들이 있다. 그런 건 오류로 명령을 중단시키지 않고 조용히 넘긴 뒤 나머지로 계산을 이어 간다. 도면 하나에 그런 객체 하나 섞였다고 명령 전체가 멈추면 쓸모가 없다.
좌표계를 돌려 놨어도 맞는다. 경계 상자는 절대좌표(WCS)로 나오는데, 사용자가 UCS를 회전시켜 놓은 상태라면 그 값을 그대로 MOVE에 넣으면 어긋난다. 그래서 계산이 끝난 뒤 UCS 기준으로 변환해서 넘긴다.
전부 언두 한 번으로 되돌아간다. 이동 직전에 언두 그룹을 열고 끝나면 닫는다. 결과가 마음에 안 들면 U 한 번이면 된다.
여기에 자잘한 안전장치를 몇 개 더 붙였다. 미리 선택해 둔 객체가 있으면 그대로 쓰고 없으면 그때 선택을 받는 것, 이미 원점에 있으면 아무것도 하지 않고 알려 주는 것, 선택한 게 전부 XCLIP 블록이라 잴 것이 하나도 없으면 첫 객체의 삽입점이라도 기준으로 삼는 것.
달라진 것 — 원점 이동이 명령어 하나로
지금은 도곽을 포함해 옮기고 싶은 것을 창으로 싹 긁고, vsm을 친다. 그게 전부다.
좌하단 모서리를 찾아 확대할 일이 없다. 오스냅이 엉뚱한 걸 잡을 일도 없다. 도곽 밖에 삐져나온 선이 있어도 그것까지 포함해서 계산하니 결과가 예측 가능하다. XCLIP 블록이 몇 개 섞여 있든 신경 쓰지 않는다.
낱장으로 분리한 파일들을 하나씩 열어 원점 정리하는 작업이 특히 편해졌다. 파일 열고, 전체 선택하고, vsm. 파일당 3초쯤 걸린다. (낱장 DWG 분리 리습으로 쪼갠 파일들을 정리할 때 이 조합을 자주 쓴다.)
사용 환경
- ZWCAD 2023에서 개발하고 실전에서 검증했다.
- AutoCAD 호환은 확인해 보지 않았다. 쓰는 명령과 함수 자체는 표준이라 아마 될 텐데, 장담은 못 한다.
- 파일은 CP949 인코딩이다. 그대로 두고 쓰면 된다.
- 리습을 처음 불러오신다면 리습 불러오는 네 가지 방법을 먼저 보시면 된다.
어떻게 쓰나
VSM.lsp를 캐드로 불러온다. (드래그앤드롭 또는 APPLOAD)- 원점으로 옮길 객체를 선택한다. 도곽 전체라면 창 선택으로 한 번에 긁으면 된다.
- 명령창에
vsm을 치고 엔터. 완벽하게 원점 정렬되었습니다가 뜨면 끝이다.
명령어를 먼저 치고 나서 선택해도 된다. 순서는 상관없다.
이미 원점에 있는 도면에 실행하면 이미 원점입니다라고만 알려 주고 아무것도 건드리지 않는다.
아직 안 되는 것
- Z는 그대로 둔다. X와 Y만 옮긴다. 고도값이 들어간 객체는 그 값을 유지한다.
- 잠긴 레이어의 객체는 따라오지 않는다. MOVE가 잠긴 객체를 못 옮기기 때문이다. 하필 그 객체가 좌하단을 잡고 있었다면 정렬 결과가 어긋난다. 실행 전에 도곽 레이어 잠금을 풀어 두시는 편이 안전하다.
- 그런데도 성공 메시지는 뜬다. 이동이 실제로 됐는지까지는 검사하지 않는다. 위 경우엔 메시지만 보고 안심하면 안 되고 눈으로 한 번 확인해야 한다.
- 선택한 것이 전부 XCLIP 블록이면 잴 수 있는 경계가 없어서, 첫 번째 객체의 삽입점을 대신 기준으로 삼는다. 정확한 좌하단이 아닐 수 있다.
- 원점 판정 기준은 0.001이다. 좌하단이 원점에서 0.001 이내면 이미 정렬된 것으로 보고 넘어간다.
받아 가기
받아서 쓰시다가 막히는 부분이나 이상한 동작이 있으면 댓글로 남겨 주세요. 제 환경에서만 되는 것이었을 수 있습니다.
짧은 회고
이 리습에서 제일 오래 붙잡은 건 알고리즘이 아니라 XCLIP이었다.
처음 버전은 잘 돌아가는 것처럼 보였다. 그러다 어느 도면에서 실행했더니 도면이 화면 밖으로 사라졌다. 코드를 아무리 봐도 계산은 맞는데 결과가 틀렸다. 한참 뒤에야 알았다. 계산은 맞았고, 재고 있던 대상이 틀렸던 것이다. 잘라 놓은 블록은 화면에는 잘린 모습을 보여 주면서 속으로는 잘리기 전 크기를 그대로 들고 있었다.
캐드에서 내가 보고 있는 것과 캐드가 알고 있는 것이 늘 같지는 않다. 머리로는 알던 얘기인데, 도면이 한 번 날아가고 나서야 몸으로 알았다.
이 리습은 개인·비영리 목적으로 자유롭게 쓰실 수 있습니다. 출처(Talkative Archi)를 밝히면 수정도 괜찮습니다. 무단 재배포와 상업적 판매는 금지하며, 사용에 따른 책임은 사용자 본인에게 있습니다. 자세히
답글 남기기