?!P, 項(xiàng)輝宇, 蘇德榮
(1.北京工商大學(xué) 機(jī)械工程學(xué)院, 北京 100048;2.北京林業(yè)大學(xué) 教育部森林培育與保護(hù)重點(diǎn)實(shí)驗(yàn)室, 北京 100083)
滴灌系統(tǒng)關(guān)鍵技術(shù)是把滴灌帶鋪于地下,結(jié)合水利、材料、控制等其它專業(yè)技術(shù),構(gòu)成一個(gè)大田膜下滴灌系統(tǒng),可有效節(jié)約用水,使農(nóng)田水利化. 本文主要探討在AutoCAD VBA(visual basic for application,簡稱VBA)環(huán)境下開發(fā)具有開放性的滴灌系統(tǒng)設(shè)計(jì)軟件,該軟件完全參照滴灌系統(tǒng)設(shè)計(jì)手冊設(shè)計(jì).
通過軟件的查詢功能,設(shè)計(jì)人員可查詢各種參數(shù)數(shù)據(jù). 部分參數(shù)表可供設(shè)計(jì)人員根據(jù)當(dāng)?shù)刈魑锾卣鬟M(jìn)行添加和刪除. 設(shè)計(jì)人員只需填寫和選擇基本的數(shù)據(jù),即生成該設(shè)計(jì)的必要參數(shù)文檔,供設(shè)計(jì)人員參考和選型. 通過文本和Excel,用戶可以記錄并保存所需的某些參數(shù).
VBA最早建立在Microsoft的Office 97中,易用且功能強(qiáng)大. 常用的繪圖軟件AutoCAD自R14.01版本開始就支持VBA作為二次開發(fā)工具. VBA最大特點(diǎn)和最大優(yōu)點(diǎn)在于兩個(gè)方面:第一,與VB有著幾乎相同的開發(fā)環(huán)境和語法,具備功能強(qiáng)大和易于掌握的特點(diǎn);第二,在于它的for Application功能,針對性強(qiáng),它駐留在主程序的內(nèi)部,使其結(jié)構(gòu)精簡,且代碼運(yùn)行效率高,使語言的引擎在技術(shù)上與開發(fā)環(huán)境分離. 它的功能在很大程度上依賴于它的客戶顯露的Automation接口[1].
VBA作為一個(gè)集成的開發(fā)環(huán)境,它提供了高質(zhì)量的用戶化編程能力,能夠使AutoCAD數(shù)據(jù)與其它的VBA應(yīng)用程序,如Microsoft Excel軟件,直接共享,實(shí)現(xiàn)無縫連接,交換數(shù)據(jù)非常方便. 在Auto CAD環(huán)境下的VBA開發(fā),需要安裝CAD,VB及Excel等軟件[2].
本設(shè)計(jì)面向用戶為滴灌系統(tǒng)的設(shè)計(jì)人員,所以設(shè)計(jì)界面應(yīng)符合設(shè)計(jì)邏輯,符合用戶習(xí)慣. 圖1為軟件界面. 圖2為軟件功能模塊界面,此界面主要分為4部分:1)參考資料;2)灌溉制度及基本參數(shù);3)水力計(jì)算;4)文檔管理.
圖1 軟件界面Fig.1 Userface
圖2 軟件功能模塊Fig.2 Modules of software
通過第一部分,用戶可獲得設(shè)計(jì)的基本知識(shí),基本參數(shù),該部分中作物/植物項(xiàng)可供用戶自己創(chuàng)建和添加當(dāng)?shù)刈魑锏膮?shù). 通過第二部分,用戶根據(jù)提示輸入已選好的基本參數(shù)計(jì)算出灌溉周期、灌溉時(shí)間以及灌溉頻率等參數(shù). 通過第三部分計(jì)算,用戶可以得到毛管、支管、干管等必要的設(shè)計(jì)參數(shù),幫助設(shè)計(jì)人員完成設(shè)備的選擇、管路的鋪設(shè)等設(shè)計(jì). 第四部分實(shí)現(xiàn)對文檔的管理,是該軟件開放性、個(gè)性化的體現(xiàn).
用戶通過點(diǎn)擊界面上的各個(gè)功能鍵,進(jìn)入相應(yīng)功能,該功能簡單明了.
在第一部分設(shè)計(jì)資料中,主要為兩級(jí)的窗體,即點(diǎn)擊功能鍵→具體功能界面,點(diǎn)擊各個(gè)命令→相應(yīng)的參數(shù)表或圖像. 圖3為滴頭查詢界面.
圖3 滴頭查詢界面Fig.3 Knowledge of drip
第二、第三部分主要為計(jì)算界面,即當(dāng)設(shè)計(jì)人員輸入已知參數(shù)時(shí)計(jì)算出相應(yīng)的關(guān)鍵設(shè)計(jì)參數(shù). 圖4為基本參數(shù)計(jì)算界面.
圖4 基本參數(shù)界面Fig.4 Interface for necessary parameter
第四部分是實(shí)現(xiàn)用戶對所得參數(shù)文檔的保存和編輯,文檔形式有文本和Excel兩種,這兩種操作較為常用,這里不再介紹.
將VBA程序添加到CAD菜單中,設(shè)計(jì)人員可以通過點(diǎn)擊菜單快速啟動(dòng)該程序,免去了一些不必要的麻煩. 具體的思路是通過在VBA開發(fā)界面的AutoCAD對象下的“This drawing”下添加程序段,以使當(dāng)CAD界面啟動(dòng)時(shí)在CAD模板中添加一個(gè)菜單鍵到工具欄中,當(dāng)點(diǎn)擊該啟動(dòng)鍵時(shí)啟動(dòng)標(biāo)準(zhǔn)模塊下的宏,通過該宏調(diào)用主程序,從而啟動(dòng)該程序. 啟動(dòng)后如圖1,程序如下:
Option Explicit
Sub AddASubMenu()
Dim currMenuGroup As AcadMenuGroup
Set currMenuGroup=ThisDrawing.
Application.MenuGroups.Item(0)
Dim newMenu As AcadPopupMenu
Set newMenu=currMenuGroup.Menus.
Add("MyMen" & Chr(Asc("&")) & "u")
′添加菜單項(xiàng)
Dim macro As String
Macro=Chr(vbKeyEscape)+Chr(vbKey_Escape) ′相當(dāng)于按下兩次Esc鍵
Dim menuItemOpen As AcadPopup
_MenuItem
Set menuItemOpen=newMenu.
AddMenuItem(newMenu.Count+1,
Chr(Asc("&")) & "林大", macro & "-vbarun" + Chr(32) + "main_1.dvb!UFO.
comDialog" + Chr(32))
′在菜單欄上顯示菜單
newMenu.InsertInMenuBar (ThisDrawing.
Application.MenuBar.Count + 1)
End Sub
2.2.1實(shí)現(xiàn)查詢功能
圖5 水質(zhì)查詢Fig.5 Knowledge of water quality
設(shè)計(jì)時(shí)需要對各種資料進(jìn)行查詢,通過軟件查詢簡單、明了. 主要設(shè)計(jì)有兩種查詢方式:一是將所需的資料做成圖片的形式,通過滾動(dòng)條拉動(dòng)圖片的方式,可以將較大圖片放入其中加以查詢. 圖5是通過該圖片查詢水質(zhì)參數(shù)的界面. 二是通過列表的方式查詢,當(dāng)點(diǎn)擊所選種類或型號(hào)時(shí),自動(dòng)彈出屬于該種類或型號(hào)相關(guān)項(xiàng)目的各種參數(shù). 圖6為管材的查詢對話框,用戶通過選擇所需的管材時(shí)得知其壁厚、內(nèi)徑等參數(shù).
圖6 管材查詢對話框Fig.6 Interface for pipe material
2.2.2添加和刪除參數(shù),實(shí)現(xiàn)開放功能
不同地域的作物、種植條件和各種參數(shù)信息是不同的.
1) 用戶需要對信息存取和創(chuàng)建,需要數(shù)據(jù)庫,本文設(shè)計(jì)為對文本文件的存取和創(chuàng)建. 通過open語句,如:
Open "path" for input As # number
對文本進(jìn)行讀取.
Open "path" for output As # number
創(chuàng)建文本.
Open "path" for Append As # number
將數(shù)據(jù)添加到文本.
當(dāng)輸入指定格式的數(shù)據(jù)后,若為已有植物種類時(shí)可在已存在的文本中按規(guī)定的格式添加;若為新的植物名稱則需要?jiǎng)?chuàng)建新的文本,并按規(guī)定格式保存數(shù)據(jù),以備用戶以后讀取用.
Open "D:林大林大開發(fā)-VBA農(nóng)作物溫室" & indata(0) & ".txt" for Output As # 8
Print #8 ,indata(0)
Close #8
Open "D:林大林大開發(fā)-VBA農(nóng)作物溫室作物" & indata(0) & ".txt" For Output
As # 9
Print # 9,indata(1) & " " & indata(2)
_ & " " & indata(3)
Close # 9
此段程序?qū)⑼瓿蓪λ斎胄畔⒁晕谋痉绞降拇鎯?chǔ),其中通過數(shù)組將所輸入的作物名稱及參數(shù)加以分類,然后進(jìn)行存儲(chǔ). 此外當(dāng)遇到輸入錯(cuò)誤即格式與要求的不同時(shí),應(yīng)能提示錯(cuò)誤,并要求用戶重新輸入. 這里是將數(shù)據(jù)分配到數(shù)組中,通過檢查數(shù)組中的數(shù)據(jù)來檢查格式的正確與否,相符時(shí)輸入,否則清零重輸,如圖7.
圖7 出錯(cuò)時(shí)提示錯(cuò)誤Fig.7 Remind user when error
2) 刪除功能的實(shí)現(xiàn). 當(dāng)輸入的數(shù)據(jù)有誤或需要?jiǎng)h除某些數(shù)據(jù)時(shí),就需要對數(shù)據(jù)進(jìn)行刪除. 不僅要?jiǎng)h除界面中的數(shù)據(jù),還要把文件中的數(shù)據(jù)刪除并保存,以供下次使用. 應(yīng)用Open和Kill命令的組合,首先逐行讀取文件并與要?jiǎng)h除的數(shù)據(jù)行進(jìn)行比較,不一樣的數(shù)據(jù)行就通過Open重新創(chuàng)建文件,并輸入該行,若一樣則跳過. 這樣最后再應(yīng)用Kill命令刪除原文本,就創(chuàng)建了一個(gè)新文本,該文本不含已刪除的數(shù)據(jù)行. 從而實(shí)現(xiàn)了對數(shù)據(jù)的刪除與保存,如圖8.
圖8 刪除操作Fig.8 Delete selected parameter
第一部分的其他功能大致與此類同,不做過多贅述.
3) 水利計(jì)算功能. 通過前面的查表功能可以得到基本參數(shù),在此功能中輸入基本參數(shù),點(diǎn)擊計(jì)算鍵計(jì)算出主要參數(shù).
將參數(shù)通過文本框輸入后,賦值給變量進(jìn)行計(jì)算,結(jié)果傳遞并輸出到文本框. 此外還要對錯(cuò)誤的輸入進(jìn)行提示. 本設(shè)計(jì)中限制了用戶輸入只能輸入數(shù)字且為正數(shù),主要是通過Keypress事件中添加程序段來實(shí)現(xiàn)的. 程序如下:
If KeyAscii >= 48 And KeyAscii ? 57 Then
ElseIf KeyAscii = Asc(".") Then
Else
KeyAscii = 0
End If
由于KeyAscii返回的是鍵盤所按鍵的Asc碼,所以通過控制數(shù)字和小數(shù)點(diǎn)的Asc碼,就可以實(shí)現(xiàn)只能輸入數(shù)字的功能.
此外對于已經(jīng)計(jì)算得出的結(jié)果,需要保存,此處為文本方式和電子表格方式,文本方式的讀取與存儲(chǔ)不再贅述. 保存文件時(shí),應(yīng)用了CommonDialog 控件對文本保存路徑加以設(shè)置,以便用戶以后的查詢. 首先設(shè)置CommomDialog的各屬性,通過調(diào)用標(biāo)準(zhǔn)模塊下的Sub程序?qū)崿F(xiàn)[3].
Public sub comsave()
With CommonDialog
.DialogTitle = "保存文本文件"
.Filter = "文本文件(*.txt)|*.txt|所有文件 (*.*)|*.*"
.InitDir = "D:林大林大開發(fā)-VBA"
.DefaultExt = "txt"
.ShowSave
End With
End Sub
設(shè)計(jì)后存儲(chǔ)功能的對話窗體如圖9.
圖9 存儲(chǔ)對話框Fig.9 Interface for save
對于調(diào)用并創(chuàng)建Excel需要聲明Excel Application,Workbook, Worksheet等對象. 用下面的語句實(shí)現(xiàn)[3].
Dim xlapp As excel.Application
Dim xlbook As excel.Workbook
Dim xlsheet As excel.Worksheet
Set xlapp = Creatobject ("Excel.Application")
Set xlbook = xlapp.Workbooks.Add
Set xlsheet = excel.Application.Worksheets(1)
若是調(diào)用已創(chuàng)建的Excel,通過下面的語句實(shí)現(xiàn).
Set xlapp = New excel.Application
Set xlbook = xlapp.workbooks.open("指定路徑")
此句申請一個(gè)Excel.Application內(nèi)存空間,并通過制定路徑實(shí)現(xiàn)對Excel的讀取. 接下來的就是應(yīng)用命令對Excel的操作,這里不作贅述.
完成了各項(xiàng)基本功能的設(shè)計(jì),后續(xù)工作主要圍繞數(shù)據(jù)輸出格式(如Excel, txt等),以及具體應(yīng)用中出現(xiàn)的問題的完善,以使其更加優(yōu)化.
通過設(shè)計(jì)本程序可以使滴灌系統(tǒng)的設(shè)計(jì)簡單化,更有利于縮短設(shè)計(jì)時(shí)間,同時(shí)又能使用戶存儲(chǔ)必要的信息. 如果進(jìn)一步完善本軟件,還可以通過數(shù)據(jù)庫對設(shè)計(jì)知識(shí)的存儲(chǔ),方便用戶的知識(shí)積累,以便查詢。同時(shí)實(shí)現(xiàn)通過計(jì)算得到的參數(shù)自動(dòng)在AutoCAD中修改和優(yōu)化的管路鋪設(shè)圖,可大大減輕設(shè)計(jì)負(fù)擔(dān).