AutoLISP 강좌 [1]


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


AutoCAD를 사용하면서 가장 먼저 느끼는 불편함은 오히려 기능이 너무 많다는 것이 아닐까 생각된다. 처음 시작하는 입장에서는 물론이거니와 자주 사용하는 입장에서는 더욱 더 하리라 본다. 별로 사용하지도 않는 선택사항이나 기능들 때문에 많은 시간을 보내야 한다면 그것만큼 비효율적인 일이 또 있겠는가? 그렇다고 해서 프로그램을 자기 좋을 대로 뜯어 고칠 수도 없는 입장이고 보면 그런 부당함을 그냥 넘길 수 밖에 없는 지도 모르겠다. 그래서인지, customizing이니 optimizing이니 하는 우리말로 옮기기에도 어려운 이상한 용어를 사용해서 프로그램을 개선할 수 있는 기능을 제공하고 있음을 자랑하는 지도 모르겠다. 아무튼 이런 기능을 다양하게 가진 프로그램일수록 편리한건 사실이다. 물론 어느 때는 그런 기능이 많은 것도 공부할 것이 많아서 부담이 된다.

AutoCAD에서도 여러가지 방식으로 이를 지원하고 있으며 아무래도 가장 적극적이라고 말할 수 있는 방법은 API(Application Programming Interface)를 사용해서 사용자가 직접 필요한 기능을 프로그래밍하는 것이리라. 초기에는 LISP만이 지원되었으며 현재는 C도 지원한다. 성능좋은 C를 사용할 수 있음에도 불구하고 LISP을 사용하는 이유는 아마도 LISP은 인터프리터(interpreter)방식의 언어라서 그 프로그램이 작성된 platform에 상관없이 수행이 가능하지만 C는 컴파일러(compiler)방식의 언어라서 그 프로그램이 컴파일된 platform에서만 수행가능하기 때문일 것이다. 즉, LISP으로 된 것은 DOS나 UNIX 혹은 PC나 Mac에 상관없이 수행이 가능하다.

LISP은 다소 배우기 까다로운 면이 있긴 하지만 굉장히 쉬운 언어이며 사용하기도 매우 편리하다. 그래서, 이번 강좌에서는 모든 단계의 AutoCAD 사용자들을 대상으로 해서 가급적 기초적인 것부터 어려운 것까지 모든 내용을 다루려고 노력할 것이다. 초보자의 경우에는 지금은 어렵더라도 강좌가 끝날 때쯤에는 모든 것을 이해할 수 있도록 내용 전개를 해나갈까 합니다. 그리고, AutoLISP으로 프로그래밍을 이것저것 해나가다보면 AutoCAD의 어려운 기능들을 이해하는 데도 많은 도움이 될 것입니다. 그럼, 그 첫번째 이야기를 시작해 보겠습니다.

1. AutoLISP의 기본 개념

1.1 AutoLISP이란?

AutoLISP은 AutoCAD의 응용 프로그램 개발 언어이며 인공지능형 시스템, 특히 전문가 시스템(expert system)의 연구와 개발에 주로 사용되는 LISP(List Processor) 언어의 방언(dialect)중의 하나라고 볼 수 있다. 역사가 오래된 LISP은 꽤나 방언이 많은 편에 속하는데 그 중에서 AutoLISP은 David Michael Betz에 의해 개발된 PC용인 XLISP 인터프리터를 기반으로 만들어 졌다. LISP은 그 이름이 뜻하는 바대로 리스트(list)의 처리를 보다 쉽게 하기 위해 만들어진 언어이다. 따라서 리스트에 대한 개념을 빨리 습득하는 것이 AutoLISP을 이해하는데 상당한 도움이 된다. 그리고 AutoLISP은 거기에 덧붙여 응용 프로그램 제작이 용이하도록 CAD의 그래픽 데이타 처리를 위한 함수들, 예를 들면 기하학적 계산을 위한 수학함수와 entity와 selection-set 등의 처리를 위한 함수들이 포함되어 있다.

그럼, AutoLISP은 과연 어떤 점에서 편리한 것일까? 우선, 아주 간단한 것이지만, 복잡한 명령어 단계를 줄일 수 있다는 점이다. 그러나, 이것은 스크립트(script)나 메뉴(menu)를 사용해서도 얻을 수 있는 결과이다. 그런 반면에 어떤 조건에 따라 변화되는 도면 작업을 수행할 수 있다는 점은 다른 어떤 것으로도 흉내낼 수 없는 프로그래밍 언어만을 사용해서 얻을 수 있는 편리함이리라. 이를 통해 우리는 단순히 AutoCAD만을 사용했을때 보다 빠른 시간안에 보다 정확한 도면을 얻을 수 있다.

