1. 중량 구하는 리습
지난 시간에는 오토캐드(AutoCAD)에서 면적을 구하는 리습을 살펴보았습니다. boundary 명령을 이용하여 면적을 구하고, 표시할 단위에 맞게 계산 및 출력하는 리습이었습니다. 오늘은 면적 구하는 리습을 조금 수정하여 중량을 구하는 리습을 작성해보겠습니다. 오늘 다룰 내용은 2D 도면의 중량을 계산할 수 있는 리습입니다. 주로 일정한 면적에 두께가 있는 철판이나 부재를 계산할 때 사용합니다. 복잡한 형상의 중량은 카티아(catia), 솔리드웍스(solidwork), 인벤터(Inventor), 솔리드 엣지(Solid Edge) 등과 같은 3D 설계 프로그램을 활용하기 바랍니다.
서론이 길었네요. 먼저 중량 구하는 리습(lisp)은 아래와 같습니다. 면적 구하는 리습과 비슷하지만, 두께를 입력받는 구문과 중량을 구하기 위한 계산식이 적용되었습니다. 오늘 내용의 이해를 돕기 위해 지난 시간에 다룬 면적 구하기 리습 내용을 참고하시기 바랍니다.
(defun c:we1 (/ p1 p2 co q1 ar ar1 ar2 ar3 we we2 tnum ts weo )
(setvar "cmdecho" 0)
(setq p1 (getpoint "\n부재의 면을 선택하세요!!!"))(print)
(setq tnum (getreal "두께를 입력하세요[mm] : "))
(command "boundary" "A" "I" "N" "" "" p1 "" "area" "o" "last" "erase" "last" "")
(setq ar1 (getvar "area"))
(initget "Y N")
(setq q1 (getkword "\n제외할 영역이 있나요? <Y/N>:"))
(if (null q1) (setq q1 "N"))
(cond ((or (= q1 "N") (= q1 "n")) (setq co 0))
((or (= q1 "Y") (= q1 "y")) (setq 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))
)
(setq ar ar1)
)
(setq we (/ (* 7.85 tnum ar) 1000000))
(setq we2 (rtos we 2 2))
(setq ts (* 1.0 (getvar "dimscale")))
(setq weo (strcat "weight = " we2 " Kg"))
(command "text" p1 ts "" weo)
(setvar "cmdecho" 1)
(PRINC)
)
2. 구문해석
중량 구하기 리습에 관한 간단한 구문해석입니다. Autolisp 함수에 대해 자세히 알고 싶다면 AutoCAD에서 제공하는 함수 메뉴얼을 참고하세요. 링크는 아래 남겨두겠습니다.
1) 두께 및 영역 지정
면적 구하는 리습에서 다루었던 내용이지만 리습 작동의 흐름을 이해하기 위해 간단한 설명을 덧붙였습니다. 면적 리습의 내용을 전부 이해했다면 굵은 글씨로 표시한 부분만 확인하시기 바랍니다. 굵은 글씨는 중량을 구하기 위해 두께를 입력받는 구문입니다.
(defun c:we1 (/ p1 p2 co q1 ar ar1 ar2 ar3 we we2 tnum ts weo )
▲ 실행 명령은 WE1 이며, 사용한 변수를 나열하고 있습니다.
(setvar “cmdecho” 0)
▲ 실행 과정을 CMD창에 표시하지 않도록 설정합니다.
(setq p1 (getpoint “\n부재의 면을 선택하세요!!!”))(print)
▲ getpoint 함수를 사용하여 마우스로 선택한 좌표를 입력받습니다. 입력된 좌표는 변수 P1으로 지정합니다.
(setq tnum (getreal “두께를 입력하세요[mm] : “))
▲ getreal 함수로 입력된 데이터를 실수형으로 변환하여 tnum 변수로 지정합니다.
(command “boundary” “A” “I” “N” “” “” p1 “” “area” “o” “last” “erase” “last” “”)
(setq ar1 (getvar “area”))|
▲ 폴리선을 생성하여 바깥쪽 면적을 계산합니다.
2) 조건문 실행
(initget “Y N”)
(setq q1 (getkword “\n제외할 영역이 있나요? :”))
(if (null q1) (setq q1 “N”))
(cond ((or (= q1 “N”) (= q1 “n”)) (setq co 0))
((or (= q1 “Y”) (= q1 “y”)) (setq co 1)))
▲ 입력 Y 또는 N에 따른 변수를 지정합니다. 대 소문자 구분없이 동작하기 위한 조건을 지정하였으며, 조건에 따른 변수를 설정합니다.
(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)))
▲ 제외할 영역이 있을 때 동작을 지정합니다. 제외 면적이 추가되면 ar3 변수에 누적하여 계산합니다. 면적을 통해 중량을 구하는 과정이니 다음 단계에서 계산하는 방법을 확인하시기 바랍니다.
(setq ar ar1))
▲ 제외 영역이 없을 때 처음 선택한 면적을 ar 변수로 지정합니다.
3) 출력
(setq we (/ (* 7.85 tnum ar) 1000000))
▲ 중량을 구하기 위한 공식으로 비중 * 두께 * 면적을 계산합니다. 단위를 kg으로 표시하기 위해 1,000,000으로 나눈 값을 적용하였습니다. 7.85는 철의 비중이며 자주 사용되는 재질의 비중은 아래 내용을 참고하세요.
알루미늄 : 2.7, SUS304 : 7.9, SUS316 : 7.945, 구리: 8.96
(setq we2 (rtos we 2 2))
(setq ts (* 1.0 (getvar “dimscale”)))
(setq weo (strcat “weight = ” we2 ” Kg”))
▲ 10진수 소수점 2자리까지 표현하도록 설정하며 중량을 표시하기 위한 단위(kg)를 지정합니다.
(command “text” p1 ts “” weo “”)
(setvar “cmdecho” 1)
(PRINC))
▲ 계산된 중량을 화면에 출력합니다. 출력되는 위치는 마우스로 지정한 p1 위치에 출력됩니다.
4) 중량 구하기 리습 실행
위에서 작성한 리습(lisp)을 실행하여 중량을 구해보겠습니다. 사용하기 앞서 중량을 구할 부재는 오토캐드 실행화면 안에 전부 표시되어 있어야 합니다. 또한 출력되는 텍스트의 크기는 dimscale 설정값에 따라 표시됩니다. 텍스트가 너무 크거나 작게 표시되면 dimscale 설정을 확인하시기 바랍니다.
<실행 순서>
① 제외할 영역이 없을 때
중량을 구하기 위한 영역 선택 → 두께 입력 → 제외할 부재 영역이 있나요? “N”입력 또는 Enter → 중량 산출
② 제외할 영역이 있을 때
중량을 구하기 위한 영역 선택 → 두께 입력 → 제외할 부재 영역이 있나요? “Y”입력 → 제외할 영역 선택 중량 산출