1. 원의 중심선 생성 리습
AutoCAD에서 원의 중심선을 생성하기 위해 사용하는 명령은 “Dimcenter”를 이용하는 방법이 있습니다. 또한 중심선 설정을 위해 “dimcen”을 입력하여 복잡한 설정을 진행해야 합니다. 자주 그리는 원의 사이즈가 고정되있지 않기 때문에 원의 사이즈에 맞는 적절한 중심선을 그리기는 쉽지 않습니다. 회사마다 설정이 다르지만 원 지름의 120%, 150% 등의 비율을 사용하여 중심선의 길이를 설정합니다. 오늘은 선택한 원을 지정한 축척에 맞게 중심선을 그려주는 리습(lisp)을 작성해 보겠습니다. 오늘 작성할 리습의 구성은 ①명령어 입력 ②원 선택 ③ 축척 (비율)입력 ④비율을 적용한 원의 끝점 좌표(상, 하, 좌, 우) 반환 ⑤ 중심선 그리기
1) 원 중심선 그리기 리습(lisp)
원의 중심선을 그리는 리습은 아래와 같습니다. 바쁘신 분들을 위해 먼저 리습 코드 내용을 알려드리겠습니다. 아래 명령어는 “cec”로 설정했지만 원하는 명령어로 변경하여 사용하기 바랍니다. 아래 작성된 리습 사용 방법은 아래 내용을 복사하여 메모장에 붙여넣고 “파일명.lsp”로 저장해서 사용하시면 됩니다. 리습(lisp)을 불러오거나 방법은 아래 포스팅을 참고하세요
(defun c:cec ( / circle now_osmode center radius x-start-point x-end-point y-start-point y-end-point )
(setq circle (car (entsel "\nSelect a circle: ")))
(setq now_osmode (getvar "osmode"))
(setvar "osmode" 0)
(if (and circle (= (cdr (assoc 0 (entget circle))) "CIRCLE"))
(progn
(setq sca (getreal "\n축척을 입력하세요: ")
center (cdr (assoc 10 (entget circle))) ; 원의 중심점 좌표 불러오기
radius (cdr (assoc 40 (entget circle))) ; 원의 반지름 정보 불러오기
x-start-point (list (- (car center) (* radius sca)) (cadr center))
x-end-point (list (+ (car center) (* radius sca)) (cadr center))
y-start-point (list (car center) (- (cadr center) (* radius sca)))
y-end-point (list (car center) (+ (cadr center) (* radius sca)))
)
(command "_LINE" x-start-point x-end-point "")
(command "_LINE" y-start-point y-end-point "")
)
(prompt "\nPlease select a valid circle.")
)
(setvar "osmode" now_osmode)
(princ)
)
2) 오늘 사용할 Autolisp 함수
① entsel 함수
entsel 함수는 사용자로부터 AutoCAD 도면에서 entity(객체)를 선택하도록 하는 함수입니다. 코드에서 사용된 예제: (entsel “\nSelect a circle: “)는 사용자에게 “원을 선택하세요”라는 프롬프트를 표시하고, 사용자가 원을 선택하면 해당 entity 정보를 반환합니다.
② getvar 함수
getvar 함수는 AutoCAD 시스템 변수의 값을 검색하는 함수입니다.
코드에서 사용된 (getvar “osmode”)는 현재 osmode 시스템 변수의 값을 가져옵니다. 이 코드의 용도는 현재 객체스냅(osnap) 설정값을 저장하기 위해 사용합니다. 그럼 여기서 “왜 저장하는데?” 라는 의문이 생깁니다. 원의 중심선을 그리는데 방해가 되는 모든 객체 스냅을 끄고, 중심선 생성이 마치면 이전에 설정된 객체스냅(osnap)값을 복구하기 위함입니다.
③ setvar 함수
setvar 함수는 AutoCAD 시스템 변수의 값을 설정하는 함수입니다.
코드에서 사용된 (setvar “osmode” 0)은 osmode 시스템 변수의 값을 0으로 설정합니다. 위에서 설명한 모든 객체 스냅을 끄기 위한 설정입니다. 여기서 중요한 점은 객체 스냅 정보를 먼저 변수로 저장하고, 객체 스냅(osmode)을 0으로 설정해야 합니다. 순서에 주의하세요.
④ assoc 함수
assoc 함수는 엔티티의 속성을 검색하는 함수입니다.
코드에서 사용된 (assoc 0 (entget circle))는 선택한 원 dxf 코드 정보에서 그룹 코드가 0인 속성을 검색합니다
⑤ getreal 함수
getreal 함수는 사용자로부터 실수 값을 입력받는 함수입니다.
코드에서 사용된 (getreal “\n축척을 입력하세요: “)는 사용자에게 “축척을 입력하세요”라는 프롬프트를 표시하고, 사용자가 입력한 실수 값을 반환합니다. 만약 1을 입력하면 원의 반지름과 동일한 중심선을 그리게 되며, 1.5를 입력하면 반지름의 1.5배에 해당하는 중심선이 작성됩니다.
⑥ command 함수
command 함수는 AutoCAD 명령을 실행하는 함수입니다.
코드에서 사용된(command “_LINE” x-start-point x-end-point “”)는 _LINE 명령을 실행하여 x축을 그립니다. 하단에 있는 “command” 문은 y축의 중심선을 그립니다. 오늘 작성된 리습에는 “line” 명령을 실행하여 좌표 대신 이미 계산된 변수가 사용되었습니다.
⑦ progn 함수
progn은 AutoLISP에서 여러 문장을 그룹화하는 데 사용되는 함수입니다.
progn 함수는 괄호 안에 포함된 모든 문장을 순차적으로 실행하며, 그 결과는 가장 마지막 문장에 나타냅니다.
<예시>
(progn
(setq x 10) ; 변수 x에 10을 할당
(setq y 20) ; 변수 y에 20을 할당
(+ x y) ; x와 y를 더한 결과를 반환
)
위의 코드에서 progn 함수는 x와 y에 값을 할당하고, 마지막 문장에서는 x와 y를 더한 값을 반환합니다. 참고로 Autolisp의 연산은 맨 앞에 연산자를 제시합니다.
⑧ if 함수
if 함수는 조건에 따라 동작을 수행하는 데 사용되는 함수입니다.
if 함수는 세 가지 인수를 가집니다. 첫 번째 인수는 조건, 두 번째 인수는 조건이 참일 때 수행할 동작, 세 번째 인수는 조건이 거짓일 때 수행할 동작입니다. 주로 progn 함수와 함께 많이 사용됩니다.
⑨ 조건문 추가 해석
(if (and circle (= (cdr (assoc 0 (entget circle))) “CIRCLE”))
오늘 사용된 if 함수를 사용하여 조건을 만족시키는 구문입니다. 조건을 만족하기 위해 and 함수를 사용하여 두 조건이 모두 circle을 만족하면 “참”에 해당하는 조건을 실행합니다.
⑩ 좌표 구하기 list 함수
x-start-point (list (- (car center) (* radius sca)) (cadr center)) ; 중심점 x좌표 – 반지름*비율 , 중심점y좌표
x-end-point (list (+ (car center) (* radius sca)) (cadr center)) ; 중심점 x좌표 + 반지름*비율 , 중심점y좌표
y-start-point (list (car center) (- (cadr center) (* radius sca))) ; 중심점 x좌표 , 중심점y 좌표 – 반지름*비율
y-end-point (list (car center) (+ (cadr center) (* radius sca))) ; 중심점 x좌표 , 중심점y 좌표 + 반지름*비율
위에 작성된 수식은 list 함수를 사용하여 각 포인트에 좌표(x,y)를 생성하는 방법입니다.
“;” 뒤에 입력된 내용은 설명을 붙이기 위한 부분으로 리습(lisp) 파일 안에 작성해도 load 되지 않습니다. 원의 중심선을 그리기 위한 4개의 점을 구하는 과정이니 천천히 확인해보세요.
마치며
오늘은 선택한 원의 중심선을 생성하는 리습(lisp)을 작성해 보았습니다. 오늘은 if 함수, progn 함수를 사용하여 조건을 설정하는 방법과 list 함수를 사용하여 좌표를 생성하는 방법을 새롭게 알아보았습니다. 전체적인 리습을 구성하는 방법을 알고 어떻게 객체를 편집할 것인지 파악해야 리습 작성을 쉽게 접근할 수 있습니다. 리습 작성 전에 어떻게 구성할 것인지 동작 리스트를 작성하는 것도 하나의 방법입니다. 오늘 내용이 도움이 되셨기 바랍니다.