隨著產品數據管理系統(tǒng)(PDM)的引入,為了便于今后的產品設計,豐富本地PDM的數據資源,需要將原先設計的產品圖紙輸入到本地零部件數據資源庫,而在輸入之前需要刪除每張圖紙中標題欄和代號欄的內容并更換PDM專用標題欄和代號欄。為了避免重復性勞動,提高輸入效率,有必要編寫專用的軟件來代替手工的操作。通過Visual Basic對AutoCAD進行二次開發(fā),成功編寫了適合本公司的圖紙批量換圖框軟件。
Windows應用程序接口,即API (Application programming interface),是一組用C語言編寫的函數庫,由操作系統(tǒng)調用來控制Windows的各個部件外觀和行為。Win32 API就是Windows32位平臺提供的應用程序編程接口。在Visual Basic中,可以像調用普通過程一樣調用API中的函數,實現所需要的操作。
Windows環(huán)境中有很多對象,諸如窗口、組合框、文本框等,可以通過API函數以不同的形式對這些對象進行操作。為此,必須以某種方法對這些對象進行標識,并把它們以參數的形式傳送給函數。Windows用一個32位的整數對各種對象進行標識,稱之為句柄。VB可以調用API函數FindWindow和FindWindowEx通過窗口標題和類名來查找指定對象,并返回句柄。
在得到指定對象的句柄之后,可以通過消息函數SendMessage和PostMessage給指定對象發(fā)送消息。SendMessage函數有4個參數,其中第一個參數(hwnd)是接收消息的窗口,即指定對象的句柄,第二個參數(wMsg)是消息編號(標識符),第三、四個參數是消息的第一、第二個參數。后兩個參數wParam和lParam并不固定,隨對象和所發(fā)送的消息而不同。
本公司的AutoCAD軟件集成了INTECAD程序,更換圖框時只需通過組合框選擇需要的標題欄和代號欄即可,如下頁圖1所示。本程序的基本原理是當標題欄dwg文件打開時,執(zhí)行更換標題欄命令會刪除原有標題欄中的數據,隨后利用VB調用API消息函數SendMessage控制AUTOCAD選擇指定的標題欄和代號欄,達到更換圖框的目的。
圖1 INTECAD程序定制圖幅界面
本軟件的主要功能是打開AUTOCAD圖紙,刪除每張圖紙中標題欄和代號欄的內容并更換PDM專用標題欄和代號欄,程序流程圖見圖2。
通過VB編程將本軟件的各種數據信息,通過對話框的形式完全體現出來,建立人機交互界面,如圖3所示。
圖紙自動換圖框軟件主要由主控制程序、選擇標題欄和代號欄子程序組成。
2.3.1 主控制程序
主控制程序實現的功能是循環(huán)打開文件列表框中的AUTOCAD圖紙,判斷圖紙為零件還是部件,根據選項判斷是否進行刪除標題欄和代號欄操作,利用注冊表將標題欄和代號欄名稱傳送給選擇標題欄和代號欄子程序,給AUTOCAD發(fā)送打開定制圖幅命令,執(zhí)行后見圖1,再通過調用選擇標題欄和代號欄子程序達到更換指定圖框的目的。具體代碼如下:
圖2 程序流程圖
圖3 程序主界面
For I = 0 To File1.ListCount - 1
Set acaddoc = acadapp.Documents.Open(astr &File1.List(I))
'利用文件名判斷圖紙為零件還是部件
Number = Split(File1.List(I), ".")
numbercount = UBound(Number)
If InStr(Number(numbercount - 1), "00") > 0 Then
headstr = headtext2
codestr = codetext2
Else
headstr = headtext1
codestr = codetext1
End If
'利用注冊表傳遞headstr和codestr
SaveSetting "通信小程序", "自定義通訊", "通訊1",headstr
SaveSetting "通信小程序", "自定義通訊", "通訊2",codestr
If Option1.Value = True Then
Call openhead(headbpath, headb)
Shell (App.Path & "headb.exe")
acaddoc.SendCommand ("tf" & vbCr)
acadapp.Documents(1).Close
End If
Shell (App.Path & "headpdm.exe")
acaddoc.SendCommand ("tf" & vbCr)
acaddoc.SendCommand ("qsave" & vbCr)
acaddoc.SendCommand ("close" & vbCr)
Set acaddoc = Nothing
Next I
2.3.2 選擇標題欄和代號欄子程序
首先從注冊表中取出主程序存入的標題欄和代號欄名稱,賦值給變量并清空數據。定義子函數, 以標題欄和代號欄名稱為變量。第一步通過API函數FindWindow查找“定制圖幅”窗口,再通過類名找到標題欄代號欄組合框控件,利用消息函數SendMessage發(fā)送組合框字符串查找消息CB_FINDSTRING來獲得標題欄和代號欄在組合框中的位置序號,再發(fā)送組合框選擇消息CB_SETCURSEL通過剛才獲取的序號選擇選項。最后找到“確定(Y)”按鈕,通過消息函數PostMessage 發(fā)送按下Y鍵的消息,完成選擇標題欄和代號欄操作。具體代碼如下:
headtext = GetSetting("通信小程序", "自定義通訊","通訊1")
codetext = GetSetting("通信小程序", "自定義通訊","通訊2")
DeleteSetting "通信小程序", "自定義通訊", "通訊1"
DeleteSetting "通信小程序", "自定義通訊", "通訊2"
Private Function pdm(ByVal headtext As String,ByVal codetext As String)
alsAnsi = StrConv(headtext, vbFromUnicode)
blsAnsi = StrConv(codetext, vbFromUnicode)
Dim starttime,count As Single
starttime = Timer
Do Until ahwnd11 Or count > 10
count = Timer - starttime
Sleep (50)
ahwnd1 = FindWindow(vbNullString, "定制圖幅")
ahwnd2 = FindWindowEx(ahwnd1, 0, "ComboBox",vbNullString)
ahwnd3 = FindWindow Ex(ahwnd1, ahwnd2,"ComboBox", vbNullString)
ahwnd4 = FindWindow Ex(ahwnd1, ahwnd3,"ComboBox", vbNullString)
ahwnd5 = Find Window Ex(ahwnd1, ahwnd4,"ComboBox", vbNullString)
ahwnd6 = FindWindow Ex(ahwnd1, ahwnd5,"ComboBox", vbNullString) '找到標題欄
ahwnd7 = FindWindow Ex(ahwnd1, ahwnd6,"ComboBox", vbNullString)
ahwnd8 = FindWindow Ex(ahwnd1, ahwnd7,"ComboBox", vbNullString) '找到代號欄
If ahwnd6 And ahwnd8 Then
Do Until (a <> -1 And b <> -1) Or count > 10
count = Timer - starttime
a = SendMessage(ahwnd6, CB_FINDSTRING, -1,ByVal StrPtr(alsAnsi)) '找到標題欄位置序號
b = SendMessage(ahwnd8, CB_FINDSTRING, -1,ByVal StrPtr(blsAnsi)) '找到代號欄位置序號
Loop
SendMessage ahwnd6, CB_SETCURSEL, a, 0 '選擇第a個選項
SendMessage ahwnd8, CB_SETCURSEL, b, 0 '選擇第b個選項
ahwnd9 = FindWindowEx(ahwnd1, 0, vbNullString,"確定(&Y)") '找確定鍵
PostMessage ahwnd9, WM_KEYDOWN, vbKeyY, 0'按下確定鍵
End If
DoEvents
ahwnd10 = FindWindow(vbNullString, "填寫欄框")
If ahwnd10 Then
ahwnd11 = Find Window Ex(ahwnd10, 0,vbNullString, "確定(&Y)")
PostMessage ahwnd11, WM_KEYDOWN, vbKeyY, 0
End If
Loop
End
End Function
本應用程序是在VB API和AutoCAD相結合的基礎上,實現了批量刪除圖紙中標題欄和代號欄的內容并更換圖框的功能,把原本商品化、通用化的AutoCAD系統(tǒng)用戶化、本地化。本文主要介紹了利用VB API作為開發(fā)工具的二次開發(fā)方法和關鍵問題,為開發(fā)其他適合用戶特定需要的專業(yè)化軟件提供了一種手段,同時也對致力于AUTOCAD二次開發(fā)的人員具有一定得參考價值。
[1] 劉炳文,李鳳華.Visual Basic 6.0 Win32 API程序設計[M].北京:清華大學出版社,2001.
[2] 張晉西.Visual Basic與AutoCAD二次開發(fā)[M].北京:清華大學出版社,2002.
[3] 尚雅玲.基于VB API的Pro/E二次開發(fā)探討[J].現代機械,2009(4):46-47.
[4] 高山,楊卓,張濤.Visual Basic中操作指針的技術及應用[J].計算機工程與設計,2009(24):5 722-5 725.
[5] 羅彬,劉獨玉.基于VB調用Windows API函數的參數傳遞研究[J].計算機應用,2001(8):264-266.