또한, LISP은 문법이 간단해서 인터프리터 제작이 쉽고 그 크기가 작다. 그래서인지 아예 AutoCAD의 명령어 해석기(command interpreter)에 LISP 인터프리터가 포함되어 있다. 따라서, 모든 명령어 사용중에 AutoLISP을 사용할 수 있다. 프로그래밍이 힘들더라도 간단히 필요한 연산이나마 LISP을 이용하여 할 수 있으면 많은 도움이 될 것이다. 아래에 보인 예들은 모두 AutoCAD의 'Command:' 상태에서 시험해 볼 수 있으며 직접 입력해 보시기를 권한다.

1.2 LISP과 List Processing

1) 숫자(number)와 심볼(symbol)

LISP의 기본 자료형은 숫자와 심볼이다. 숫자는 정수나 실수값을 가질 수 있다. 다음은 숫자의 예이다.

1 -2 3.0 4.0E-5

심볼은 일반 프로그래밍언어의 변수와 비슷한 형태를 가진다. 다음은 심볼의 예이다.

auto basic count

2) 아톰(atom)

LISP의 자료 구조를 구성하는 가장 기본이 되는 것으로 아톰이라는 것이 있는데 이것은 숫자이거나 심볼일 수 있다. 그 중에서 다음의 두가지 아톰은 특별한 용도로 정의되었으므로 새롭게 정의해서 사용해서는 안된다.

t : 논리적인 참(true)을 뜻한다.

nil : 논리적인 거짓(false)과 빈리스트(empty list) ()를 뜻한다.

따라서, nil은 아톰이기도 하고 리스트이기도 하다.

3) 리스트(list)

LISP에서 다루어 지는 리스트는 주로 링크드 리스트(linked list)를 의미한다. 이 자료구조의 장점은 자료의 삽입과 삭제가 용이하다는 것이다. LISP에서는 리스트를 다음과 같이 표현하며 그것을 다시 메모리상에서의 표현방식으로 바꾸면 그림 1과 같다.

(auto 1 basic 2 count)


그림 1. LIST의 하위 표현

여기서 포인터(pointer)는 컴퓨터 메모리의 물리적인 주소를 뜻하며 nil은 리스트의 끝을 뜻한다.

LIST 함수를 사용하면 위와 같은 형태의 리스트를 만들 수 있습니다. 인수로는 아톰이나 리스트가 올 수 있다.

Command: (list 1 2)
(1 2)
Command: (list 1 (list 2 3))
(1 (2 3))

4) 함수(function)

함수란 특정의 행위를 하거나 계산을 수행하는 프로그램의 단위이며 LISP에서는 모든 것이 함수에 의해 이루어지기 때문에 LISP을 함수적 프로그래밍 언어(functional programming language)라고도 부른다.

Command: (print (+ 2 3))
5 5

위의 예에서 PRINT는 수행될 함수의 이름이며 (+ 2 3)은 PRINT 함수의 실인수가 된다. 그리고 앞에 나온 5는 PRINT 함수의 수행결과이며 뒤에 나온 5는 PRINT 함수가 수행된 결과값(return value)이다. 함수는 수행이 완료되면 호출된 곳으로 수행한 결과값을 반환해야 한다.

5) S-식(symbolic-expression)

LISP은 사용자와 대화식으로 운영되는 인터프리터방식의 언어이기 때문에 하나의 프로그램이 수행되는 것이 아니라 하나의 문장(statement)이 수행된다. LISP에서는 한 문장을 가르켜 S-식이라고 부르며 S-식은 괄호로 묶여있는 문장이나, 심볼 또는 숫자를 뜻한다. 그리고 모든 리스트는 S-식으로 표현가능하다.

(a) nil은 S-식에서도 nil이다.

(b) 아톰은 S-식에서도 같은 형태이다.

(c) 리스트 (e1 e2 . . . eN)는 S-식 (e1 . (e2 . ( . . . (eN . nil) . . . )))과 같다.

그리고 (c)의 경우에 그 반대의 경우가 항상 성립하지는 않는다. 다음의 예를 보자.

(a) (2 . 3)

(b) (2 . (3 . nil))


그림 2. S-식의 하위 표현

그림 2를 보면 (a)의 경우에는 (b)와는 달리 리스트를 표현하던 것과 표현방식이 다름을 알 수 있다. 따라서 (a)의 경우에는 S-식으로만 표현가능하며 (b)의 경우는 리스트 (2 3)과 같다.

