상세 컨텐츠

본문 제목

AutoLISP의 도형 이름 함수

IT & Programming/LISP 공부

by 그림아이 2021. 12. 25. 02:00

본문

반응형

이번 기사에서는 도형명 함수에 대해 해설합니다.

갑작스럽지만, CAD의 사용으로 이런 고민을 가지고 있지 않을까요.

  • 명령을 사용하여 도형을 조작하는 것이 번거로움
  • 수작업을 줄이고 자동화하고 싶습니다.

그럴 때는 도형명 함수를 활용합시다!

도형의 이동이나 삭제, 사이즈의 변경 등 도형에 관한 수고로 귀찮은 작업을 자동화할 수 있습니다. AutoCAD의 작업을 효율화하고 편해지고 싶은 분은 꼭 봐 주세요.

 

도형명 함수란?

도형명 함수는 도형명을 취득하거나 도형명을 이용해 도형을 조작하는 함수입니다. 레이블에 할당 된 도면에 각각의 모양, 그리고  호출되는 형상 이름을 .

후술하는 entget에서는 도형명으로부터 도형 정의 데이터를 취득할 수 있습니다. 도형에 대해 섬세한 조작을 할 수 있으므로 매우 편리합니다.

도형 정의 데이터란?

도형 정의 데이터란 간단히 말하면 도형을 정의하는 데이터 입니다. 도면층, 선종류, 좌표 등 도형을 정의하는 데 필요한 파라미터가 대응하는 그룹 코드와 세트로 되어 있습니다.

또, 파라미터의 재기입에 의해 도형을 조작하는 것이 가능합니다.

 

설명을 위해 요소를 일부 생략하고 있지만, 도형 정의 데이터는 다음과 같은 리스트로 표현됩니다.

((-1 . 도형명) (0 . "CIRCLE") (10 . 100.0 150.0 0.0))

각 요소의 왼쪽에 있는 숫자(-1, 0, 10)는 그룹 코드 이고 오른쪽은 매개변수를 나타냅니다. 그룹 코드는 각 파라미터에 할당된 숫자 입니다. 예를 들면 도형종이라면 "0", 좌표라면 "10" 등 다수 존재합니다.

 

미리 할당된 그룹 코드에 대한 설명은 다음과 같습니다.

 

