AutoLISP Tips


Icon Menu | Sweep Surface Generator | Block Preview

Icon Menu

용도

AutoCAD Release 12부터는 아이콘 메뉴가 항상 20개 항목으로 고정되어서 예전에 쓰던 메뉴들이 모두 보기 싫게 나온다. 그래서, 이번에는 DCL을 사용하여 예전의 아이콘 메뉴와 비슷하게 만들어 볼까 한다. 물론, 아이콘 메뉴보다야 불편하겠지만 언제든지 원하는 개수로 수정할 수 있도록 잘 짜여졌다고 자신한다. 이를 이용하여 AutoCAD의 시스템 변수인 PDMODE 를 아이콘을 보면서 쉽게 설정할 수 있는 프로그램을 아래에 소개하겠다.

다이얼로그의 구성

다이얼로그 박스의 구성을 보다 쉽게 이해하기 위해 먼저 프로그램을 수행해 보면서 아래 내용을 보기 바란다. 이 프로그램에서 사용될 다이얼로그 박스는 총 네개의 부분으로 구분해 서 생각할 수 있다. 다음을 보자.

1. 다이얼로그 박스 자체
2. 아이콘의 해당 내용을 담고 있는 LIST BOX
3. 아이콘의 해당 이미지
4. PREVIOUS, NEXT, OK, CANCEL BUTTON

이번 예제에서 사용되는 다이얼로그 박스는 왼쪽에 아이콘의 항목 내용이 나타나는 리스트 박스가 있고 오른쪽에 지정한 수 만큼의 아이콘들이 나타난다. 여기서 수의 지정은 전역 변수 #MAXICONS로 정의되는데 그 값이 예를들어 9이면 3 x 3의 행렬로 아이콘들이 나타나게 된다. 때문에, DCL 파일에는 아이콘이 각각 1개, 4개, 9개, 16개, 25개일때를 대비한 다이얼로그 박스가 정의되어 있다. 필요하다면 같은 형식으로 더 크게 또는 변형된 형태(가로, 세로의 아이콘 수가 다른 형태 : 약간의 프로그램 수정이 필요함)를 추가하여 사용하면 된다. 그리고, 아래에는 페이지를 전환하는 'Previous'와 'Next' 버튼이 있고 다이얼로그 박스를 종료시키는 'OK'와 'Cancel' 버튼이 있다.

Image Button 제어

이제 본격적으로 이미지 버튼을 처리하는 방법을 설명하겠다.

1) 이미지 버튼을 clear 시킨다. (clear-image 함수 참조)

(setq dx (dimx_tile key)) <- 이미지 버튼의 X 사이즈를 구함
(setq dy (dimy_tile key)) <- 이미지 버튼의 Y 사이즈를 구함
(start_image key) <- 이미지 출력을 시작한다.
(fill_image 0 0 dx dy co) <- 지정한 색으로 clear 한다.
(end_image) <- 이미지 출력을 종료한다.

이때 co 값으로 -2를 지정하면 그래픽스 화면의 배경색으로 clear된다.

2) 이미지 버튼에 해당 슬라이드를 출력한다. (view-slide 함수 참조)

......
(clear-image key -2) <- 이미지 버튼을 clear 시킨다.
(start_image key) <- 이미지 출력을 시작한다.
(slide_image 0 0 dx dy name) <- 지정한 슬라이드를 출력한다.
(end_image) <- 이미지 출력을 종료한다.

이미지 버튼을 clear시키지 않으면 기존에 있던 것에 중복되어 출력된다.

3) 선택된 항목 알아내기 (do-icon 함수 참조)

여기서는 전역 변수 #ICONLIST를 통해 해당 아이콘 마다 CALL BACK 함수들을 선언할 수 있지만, DO-ICON이란 하나의 함수로 모든 처리를 통일시켰다. 필요하다면, 해당 CALL BACK 함수를 변경할 수 있으며 되도록이면 DO-ICON 함수를 그 함수의 선두에서 실행시켜 주기 바란다. 그래야만 나머지 부분의 함수들의 정상 동작을 보장할 수 있다. 우선, 다른 항목들에 대해 같은 함수를 사용했기 때문에 함수 실행시에 어떤 키가 동작했는지를 알 필요가 있다. 따라서, $KEY를 이용하여 선택된 키를 함수에게 알려주어야 한다. 이번 예제에서는 아이콘의 개수를 동적으로 관리하기 위해 이미지 버튼의 이름을 모두 'icon_image'와 몇번째 인지를 나타내는 번호를 붙여서 icon_image1, icon_image2, icon_image3 등으로 붙였다.

(if (= key (strcat "icon_image" (itoa in)) <- 몇번째 아이콘인지 확인
  (setq find T max in) <- FIND flag을 T로 설정
)

FIND flag이 T인 경우에 한해 다음을 수행한다.

; 기존에 선택된 아이콘이 있는 경우 그 아이콘의 하이라이트를 off 시킨다.
(if #CURICON
  (mode_tile (strcat "icon_image" (itoa #CURICON)) 4)
)
; 새로 선택된 아이콘의 하이라이트를 on
(mode_tile (strcat "icon_image" (itoa in)) 4)
; 아이콘 리스트의 해당 항목으로 선택바를 이동시킨다.
(set_tile "icon_list" (itoa (+ cur (1- in))))
; 선택된 아이콘으로 현재 아이콘 설정
(setq #CURICON in)

그외의 기법

1) 아이콘 메뉴의 페이지 전환 (set-page 함수 참조)

다음의 단계로 나누어 볼 수 있다.

a) 페이지에 따라 'previous' 버튼의 사용 여부를 결정
b) 남은 아이콘 수보다 출력 아이콘 수가 적은 경우 'next' 버튼을 사용 가능하게 한다.
c) 설정 가능한 아이콘인 경우 해당 슬라이드를 출력하고 해당 아이콘을 사용 가능하게 한다.
d) 빈칸인 경우 이미지만 clear하고 해당 아이콘을 사용 불가능하게 해 둔다.

