캐드 면적 구하기 리습(LISP)

1. CAD 면적 구하는 리습-LISP

캐드 면적 구하기 리습(LISP)에 대해서 살펴보겠습니다. 지난 포스팅에서 오토캐드 기능을 이용하여 면적을 구하는 방법을 알아보았습니다. 리습(LISP)을 사용하면, 좀 더 빠르고 쉽게 원하는 작업을 진행할 수 있는 장점이 있습니다. 오늘은 면적을 구하는 리습을 간단히 살펴보고, 다양하게 활용할 수 있도록 구문을 해석해보겠습니다.

1) 면적 구하는 리습

먼저 코드의 내용은 아래와 같습니다. 작동 명령은 AAA이며, 선택한 객체의 면적에서 제외할 면적을 계산하여 면적을 계산합니다. 간단히 구문을 살펴보겠습니다.



2) 구문 해석

(1) 면적을 구할 영역 선택

(defun c:AAA (/ p1 p2 co q1 ar ar1 ar2 ar3 ts weo1 weo2 )
▲ 실행 명령어 AAA이며, 사용한 변수들의 목록을 나타냅니다.


(setvar “cmdecho” 0)
▲ SETVAR는 오토캐드 환경 변수 설정입니다. “cmdecho” 0은 CMD 창에 명령 실행 과정을 생략하는 설정입니다.


(setq p1 (getpoint “\n부재의 면을 선택하세요!!!”))(print)
▲ Getpoint는 사용자가 선택한 좌표를 리스트(list)로 변수 p1으로 설정합니다.

(command “boundary” “A” “I” “N” “” “” p1 “” “area” “o” “last” “erase” “last” “”)
▲ boundary, area, erase 명령을 차례대로 실행합니다. 여기서 boundary 설정은 면적을 구하는 영역에 안쪽에 있는 부재는 폴리선 생성을 시키지 않도록 설정하였습니다. 이 설정을 하지 않으면 바깥쪽에 생성된 폴리선은 삭제되지만, 내부에 있는 폴리선은 삭제되지 않아 원본에 폴리선이 남아있습니다. 참고로 명령창에 “-boundary”로 입력하면 대화상자 설정 없이 위 구문에서 사용된 설정을 확인할 수 있습니다.


(setq ar1 (getvar “area”))
▲ 환경 변수 area를 실행하여 면적을 ar1 변수에 저장


(2) 조건문 실행

(initget “Y N”)
(setq q1 (getkword “\n제외할 영역이 있나요? :”))
▲ Initget 함수로 허용되는 문자열 설정. 응답이 Y또는 N이 아닐 경우 유효한 응답을 요구하는 메시지가 표시됩니다. 응답을 요구하는 메시지에는 아래 구문의 getkword 함수와 같이 사용되며, 입력된 문자는 q1 변수로 지정됩니다.


(if (null q1) (setq q1 “N”))
(cond ((or (= q1 “N”) (= q1 “n”)) (setq co 0))
▲ 변수 q1이 null이면, 변수 “N”으로 설정함 (제외할 부재가 없을 때 설정)
▲ 변수 q1가 N또는 n이면, 변수 co를 0으로 지정


((or (= q1 “Y”) (= q1 “y”)) (setq co 1)))
▲ 변수 q1이 Y또는 y이면, 변수 co를 1로 지정 (제외할 부재가 있을 때 설정)

(if (= co 1)
(progn
(setq ar3 0)
(while
(setq p2 (getpoint “\n제외 면적 선택”))(print)
(command “boundary” p2 “” “area” “o” “last” “erase” “last” “”)
(setq ar2 (getvar “area”))
(setq ar3 (+ ar2 ar3))
(setq ar (- ar1 ar3)))
▲ if 조건이 true(co = 1)이면, 아래 구문이 작동합니다. progn 함수는 표현식을 순서대로 실행합니다. 이때 while 함수를 통해 제외할 면적 선택을 반복시킬 수 있습니다. ar3 변수는 제외할 면적을 누적하는 데이터로 초기값을 0으로 설정합니다. 제외할 면적이 선택을 선택하면 ar2 변수에 저장되고 ar1 변수와 연산하여 최종 면적을 ar 변수에 저장합니다.


(setq ar ar1)
▲ if가 false(co = 0)일 때 실행하며, 제외할 면적이 없으므로 처음 계산한 면적을 AR 변수로 지정


)
▲ if 구문 완료


(3) 출력

(setq we3 (/ ar 1000000))
(setq we4 (rtos we3 2 2))
▲ 면적 ㎟을 ㎡으로 계산하여 we3 변수로 지정.
▲ we3 변수를 10진수(Decimal), 소수점 2자리로 표현하는 문자열로 변환 후 we4 변수로 지정



(setq we5 (/ (/ ar 1000000) 3.30578512))
(setq we6 (rtos we5 2 4))
▲ 면적을 평으로 계산하여 we5 변수로 지정
▲ we5 변수를 10진수, 소수점 2자리로 표현하는 문자열로 변환 후 we6 변수로 지정


(SETQ ts (* 1.0 (GETVAR “dimscale”)))
▲ 오토캐드에 설정된 dimscale 값을 불러와 ts 변수로 지정 (설정값을 사용하기 위해 1.0을 곱함)

(setq weo1 (strcat “Area = ” we4 ” m\U+00b2″))
(setq weo2 (strcat we6 ” py”))
▲ strcat 함수를 사용하여 문자열을 결합하여 화면에 표시할 서식 작성


(command “text” p1 ts “” weo1 “”)
(command “text” “” weo2)
▲ text 명령을 실행하여 면적 정보를 출력합니다. 출력되는 위치는 면적을 구하기 위해 선택한 위치에 표시합니다.


(setvar “cmdecho” 1)
(PRINC)
)
▲ cmdecho 값을 다시 1로 설정. 리습 종료


(4) 면적 리습 실행

면적 구하는 리습은 명령어 AAA를 입력하여 실행합니다. 면적을 구할 부재의 면을 선택합니다. 만약 제외할 면적이 있다면 “Y” 또는 “y”를 입력하고 제외할 면적을 선택합니다. 제외할 면적 선택이 끝나면 ENTER 나 SPACE를 입력하면 ㎡과 평이 계산되어 화면에 출력됩니다.

마치며

캐드에서 면적을 구하는 리습(LISP) 코드를 살펴보았습니다. 내용을 이해했다면 사용자에게 맞게 코드를 수정하여 사용할 수 있습니다. 함수에 대한 설명을 따로 하지 않고 구문 중심으로 해석하며 진행했습니다. 함수를 실제로 적용하는 방법을 익히면 LISP을 이해하고 접근하기 쉬워집니다. 함수에 대한 정의는 아래 링크로 확인하시기 바랍니다.

https://help.autodesk.com/view/OARX/2023/ENU/?guid=GUID-4CEE5072-8817-4920-8A2D-7060F5E16547

Leave a Comment