그룹 코드 설명
-5 APP: 불변 리액터 체인
-4 APP : 조건 연산자 (반드시 ssget 과 함께 사용)
-3 APP : 확장 데이터 (XDATA) 표시 (고정)
-2 APP: 도형명 참조(고정)
-1 APP: 도형명 도형명은 도면을 열 때마다 바뀝니다. 저장되지 않음 (고정)
0 도형 유형을 나타내는 텍스트 문자열 (고정)
1 도형에 대한 주요 텍스트 값
2 이름 (속성 이름, 블록 이름 등)
3-4 기타 텍스트 및 이름 값
5 도형 핸들, 최대 16 자리 16 진수 텍스트 문자열 (고정)
6 선종명(고정)
7 문자 스타일 이름 (고정)
8 도면층 이름(고정)
9 DXF : 변수 이름 식별자 (DXF 파일의 HEADER 섹션에서만 사용됨)
10 주요 포인트. 선 또는 문자 도형의 시작점, 원의 중심 등.
DXF : 주요 점의 X 값 (이후 Y  Z 값 코드 20 및 30이옵니다)
APP : 3D 점 (3 개의 실수 목록)
11-18 기타 포인트
DXF : 다른 점의 X 값 (이후에는 Y 값의 코드 21-28 및 Z 값의 코드 31-38이옵니다).
APP : 3D 점 (3 개의 실수 목록)
20, 30 DXF: 주요 점의 Y 및 Z 
21-28, 31-37 DXF: 다른 점의 Y  Z 
38 DXF: 도형의 고도(0이 아닌 경우)
39 셰이프 두께 (0이 아닌 경우) (고정)
40-48 배정도 부동 소수점 값(문자 높이, 척도 등)
48 선종류 척도. 스칼라 배정도 부동 소수점 값. 기본값은 모든 도형 유형에 대해 정의됩니다.
49 반복되는 배정밀도 부동 소수점 값. LTYPE [선종류] 테이블의 대시 길이와 같은 가변 길이 테이블의 경우 하나의 셰이프에 여러 그룹 49가 나타날 수 있습니다. 첫 번째 그룹 49 앞에는 항상 테이블 길이를 나타내는 그룹 7 x 가 나타납니다.
50-58 각도 (DXF 파일의 경우 각도, AutoLISP 및 ObjectARX 응용 프로그램의 경우 라디안으로 출력)
60 도형의 가시성. 정수 값. 존재하지 않는 경우나 0(제로)의 경우는 가시, 1 은 불가시를 나타냅니다.
62 색 번호(고정)
66 후속 도형 플래그(고정)
67 공간, 모델 공간 또는 종이 공간 (고정)
68 APP: 뷰포트가 켜져 있고 화면에 표시되지 않았는지 여부를 나타냅니다. 즉, 비활성인지 아니면 꺼져 있는지를 나타냅니다.
69 APP: 뷰포트 식별 번호
70-78 반복 수, 플래그 비트, 모드 등의 정수 값
90-99 32비트 정수 값
100 서브 클래스 데이터 마커(파생 클래스명이 캐릭터 라인으로서 부속). 다른 특정 클래스에서 파생된 모든 개체 클래스와 셰이프 클래스에 필요합니다. 하위 클래스 데이터 마커는 동일한 개체에 대한 상속 체인 내에서 서로 다른 클래스에 의해 정의된 데이터를 분리합니다.
또한 ObjectARX에서 파생된 각 명확한 특정 클래스에 대한 DXF 이름이 필요합니다( 서브클래스 마커 참조).
102 제어 문자열에서 "{<임의의 이름>" 또는 "}"가 뒤에옵니다. 확장 데이터 그룹 코드 1002와 비슷하지만 문자열이 "{"로 시작하면 응용 프로그램에서 해석되는 모든 문자열을 계속할 수 있습니다. 그 밖에 허용되는 유일한 제어 문자는 "}"로, 그룹의 종단을 나타냅니다. AutoCAD는 도면 감사를 제외하고는 이러한 문자열을 해석하지 않습니다. 이러한 문자열은 응용 프로그램에서 사용됩니다.
105 DIMVAR 기호 테이블 항목의 객체 핸들
110 UCS 원점 (코드 72가 1 인 경우에만 나타납니다)
DXF: X 값, APP: 3D 점
111 UCS의 X 축 (코드 72가 1 인 경우에만 나타납니다)
DXF: X 값, APP: 3D 벡터
112 UCS Y 축 (코드 72가 1 인 경우에만 나타납니다)
DXF: X 값, APP: 3D 벡터
120-122 DXF : UCS 원점, UCS X 축, UCS Y  Y 
130-132 DXF : UCS 원점, UCS X 축, UCS Y 축 Z 값
140-149 배정도 부동 소수점 값 (예 : 점, 고도, 치수 스타일에 대한 다양한 설정)
170-179 16 비트 정수 값 (예 : DIMSYTLE 설정을 나타내는 플래그 비트)
210 압출 방향(고정)
DXF: 돌출 방향의 X 
APP: 3D 돌출 방향 벡터
220, 230 DXF: 돌출 방향의 Y  Z 
270-279 16비트 정수 값
280-289 16비트 정수 값
290-299 진위 플래그 값
300-309 모든 텍스트 문자열
310-319 모든 바이너리 청크. 그룹 코드 1004와 동일한 표현 형식 및 제한. 최대 127바이트의 데이터 청크를 나타내는 최대 254자의 16진수 문자열입니다.
320-329 모든 객체 핸들. "있는 그대로" 얻은 핸들 값. INSERT [블록 삽입] 및 XREF [외부 참조] 명령 조작으로 변환되지 않습니다.
330-339 소프트 포인터 핸들. 동일한 DXF 파일 또는 도면의 다른 객체에 대한 임의의 소프트 포인터. INSERT [블록 삽입] 및 XREF [외부 참조] 명령 조작으로 변환됩니다.
340-349 하드 포인터 핸들. 동일한 DXF 파일 또는 도면의 다른 개체에 대한 모든 하드 포인터. INSERT [블록 삽입] 및 XREF [외부 참조] 명령 조작으로 변환됩니다.
350-359 소프트 소유자 핸들. 동일한 DXF 파일 또는 도면의 다른 개체에 대한 모든 소프트 소유권 링크. INSERT [블록 삽입] 및 XREF [외부 참조] 명령 조작으로 변환됩니다.
360-369 하드 소유자 핸들. 동일한 DXF 파일 또는 도면의 다른 개체에 대한 모든 하드 소유권 링크. INSERT [블록 삽입] 및 XREF [외부 참조] 명령 조작으로 변환됩니다.
370-379 선 두께의 열거값(AcDb::LineWeight). 16비트 정수로 저장되어 전송됩니다. 사용자 지정 비 셰이프 개체는 전체 범위를 사용할 수 있지만 셰이프 클래스는 표현에 DXF 그룹 코드 371-379 만 사용합니다. 이는 AutoCAD와 AutoLISP가 모두 그룹 코드 370을 도형의 선 두께로 간주하기 때문입니다. 이렇게 하면 370을 사용하여 다른 "공통" 셰이프 필드처럼 작동할 수 있습니다.
380-389 인쇄 스타일명의 타입의 열거 (AcDb::PlotStyleNameType). 16비트 정수로 저장되어 전송됩니다. 사용자 지정 비 셰이프 개체는 전체 범위를 사용할 수 있지만 위의 선 두께 범위와 동일한 이유로 셰이프 클래스는 해당 표현에 DXF 그룹 코드 381-389 만 사용합니다.
390-399 인쇄 스타일 이름 개체의 핸들 값을 나타내는 문자열로, 기본적으로 하드 포인터이지만 하위 호환성을 해결하기 위해 다른 범위를 갖습니다. 오브젝트 ID(DXF의 핸들) 및 AutoLISP는 특수한 유형으로 저장되고 전송됩니다. 사용자 지정 비 셰이프 개체는 전체 범위를 사용할 수 있지만 위의 선 두께 범위와 동일한 이유로 셰이프 클래스는 해당 표현에 DXF 그룹 코드 391-399 만 사용합니다.
400-409 16비트 정수
410-419 문자열
420-427 32비트 정수 값. True Color를 사용할 때 24비트 색상 값을 나타내는 32비트 정수입니다. 최상위 바이트(8비트)는 0, 최하위 바이트는 청색의 값(0 - 255)을 가지는 부호 없음의 문자, 다음에 녹색의 값으로, 상위 2위 바이트는 빨강의 값입니다. 이 정수 값을 16진수로 변환하면 다음 비트 마스크가 됩니다: 0x00RRGGBB. 예를 들어, 빨강==200, 녹색==100, 청==50의 true color는 0x00C86432로, DXF에서는 10진수로 13132850이 됩니다.
430-437 문자열. True Color 에 사용하는 경우, 색의 이름을 나타내는 캐릭터 라인이 됩니다.
440-447 32비트 정수 값. True Color에 사용하는 경우 투명 값
450-459 긴 정수
460-469 배정도 부동 소수점 값
470-479 문자열
480-481 하드 포인터 핸들. 동일한 DXF 파일 또는 도면의 다른 개체에 대한 모든 하드 포인터. INSERT [블록 삽입] 및 XREF [외부 참조] 명령 조작으로 변환됩니다.
999 DXF: 그룹 코드 999는 다음 줄이 주석 문자열임을 나타냅니다. SAVEAS [다른 이름으로 저장] 명령은 DXF 출력 파일에이 그룹을 삽입하지 않지만 OPEN [열기] 명령은 수락하고 주석으로 무시합니다. 그룹 999를 사용하여 사용자가 편집한 DXF 파일에 주석을 삽입할 수 있습니다.
1000 확장 데이터의 ASCII 문자열 (최대 255 바이트 길이)
1001 확장 데이터 등록 응용 프로그램 이름 (최대 31 바이트 길이의 ASCII 문자열)
1002년 확장 데이터 제어 문자열(" { " 또는 " } ")
1003년 확장 데이터의 레이어 이름
1004년 확장 데이터의 바이트 청크 (최대 127 바이트 길이)
1005년 확장 데이터의 도형 핸들. 최대 16자리의 16진수 텍스트 문자열.
1010 확장 데이터 포인트
DXF : X 값 (이후 그룹 1020 및 1030이옵니다)
APP: 3D 포인트
1020, 1030 DXF: 점의 Y  Z 
1011 확장 데이터의 3D 월드 공간 위치
DXF : X 값 (이후 그룹 1021 및 1031이옵니다)
APP: 3D 포인트
1021, 1031 DXF: 3D 월드 공간 위치의 Y  Z 
1012년 확장 데이터의 3D 월드 공간 변위
DXF : X 값 (이후 그룹 1022 및 1032가옵니다)
APP: 3D 벡터
1022, 1032 DXF: 3D 월드 공간 변위의 Y  Z 
1013년 확장 데이터의 3D 월드 공간 방향
DXF : X 값 (이후 그룹 1022 및 1032가옵니다)
APP: 3D 벡터
1023, 1033 DXF: 3D 월드 공간 방향의 Y  Z 
1040 확장 데이터의 배정도 부동 소수점 값
1041 확장 데이터의 거리 값
1042 확장 데이터의 척도 계수
1070 확장 데이터의 16비트 부호 있는 정수
1071 확장 데이터의 32비트 부호 있는 정수

