CAFE

게시판

[팁] LISP과 VBA를 연결하는 방법..

작성자존밴|작성시간01.10.27|조회수1,502 목록 댓글 0

음. 편법이기는 한데요..

실제로, 제가 알바로 수행했던 프로젝트에서 사용해서

꽤 시간을 아꼈던 적이 있습니다.

전에는 DCL을 사용해서 사용자 인터페이스를 작성하다가,

어느날 너무 노가다(?)성격이 강하다는 생각이 들어서,

VBA를 사용하려니까, 또 VBA에서는 LISP 만큼 엔티티 핸들링이

익숙하지가 않더군요..

그래서, 결국에는 편법을 사용했는데, 사실 편법이라기 보다

새로운 기법이라고 얘기하고 싶네요..

* 개괄적인 기본 방법론

- 기본은 메일 리습파일이 VBA를 Call한다.
- VBA에서 사용자 입력 다이얼로그 및 입력오류체크는 수행.
- VBA 사용자 입력이 모두 끝나고, 확인버튼이 눌려지면,
- VBA에서 Autocad에 세팅된 변수값을 전송한 후,
- 실제 수행하게될 AutoLISP을 자동 실행.

방법론은 상당히 단순하지만, 효과는 꽤 만족스럽습니다.

사용자 측면에서 바라본다면, 아무런 손색없는 완벽한

인터페이스 입니다.

실제로 다음의 예를 들면,

1. Main LISP 파일의 내용.

;; 레지스트리에 저장된 패스를 읽어온다.
(setq fDir (vl-registry-read "HKEY_CURRENT_USER\\SOFTWARE\\VB and VBA Program Settings\\TEST\\Path" "Value"))

;; VBA를 로딩.
(vl-vbaload (strcat fDir "\\Automation.dvb"))

;; 실제 수행하는 내용의 함수 정의
(defun C:virtMap()
(vl-vbarun "VirtMap")
)

2. VBA로 작업을 하고, 확인 버튼이 눌려지는 이벤트에 다음과 같은
코딩을 넣는다.

' 현재 다이얼로그 박스를 숨긴다.
VirtMapForm.Hide

' 다이얼로그에서 입력받은 값을 Autocad에 전송한다.
ThisDrawing.SendCommand "(setq inputX " & tb_Xcoord.Text & ") "

' 실제 수행할 LISP파일을 수행한다.
ThisDrawing.SendCommand "(Load """ & LispRootPath & "VirtMap.fas"") "

' LISP 함수 실행
ThisDrawing.SendCommand "(vm) "


이렇게 하면 됩니다.

물론, 중간의 많은 복잡한 과정들이 생략되기는 했지만,

방법론만 익히기에는 어느정도 예가 되었을 것 같습니다.

이 방법의 장점은

DCL 대신에 VBA를 사용하여서, 사용자 인터페이스를 개선할 수있을

뿐아니라, VBA의 특징인 외부 Windows API를 활용할 수 있다는 점과

화면 디자인 시간이 훨씬 짧아진 것입니다.


결론적으로, 사용자인터페이스 및 Windows와의 통신은 VBA에 맡기고,

실제 Autocad 도면상의 엔티티 핸들링은 LISP이 처리하는 방식입니다.

도움이 되었기를 바랍니다.

혹, 문의사항 있으면,

johnbann@orgio.net 으로 멜 주세요..

- 존 밴 -
다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