甄 良,李忠明
(北京全路通信信號(hào)研究設(shè)計(jì)院集團(tuán)有限公司,北京 100070)
RD1 型電加熱道岔融雪系統(tǒng)是根據(jù)國(guó)內(nèi)鐵路道岔特點(diǎn)而研制開(kāi)發(fā)的,廣泛適用于客運(yùn)專線、鐵路干線、重載線路和城際軌道交通等領(lǐng)域,適用于電氣化和非電氣化牽引區(qū)段各種類型的道岔。隨著計(jì)算機(jī)軟件技術(shù)不斷發(fā)展,為系統(tǒng)定制化開(kāi)發(fā)數(shù)據(jù)工具軟件的需求應(yīng)運(yùn)而生。
根據(jù)站場(chǎng)工程設(shè)計(jì)圖紙,通過(guò)軟件將融雪系統(tǒng)的操作界面圖形、系統(tǒng)參數(shù)配置等形成數(shù)據(jù)文件,采用具有交互功能且具備統(tǒng)一標(biāo)準(zhǔn)化的語(yǔ)言格式描述并形成文件存儲(chǔ)。
道岔融雪系統(tǒng)的界面顯示主要由控制柜、變壓器、道岔、區(qū)段、命令按鈕、站名文本、狀態(tài)標(biāo)簽等圖形元素構(gòu)成。通過(guò)系統(tǒng)菜單或鼠標(biāo)快捷菜單實(shí)現(xiàn)按照設(shè)計(jì)圖紙及界面顯示需求將上述不同類型界面圖形元素生成,并對(duì)單個(gè)或多個(gè)圖形元素進(jìn)行動(dòng)態(tài)編輯。以控制柜為例,對(duì)圖元屬性說(shuō)明如表1 所示。
表1 圖元屬性樣例表Tab.1 Examples of attributes of graphic elements
軟件開(kāi)發(fā)基于.NET FrameWork4.6 的WinForm窗體應(yīng)用,開(kāi)發(fā)語(yǔ)言使用C#,開(kāi)發(fā)工具使用Visual Studio2019,編譯目標(biāo)平臺(tái)為x86。
1)圖元數(shù)據(jù)類
圖1 圖元類繼承關(guān)系圖Fig.1 Relationship between basic and derivative graphic elements
根據(jù)軟件需求共設(shè)計(jì)1 個(gè)抽象基類ShapeGraph 和6個(gè)派生子類CabinetGraph、SectionGraph、SwitchGraph、CmdButGraph、StaLableGraph、TransformGraph,各類之間繼承關(guān)系如圖 1 所示。
2)操作接口類
在圖元數(shù)據(jù)類和窗體類之間的StaGraph 類,作用是降低數(shù)據(jù)與顯示、操作的耦合;為數(shù)據(jù)序列化和反序列化提供數(shù)據(jù)聚合的支持。
1)類繼承方法
派生子類根據(jù)不同的圖元類型實(shí)現(xiàn)圖元的繪制(主窗體、預(yù)覽窗體)、圖元的操作(響應(yīng)菜單命令、鼠標(biāo)、鍵盤(pán)進(jìn)行移動(dòng)、刪除、關(guān)聯(lián)等)、屬性數(shù)據(jù)的編輯保存。引入抽象基類ShapeGraph,各子類通過(guò)繼承獲得父類屬性數(shù)據(jù)、操作方法接口,有效降低代碼冗余。
2)泛型方法
泛型在C#中有很重要的地位,在編寫(xiě)軟件時(shí)經(jīng)常會(huì)遇到功能非常相似的模塊,只是處理的數(shù)據(jù)不一樣,泛型的出現(xiàn)就是專門(mén)來(lái)解決這個(gè)問(wèn)題的。
各個(gè)圖元對(duì)象封裝在不同對(duì)象List 中,其移動(dòng)函數(shù)方法相近,通過(guò)構(gòu)造泛型函數(shù):
public void MoveDevByOffsetValue
實(shí)現(xiàn)對(duì)不同對(duì)象使用同一個(gè)泛型函數(shù)進(jìn)行移動(dòng)操作。
方法中使用了Dynamic 對(duì)象,將泛型方法和動(dòng)態(tài)對(duì)象進(jìn)行結(jié)合使用,在泛型類型檢查約束之下,發(fā)揮動(dòng)態(tài)對(duì)象靈活性同時(shí)保障了使用安全。
窗體類為圖元數(shù)據(jù)類提供數(shù)據(jù)圖形化顯示、操作命令的接口;圖元數(shù)據(jù)類通過(guò)響應(yīng)窗口類提供的操作命令實(shí)現(xiàn)圖元對(duì)象生成、編輯、數(shù)據(jù)保存,并為窗體類顯示提供必要的數(shù)據(jù)和調(diào)用方法。
Stagraph 類作為數(shù)據(jù)類和窗體類之間的解耦接口類,在圖元對(duì)象和窗體類之間使用固定的接口函數(shù),數(shù)據(jù)和窗體的代碼解耦如圖 2 所示。
圖2 各類之間的數(shù)據(jù)及方法接口關(guān)系圖Fig.2 Relationship between data and interface method of each type of objects
.NET 下的System.Text.RegularExpressions正則表達(dá)式引擎為在軟件開(kāi)發(fā)中使用正則表達(dá)式提供了強(qiáng)大支持。以軟件中使用正則表達(dá)式實(shí)現(xiàn)用戶在文本框中輸入的數(shù)據(jù)同時(shí)進(jìn)行輸入數(shù)據(jù)檢查為例:正則表達(dá)式定義:private const string pattern=@”^[0-9]*$”,限制輸入字符為數(shù)字0~9,在控件的鍵盤(pán)事件函數(shù)內(nèi)調(diào)用該規(guī)則檢查實(shí)現(xiàn)。
GDI+相比于GDI 提供了更為強(qiáng)大的繪圖功能,通過(guò)簡(jiǎn)單地創(chuàng)建一個(gè)圖形對(duì)象(Graphics),使用面向?qū)ο蟮木幊谭绞秸{(diào)用它的方法即可。在窗體繪圖中應(yīng)注意資源釋放、繪圖坐標(biāo)系轉(zhuǎn)換調(diào)整和顯示刷新機(jī)制方面的內(nèi)容。
1)為什么使用序列化
使用序列化可以實(shí)現(xiàn)持久化內(nèi)存中的對(duì)象,將對(duì)象以數(shù)據(jù)的形式便捷的進(jìn)行存儲(chǔ)、網(wǎng)絡(luò)交互,并在需要的時(shí)候使用反序列化根據(jù)數(shù)據(jù)重構(gòu)對(duì)象。
2)序列化的方法比較和選擇
序列化的方法有多種,C#常見(jiàn)的有二進(jìn)制(流)、XML、Soap 等。各種方法均有其適用性。本文采用的是Json 序列化方法。
3)Json.NET 序列化
.NET 支持Json 序列化的方法和庫(kù)很多,本文選用了Newtonsoft 的Json.NET 實(shí)現(xiàn)。
技術(shù)要點(diǎn)在于如何將不同對(duì)象的List 正確序列化,并在反序列化時(shí)按照不同的類型進(jìn)行對(duì)象準(zhǔn)確重構(gòu)。本文采取了將Newtonsoft.Json.Linq 中JObject對(duì)象與其他對(duì)象互轉(zhuǎn)的泛型方法與鍵值讀取的方法結(jié)合的方法實(shí)現(xiàn)。
本文以某4 股道的中間站施工圖紙為輸入,使用數(shù)據(jù)工具進(jìn)行了數(shù)據(jù)設(shè)計(jì),共計(jì)4 組道岔、2 臺(tái)融雪控制柜、48 臺(tái)變壓器。通過(guò)軟件,可以對(duì)上述的設(shè)備及其名稱、參數(shù)按照設(shè)計(jì)需要使用鼠標(biāo)進(jìn)行位置調(diào)整、數(shù)據(jù)輸入,形成數(shù)據(jù)文件,供現(xiàn)場(chǎng)控制軟件使用,保持顯示一致。最終數(shù)據(jù)完成界面如圖 3 軟件界面所示。
圖3 軟件界面Fig.3 Software interface
以道岔融雪數(shù)據(jù)設(shè)計(jì)工具的設(shè)計(jì)和開(kāi)發(fā)實(shí)現(xiàn)過(guò)程為基礎(chǔ),以使用C#開(kāi)發(fā)語(yǔ)言和.NET 框架開(kāi)發(fā)交互式Windows 桌面軟件的思路和需要關(guān)注和掌握的技術(shù)要點(diǎn)為側(cè)重,結(jié)合代碼實(shí)例對(duì)技術(shù)實(shí)現(xiàn)細(xì)節(jié)進(jìn)行展現(xiàn)。通過(guò)數(shù)據(jù)工具軟件的開(kāi)發(fā)對(duì)系統(tǒng)界面和數(shù)據(jù)進(jìn)行定制、標(biāo)準(zhǔn)化的數(shù)據(jù)格式封裝,在降低數(shù)據(jù)制作的工作強(qiáng)度、統(tǒng)一數(shù)據(jù)標(biāo)準(zhǔn)、降低數(shù)據(jù)錯(cuò)誤等方面具有實(shí)用價(jià)值。