|
- Visual LISP에 추가된 함수들 -
Visual LISP을 사용하는 사람들이 처음 접하는 장점은 역시 편리한 IDE(Integrated Development Environment)일 것이다. 이 통합개발환경은 프로그램을 매우 쉽고 신속하게 개발할 수 있게 하여준다. 하지만, 많은 이들이 Visual LISP에서 강화된 또 하나의 기능인 추가된 함수들에 대해서는 잘 모르고 있는 듯 하다.
Visual LISP은 기존의 LISP이 가지고있던 함수에 130여 개의 새로운 함수가 추가되었다. 이 함수들 중 약 50개의 함수는 ActiveX를 지원하기 위한 함수, 25개 정도는 리엑터(Reactor)를 지원하기 위한 함수이고 나머지 50개 정도는 기존 LISP의 부족한 점을 보완하기 위한 함수들이다.
ActiveX는 모든 응용프로그램과 인터넷상의 모든 기능들에 객체지향이라는 방법으로 접근하기 위한, 마이크로소프트사가 제안한 최신기술이다. 이 기능을 이용한 대표적 프로그램들이 마이크로소프트 오피스 제품군과 인터넷 익스플로러이다. AutoCAD에서는 이 기능을 Object ARX, VBA for AutoCAD, Visual LISP 등을 통하여 제공함으로써 이 기술을 지원하는 모든 프로그램들 간의 효과적인 데이터 공유와, 일관된 프로그래밍 방법을 제공하고 있다.
리엑터(Reactor)란, 객체(Object)의 길이나 모양 등의 조건(Property)이 바뀌면 스스로 알아서 연결된 다른 조건을 바꿔주는 지능적인 객체를 말한다. AutoCAD 내에서 우리가 흔히 보는 리엑터로는 Dim과 Hatch가 있다. 이 객체들은 자신이 가진 기본 데이터인 길이나 영역의 모양등이 변하면 스스로 길이 표시나 해치영역의 크기 등을 바꾼다. 이처럼 완전한 객체지향적으로 동작하는 객체들을 리엑터라 한다.
앞에 설명한 ActiveX나 리엑터는 그것 자체만으로도 커다란 개념이고, 설명할 것이 너무나 많기에 이번 호에서 ActiveX나 리엑터를 위한 함수들은 다루지 않고, 이 이외의 추가적인 함수들을 중심으로 설명한다. 하지만 이 추가적인 함수들만 알아도 기존 LISP의 부족한 점을 크게 보완해 매우 강력한 프로그램을 만들 수 있을 것이다.
함수일람
추가된 함수들을 효과적으로 설명하기 위해 먼저 추가된 함수들과 그 함수들이 필요로 하는 인자, 그리고 기능들을 개략적으로 살펴보고 이 함수들을 사용해 만든 프로그램의 실재적인 예를 분석해 보겠다. 이 절의 내용은 나중에 사전처럼 쓰면 편리할 것이다.
여기 설명된 함수 뿐 아니라 다른 함수들도 그 내용과 인자를 좀 자세히 알고자 하면 VLIDE에서 <F1>키를 눌러 도움말을 찾아보면 될 것이다. 함수들의 리스트와 각각에 대한 설명은 Help 화면에서 Visual LISP for AutoCAD R14 Guide - Visual Lisp Function Reference - Function Catalog 항목으로 들어가 얻을 수 있을 것이다. (그림 1, 그림 2, 그림3 참조)
그럼 먼저 추가된 함수들을 개략적으로 살펴보자. LISP에 추가적인 기능을 제공하는 함수들은 vi-로 시작하거나 vlisp-로 시작한다.
파일을 다루기 위한 함수
(vl-directory-files [directory pattern directories])
주어진 디렉토리 내의 파일들의 리스트를 반환한다.
(vl-exe-filename)
현재 실행중인 ARX파일의 이름을 확인한다.
(vl-file-copy source-filename destination-filename [append?])
파일을 카피한다.
(vl-file-delete filename)
파일을 제거한다.
(vl-file-directory-p "filename")
주어진 파일이름이 디렉토리의 이름인지 확인한다.
(vl-file-rename old-filename new-filename)
파일의 이름을 바꾼다.
(vl-file-size filename)
파일의 크기를 알아낸다.
(vl-file-systime "filename")
파일이 작성된 시간을 알아낸다.
(vl-filename-base filename)
파일이름에서 디렉토리와 확장자를 제외한 이름만을 반환한다.
(vl-filename-directory filename)
파일이름에서 디렉토리만을 반환한다.
(vl-filename-extension filename)
파일이름에서 확장자만을 반환한다.
(vl-filename-mktemp [pattern directory extension])
만들어 낼 수 있는 임시 파일의 이름을 생성한다.
문자열을 다루는 함수
(vl-string->list string)
문자열을, 문자열을 구성하는 각 글자의 아스키 값들의 리스트로 바꾼다.
(vl-string-elt string position)
주어진 문자열의 몇번째 글자의 아스키 코드값을 반환한다. 단, 첫 글자가 0번째 글자다.
(vl-string-left-trim character-set string)
주어진 문자셋에 있는 글자가 문자열의 왼쪽에 있으면 삭제한다.
(vl-string-mismatch str1 str2 [pos1 pos2 ignore-case-p])
주어진 두 개의 문자열이 서로 달라지는 위치를 반환한다.
(vl-string-position char-code str [start-pos1 from-end-p])
주어진 아스키코드를 가진 문자가 문자열에서 몇 번째에 위치하는지 찾는다.
(vl-string-right-trim character-set string)
주어진 문자셋에 있는 글자가 문자열의 오른쪽에 있으면 삭제한다.
(vl-string-search pattern string [start-pos])
주어진 패턴이 문자열의 몇 번째에 있는지 알아낸다.
(vl-string-subst new-str pattern string [start-pos])
문자열 내의 패턴과 일치하는 글자를 새로운 문자열로 바꾼다.
(vl-string-translate source-set dest-set str)
문자열에서 처음의 문자셋에 있는 글자를 찾으면 두 번째 문자셋의 같은 위치 글자로 바꾼다.
(vl-string-trim char-set str)
주어진 문자셋에 있는 글자가 문장의 오른쪽이나 왼쪽에 있으면 삭제한다.
리스트를 다루기 위한 함수
(vl-consp list-variable)
주어진 인수가 list 인지 확인한다. listp 함수와 다른 점은 빈 리스트( '() )의 경우 nil을 반환한다는 것이다.
(vl-every predicate-function list [more-lists]...)
주어진 식으로 테스트해보아 인자로 주어진 리스트가 모두 참인지 확인한다. 즉, 리스트 안의 모든 요소들이 식을 만족하는지 확인한다.
(vl-list* object [more-objects]...)
좀 특이한 방법으로 list를 만든다. 인자의 개수와 마지막 인자가 리스트인지 여부에 따라 달리 동작한다.
(vl-list->string char-codes-list)
아스키코드들의 리스트를 문자열로 바꿔준다.
(vl-list-length list-or-cons-object)
리스트의 인자의 개수를 반환한다. length 함수와의 차이점은 cons(점으로 이루어진 리스트)가 인자로 주어진 경우 에러가 나지 않고 nil을 반환한다는 것이다.
(vl-member-if predicate-function list)
주어진 식으로 테스트해서 처음 참이 되는 리스트의 인자와 그 이후의 인자로 된 리스트를 반환한다.
(vl-member-if-not predicate-function list)
주어진 식으로 테스트해서 처음 참이 되는 리스트의 인자와 그 이후의 인자로 된 리스트를 반환한다.
(vl-position symbol list)
주어진 심벌이 리스트 내에 몇 번째에 있는가를 반환한다.
(vl-remove element-to-remove list)
주어진 인자가 리스트 내에 있으면 모두 제거한다.
(vl-remove-if predicate-function list)
리스트의 인자 중 주어진 식을 만족하는 것들을 모두 제거한다.
(vl-remove-if-not predicate-function list)
리스트의 인자 중 주어진 식을 만족하지 않는 것들을 모두 제거한다.
(vl-some predicate-function list [more-lists]...)
주어진 식으로 리스트의 인자를 테스트 해 보아 참인 것이 하나라도 있는지 확인한다.
(vl-sort list less?-function)
리스트 내의 인자들을 주어진 식에 따라 소트하여 반환한다.
(vl-sort-i list less?-function)
리스트 내의 인자들을 주어진 식에 따라 소트하여 원래의 위치에 해당하는 번호들의 리스트를 반환한다.
외부 ARX, ADS, LISP 프로그램과의 통신을 위한 함수
(vl-acad-defun 'symbol)
VLISP으로 만든 함수를 외부프로그램(ARX, ADS, LISP)에서 쓸 수 있게 허용한다.
(vl-acad-undefun 'symbol)
vl-acad-defun을 해제한다.
(vlisp-export-symbol 'symbol-name)
VLISP에서 만든 심벌(변수)을 외부프로그램(ARX, ADS, LISP)에서 참조할 수 있게 허용한다.
(vlisp-import-exsubrs '("app-name" "entry-name" ["entry-name"...]))
ARX나 ADS에서 만든 함수를 VLISP에서 쓸 수 있게 해준다.
(vlisp-import-symbol 'symbol-name)
ARX나 ADS에서 만든 심벌(변수)을 VLISP에서 쓸 수 있게 해준다.
레지스트리를 다루는 함수
(vl-registry-delete reg-key [val-name])
주어진 레지스트리 키 혹은 거기 속한 변수이름을 지운다.
(vl-registry-descendents reg-key [val-name])
주어진 레지스트리 키의 하위 레지스트리 키의 리스트를 반환한다.
(vl-registry-read reg-key [val-name])
주어진 레지스트리 키의 디폴트 값 혹은 거기 속한 변수의 값을 읽는다.
(vl-registry-write reg-key [val-name val-data])
주어진 레지스트리 키의 디폴트 값 혹은 거기 속한 변수값을 변경한다.
심벌을 다루는 함수
(vl-symbol-name symbol)
주어진 심벌의 이름을 반환한다.
(vl-symbol-value symbol)
주어진 심벌의 값을 반환한다.
(vl-symbolp object)
인자가 심벌인지 확인한다.
기타 지원 함수
(vl-init)
오토캐드를, 파일을 방금 연 때처럼 초기화한다.
(vl-prin1-to-string object)
prin1과 거의 같게 동작한다. 다만, 반환값을 항상 문자열로 만든다.
(vl-princ-to-string object)
princ와 거의 같게 동작한다. 다만, 반환값을 항상 문자열로 만든다.
ActiveX를 위한 함수
vlax-3D-point
vlax-add-cmd
vlax-curve-getArea
vlax-curve-getDistAtParam
·
·
·
vlax-tmatrix
vlax-typeinfo-available-p
vlax-vla-object->ename
vlax-write-enabled-p
'vlax-'로 시작하는 모든 함수들이 여기에 해당한다. 하지만, 이 함수들에 대한 설명은 ActiveX를 알고 있어야만 가능하므로 생략한다.
리엑터(Reactor)를 만들기 위한 함수
vlr-acdb-reactor
vlr-add
vlr-added-p
vlr-beep-reaction
·
·
·
vlr-remove-all
vlr-trace-reaction
vlr-type
vlr-types
'vlr-'로 시작하는 모든 함수들이 여기 해당한다. 리엑터를 만드는 것은 그것만으로도 한 회 이상의 강의를 필요로 하므로 이번 호에서는 언급하지 않는다.
프로그래밍 예제
새로운 함수의 기능을 익히고 그 주의사항을 아는데는 실제 프로그램을 보는 것만큼 좋은 것은 없다. 그러기에 Visual LISP의 도움말을 비롯한 요즈음 유행하는 거의 모든 프로그램 언어의 도움말 중 함수에 관한 설명에는 실례가 빠짐없이 들어있다. 물론, Visual LISP에서 제공하는 도움말에 있는 예제들도 꽤 쓸만하고, 필자도 그 예제들을 통해 함수들을 익혔지만, 이 예제들은 너무 짤막해서 종합적인 사용방법을 익히는 데는 문제가 있다고 생각해 필자가 다시 예제를 만들었다.
이 예제들은 가능한 한, 부분 부분을 실제 상황에 따다 넣으면 될 수 있게 하려 애를 썼지만 필자의 프로그래밍 실력이 부족해서 과연 독자들이 이 프로그램들을 유용하게 이용할지는 모르겠다. 이 프로그램의 소스는 새로 만든 월간 CAD/CAM의 웹사이트에 올려놓았다. 이 프로그램을 다운 받아서 직접 실행하며 설명을 읽으면 도움이 되리라 믿는다. 프로그램 내에 프로그램 소스를 읽기에 충분할 만한 주석을 넣었으므로, 먼저 프로그램 소스를 한번 스스로 읽어보시고 필자가 뒤에 설명해 놓은 각 함수에 대한 해설들을 보시기 바란다. 프로그램이 좀 길어 보이기는 하지만, 절반이 설명을 위한 주석문이므로 부담 갖지 말고 차근차근 살펴보기 바란다.
예제프로그램은 HWP 파일이나 LISP 소스 파일을 받아 보시기 바랍니다. 길이 관계상 왭에서는 올리지 않습니다.