그룹 코드와 파라미터는 닷으로 사이를 단락짓는 「닷 쌍」이라고 하는 특수한 리스트 형식이 되어 있습니다. 또한 점 쌍을 요소로 가진 목록을 연상 목록이라고합니다.

 도형명에 관한 함수 6종

이번에 소개하는 도형명에 관한 함수는 다음의 6개입니다.

  • 도형 이름과 선택한 좌표를 가져옵니다.
  • 도형 정의 데이터 가져오기 entget
  • 다음에 작성한 도형명을 취득 entnext
  • 마지막으로 작성한 도형명을 취득 entlast
  • 도형 정의 데이터 다시 쓰기 entmod
  • 도형 삭제 / 복원 entdel

도형 이름과 선택한 좌표를 가져옵니다.

entsel은 사용자에게 도형 선택을 요청합니다. 그런 다음 선택한 도형에서 도형 이름을 가져오고 도형 이름과 선택한 좌표 목록을 반환합니다 .

도형명을 취득하고 싶은 도형을 도면상에서 선택하는 경우는 entsel 를 사용하는 것을 추천합니다. 도형 이름이 요소의 첫 번째이고 선택한 좌표가 두 번째이므로 car를 사용하여 도형 이름을 얻을 수 있습니다.

 

구문

(entsel [문자열])