CONS 함수를 사용하면 S-식을 만들 수 있으며 위의 (b)와 같은 원리로 리스트도 만들 수 있다.

Command: (cons 'a 2)
(A . 2)
Command: (cons 'b '(2 3))
(B 2 3)

6) CAR과 CDR

LISP을 공부하다 보면 그 이름만으로는 의미를 종잡기가 힘든 함수들이 있다. 제목에 있는 CAR과 CDR도 그런 함수들 중에 속하리라 생각되는데 알고 보면 아주 중요한 의미를 가지고 있다.

이 두 함수의 유래를 잠시 살펴보면 초기에 LISP이 사용되던 시기로 거슬러 올라 갑니다. 그 당시 LISP이 사용되던 IBM 704 컴퓨터에는 리스트의 머리와 꼬리의 정보를 보관하는 'Address' 레지스터와 'Decrement' 레지스터가 있었는데 바로 이 두개의 레지스터 이름에서 나온 것이 CAR(Contents of the Address Register)과 CDR(Contents of the Decrement Register) 함수이다.

이 함수의 기능을 살펴보면 위의 설명대로 CAR은 리스트의 첫번째 요소를 나타내고 CDR은 두번째 요소부터 그 이후의 모든 것을 나타낸다. 다음을 보면서 이해해 보기 바란다.

리스트 (e1 e2 . . . eN)는 앞서 설명드린대로 다음과 같은 S-식으로 나타낼 수 있다.

(e1 . (e2 . ( . . . (eN . nil) . . . )))

여기서 CAR은 단일 요소 e1을 나타내고 CDR은 요소 e2부터 eN까지를 포함하는 리스트, 즉 S-식의 두번째 요소를 나타내게 된다.

그리고 이 두개의 함수는 4단계까지 연결하여 사용할 수 있다. 예를 들면

(car (cdr L)) => (cadr L) (리스트의 두번째 요소)

(car (cdr (cdr L))) => (caddr L) (리스트의 세번째 요소)

Command: (setq a '(1 2 3))
(1 2 3)
Command: (car a)
1
Command: (cadr a)
2
Command: (caddr a)
3

이를 이용하여 좌표점을 표현하는 리스트에서 X 좌표값은 CAR 함수로 Y 좌표값은 CADR 함수로 Z 좌표값은 CADDR 함수를 사용하여 얻을 수 있다. 이 세개의 함수명은 자주 사용되므로 외워 두기 바란다.

7) 변수의 사용

LISP에서는 변수에 값을 지정(assign)하는 것 또한 함수를 통해 이루어진다. 이때 사용되는 함수가 SET과 SETQ이며 이 함수의 특징은 지정한 변수에 값뿐만 아니라 식자체도 저장할 수 있다는 점이다.

