AutoLISP 강좌 [5]


1. 입문(I) - AutoLISP의 기본 개념
2. 입문(II) - 사용자 정의 함수 제작
3. 입문(III) - 그 밖의 기본 기능들
4. 응용(I) - Entity와 Selection-Set
5. 응용(II) - Symbol table과 Device 제어
6. 응용(III) - Dialogue box 제어
7. 활용예제


5. Symbol table과 Device 제어

5.1 Symbol table 처리

AutoCAD에는 APPID, BLOCK, DIMSTYLE, LAYER, LTYPE, STYLE, UCS, VIEW, VPORT와 같은 symbol table이 있으며 이들은 앞서 다루어 보았던 entity와 유사한 형태로 저장되어 있다.

APPID 2 응용 프로그램 이름
  70 flag
BLOCK 1 Xref 화일이름
  2 BLOCK 이름
  3 추가적인 BLOCK 이름
  10 BLOCK의 기준점
  70 BLOCK의 형태 flag
DIMSTYLE 2 DIMSTYLE 이름
  70 flag
    그외 39개의 치수관련시스템변수를 저장
LAYER 2 LAYER 이름
  6 선종류
  62 색번호
  70 flag
LTYPE 2 LINETYPE 이름
  3 선종류에 대한 간단한 설명
  40 전체 길이
  49 마디의 길이 (마디의 수만큼 반복)
  70 flag
  72 alignment code
  73 마디의 수
STYLE 2 STYLE 이름
  3 기본 문자체 화일이름
  4 BIG-FONT 화일이름
  40 고정된 글자 높이
  41 폭의 비율
  42 최근 사용 높이
  50 기운 각
  70 flag
  71 문자출력형태 flag
UCS 2 UCS 이름
  10 원점
  11 X축상의 한점
  12 Y축상의 한점
  70 flag
VIEW 2 VIEW 이름
  10 중심점
  11 목표점으로부터 view의 방향
  12 목표점
  40 view의 높이
  41 view의 폭
  42 lens 거리
  43 front clipping plane
  44 back clipping plane
  50 비틀림각
  70 flag
  71 view mode
VPORT 2 VIEWPORT 이름
  10 왼쪽 아래 모서리 좌표
  11 오른쪽 위 모서리 좌표
  12 중심점
  13 SNAP의 기준점
  14 SNAP의 X, Y 방향 간격
  15 GRID의 X, Y 방향 간격
  16 목표점으로부터 view의 방향
  17 목표점
  40 view의 높이
  41 viewport의 가로세로비
  42 lens 거리
  43 front clipping plane
  44 back clipping plane
  50 SNAP의 회전각
  51 비틀림각
  68 상태값
  69 ID
  70 flag
  71 view mode
  72 원 확대율
  73 신속한 확대 설정
  74 UCSICON 설정
  75 SNAP의 상태
  76 GRID의 상태
  77 SNAP의 형태
  78 SNAP isopair

표 1. symbol table에 대한 DXF 코드
(해당 DXF 코드의 보다 자세한 의미는 매뉴얼을 참고하시기 바랍니다.)

위와 같은 symbol table의 자료를 얻어내는데 사용되는 함수에는 TBLNEXT와 TBLSEARCH가 있다. TBLNEXT는 순차적으로 symbol table 내에있는 정보를 얻어내는데 주로 사용되며, TBLSEARCH는 symbol table 내에 해당 symbol이 존재하는가를 확인하고 존재하면 정보를 얻어내는데 주로 사용된다.

5.1.1 APPID

APPID는 현재 도면상에서 사용중인 모든 응용프로그램의 이름을 담고 있다. 초기 값으로 "ACAD"라는 정보가 들어있다.

Command: (tblnext "APPID" T)
((0 . "APPID") (2 . "ACAD") (70 . 64))

70번 flag의 값인 64는 현재 그 응용프로그램이 도면상에서 사용되고 있음을 의미한다.

