음. 편법이기는 한데요..
실제로, 제가 알바로 수행했던 프로젝트에서 사용해서
꽤 시간을 아꼈던 적이 있습니다.
전에는 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 으로 멜 주세요..
- 존 밴 -
다음검색