Command: (set 'a 1) <= 변수 a에 1을 저장한다.
1
Command: (setq a 1) <= 변수 a에 1을 저장한다.
1
Command: (setq a (+ 2 3)) <= 변수 a에 2와 3을 더한 값 5를 저장한다.
5
Command: (setq a '(+ 2 3)) <= 변수 a에 2와 3을 더하는 식을 저장한다.
(+ 2 3)

위와 같이 변수에 값이나 식을 설정할 수 있으며 그 값을 AutoCAD상에서 알아볼때는 !를 사용한다.

Command: !a <= 변수 a에 저장되어 있는 값을 알아본다.
(+ 2 3)

8) 인용(quote)과 평가(evaluation)

LISP에서 식을 처리하는 방식은 보통 위의 두가지로 분류할 수 있다. 이것은 식의 값을 평가하는가 하지 않는가의 문제인데 위에서 벌써 그 예를 들었다. 위의 마지막 예를 보면 '(quote) 문자를 사용한 것이 보인다. 이 문자가 보통 QUOTE 함수의 약자로 사용되는 기호이다. 예를 들면 'a는 (quote a)와 동일하다. 그럼, 다시 위의 예를 들어 두가지 처리 방식의 차이를 보자.

(setq a (+ 2 3)) <= 여기서는 식의 계산을 수행한다. (평가)

(setq a '(+ 2 3)) <= 단순히 식 자체를 저장한다. (인용)

여기서 정리해보면 '의 역할은 LISP Evalutor의 평가를 중지시킨다는 것을 의미한다. 즉, '가 앞에 붙어있는 부분은 그냥 자체를 심볼로써 받아들이게 된다. 그래서 어떤 변수에 값을 지정할 때 쓰는 가장 저급의 표현은 SET 함수를 사용하고 변수명앞에 '를 붙이는 것이다. 이것을 하나의 함수로 처리한 것이 SETQ(SET+QUOTE) 함수이다. 편의상 SETQ를 많이 사용한다. 다음의 예를 보자.

Command: (set 'c 5) <= 변수 c에 5를 저장한다.
5
Command: (set 'b 'c) <= 변수 b에 변수 c를 지정한다.
(변수 b는 변수 c에 대한 포인터가 된다.)
C
Command: (set b 6) <= 변수 b에 '가 없으므로 평가한 결과인 변수 c에 6을 저장한다.
6
Command: !c <= 결과적으로 변수 c에 6이 저장된다.
6

위의 예와 같이 SET을 사용하면 변수의 간접참조기능을 사용하여 다른 변수의 값을 간접적으로 변화시킬 수 있다.

그리고, 위와 같이 '를 사용하여 함수식 자체를 저장한 경우에 그 함수식의 결과값을 알고자 할때는 !만으로는 안되고 함수식을 평가하는 함수 EVAL를 사용해야 한다.

Command: (eval a)
5

1.3 AutoCAD에의 적용

AutoLISP에서 좌표점은 리스트의 형태로 사용되며 3차원인 경우는 세개의 요소가 있으면 되고 2차원인 경우는 두개의 요소가 있으면 된다.

Command: (setq a '(1.0 1.0 0.0)) <= 변수 a에 1,1,0의 좌표점을 지정
(1.0 1.0 0.0)
Command: (setq b '(2.0 2.0 0.0)) <= 변수 b에 2,2,0의 좌표점을 지정
(2.0 2.0 0.0)

위에서 좌표점을 이루는 리스트를 만들기 위해 QUOTE 함수를 사용하였는데 이러한 방식은 QUOTE의 특성상 리스트의 요소들이 상수일때만 적용가능하다. 일반적인 경우에는 앞서 말씀드린 LIST 함수나 CONS 함수, 또는 그외의 함수들을 사용하여 리스트를 구성한다.

Command: (setq c '(a b))
(A B) <= 변수 c는 단순히 a와 b라는 심볼을 담은 리스트가 된다.
Command: (setq c (list a b))
((1.0 1.0 0.0) (2.0 2.0 0.0)) <= 변수 c는 리스트 a와 b를 포함하는 리스트가 된다.

그럼, 다시 이 값들을 AutoCAD에서 사용해 보자.

Command: LINE
From point: !a
To point: !b
To point:

위와 같이 하면 1,1,0에서 2,2,0에 이르는 선을 그리게 된다.

Command: CIRCLE
3P/2P/TTR/<Center point>: !a
Diameter/<Radius>: !b

위와 같이 하면 중심점이 1,1,0이고 2,2,0을 지나는 원을 그리게 된다.

▶ TIP : AutoCAD의 시스템 변수중에는 TEXTEVAL라는 것이 있는데 이 값을 이용하면 TEXT 명령어 사용중에도 AutoLISP을 사용할 수 있게 도와준다. 먼저 TEXTEVAL 값을 0으로 하고서 다음을 수행해 보자.

Command: TEXTEVAL
New value for TEXTEVAL <0>:
Command: TEXT
Justify/Style/<Start point>: !a
Height <0.2000>: 1
Rotation angle <0>:
Text: (+ 2 3)

이 경우에는 AutoLISP을 사용할 수 없어 AutoLISP의 식이 단순히 글자로 출력된다. 이번에는 TEXTEVAL 값을 1로 하고 마찬가지로 수행해 보자. 그러면 (+ 2 3) 대신 5가 출력된다. 단, 이 기능은 DTEXT 명령에서는 사용할 수 없다.

이상으로 간단히 개념적인 설명을 마치고 다음회부터는 실제적인 문제를 같이 해결해 가면서 필요한 개념을 설명하는 방식으로 진행하겠습니다. 리스트 1에 있는 프로그램은 LISP 프로그램을 편집 즉시 자동으로 LOAD 해주는 프로그램이니 유용하게 사용하시기 바랍니다. 앞으로도 많은 관심 부탁드리며 강좌 내용이나 그 밖의 AutoLISP에 관한 질문 있으신 분은 하이텔 캐드동호회나 개인 ID로 문의바랍니다.



관련 자료
disk [1] QE.LSP : 편집 즉시 로딩(loading)시켜주는 프로그램

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