5.1.2 BLOCK

BLOCK은 말그대로 BLOCK 명령을 사용하여 정의된 entity들의 정보를 담고 있다.

Command: LINE
From point: 1,1
To point: 2,2
To point:
Command: BLOCK
Block name (or ?): LINE
Insertion base point: 1,1
Select objects: L
1 found
Select objects:

이번에는 도면상에 이미 많은 BLOCK이 정의되어 있을 경우를 생각해서 TBLSEARCH 함수를 사용해 보자.

Command: (tblsearch "BLOCK" "LINE")
((0 . "BLOCK")
 (2 . LINE) (70 . 64) (10 0.0 0.0 0.0)
 (-2 . <Entity name: XXXXXXXX>)
)

위와 같이 해당 BLOCK 정보의 끝에는 entity 이름이 들어있는데 이것을 이용하면 해당 BLOCK 내에 어떤 entity들이 포함되어있는가를 알 수 있다.

Command: (setq en (cdr (assoc '-2 (tblsearch "BLOCK" "LINE"))))
<Entity name: XXXXXXXX>
Command: (entget en)
((-1 . <Entity name: XXXXXXXX>)
 (0 . "LINE") (8 . "0") (5 . "67")
 (10 0.0 0.0 0.0) <= 기준점에 대해 좌표변환된 것을 알 수 있다.
 (11 1.0 1.0 1.0) <= 기준점에 대해 좌표변환된 것을 알 수 있다.
 (210 0.0 0.0 1.0)
)
Command: (setq en (entnext en))
nil <= 더 이상 BLOCK에 포함된 entity가 존재하지 않는다는 뜻

5.1.3 DIMSTYLE

DIMSTYLE은 치수와 관련된 시스템 변수의 값들을 담고 있다. 초기에는 아래에서와 같이 정의되어 있는 DIMSTYLE이 없다. 연습삼아 DIMSTYLE 하나를 만들어서 저장되어 있는 내용을 살펴보자.

Command: (tblnext "DIMSTYLE" T)
nil <= 정의된 DIMSTYLE이 없다는 뜻
Command: DIM
Dim: SAVE
?/Name for new dimension style: MYWAY
Dim: EXIT
Command: (tblnext "DIMSTYLE" T)
((0 . "DIMSTYLE") (2 . "MYWAY") (70 . 0) ...<<이하 생략>>...)

위의 맨마지막 결과는 사용자마다 시스템 변수의 설정치에 따라 달라질 수 있다.

5.1.4 LAYER

LAYER의 이름과 현재 사용중인지 사용중이 아닌지 그리고 설정색과 선종류를 담고 있다. 기본적으로 존재하는 layer "0"의 정보를 보자.

Command: (tblnext "LAYER" T)
((0. "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "CONTINUOUS"))

그리고, 70번 flag의 값의 의미를 확인하기 위해 몇개의 layer를 더 만들어 보자.

Command: LAYER
?/Make/Set/New/ON/OFF/Color/Ltype/Freeze/Thaw/LOck/Unlock: N
New layer name(s): off,freeze,lock
?/Make/Set/New/ON/OFF/Color/Ltype/Freeze/Thaw/LOck/Unlock: OFF
Layer name(s) to turn Off: off
?/Make/Set/New/ON/OFF/Color/Ltype/Freeze/Thaw/LOck/Unlock: F
Layer name(s) to Freeze: freeze
?/Make/Set/New/ON/OFF/Color/Ltype/Freeze/Thaw/LOck/Unlock: LO
Layer name(s) to Lock: lock
?/Make/Set/New/ON/OFF/Color/Ltype/Freeze/Thaw/LOck/Unlock:
Command: (tblnext "LAYER")
((0 . "LAYER") (2 . "OFF") (70 . 64) (62 . -7) (6 . "CONTINUOUS"))
Command: (tblnext "LAYER")
((0 . "LAYER") (2 . "FREEZE") (70 . 65) (62 . 7) (6 . "CONTINUOUS"))
Command: (tblnext "LAYER")
((0 . "LAYER") (2 . "LOCK") (70 . 68) (62 . 7) (6 . "CONTINUOUS"))
Command: (logand 65 1)
1 <= FROZEN 되었다.
Command: (logand 68 4)
4 <= LOCK 되었다.

첫번째로 만든 LAYER는 OFF된 상태이면 이때는 62번 색번호가 음의 값을 갖게된다는 것을 알 수 있다. 두번째와 세번째의 경우는 70번 flag의 값으로 상태를 알 수 있는데 0번 bit가 ON이면 FROZEN된 상태이며 2번 bit가 ON이면 LOCK된 상태이다. 이제 이와 관련된 예제 하나를 소개할까 한다.

; LAOFF.LSP : 선택된 레이어를 제외한 모든 레이어를 보이지 않게 한다.

(defun C:LAOFF ( / sl ty tl ln)
  (setq sl (strcase (getstring "\nSet layer name: ")))
  (if (not (tblsearch "LAYER" sl))
    (progn (princ "\nIt is not a layer.") (exit))
  )
  (initget 1 "Freeze Off")
  (setq ty (getkword "Type <Freeze/Off>: "))
  (if (= 1 (logand 1 (cdr (assoc 70 (tblsearch "LAYER" sl)))))
    (command "LAYER" "THAW" sl "")
  )
  (command "LAYER" "SET" sl "")
  (setq tl (tblnext "LAYER" T))
  (command "LAYER")
  (while tl
    (setq ln (cdr (assoc 2 tl)))
    (if (/= ln sl)
      (cond ((= ty "Freeze") (command "FREEZE" ln))
            ((= ty "Off") (command "OFF" ln))
      )
    )
    (setq tl (tblnext "LAYER"))
  )
  (command "")
  (princ)
)

5.1.5 LTYPE

LTYPE은 잘 알고 있는바대로 사용자가 정의한 LINETYPE에 관한 정보를 담고 있다. 자료형태는 *.LIN 화일에 정의되는 형식과 같다. 기본자료로는 직선에 관한 정보가 들어있는데 한번 살펴보자.

Command: (tblnext "LTYPE" T)
((0 . "LTYPE" (2 . "CONTINUOUS") (70 . 64) (3 . "SOLID LINE")
 (72 . 65) (73 . 0) (40 . 0))

새로운 LINETYPE을 만들고 불러들여서 정보의 차이를 비교해 보자.

Command: LINETYPE
?/Create/Load/Set: C
Name of linetype to create: DASHDOT
File for storage of linetype <C:\ACAD\SUPPORT\ACAD.LIN>: DASHDOT
Creating new file
Descriptive text: _ . _ . _
Enter pattern (on next line):
A,.5,-.25,0,-.25
New definition written to file.
?/Create/Load/Set: L
Linetype(s) to load: DASHDOT
File to search <DASHDOT>:
Linetype DASHDOT loaded.
?/Create/Load/Set:
Command: (tblnext "LTYPE")
((0 . "LTYPE") (2. "DASHDOT") (70 . 64)
 (3 . "_ . _ . _") <= descriptive text
 (72 . 65) <= 항상 65 (ASCII 코드로 'A')
 (73 . 4) <= 49번 항목의 값이 4개 존재
 (40 . 1.0) <= 49번 항목의 전체 길이가 1.0
 (49 . 0.5) <= 양의 값이면 직선의 길이
 (49 . -0.25) <= 음의 값이면 공백의 길이
 (49 . 0.0) <= 영이면 점을 의미
 (49 . -0.25)
)

5.1.6 STYLE

STYLE은 글자체나 SHAPE에 관한 정보를 담고 있다. 기본으로 들어있는 "STANDARD"에 관한 정보를 살펴보자.

Command: (tblnext "STYLE" T)
((0 . "STYLE") (2 . "STANDARD")
 (70 . 0) <= 첫번째 비트가 1이면 SHAPE, 세번째 비트가 1이면 수직
 (40 . 0.0) <= 0이면 글자의 높이가 고정되지 않았음
 (41 . 1.0)
 (50 . 0.0)
 (71 . 0) <= 두번째 비트가 1이면 좌우가 반대로 써진다. 
             세번째 비트가 1이면 위아래가 반대로 써진다.
 (42 . 0.2)
 (3 . "txt")
 (4 . "") <= big-font를 사용하지 않으면 blank
)

5.1.7 UCS

UCS는 사용자 정의 좌표계에 대한 정보를 담고 있다. 기본으로 아무런 UCS도 정의되어 있지 않으므로 몇개를 연습삼아 만들어 보자.

Command: UCS
Origin/ZAxis/3point/.../Prev/Restore/Save/Del/?/<World>: O
Origin point <0,0,0>: 1,1,1
Command: UCS
Origin/ZAxis/3point/.../Prev/Restore/Save/Del/?/<World>: S
?/Desired UCS name: origin
Command: UCS
Origin/ZAxis/3point/.../Prev/Restore/Save/Del/?/<World>:
Command: UCS
Origin/ZAxis/3point/.../Prev/Restore/Save/Del/?/<World>: 3
Origin point <0,0,0>:
Point on positive portion of the X-axis <1,0,0>: 0,1,0
Point on positive-Y portion of the UCS XY plane <-1,0,0>: 1,0,0
Command: UCS
Origin/ZAxis/3point/.../Prev/Restore/Save/Del/?/<World>: S
?/Desired UCS name: back-plane
Command: UCS
Origin/ZAxis/3point/.../Prev/Restore/Save/Del/?/<World>:
Command: (tblnext "UCS" T)
((0 . "UCS") (2 . "ORIGIN") (70 . 0)
 (10 1.0 1.0 1.0) <= 원점이 1,1,1로 이동되었다.
 (11 1.0 0.0 0.0) <= 11과 아래 12는 원래 상태 그대로이다.
 (12 0.0 1.0 0.0)
)
Command: (tblnext "UCS")
((0. "UCS") (2 . "BACK-PLANE") (70 . 0)
 (10 0.0 0.0 0.0) <= 원점은 그대로이다.
 (11 0.0 1.0 0.0) <= 11과 아래 12는 입력한대로 변경되었다.
 (12 1.0 0.0 0.0)
)

5.1.8 VIEW

VIEW는 잘 아는 바대로 화면 출력에 관한 많은 설정들을 미리 어떤 상태로 만들어 두고 편리하게 화면 상태를 바꿀 수 있게 해주는 매우 편리한 기능이다. 이것도 미리 정의된 것이 없으므로 하나를 만들어 보자.

Command: DVIEW
Select objects:
.../Distance/POints/PAn/Zoom/TWist/CLip/Hide/Off/Undo/<eXit>: PO
Enter target point <8.3559,4.9408,0.0000>: 0,0,0
Enter camera point <8.3559,4.9408,1.0000>: 1,1,1
.../Distance/POints/PAn/Zoom/TWist/CLip/Hide/Off/Undo/<eXit>: D
New camera/target distance <1.7321>:
.../Distance/POints/PAn/Zoom/TWist/CLip/Hide/Off/Undo/<eXit>: TW
New view twist <0.00>: 10
.../Distance/POints/PAn/Zoom/TWist/CLip/Hide/Off/Undo/<eXit>: CL
Back/Front/<Off>: B
ON/OFF/<Distance from target> <0.0000>: 1
.../Distance/POints/PAn/Zoom/TWist/CLip/Hide/Off/Undo/<eXit>: CL
Back/Front/<Off>: F
Eye/<Distance from target> <1.7320>: 0.9
.../Distance/POints/PAn/Zoom/TWist/CLip/Hide/Off/Undo/<eXit>:
Regenerating drawing.
Command: VIEW
?/Delete/Restore/Save/Window: S
View name to save: PERSP
Command: (tblnext "VIEW" T)
((0 . "VIEW") (2 . "PERSP")
 (70 . 0) <= 첫번째 비트가 1이면 paper space view 이다.
 (40 . 9.88155)
 (10 0.0 0.0)
 (41 . 16.7118)
 (11 1.0 1.0 1.0)
 (12 0.0 0.0 0.0)
 (42 . 50.0) <= 초기값이다.
 (43 . 0.9)
 (44 . 1.0)
 (50 . 0.174533) <= 10도를 라디안값으로 변경한 것
 (71 . 23) <= view mode 값의 의미는 아래를 참조
)

VIEWMODE 시스템변수의 의미는 다음과 같다.

1 = perspective view
2 = front clipping
4 = back clipping
8 = UCS follow mode
16 = front clip 면이 시점상에 존재하지 않을때

5.1.9 VPORT

VPORT는 화면 출력과 관련된다는 점에서 VIEW와 상당히 비슷하며 내부 정보도 중복되는 부분이 많다.

Command: VPORTS
Save/Restore/Delete/Join/SIngle/?/2/<3>/4: 4
Regenerating drawing.
Command: VPORTS
Save/Restore/Delete/Join/SIngle/?/2/<3>/4: S
?/Name for new viewport configuration: four
Command: (tblnext "VPORT" T)
((0 . "VPORT") (2 . "FOUR") (70 . 0)
 (10 0.5 0.0) <= 단위화면상의 왼쪽 아래 모서리의 좌표점
 (11 1.0 0.5) <= 단위화면상의 오른쪽 위 모서리의 좌표점
 (12 0.0 0.0) (13 0.0 0.0) (14 1.0 1.0) (15 0.0 0.0)
 (16 1.0 1.0 1.0) (17 0.0 0.0 0.0)
 (40 . 9.88155) (41 . 1.70697) (42 . 50.0)
 (43 . 0.9) (44 . 1.0) (50 . 0.0) (51 . 0.174533)
 (71 . 23) (72 . 100) (73 . 1) (74 . 1)
 (75 . 0) (76 . 0) (77 . 0) (78 . 0)
)

10번과 11번의 좌표점으로 볼때 이 VPORT는 오른쪽 아래 모서리에 있는 것의 정보라는 것을 알 수 있다. 몇가지 설정값을 변경해보고 결과를 확인해 보기 바란다. 그리고, 화면이 4개로 등분되었으므로 같은 이름을 갖는 VPORT가 4개 존재하게 된다. 계속해서 나머지 3개의 정보를 얻어내서 차이점을 확인하기 바란다.

그리고, 참고로 유용하게 쓰일만한 관련 함수 하나를 소개할까 한다. VPORT의 단위화면의 좌표점만을 확인하는데 사용되는 VPORTS가 바로 그것인데 이 함수를 사용하면 현재 사용중인 모든 VPORT의 ID를 얻어낼 수 있다. 이 ID를 알아야만 시스템 변수 CVPORT의 값을 변경해서 프로그램상에서 현재 VPORT를 변경할 수 있다. 이를 이용하면 모든 VPORT에 대해 어떤 작업을 동시에 행해야 할때 매우 편리하다. 아래의 프로그램 예제를 보자.

; POFFALL.LSP : 모든 뷰포트에 대해 perspective off를 수행한다.

; 모든 뷰포트의 ID 번호를 구한다.

(defun g-avnum ( / vp vl)
  (setq vp (vports))
  (while vp
    (setq vl (cons (caar vp) vl))
    (setq vp (cdr vp))
  )
  vl
)

(defun C:POFFALL ( / vp)
  (foreach vp (g-avnum)
    (setvar "CVPORT" vp)
    (command "DVIEW" "" "OFF" "")
  )
  (princ)
)

5.2 Device 제어

5.2.1 GRCLEAR

GRCLEAR 함수는 화면상에 그려진 모든 그림들(UCSICON까지)을 지운다. 지운다고 해서 데이타베이스에서 삭제되는 것이 아니라 단순히 화면상에서만 사라지는 것이다.

Command: (grclear)
nil <= 항상 반환값은 0이다.
Command: REDRAW
<<원래 그림이 다시 나타난다.>>

이 함수는 다음으로 다룰 GRDRAW 함수를 이용해서 화면상에 어떤 그림을 출력하고자 할때 임시로 화면을 지우기 위해 주로 사용된다.

5.2.2 GRDRAW

GRDRAW 함수는 화면상에 임의의 2D 또는 3D 벡터를 그리기 위해 사용된다. 다음의 예를 보자.

Command: (grdraw '(0 0 0) '(10 10 10) 7)
nil
Command: (grdraw '(0 0 0) '(10 10 10) -1) <= XOR의 의미를 갖는다.
nil
Command: (grdraw '(0 0 0) '(10 10 10) -1 1) <= highlight된다.
nil

5.2.3 GRREAD

GRREAD 함수는 입력장치로부터 다음과 같은 특수한 정보를 얻어내기 위해 사용된다.

2 : 키보드 입력, 글자의 ASCII 코드값
3 : 선택된 점, 3차원 좌표값
4 : 스크린이나 풀다운 메뉴 선택, 선택된 항목의 번호
5 : 입력장치의 위치, 3차원 좌표값
6 : 버튼 메뉴 선택, 선택된 항목의 번호
7 : TABLET1 매뉴 선택, 선택된 항목의 번호
8 : TABLET2 매뉴 선택, 선택된 항목의 번호
9 : TABLET3 매뉴 선택, 선택된 항목의 번호
10 : TABLET4 매뉴 선택, 선택된 항목의 번호
11 : AUX 매뉴 선택, 선택된 항목의 번호
12 : 버튼 선택, 3차원 좌표값 (6이나 11에 이어서 나온다.)

Command: (while T (print (grread T)))

위와 같은 상태에서 키보드나 입력장치의 버튼을 사용해서 입력이나 선택을 행했을때 화면상에 나타나는 결과의 차이를 잘 비교해 보기 바란다. 위의 상태를 끝마치고 싶을 때는 <Ctrl> + C를 누르면 된다.

5.2.4 GRTEXT

GRTEXT는 화면상의 STATUS LINE과 SCREEN MENU 영역에 필요로하는 정보를 출력하고자 할 때 사용된다. 그 영역은 다음과 같이 정의되어 있다.

-1 : mode status line
-2 : coordinate status line
0 ~ : screen menu

Command: (grtext -1 "MODE STATUS LINE")
"MODE STATUS LINE"
Command: (grtext -2 "COORDINATE STATUS LINE")
"COORDINATE STATUs LINE"
Command: (grtext 0 "BOX 0")
"BOX 0"
Command: (grtext 19 "BOX 19" 1) <= highlight된다.
"BOX 19"
Command: (grtext) <= 원래대로 환원된다.
nil

5.2.5 GRVECS

GRVECS 함수는 GRDRAW 함수가 확장된 것으로서 여러개의 벡터를 동시에 그릴 수 있으며 그와 동시에 3차원 변환을 수행할 수 있다.

Command: (grvecs '(
2> 1 (0 0 0) (1 0 0)
2> 3 (1 0 0) (1 1 0)
2> 5 (1 1 0) (0 1 0)
2> 7 (0 1 0) (0 0 0))
1> '(
2> (0.2 0.0 0.0 0.0)
2> (0.0 0.4 0.0 0.0)
2> (0.0 0.0 0.8 0.0)
2> (0.0 0.0 0.0 1.0)
2> ))
nil


Last updated 2002-09-06 by choi@moon-sun.com
This page has been accessed : Counter times.
Home