1. 선 길이 합계 리습(lisp)
캐드에서 선 길이를 확인하는 방법은 여러 가지 있습니다. 하지만 여러 선의 길이를 한꺼번에 파악하기는 쉽지 않은데요. 오늘은 AutoCAD에서 선 길이 합계 구하는 리습을 작성해보겠습니다. 오늘 작성한 리습은 사용자가 선택한 선(LINE,CIRCLE,ARC,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE)을 모두 합산하여 지정한 위치에 표시하는 리습입니다.
1) 리습 작동 순서
리습을 작성하기 위해 작동 순서를 정해보겠습니다.
① 명령어를 입력한다.
② 객체를 선택한다.
③ 객체 개수(n)를 파악한다.
④ n번 객체 길이를 구한다.
⑤ 구해진 길이를 누적시킨다.
⑥ 객체 개수만큼 반복한다.
⑦ 반복을 마치고 텍스트 위치 및 크기를 지정한다.
⑧ 표시할 텍스트의 단위 및 표기 방법을 지정한다.
⑨ 화면에 텍스트를 표시한다.
2) 리습 작성 및 구문 해석
(defun C:llp (/ now1 obj n obj1 length length1 length2 txtsize p1)
명령어는 llp로 지정하고 사용할 변수를 입력합니다. 입력된 변수는 리습 구동이 마치면 자동으로 삭제되어 초기화됩니다.(Setq now1(getvar "cmdecho"))
(Setvar "cmdecho" 0)
사용자가 지정한 현재 “CMDECHO”값을 now1 변수로 지정합니다. 이건 리습 구동이 마치면 사용자가 설정한 CMDECHO 설정을 복구하기 위해 사용되는 변수입니다. CMDECHO를 “0”으로 설정하면, 리습이 작동하면서 출력하는 결과값을 숨겨줍니다. 여기서 getvar는 설정을 호출하는 기능이고 setvar는 설정을 새로 지정하는 역할을 하는 함수입니다.(Setq obj (ssget '((0 . "LINE,CIRCLE,ARC,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE"))))
ssget 함수의 필터 기능으로 지정된 객체만 선택하고, 이를 “obj” 변수에 저장합니다.(Setq n 0 length 0)
반복을 위한 n 변수 초기값을 0으로 설정합니다. 길이 누적에 사용되는 변수 length도 초기값을 0으로 설정합니다.
(Repeat (sslength obj)
sslength 함수를 사용하여 선택한 객체의 개수를 구하고 Repeat 함수를 사용하여 반복합니다.(Setq obj1(ssname obj n))
obj 변수에 저장된 선택 세트 n번째 객체를 obj1 변수로 설정합니다. 위에서 n = 0으로 설정했습니다.(Command "lengthen" obj1 "" "" "")
“lengthen” 명령을 실행하여 객체의 길이를 구합니다. 이건 실제로 캐드 명령 창에서 실행하고 객체를 선택하면 객체의 길이를 표시합니다.
(Setq length (+ length (getvar "PERIMETER")))
(getvar “PERIMETER”)는 AutoCAD에서 마지막에 계산된 길이(둘레)를 불러옵니다. 이 길이를 length 변수에 누적시킵니다.(Setq n (1+ n)))
초기 설정값 0에 1씩 더해 다음 객체를 선택하고, 길이를 구하는 작업을 반복합니다.
(Setq p1 (getpoint "\n텍스트 위치 지정!!!"))
객체의 길이를 표시할 텍스트 위치를 지정합니다.(Setq txtsize(getvar "textsize"))
텍스트 크기는 “textsize”에 지정된 크기를 사용합니다. 캐드 명령 창에 textsize 입력하면 텍스트 크기를 설정할 수 있습니다.(Setq length1 (/ length 1000))
길이를 M 단위로 환산하기 위해 1000으로 나눕니다. 단위를 mm로 사용하려면 1000을 1로 변경하세요.(Setq length2 (rtos length1 2 4))
rtos 함수를 사용하여 10진수, 소수점 4자리로 표시하도록 설정합니다.(COMMAND "text" p1 txtsize "0" (Strcat length2 "M"))
Command 명령을 실행하여 사용자가 지정한 위치에 길이를 “M”로 표시합니다.(Setvar "cmdecho" now1)
(princ))
초기 CMDECHO 값으로 복구 시키고 리습이 종료됩니다.
3) 선 길이 합계 리습
(defun C:llp (/ now1 obj n obj1 length length1 length2 txtsize p1)
(Setq now1(getvar "cmdecho"))
(Setvar "CMDECHO" 0)
(Setq obj (ssget '((0 . "LINE,CIRCLE,ARC,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE"))))
(Setq n 0 length 0)
(Repeat (sslength obj)
(Setq obj1(ssname obj n))
(Command "lengthen" obj1 "" "" "")
(Setq length (+ length (getvar "PERIMETER")))
(Setq n (1+ n))
)
(Setq p1 (getpoint "\n텍스트 위치 지정!!!"))
(Setq txtsize(getvar "textsize"))
(Setq length1 (/ length 1000))
(Setq length2 (rtos length1 2 4))
(COMMAND "text" p1 txtsize "0" (Strcat length2 "M"))
(Setvar "cmdecho" now1)
(princ)
)
4) 리습 실행
선 길이 합계 구하는 리습 실행 영상입니다. 아래 영상과 같이 개별 객체 및 다중 객체를 선택하고 Enter 나 Space 키를 입력합니다. 그 다음 텍스트 위치를 지정하면 전체 길이 합을 표시합니다.