인수 설명

문자열사용자를 향한 메시지. 명령행에 표시할 수 있다. 선택 사항.

반환값

목록도형 이름과 선택한 좌표 목록입니다. 첫 번째 요소는 도형명, 두 번째가 선택한 좌표.

entsel의 사용 예

 작성한 원의 도형명을 취득

(command "circle" (list 0 0) "D" 10)
(setq lst (entsel "원을 선택합니다."))
(setq figname (car lst))

작성한 원을 선택해 그 도형명을 취득하는 예입니다. entsel의 반환 값은 lst 변수에 저장됩니다. 그런 다음 car를 사용하여 변수 lst에서 셰이프 이름만 검색하여 변수 figname에 저장합니다.

도형 정의 데이터 가져오기 entget

entget은 셰이프 이름에서 셰이프 정의 데이터를 검색하는 함수입니다. 존재하지 않는 도형명의 경우는 nil 를 돌려줍니다.

내가 아는 한, 도형 정의 데이터의 연상리스트를 얻을 수 있는 것은 entget 뿐입니다. 취득한 연상 리스트가 없으면 도형 정의 데이터의 편집을 할 수 없기 때문에 사용 빈도가 높은 함수라고 할 수 있습니다.

구문

(entget 도형명)

인수 설명

도형명도형 정의 데이터를 검색할 도형 이름.

반환값

연상 목록 / nil인수의 도형명을 포함한 도형 정의 데이터(연상 리스트)를 돌려준다.nil도형명이 존재하지 않는 경우는 nil를 돌려준다.

entget 사용 예

 작성한 원의 도형 정의 데이터를 취득

(command "circle" (list 0 0) "D" 10)
(setq ent (entget (car (entsel "원을 선택합니다."))))

앞서 설명한 entsel과 car를 사용하여 도형명을 취득하고, 그 도형명으로부터 얻은 도형 정의 데이터를 변수 ent에 저장하는 예입니다.

도형명을 다른 변수에 격납하지 않고 그대로 entget의 인수로 하는 것으로, 프로그램을 1문에 정리할 수가 있습니다.

다음에 작성한 도형명을 취득 entnext

entnext는 지정된 도형 이름 다음에 만든 도형의 도형 이름을 반환하는 함수입니다. 인수를 생략하는 것도 가능해, 이 경우는 최초로 작성한 도형의 도형명을 돌려줍니다.

돌려주는 도형명이 도면에 존재하지 않는 경우는 nil 가 돌려주어집니다. 또한 인수가 nil이면 오류가 발생합니다.

구문

(entnext [도형명])

인수 설명

도형명도면에 존재하는 도형의 도형명. nil을 지정하면 오류가 발생합니다. 선택 사항.

반환값

도형명 / nil지정된 도형명의 다음에 작성한 도형의 도형명이 돌려주어진다. 인수를 생략했을 경우는 도면상에서 최초로 작성한 도형의 도형명을 돌려준다.nil돌려주는 도형명이 존재하지 않는 경우의 반환값은 nil.

entnext 사용 예

 두 번째로 만든 도형 이름 얻기

