1. 캐드 Z값 삭제 방법
오토캐드에서 좌표를 표현하는 방법은 (X, Y, Z)로 표현합니다. 하지만 2D CAD에서는 Z 좌표를 사용하지 않아 “0”으로 두고 사용하는데요. 가끔 카티아(catia), 솔리드웍스(solidwork), 인벤터(Inventor), 솔리드 엣지(Solid Edge)와 같은 3D 프로그램에서 작업한 도면을 2D로 변경하면서 Z 좌표에 값이 입력되는 경우가 생깁니다. 오늘은 오토캐드(AUTO CAD)에서 Z값 삭제 방법 및 리습에 대해서 살펴보겠습니다.
1) Z값이 0이 아닐 때 – 증상
캐드에서 Z값이 0이 아닐 때 생기는 대표적인 오류는 FILLET과 CHAMFER가 실행되지 않습니다. 이런 현상이 발생하면 Z값을 변경하여 0으로 변경하고 작업을 진행해야 합니다.
2) Z값 변경하기① – PROPERTIES
Z값을 변경하는 가장 쉬운 방법은 PROPERTIES 또는 CTRL +1을 입력하여 특성 팔레트를 실행하는 방법입니다. 아래 영상처럼 객체를 선택하고 특성 팔레트의 형상에서 Z 시작과 Z 끝에 대한 정보를 0으로 수정하면 Z 좌표를 간단히 변경할 수 있습니다.
3) Z값 변경하기② – CHANGE
Z값 변경하기 두 번째 방법은 명령어 CHANGE를 이용하는 방법입니다.
① 명령 창에 “CHANGE”를 입력하고 객체를 선택 후 ENTER 나 SPACE를 입력합니다.
② P(특성) 입력 → ENTER →E(고도) 입력 → ENTER → 0 입력 → ENTER를 순서대로 실행합니다.
객체를 선택하고 특성 팔레트를 실행하면 변경된 Z 좌표를 확인할 수 있습니다. 만약 도면에 있는 모든 객체의 Z 좌표를 0으로 변경하려면 객체를 선택할 때 명령 창에 “ALL”을 입력합니다.
4) Z값 변경하기③ – FLATTEN
Z값을 변경하는 세 번째 방법은 FLATTEN 명령을 사용하는 방법입니다.
① 커맨드(CMD) 창에 FLATTEN을 입력하고 객체를 선택합니다.
– 객체 선택할 때 명령 창에 “ALL”을 입력하면 도면 전체 객체를 선택하여 변경할 수 있음
② 객체 선택을 마치면 ENTER를 입력하고 “Remove hidden lines?”이라는 메시지가 뜨면 “No”를 입력합니다.
변경된 Z 좌표는 특성 팔레트에서 확인할 수 있습니다.
5) Z값 변경하기④ – Lisp
위에서 사용한 Change 명령을 이용하여 리습을 작성해보겠습니다. 웹 서핑을 조금만 해보면 Z값을 없애는 리습이 굉장히 많이 나옵니다. COMMAND 문을 통해서 간단하게 작성할 수 있는 리습을 구현해보겠습니다. 실행 명령은 알맞게 변경하여 사용하시기 바랍니다. 초기에 설정된 명령어는 Z00입니다.
명령을 실행하면 도면에 있는 모든 객체를 선택하여 Z값(고도)을 0으로 변경합니다. 아래 내용을 메모장에 붙여넣고 이름.LSP 파일로 저장하여 사용하시기 바랍니다. 이름은 사용자가 원하는 이름으로 지정하시고, 뒤에 확장자는 LSP로 저장해야 합니다. 리습을 추가하는 방법은 아래 링크를 확인하세요.
(defun c:Z00 () ;명령을 바꾸려면 이곳을 변경하세요
(command "CHANGE" "all" "" "p" "e" "0" "")
(PRINC)
)
▼ 리습 실행 영상 – 다양한 객체의 Z 좌표를 모두 0으로 변경되는 것을 확인할 수 있습니다.
6) 달라지는 Z 좌표를 가진 선
달라지는 Z 좌표를 가진 선은 Z 좌표 시작점과 끝점이 다른 경우를 뜻합니다. 이러한 객체들은 CHANGE, FLATTEN과 같은 명령으로 Z값을 삭제할 수 없습니다. 간단한 해결 방법은 “특성 팔레트”를 실행하여 Z값을 수동으로 수정해야 합니다. 달라지는 Z 좌표를 가진 선이 많을 때는 아래에 제공한 리습을 사용하여 Z값을 수정하시기 바랍니다. 아래 제공하는 코드는 오직 선에 대한 Z값을 수정하는 리습입니다. 사용에 착오 없으시기 바랍니다. 리습(LISP)의 구문 설명은 주석을 남겨놓았습니다. 초기 실행 명령은 “JJJ”이며 원하는 명령으로 수정하여 사용하시기 바랍니다.
(defun c:jjj (/ n ss1 ss old_end o_ent old_st old_st_list old_end_list x y z x1 y1 strp endp assoc_key assoc_key1 new_st new_end new_change_st new_change_end l_entdata_st l_entdata_end )
(prompt "\n Z값 0이 아닌 선 선택..")
(setq n 0 ss1 (ssadd));반복을 위한 변수 n은 0으로 설정, 선택 세트를 ss1 변수에 추가(변수를 2개 설정)
(setq ss (ssget '((0 . "LINE"))));라인만 선택하여 변수에 저장
(repeat (sslength ss) ;객체 개수를 ss변수로 저장하고 개수만큼 반복
(setq o_ent (entget (ssname ss n))) ;라인의 dxf 속성을 변수로 저장
(setq old_st (assoc 10 o_ent)) ; 10번 dxf 코드를 변수로 저장
(setq old_st_list (cdr old_st)) ; 10번 dxf 코드 헤더를 제외한 나머지 데이터를 변수로 저장
(setq old_end (assoc 11 o_ent)) ; 10번 dxf 코드를 변수로 저장
(setq old_end_list (cdr old_end)) ; 11번 dxf 코드 헤더를 제외한 나머지 데이터를 변수로 저장
(setq x (nth 0 old_st_list)) ;시작점 x 좌표를 x 변수로 저장
(setq y (nth 1 old_st_list)) ;시작점 y 좌표를 y 변수로 저장
(setq z '0.0) ;0.0을 z 변수로 저장
(setq x1 (nth 0 old_end_list)) ;끝점 x 좌표를 x1 변수로 저장
(setq y1 (nth 1 old_end_list)) ;끝점 y 좌표를 y1 변수로 저장
(setq strp (nth 2 old_st_list)) ; 시작점 z 좌표를 strp 변수로 저장
(setq endp (nth 2 old_end_list)) ; 끝점 z 좌표를 endp 변수로 저장
(if (not (and (= strp 0.0) (= endp 0.0))) ;조건문 시작점과 끝점의 z 좌표가 0.0이 아닐 때 아래 내용을 반복
(progn
(setq assoc_key 10) ;시작점 dxf 코드 10을 변수로 저장
(setq assoc_key1 11) ;끝점 dxf 코드 11을 변수로 저장
(setq new_st (list x y z));x y z 변수를 이용하여 리스트를 작성하고 new_st 변수로 저장
(setq new_end (list x1 y1 z)) ; x1 y1 z 변수를 이용하여 리스트를 작성하고 new_end 변수로 저장
(setq new_change_st (cons assoc_key new_st)) ; cons 함수로 시작점을 dxf코드.리스트) 형식으로 데이터 작성
(setq new_change_end (cons assoc_key1 new_end)); cons함수로 끝점을 dxf코드.리스트) 형식으로 데이터 작성
(setq l_entdata_st (subst new_change_st old_st o_ent)) ;Z값이 있는 시작점을 Z값이 제거된 리스트로 치환
(setq l_entdata_end (subst new_change_end old_end l_entdata_st)) ;Z값이 있는 끝점을 Z값이 제거된 리스트로 치환
(entmod l_entdata_st);subst 함수로 변경된 시작점을 새롭게 출력
(entmod l_entdata_end);subst 함수로 변경된 끝점을 새롭게 출력
)
)
(setq n (+ 1 n)) ;반복하기 위한 조건문
)
(princ)
)
▼ 시작점과 끝점의 Z값이 다른 선 제거 리습 실행