AutoCAD是一個常用工業繪圖平台,用戶在使用時經常要用Lisp或ADS進行二次開發,但Lisp處理數據庫能力差,編制界面困難,而ADS要求較高.相比之下,VisualBasic(以下簡稱VB)編寫獨立程序的速度快,編制界面容易,可進行快速計算,可操作數據庫。ACADWIN是AUTOCAD的Windows版程序,具有WINDOWS的許多特點。可以利用DDE進行VB與ACADWIN之間的通訊,實現AutoCAD編程。
VB在ACADWIN的應用文件
因為ACADWINR12不支持如PastLink的直接DDE方法,所以要有一個控件與VB相聯系,以進行數據傳遞。這裡主要用到以下幾個文件:
1):DDEBAS.EXE這是VB/DDE服務器程序,必須在運行VB應用程序前調入,在命令行下鍵入:(XLOAD“DDEBAS”)。
2):ACADVB.DLL,VB應用程序的動態連接庫。
3):GLOBAL.BAS,VB應用程序的全程變量的定義文件。
4):ADSFUNCS.BAS,VB應用程序對ADS庫標准函數的調用。
5):ADSFUNCS.FRM,標准ACADWIN的初始VB窗口。
6):NEW.FRM,用於新建標准初始VB窗口。
後4個文件在ACADWIN/VB/NEW目錄下,編程時只要打開NEWPROJ.MAK就都有了,但NEW.FRM可以不要,只要把啟動文件定為ADSFUNC.FRM即可。
VB在ACADWIN的使用方法
為了實現DDE通訊,先要在ADSFUNCS.FRM中增加一個用於通訊的TEXT(文本框)控件,並在特性表中將其NAME命名為ACADTEXT,TEXT的CAPTION置為空串(減少窗體不必要的信息),VISIBLE特性呈為TURE。用linkapp函數初始化並關閉連接。
過程linkapp代碼如下:
sublinkapp(linkascontonl,appnameasstring,topicasstring)
link.linkmode=0'關閉通訊
link.linktopic=appname “|” topic'置通訊主題
link.linkmode=2'手工通訊
endsub
增加一個過程unlinkapp,其代碼如下:
subunlinkapp(linkascontonl)
link.linkmode=0'關閉通訊
endsub
在窗體事件中,增加如下代碼:
subform_load()
LINKAPPACADTEXT,“AUTOCAD.DDE”,“SYSTEM”
endsub
subform_unload(cancelasinteger)
UNLINKAPPACADTEXT
endsub
如畫圓“CIRCLE”,先在ADSFUNC.FRM中增加一個命令鈕COMMAND1,將其CAPTION置為“C
IRCLE”,在子過程中增加以下代碼:
SUBCOMMAND1_CLICK()
ACADTEXT.LINKEXECUTE“[^3^3CIRCLE]”
ENDSUB
至此可以實現繪圖命令。如果要實現復雜的功能,如捕捉特征點,獲得特性,參數化繪圖,等能否讓完成界面及計算功能,把參數傳給一個Lisp程序,然後再將程序調入環境中完成繪圖呢?答案是肯定的這就要用到“SendKey"語句。該語句功能是向具有焦點的窗口發送字符,就象從鍵盤中鍵入一樣。這時先用函數FindACAD()找到ACADWIN的句柄,再用AcadACTIVE函授激活ACADWIN,使其具有焦點,這時就可以用SendKey了。
如有一個Lisp程序YZ.LSP,主函數為“C:YZ()”,可先在ADSFUNC.FRM中增加一個命令鈕COMMAND2,將其CAPTION置為“YZ”,在子過程中增加以下代碼:
SUBCOMMAND2_CLICK()
hwndAcad=FindAcad()
AcadActivate(hwndAcad)
SendKeys“{(}load ‘yz '{)}”,-1
SendKeys“{enter}”,-1
SendKeys“yz”,-1
ENDSUB
以上方法可以實現通過VB的界面選取參數,進行計算;用Lisp進行繪圖。有兩個問題值得注意:一:如要進行參數的傳遞,可以先用VB寫臨時數據文件,再用Lisp讀此臨時數據文件。二:因為與窗體布置不一定使ACADWIN和VB應用程序兩者同時可見,Lisp程序執行完畢,不能自動返回到VB應用程序,這時可以通過調用WindowsAPI函數SetWindowPos來使應用程序總浮在最上面,避免了來回切換窗口。這種技術的實現在本報已有介紹.
在ADSFUNCS.BAS中也定義了很多ADS函數可供調用。如ACADWINVBASVU中有一個例子ASVU.EXE,就是應用Ads_getvar及Ads_setvar函數,在SYSVARS.MAK的intervai.bas可以看到。但DDE的鏈接方式要改變,在啟動窗體或函授中加上:
DDE_TIMEOUT=-1'等待一個DDE事件
openDDE'ADSFUNCS.BAS中一個函數,初始化DDE鏈接->