2) PDMODE 값 설정 (set-pdmode 함수 참조)

아이콘 메뉴를 사용하는 대부분의 경우는 어떤 한정된 사항에 대한 선 택의 경우가 많은 것을 그림으로 나타내어서 선택하기 쉽도록 하기 위 해 사용하는 것이 보통이다. 그래서, 이번 예제에서는 CALL BACK 함수 도 같은 것을 사용하였으며, 마지막에 선택된 PDMODE 값을 알아내는 방 법으로는 전역변수인 #CURPAGE(현재 선택된 페이지)와 #CURICON(해당 페이지의 선택된 아이콘)의 값을 이용하여 선택된 항목을 확인한 후 아 이콘의 이름으로 사용된 PDMODE의 값을 알아내서 PDMODE를 설정하는 방 법을 사용하였다. 그렇지 않으면 이 처리도 무척 골치아픈 내용이 되어 버린다.

3) 전역 변수 #MAXICONS

앞서도 얘기한바 있는 #MAXICONS의 의미는 화면상에 나타나는 아이콘의 수를 결정하게 된다. 이 값을 변경하여 보고 기능이 정상적으로 동작하 는지 어떤 식으로 동작이 변화되는지 확인해 보기 바란다.

[본 프로그램은 월간캐드캠 1994년 4월호의 TIPs 프로그램으로 소개되었다.]


관련 자료
disk [1] DDPDMODE.LSP

Sweep Surface Generator

용도

본 프로그램은 AutoCAD Release 10 이상에서 실행되는 AutoLISP 프로그램으로 주어진 경로를 따라 지정 단면을 돌출시키는 작업을 수행한다.
sweep surface는 AutoCAD에 있는 기존의 명령어인 TABSURF가 만들어 내는 surface와 비슷하긴 한데 몇가지 차이점이 있습니다. 예를 들면 TABSURF는 방향벡터(direction vector)로 곡선을 선택한다 하더라도 그 곡선의 시작점과 끝점이 이루는 방향만을 고려하여 선택한 단면을 돌출시키지만 sweep surface에서는 비록 제한적이긴 하지만 선택한 방향벡터가 곡선이면 그 곡선을 따라서 단면의 각도를 변화시켜가면서 surface를 구성하여줍니다.

사용법

AutoCAD Release 10 이상에서만 사용가능하다.

AutoCAD를 실행한 후 명령어 상에서 다음을 입력한다. 예를 들어 SWEEP.LSP가 C:\LSP상에 있다면

Command: (load "C:/LSP/SWEEP")

와 같이 입력한다. 이제 프로그램이 로드(load)되었다. 프로그램을 실행해 보자. 명령어는 "SWEEP"이며 실행하면 다음과 같은 메시지가 출력된다.

Command: SWEEP
Select path curve: <- 돌출시킬 단면을 선택한다.
Select direction vector: <- 방향 벡터를 선택한다.
Change Normal? <Y>: <- 방향 벡터를 따라서 단면의 각도를 변경시킬지의 여부를 묻는다.

주의 사항

단면은 시스템 변수 SURFTAB1의 값 만큼 나눠지며 방향벡터는 SURFTAB2의 값만큼 나눠진다. 단 polyline의 경우에는 arc segment 도 SURFTAB2 만큼으로 나눠진다. 따라서, 복잡한 polyline의 경우 에는 위의 시스템 변수 값을 너무 크게 지정하지 마시기 바랍니다. AutoCAD에서는 256x256 이상의 3차원 mesh를 만들 수 없습니다. 또 한가지, 여기서 방향벡터로는 3차원 요소는 사용할 수 없습니다. 그리고 단면의 각도를 변경시키실 경우에는 방향벡터의 시작점이나 끝점이 단면이 이루는 평면상의 내부에 존재하는 것이 좋습니다. 왜냐하면 3차원 회전변환을 수행할 때 기준점이 멀리있게 되면 회전의 정도가 심해지기 때문입니다.

[본 프로그램은 월간캐드캠 1995년 6월호의 TIPs 프로그램으로 소개되었다.]


관련 자료
disk [1] SWEEP.LSP

Block Preview

용도

BPREVIEW(Block Preview)는 블럭을 insert 하기전에 생김새를 미리 보여주는 기능을 수행한다. 현재로는 지원되지 않는 엔티티들이 있긴 하지만 기본적인 엔티티들에 대한 완벽한 처리를 통해 말그대로 preview의 기능을 충분히 수행할 수 있으리라 생각된다.

사용법

AutoCAD에서 다음과 같이 실행한다.

Command: (load "BPREVIEW")
C:BPREVIEW
Command: BPREVIEW

대화상자가 나타나면 왼쪽에 있는 블럭 목록중에 하나를 선택한다. 선택된 블럭은 대화상자 오른쪽 이미지 영역에 그려진다. 목록을 더블클릭하거나 OK 버튼을 선택하면 해당 블럭을 insert할 수 있다.

사용자 개선 사항

몇몇 엔티티의 최대 크기 계산 방식의 수정과 지원되지 않는 엔티티들에 대한 처리 기능을 추가해 보기 바란다.

[본 프로그램은 월간캐드캠 1996년 2월호의 TIPs 프로그램으로 소개되었다.]


관련 자료
disk [1] BPREVIEW.LSP

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