牛 凱, 項輝宇, 蘇德榮
(1.北京工商大學 機械工程學院, 北京 100048;2.北京林業大學 教育部森林培育與保護重點實驗室, 北京 100083)
滴灌系統關鍵技術是把滴灌帶鋪于地下,結合水利、材料、控制等其它專業技術,構成一個大田膜下滴灌系統,可有效節約用水,使農田水利化. 本文主要探討在AutoCAD VBA(visual basic for application,簡稱VBA)環境下開發具有開放性的滴灌系統設計軟件,該軟件完全參照滴灌系統設計手冊設計.
通過軟件的查詢功能,設計人員可查詢各種參數數據. 部分參數表可供設計人員根據當地作物特征進行添加和刪除. 設計人員只需填寫和選擇基本的數據,即生成該設計的必要參數文檔,供設計人員參考和選型. 通過文本和Excel,用戶可以記錄并保存所需的某些參數.
VBA最早建立在Microsoft的Office 97中,易用且功能強大. 常用的繪圖軟件AutoCAD自R14.01版本開始就支持VBA作為二次開發工具. VBA最大特點和最大優點在于兩個方面:第一,與VB有著幾乎相同的開發環境和語法,具備功能強大和易于掌握的特點;第二,在于它的for Application功能,針對性強,它駐留在主程序的內部,使其結構精簡,且代碼運行效率高,使語言的引擎在技術上與開發環境分離. 它的功能在很大程度上依賴于它的客戶顯露的Automation接口[1].
VBA作為一個集成的開發環境,它提供了高質量的用戶化編程能力,能夠使AutoCAD數據與其它的VBA應用程序,如Microsoft Excel軟件,直接共享,實現無縫連接,交換數據非常方便. 在Auto CAD環境下的VBA開發,需要安裝CAD,VB及Excel等軟件[2].
本設計面向用戶為滴灌系統的設計人員,所以設計界面應符合設計邏輯,符合用戶習慣. 圖1為軟件界面. 圖2為軟件功能模塊界面,此界面主要分為4部分:1)參考資料;2)灌溉制度及基本參數;3)水力計算;4)文檔管理.

圖1 軟件界面Fig.1 Userface

圖2 軟件功能模塊Fig.2 Modules of software
通過第一部分,用戶可獲得設計的基本知識,基本參數,該部分中作物/植物項可供用戶自己創建和添加當地作物的參數. 通過第二部分,用戶根據提示輸入已選好的基本參數計算出灌溉周期、灌溉時間以及灌溉頻率等參數. 通過第三部分計算,用戶可以得到毛管、支管、干管等必要的設計參數,幫助設計人員完成設備的選擇、管路的鋪設等設計. 第四部分實現對文檔的管理,是該軟件開放性、個性化的體現.
用戶通過點擊界面上的各個功能鍵,進入相應功能,該功能簡單明了.
在第一部分設計資料中,主要為兩級的窗體,即點擊功能鍵→具體功能界面,點擊各個命令→相應的參數表或圖像. 圖3為滴頭查詢界面.

圖3 滴頭查詢界面Fig.3 Knowledge of drip
第二、第三部分主要為計算界面,即當設計人員輸入已知參數時計算出相應的關鍵設計參數. 圖4為基本參數計算界面.

圖4 基本參數界面Fig.4 Interface for necessary parameter
第四部分是實現用戶對所得參數文檔的保存和編輯,文檔形式有文本和Excel兩種,這兩種操作較為常用,這里不再介紹.
將VBA程序添加到CAD菜單中,設計人員可以通過點擊菜單快速啟動該程序,免去了一些不必要的麻煩. 具體的思路是通過在VBA開發界面的AutoCAD對象下的“This drawing”下添加程序段,以使當CAD界面啟動時在CAD模板中添加一個菜單鍵到工具欄中,當點擊該啟動鍵時啟動標準模塊下的宏,通過該宏調用主程序,從而啟動該程序. 啟動后如圖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")
′添加菜單項
Dim macro As String
Macro=Chr(vbKeyEscape)+Chr(vbKey_Escape) ′相當于按下兩次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實現查詢功能

圖5 水質查詢Fig.5 Knowledge of water quality
設計時需要對各種資料進行查詢,通過軟件查詢簡單、明了. 主要設計有兩種查詢方式:一是將所需的資料做成圖片的形式,通過滾動條拉動圖片的方式,可以將較大圖片放入其中加以查詢. 圖5是通過該圖片查詢水質參數的界面. 二是通過列表的方式查詢,當點擊所選種類或型號時,自動彈出屬于該種類或型號相關項目的各種參數. 圖6為管材的查詢對話框,用戶通過選擇所需的管材時得知其壁厚、內徑等參數.

