오토캐드(AUTO CAD) 레이어 ON/OFF 리습 LISP 만들기

1. 레이어(layer) 켜기(ON) 끄기(OFF) 리습 만들기

오늘은 AUTOLISP 함수를 통해 선택한 레이어만 켜기(ON), 선택한 레이어 끄기(OFF), 전체 레이어 켜기, 현재 도면층 설정하기를 실행할 수 있는 리습(LISP)을 작성해 보겠습니다. 도면층에 관련된 명령어가 있지만 조금 더 쉽고 빠르게 실행할 수 있게 리습을 만들어 보겠습니다.

1) 사용할 함수

① Entsel
지난 포스팅에서 다룬 ssget는 여러 개의 entity를 선택할 수 있었지만, Entsel은 한 개의 entity만 선택할 수 있습니다. 또한 명령을 실행하기 위한 메시지 입력도 가능합니다.
선택한 객체의 entity 아래 예시와 같이 이름과 선택한 좌표를 반환합니다.
예시 ▶ (<도면요소 이름: 29e70263d90> (283234.0 651193.0 0.0))

② Entget
객체의 정보 확인할 때 사용하는 함수입니다. “도면 요소 이름”을 지정해주면 entity 리스트(dxf 코드)를 반환합니다.

③ Car
리스트 형식의 데이터에서 첫 번째 요소를 반환합니다.

④ Cdr
리스트 형식의 데이터에서 첫 번째 요소를 제외한 나머지 요소를 반환합니다. 예를 들어(8. “0”)과 같이 도면층(레이어) dxf 코드에서 도면층 이름만 사용하기 위해 cdr 함수를 사용할 수 있습니다. 오늘 다룰 도면층 on/off 리습 코드에서 사용하는 방법을 확인해보세요

⑤ Assoc
entget을 통해 객체의 dxf 코드를 불러올 수 있다고 설명했습니다. 이 dxf 코드 리스트에서 원하는 값을 검색하여 불러오는 함수입니다.

⑥ Command
AutoCAD 명령창에서 실제로 명령을 실행하기 위한 과정을 입력할 수 있습니다. “” 는 명령을 실행하기 위한 Enter 나 Space의 역할을 합니다. 실행에 필요한 명령어, 좌표, 선택 옵션은 앞뒤로 “를 추가하여 사용합니다.
예시 ▶ (Command “line” “0,0” “500,500” “”) 오토캐드 명령어창에 입력하면 시작점 0,0 끝점 500,500에 선을 그려줍니다.


2) 현재 레이어(LAYER) 설정 리습(LISP)

(defun C:LS (/ En SEN NEN)
(SETQ En (CAR (ENTSEL ">>현재로 설정할 레이어를 선택하세요")))
	(SETQ SEN (ENTGET En))
	(SETQ NEN (CDR (ASSOC 8 SEN)))
	(COMMAND "-LAYER" "SET" NEN "")
	(PRINC)
)

선택한 레이어를 현재 설정된 레이어(LAYER)로 변경하는 리습입니다. 이 리습은 현재 설정된 레이어는 끄기를 실행할 수 없으므로 다른 레이어를 선택하여 빠르게 변경하기 위해 사용합니다. 실행 명령어는 “LS”이지만 용도에 맞게 변경하여 사용하시기 바랍니다.


<리습 코드 해석 ▼>

“Entsel” 함수를 이용하여 객체를 선택합니다. 선택된 객체(entity)의 이름과 좌표가 반환되지만 “CAR” 함수에 의해 “도면 요소 이름”만 변수 “En”으로 설정합니다. 변수 “En”은 “Entget”함수를 통해 선택한 객체의 dxf 코드 리스트를 반환하며, 이때 반환된 dxf 코드 리스트는 변수 “SEN”으로 지정합니다. 변수 “SEN” 안에 객체를 구성하고 있는 다양한 dxf 코드 리스트가 포함되어 있습니다. Assoc 함수를 이용하여 변수 “SEN” 안에 있는 코드중 8(도면층)에 해당하는 리스트를 검색합니다. “CDR” 함수를 통해 도면층 이름만 변수 “NEN”으로 지정합니다. 이제 변수 “NEN”에는 도면층 이름만 남아 있는 상태가 됩니다. Command 문을 작성하여 선택한 레이어를 현재 레이어로 변경하는 과정을 입력합니다. 여기서 의문을 가지게 되는 부분이 “-Layer”인데, 명령을 실행하면 “도면층 특성 관리자”를 실행하지 않고 키보드 입력으로 옵션을 실행시킬 수 있습니다.


<함수 실행 과정 ▼>

선택 객체의 “도면 요소 이름”을 불러와서 dxf 코드 리스트를 추출하고 변수로 지정합니다. 그리고 지정된 변수의 필요한 정보를 추출하여 다시 다른 이름의 변수로 지정합니다. 이 과정에서 최종적으로 필요한 변수는 “NEN”의 도면층 이름을 추출할 수 있습니다. 추출된 변수는 Command 문에 활용하여 필요한 명령을 실행하는 데 사용됩니다.

3) 레이어(layer) 끄기(OFF) 리습(LISP)

(defun C:HL (/ En SEN NEN)
(SETQ En (CAR (ENTSEL "숨길 레이어를 선택하세요")))
	(SETQ SEN (ENTGET En))
	(SETQ NEN (CDR (ASSOC 8 SEN)))
	(COMMAND "-LAYER" "OFF" NEN "")
	(PRINC)
)

현재 선택한 도면층(LAYER)를 끄기(OFF) 위한 리습입니다. 리습을 실행하고 객체를 선택하면 선택한 객체의 도면층을 끌 수 있습니다. 객체(entity) 선택 과정 및 변수를 추출하는 과정은 위에서 다룬 내용과 똑같고 Command 문에 작성된 명령만 다릅니다. 함수 동작과 기능은 같기 때문에 자세한 설명을 생략하도록 하겠습니다. 실행 명령은 중복되지 않게 수정하여 사용하시기 바랍니다.(현재는 “HL”로 설정돼있음)

4) 선택한 레이어(layer) 만 켜기(ON) 리습

(defun ACL: (/ En SEN NEN)
(SETQ En (CAR (ENTSEL "보여질 레이어를 선택하세요")))
	(SETQ SEN (ENTGET En))
	(SETQ NEN (CDR (ASSOC 8 SEN)))
	(PRINC)
(COMMAND "-LAYER" "s" NEN "off" "*" """")
)

선택한 도면층(layer)만 보이고 나머지는 모두 끄기를 실행하는 리습입니다. 명령을 실행하고 도면층(layer)을 선택하면 선택한 도면층을 제외한 나머지 도면층은 모두 꺼집니다. 앞서 설명한 Autolisp 함수는 동일하고 Command 만 변경되었습니다.

5) 모든 레이어(layer) 켜기 리습

(defun C:AA () 
(COMMAND "-LAYER" "on" "*" "")
)

모든 레이어(도면층)을 켜는 리습 입니다. 특정 레이어가 꺼졌을 때 모든 레이어를 복구시킬 수 있습니다. 따로 객체를 선택하거나 변수가 필요하지 않기 때문에 Command 문으로만 작성하였습니다. 위에 사용된 실행 명령어(AA)는 임의로 지정한 명령어입니다. 사용할 때 중복되지 않도록 다시 설정하여 사용하시기 바랍니다.

Leave a Comment