1. 객체 선택 리습 LISP 만들기
AUTOCAD에서 객체(entity)는 dxf 코드로 구성되어 있습니다. 지난 시간에 다룬 DXF 코드에서 객체가 표현되는 방법에 대해서 다루었습니다. 오늘은 DXF 코드를 이용하여 Autolisp의 함수를 통해 객체를 선택하는 리습을 작성해 보겠습니다. 코드 작성은 메모장을 실행하고 코드를 입력 후 “파일명.LSP” 형식으로 저장합니다. 리습을 불러오는 방법과 DXF 코드에 관해서는 아래 남긴 포스팅을 참고하세요
오토캐드(AUTO CAD) DXF 코드 조회 리습 LISP
오토캐드(AUTO CAD) 리습 LISP 추가하기
2. 객체 선택 리습(lisp)에 사용할 함수
객체 선택을 위한 리습(lisp)을 작성하기 위해 사용하는 함수와 변수들에 대해서 간략하게 설명하겠습니다. 리습 함수에 관한 내용은 아주 방대하고 너무 깊게 파고들면 흥미를 잃을 수 있어 간략하게 설명하겠습니다. 필요한 내용은 상황에 맞게 리습을 작성하면서 설명하겠습니다.
1) defun
함수를 정의하는 부분으로 쉽게 말해 실행하기 위한 단축키를 지정한다고 생각하면 됩니다. “(defun c: 명령어()” 이렇게 사용합니다. 명령어 뒤에 있는 괄호는 “/ 지정한 변수”들을 나열해 줍니다. 괄호가 열려있으면 닫아야 하는 구조이므로 괄호 입력에 주의해야 합니다.
2) setq
변수를 정의하기 위한 함수로 “set quote”의 약자입니다. 입력된 홀수 번호는 변수로 인식하며, 짝수 번호는 값으로 인식합니다. 숫자로 시작하는 변수는 사용할 수 없으며, 문자+숫자 형태로 사용하거나 문자로만 사용해야 합니다. 또한 변수에 사용하는 문자는 영문을 사용하시기 바랍니다. (한글 사용 시 문제가 발생할 수 있음) 단, 변수 이름은 AutoCAD에서 사용하는 명령이나 AutoLisp의 함수명을 사용할 수 없습니다.
3) ssget
여러 객체(entity)를 동시에 선택할 수 있는 함수입니다. 자동으로 종료되지 않기 때문에 선택 완료 후 ENTER 나 마우스 오른쪽을 클릭해야 합니다.
① (ssget “L”) – 마지막에 생성한 객체 (데이터베이스에 추가된 마지막 객체)
② (ssget “I”) – PICKFIRST가 ON인 상태에서 선택/생성한 객체
③ (ssget “P”) – 이전에 선택한 객체 및 선택 세트
④ (ssget “W” pt1 pt2) – Window로 객체 선택 (pt는 마우스 선택 지점)
⑤ (ssget “C” pt1 pt2) – Crossing으로 객체 선택
⑥ (ssget “X”) – 도면 전체에 있는 Entity 선택. 뒤에 filter-list를 지정하면 조건에 해당하는 객체 선택
4) prompt
오토캐드 명령창에 메시지를 출력합니다. 내용 앞에 “\n”을 입력하면 다음 줄로 줄 바꿈 되어 메시지가 출력됩니다. 실행 명령과 함께 표시되는 것을 방지하기 위해 \n을 입력하여 내용을 표시하였습니다.
5) prince
문자를 출력하는 함수로 (prince)의 형태로 사용하면 불필요한 응답 출력을 지워줍니다.
6) sssetfirst
객체를 선택하여 강조하는 함수로 pick-set의 요소를 그립(grip)이 표현되도록 선택합니다. 선택한 객체를 주위 객체와 분리되어 표시(hightlight)할 때 유용합니다.
7) nil
공백이나 숫자 0이 아니며, 현재 값을 확인하거나 테스트할 수 있습니다. 쉽게 메모리에 할당하지 않고 사용할 수 있는 변수라고 이해하시면 됩니다.
3. 객체 선택 리습 작성하기
1) 문자만 선택하는 리습(LISP)
아래 내용에 “명령어”는 리습을 사용할 때 사용할 단축키입니다. 사용하기 전에 원하는 명령어를 입력해야 사용할 수 있습니다. 지정한 명령어를 입력하면 prompt를 통해 “문자만 선택” 메시지가 송출됩니다. 원하는 객체 영역을 선택하고 ssget에 선택을 완료했다는 신호를 주기 위해 Enter 나 space를 입력하면 지정한 영역 안에 있는 문자가 선택됩니다. 여기서 사용된 dxf 코드는 “0”에 해당하는 객체 유형 중에 MTEXT(여러줄 문자), TEXT(문자)를 선택하여 결과값을 나타냅니다. (0 . “객체 유형, 객체 유형”)의 형태로 입력하면 OR(논리곱)에 해당하는 조건으로 나열된 객체 유형을 선택할 수 있습니다.
<Lisp 프로그램 설명>
defun c: 명령어를 입력하여 실행할 단축키를 지정합니다. prompt를 이용하여 “문자만 선택”이라는 텍스트를 출력합니다. 객체 유형이 MTEXT, TEXT인 객체를 ssget 함수를 이용하여 선택합니다. 선택된 객체는 “ss”라는 변수로 저장합니다. 저장된 변수 “ss”를 변수 nil로 지정하고 sssetfirst 함수를 이용하여 변수에 해당하는 객체를 선택하여 그립으로 표시합니다.
(defun c:명령어(/ ss )
(prompt "\n문자만 선택..")
(setq ss (ssget '((0 . "MTEXT,TEXT"))))
(sssetfirst nil ss)
(princ)
)
2) 같은 색상만 선택하는 리습(LISP)
같은 색상을 선택하는 리습(LISP)입니다. 위에 리습과 같이 원하는 “명령어”를 지정하여 사용하시기 바랍니다. 아래 코드에서 색상을 나타내는 DXF 코드 62번을 이용하여 빨간색을 선택하는 리습입니다. 객체 색상은 색인 번호 1번 빨간색, 2번 노란색, 3번 녹색, 4번 하늘색, 5번 파란색, 6번 보라색, 7번은 흰색입니다. 명령어 창에 “COLOR”을 입력하면 다양한 색상 색인 번호를 확인할 수 있습니다. 색상 번호를 확인하셔서 원하는 색상으로 변경하여 사용하시기 바랍니다.
(defun c:명령어(/ ss )
(prompt "\n1번색상만 선택..")
(setq ss (ssget '((62 . 1))))
(sssetfirst nil ss)
(princ)
)
3) 색상, 객체 유형 선택하는 리습(LISP)
AND(논리합)에 해당하는 조건으로 객체를 선택하는 리습을 작성해 보겠습니다. 위에서 작성한 리습과 원리는 같지만, 선택 조건을 변경해야 합니다. (0 . “circle”) (62 . 1)과 같이 괄호를 따로 작성하여 조건을 붙여주면 주어진 조건을 모두 만족하는 객체가 선택됩니다. 아래 리습은 객체 유형은 “원” 이고 색상은 빨간색을 만족하는 객체를 선택하게 됩니다.
(defun c:명령어(/ ss )
(prompt "\nCIRCLE 색상30 선택..")
(setq ss (ssget '((0 . "circle")
(62 . 30))))
(sssetfirst nil ss)
(princ)
)
마치며
오늘은 객체를 선택하는 리습(lisp)을 살펴보았습니다. Autolisp 함수와 dxf 코드를 활용하면 객체 유형, 색상, 레이어가 같은 객체를 쉽게 선택할 수 있습니다. 또한 다양한 조건을 적용하면 원하는 객체를 조금 더 세밀하게 선택할 수 있습니다. 오늘 다룬 ssget 함수를 통해 객체를 선택하고 변수로 적용하는 방법을 자세히 살펴보기 바랍니다. 작성한 리습을 바탕으로 객체의 다양한 dxf 코드를 응용해 보시기 바랍니다. Autolisp을 공부할 때 함수 기능을 전부 알고 시작하기 보다 필요한 함수를 찾아보면서 활용하다 보면 빠르게 접근할 수 있습니다.