(command "circle" (list 0 0) "D" 10)
(command "circle" (list 1 1) "D" 15)
(setq ss (ssget))
(entnext (ssname ss 0))

첫 번째로 만든 원의 도형 이름을 인수로 사용하여 두 번째로 만든 원의 도형 이름을 가져오는 예입니다. 도형을 선택하려면 ssget, 첫 번째 도형 이름을 얻기 위해 ssname을 사용합니다.

 

마지막으로 작성한 도형명을 취득 entlast

entlast는 마지막으로 만든 도형의 도형 이름을 얻는 함수입니다. 다른 함수와 달리 인수가 필요하지 않습니다. 도형을 작성한 직후에 도형 정의 데이터를 취득하고 싶을 때에 편리합니다.

구문

(entlast)

인수 설명

인수 없음entlast는 인수를 사용하지 않는다.

반환값

도형명마지막으로 작성한 도형의 도형명을 돌려줍니다.

entlast 사용 예

 도면에서 마지막으로 작성한 도형의 도형 데이터를 취득

(command "circle" (list 0 0) "D" 10)
(command "circle" (list 1 1) "D" 15)
(setq ent (entget (entlast)))

마지막으로 작성한 원(두 번째로 작성한 원)의 도형 정의 데이터를 취득하는 예입니다. entlast와 entget로 얻은 도형 정의 데이터를 변수 ent에 저장합니다.

도형 정의 데이터 다시 쓰기 entmod

entmod는 기존 도형 정의 데이터를 새로운 도형 정의 데이터로 다시 쓰는 함수입니다. 도형 정의 데이터의 재기록이 가능하면, 획층 변경이나 좌표 이동 등 다양한 변경을 한 번에 실행하는 것이 가능 하게 됩니다.

구문

(entmod 도형 정의 데이터)

인수 설명

도형 정의 데이터재기록 후의 도형 정의 데이터.

반환값

도형 정의 데이터 / nil재기록 된 도형 정의 데이터 (인수의 도형 정의 데이터)가 리턴된다.nil다시 쓰지 못하면 nil을 반환합니다.

entmod 사용 예

 만든 원의 중심 변경

(command "circle" (list 0 0) "D" 10)
(setq ent (entget (entlast)))
(setq new-ent (subst (cons 10 (list 5 5)) (assoc 10 ent) ent))
(entmod new-ent)

작성한 원의 도형 정의 데이터를 재기록하여 중심을 이동시키는 예입니다. 우선, entlast와 entget로 도형 정의 데이터를 취득합니다.

그런 다음 subst를 사용하여 중심 좌표를 (0,0)에서 (5,5)로 대체하고 새로운 도형 정의 데이터를 변수 new-ent에 저장합니다. 그런 다음 변수 new-ent로 entmod를 실행하여 원의 중심을 변경합니다.

도형 삭제 / 복원 entdel

entdel은 지정된 도형 이름의 도형을 삭제하는 함수입니다. 삭제된 셰이프 이름을 인수로 지정한 경우 셰이프를 복원할 수 있습니다.

삭제된 도형은 도면을 닫으면 완전히 제거되므로 도면을 닫은 후에는 도형을 복원할 수 없습니다.

구문

(entdel 도형명)

인수 설명

도형명삭제 또는 복원할 도형의 도형 이름.

반환값

도형명인수의 도형명이 돌려주어진다.

entdel 사용 예

 마지막으로 만든 도형 삭제

(command "circle" (list 0 0) "D" 10)
(entdel (entlast))

작성한 원을 삭제하는 예입니다. entdel의 인수로 필요한 도형 이름은 entlast로 가져옵니다.

요약

이번 정리

  • 도형 이름: 도형 각각에 할당된 레이블
  • 도형 정의 데이터: 도형을 정의하는 파라미터를 정리한 연상 리스트
  • 도형명 및 도형 정의 데이터를 이용하여 도형을 조작할 수 있다
기능 구문 내용
entsel (entsel [문자열]) 도형 이름과 선택한 좌표 목록을 반환합니다.
entget (entget 도형명) 도형 이름에서 도형 정의 데이터를 얻습니다.
entnext (entnext [도형명]) 다음에 작성한 도형의 도형명을 돌려준다
entlast (entlast) 마지막으로 만든 도형의 도형 이름을 가져옵니다.
entmod (entmod 도형 정의 데이터) 도형 정의 데이터 재작성
entdel (entdel 도형명) 도형 삭제 또는 복원

프로그래밍

 

728x90
반응형

관련글 더보기

댓글 영역