圖6 管材查詢對話框Fig.6 Interface for pipe material
2.2.2添加和刪除參數,實現開放功能
不同地域的作物、種植條件和各種參數信息是不同的.
1) 用戶需要對信息存取和創建,需要數據庫,本文設計為對文本文件的存取和創建. 通過open語句,如:
Open "path" for input As # number
對文本進行讀取.
Open "path" for output As # number
創建文本.
Open "path" for Append As # number
將數據添加到文本.
當輸入指定格式的數據后,若為已有植物種類時可在已存在的文本中按規定的格式添加;若為新的植物名稱則需要創建新的文本,并按規定格式保存數據,以備用戶以后讀取用.
Open "D:林大林大開發-VBA農作物溫室" & indata(0) & ".txt" for Output As # 8
Print #8 ,indata(0)
Close #8
Open "D:林大林大開發-VBA農作物溫室作物" & indata(0) & ".txt" For Output
As # 9
Print # 9,indata(1) & " " & indata(2)
_ & " " & indata(3)
Close # 9
此段程序將完成對所輸入信息以文本方式的存儲,其中通過數組將所輸入的作物名稱及參數加以分類,然后進行存儲. 此外當遇到輸入錯誤即格式與要求的不同時,應能提示錯誤,并要求用戶重新輸入. 這里是將數據分配到數組中,通過檢查數組中的數據來檢查格式的正確與否,相符時輸入,否則清零重輸,如圖7.

圖7 出錯時提示錯誤Fig.7 Remind user when error
2) 刪除功能的實現. 當輸入的數據有誤或需要刪除某些數據時,就需要對數據進行刪除. 不僅要刪除界面中的數據,還要把文件中的數據刪除并保存,以供下次使用. 應用Open和Kill命令的組合,首先逐行讀取文件并與要刪除的數據行進行比較,不一樣的數據行就通過Open重新創建文件,并輸入該行,若一樣則跳過. 這樣最后再應用Kill命令刪除原文本,就創建了一個新文本,該文本不含已刪除的數據行. 從而實現了對數據的刪除與保存,如圖8.

圖8 刪除操作Fig.8 Delete selected parameter
第一部分的其他功能大致與此類同,不做過多贅述.
3) 水利計算功能. 通過前面的查表功能可以得到基本參數,在此功能中輸入基本參數,點擊計算鍵計算出主要參數.
將參數通過文本框輸入后,賦值給變量進行計算,結果傳遞并輸出到文本框. 此外還要對錯誤的輸入進行提示. 本設計中限制了用戶輸入只能輸入數字且為正數,主要是通過Keypress事件中添加程序段來實現的. 程序如下:
If KeyAscii >= 48 And KeyAscii ? 57 Then
ElseIf KeyAscii = Asc(".") Then
Else
KeyAscii = 0
End If
由于KeyAscii返回的是鍵盤所按鍵的Asc碼,所以通過控制數字和小數點的Asc碼,就可以實現只能輸入數字的功能.
此外對于已經計算得出的結果,需要保存,此處為文本方式和電子表格方式,文本方式的讀取與存儲不再贅述. 保存文件時,應用了CommonDialog 控件對文本保存路徑加以設置,以便用戶以后的查詢. 首先設置CommomDialog的各屬性,通過調用標準模塊下的Sub程序實現[3].
Public sub comsave()
With CommonDialog
.DialogTitle = "保存文本文件"
.Filter = "文本文件(*.txt)|*.txt|所有文件 (*.*)|*.*"
.InitDir = "D:林大林大開發-VBA"
.DefaultExt = "txt"
.ShowSave
End With
End Sub
設計后存儲功能的對話窗體如圖9.

圖9 存儲對話框Fig.9 Interface for save
對于調用并創建Excel需要聲明Excel Application,Workbook, Worksheet等對象. 用下面的語句實現[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)
若是調用已創建的Excel,通過下面的語句實現.
Set xlapp = New excel.Application
Set xlbook = xlapp.workbooks.open("指定路徑")
此句申請一個Excel.Application內存空間,并通過制定路徑實現對Excel的讀取. 接下來的就是應用命令對Excel的操作,這里不作贅述.
完成了各項基本功能的設計,后續工作主要圍繞數據輸出格式(如Excel, txt等),以及具體應用中出現的問題的完善,以使其更加優化.
通過設計本程序可以使滴灌系統的設計簡單化,更有利于縮短設計時間,同時又能使用戶存儲必要的信息. 如果進一步完善本軟件,還可以通過數據庫對設計知識的存儲,方便用戶的知識積累,以便查詢。同時實現通過計算得到的參數自動在AutoCAD中修改和優化的管路鋪設圖,可大大減輕設計負擔.