티스토리 뷰

프로그래밍/LISP

LISP 6.

.가끔은 2021. 10. 27. 23:08
반응형

Entity 개수 확인

(sslength <선택그룹>) 

<선택 그룹>의 존재하는 객체의 개수를 표시 

1. (sslength) 

사용자로 하여금 어떤 객체를 선택하게 한 후 
그 객체의 갯수를 알고자 할 때 사용하는 함수. 

2. 예제 

(defun c:test1(/ ent n) 
(setq ent (ssget)) ; 객체 선택 요구 
(setq n (sslength ent)); 선택 객체 개수 
(prompt "Entity numbers #"); "Entity numbers #" 화면에 출력 
(princ n); 선택 갯수를 화면에 출력 
(princ) 


이 함수는 (repeat) (while) 문 등과 함께 객체의 수만큼 반복할 때 많이 사용될 함수이다. 

객체의 속성 변경


글자의 크기, 글자의 폭, 글자의 스타일, 라인의 시작(끝)위치, 폴리 라인의 두께 등 
객체의 특정부분을 변경하고자 할 때 사용하는 함수들이다. 

(setq var (entget (ssname e i)) 
 old (assoc 41 var) 
 new (cons 41 tw) 
 chg (subst new old var) 

(entmod chg) 

1. (ssname <객체그룹> <객체번호>) 

 <객체그룹>에서 <객체번호>의 객체 이름을 알려준다. 
객체를 선택하면 0번부터 객체갯수만큼의 번호가 주어진다. 
캐드 화면에 무언가를 그리거나 쓴 다음 예제를 해보자 

(defun c:test1(/ a b) 
 (setq a (ssget)) ;객체를 선택하도록 요구 -> a 
 (setq b (ssname a 0));객체중 0번째의 객체이름 -> b 
 ) 

위에서 객체를 여러개 선택하였으면 숫자 0 을 1 , 2 , 3 ... 
등으로 바꾸어 가면서 실행해 보자. 

2. (entget <객체이름>) 

 <객체이름>의 각 속성 등을 알려준다. 

 (defun c:test2(/ a b c) 
 (setq a (ssget)) 
 (setq b (ssname a 0)) 
 (setq c (entget b)) 
 ) 

위에서도 객체를 여러개 선택하면 숫자 0을 1 , 2 , 3... 
등으로 바꾸어 가면서 실행해 보자. 

다음 예제는 객체 한개만을 선택하여 객체 속성을 알아보는 리습이다. 
 (entsel)명령은 [Entity name]과 [위치]를 그대로 반환하므로 (ssname) 명령이 필요 없다. 
명령어를 info 로 정의한 것은 앞으로 빈번히 사용될 리습이기 때문이다. 
앞으로 거론될 dxf 코드를 알기 위해서도 꼭 필요한 리습이다. 

 (defun c:info(/ ent dxf) 
 (setq ent (entsel)) 
 (setq dxf (entget (car ent))) 
 ) 

위에서 (car ent) 란? 
캐드 화면에서 그냥 (entsel)이라고 한번 타이핑해보고 객체 하나를 
 선택해보라. 그러면 응답값이 entity name 하고 point 인걸 확인할 수 있다. 
ent 가 변수이기 때문에 (car (entsel)) 과 같은 말이다. 
 (entsel) 명령은 entity name과 선택한 포인트를 리스트 형태로 
 반환한다. 따라서 entity name 만을 얻으려면 
(car (entsel))명령으로 쉽게 구할수 있다. 

3. DXF코드란? 

앞선 리습강의에서 info 리습을 만들어 보았다. 
캐드에서 글자크기 3, 글자 내용 "test"라는 텍스트를 하나 작성하고 
info를 실행해서 그 글자 하나를 선택해 보자. 
그러면 아래와 같이 나올 것이다. (폰트와 좌표는 다르게 나타날 수 있음) 

((-1 . <Entity name: 24d508d84f0>) (0 . "TEXT") (5 . "20")
(100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbText") (10 . 121.584 158.415 0.0)
(40 . 3.0) (1 . "test") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "STANDARD") (71 . 0) (72 . 0) (11 0.0 0.0 0.0)
(210 0.0 0.0 1.0) (100 . "AcDbText") (73 . 0)) 

여기서 중요한것 몇 가지만 살펴보겠다. 

(-1 . ); 객체 이름
(0 . "TEXT") ; 객체 종류 
(10 . 121.584 158.415 0.0) ; 글자의 x,y,x 좌표 
(1 . "test") ; 글자의 내용 
(40 . 3.0) ; 글자의 크기 
(41 . 1.0) ; 글자의 폭 
(7 . "STANDARD") ; 글자 폰트 스타일 

이런 것들이 있다. 이것을 DXF CODE 라 하고 
다른 성분들도 다양하게 변경하면서 info 리습으로 찍어보면 
내용을 쉽게 알 수 있을 것이다. 

괄호() 안의 첫 번째 숫자가 <코드번호>라 칭하고 그다음 점(.) 뒤의 
내용을 <코드내용>으로 칭한다. 
항상 괄호와 내용 사이에 점이 존재함을 눈여겨보자. 

반응형


4. (assoc <코드번호> ) 

(entget)으로 구해진 값들 (위에 지저분하게 나열된 리스트들) 중에서 
원하는 <코드번호>의 값을 얻어오는 함수이다. 

앞에서 설명한 info 리습을 이용해서 지금 선택한 객체의 종류를 
알아내는 리습을 만들어 보자 

(defun c:test1(/ ent dxf) 
 (setq ent (entsel)) 
 (setq dxf (entget (car ent))) 
 (setq name1 (assoc 0 dxf)) 
 (setq name2 (cdr name1)) 
 ) 

위의 리습을 실행하고 만약 글자를 찍어보면 
name1 = (0 . "TEXT") 
name2 = "TEXT" 
의 값을 가진다. 

객체의 종류는 코드번호 0번이므로 (assoc 0 dxf)를 사용했다. 
리스트 객체이기 때문에 (cdr) 함수를 사용하여 코드 내용만을 발췌했다. 
이 리습을 실행하고 원, 선, 글자등을 찍어보면 
그 종류를 알 수 있다. 

아래는 만약 글자를 선택하였으면 글자의 크기를 알아내는 리습이다. 

 (defun c:test2(/ ent dxf name th) 
 (setq ent (entsel)) 
 (setq dxf (entget (car ent))) 
 (setq name (cdr (assoc 0 dxf))) ; 종류를 알아내는 부분 
(if (= name "TEXT") (setq th (cdr (assoc 40 dxf)))) 
 (prompt "\nText Height = ") 
 (princ th) 
 (princ) 
 ) 

5. (cons <코드번호> <코드내용>) 

이 함수는 위의 dxf code 형태로 만들어 주는 함수다. 
(list) 함수와 비슷하지만 가운데 점이 있는 dxf code 형태로 된다는 점이 
다른 내용이다. 
예를 통해서 쉽게 알아보자 

(cons 0 "TEXT")->(0 . "TEXT") 
(cons "123" "345") ->("123" . "345") 
(cons 41 2)->(41 . 2) 


6. (subst <신코드> <구코드> ) 


특정 DXF코드를 변경하고 싶을때 
<구코드>를 <신코드>로 바꾸는 명령입니다. 

예를 들어서 글자크기를 변경할때 글자크기를 3.456이라고 가정하면 
DXF코드는 (40 . 3.456)입니다. 
이걸 글자크기 5.678로 바꾸려면 

(setq old (cons 40 3.456)) 
(setq new (cons 40 5.678)) 
(setq chg (subst new old var) 

이런 식으로 하면 됩니다. 

7. (entmod) 

DXF코드를 (subst)로 갱신하거나, 새로운 객체가 포함, 삭제되면 
캐드 명령어 regen, redraw처럼 변경된 사항을 적용, 갱신하라는 뜻입니다. 
캐드도 데이터베이스(DB) 개념입니다. 
각 코드를 데이터화하여 저장, 생성, 재생시킵니다. 
(entmod)가 각 데이터를 갱신함으로서, 비로소 눈으로 변경된 사항을 보실 수 있는 것입니다. 

반응형

'프로그래밍 > LISP' 카테고리의 다른 글

LISP 5.  (0) 2021.10.20
LIPS 4.  (1) 2021.10.16
LISP 3.  (1) 2021.10.13
LISP 2.  (0) 2021.10.09
LISP 1.  (0) 2021.10.06
댓글