胡潤(rùn)滋,胡鵬飛
(1.重慶市電力公司調(diào)度控制中心,重慶 400014;2.重慶市電力公司檢修分公司,重慶 400039)
矢量圖形系統(tǒng)是電力系統(tǒng)分析、計(jì)算、設(shè)計(jì)、監(jiān)控、管理等諸多應(yīng)用系統(tǒng)實(shí)現(xiàn)圖形可視化的基礎(chǔ),現(xiàn)有的電力系統(tǒng)矢量圖形系統(tǒng),大多數(shù)是利用傳統(tǒng)的Windows圖形設(shè)備接口技術(shù)GDI構(gòu)建起來的,對(duì)各種電氣元件圖元的繪制及圖元的點(diǎn)選、旋轉(zhuǎn)、平移、縮放等操作,需要進(jìn)行圖元坐標(biāo)變換等大量數(shù)值計(jì)算。圖形程序設(shè)計(jì)比較復(fù)雜,開發(fā)工作量大、代碼維護(hù)比較困難[1-4]。而MS.NET框架的類層次結(jié)構(gòu),較好地封裝了新一代的圖形設(shè)備接口技術(shù)GDI+,大大簡(jiǎn)化了基于Windows和Web的圖形應(yīng)用系統(tǒng)的開發(fā)難度,利用GDI+技術(shù)進(jìn)行電力系統(tǒng)矢量圖形系統(tǒng)的設(shè)計(jì)開發(fā),避免了傳統(tǒng)技術(shù)的弊端,具有較好的實(shí)際應(yīng)用價(jià)值。
本文結(jié)合在電力系統(tǒng)繼電保護(hù)綜合計(jì)算及信息管理系統(tǒng)的實(shí)際項(xiàng)目開發(fā)過程中的體會(huì),介紹GDI+核心技術(shù)在電力系統(tǒng)矢量圖形系統(tǒng)開發(fā)中的具體應(yīng)用。實(shí)際應(yīng)用表明,所采用的技術(shù)手段較傳統(tǒng)方法簡(jiǎn)便靈活,設(shè)計(jì)簡(jiǎn)單、開發(fā)工作量小,效率高,程序代碼更易于維護(hù)、復(fù)用率高,不需要進(jìn)行大量的坐標(biāo)變換數(shù)值計(jì)算,運(yùn)行速度也較快。
GDI+是最新的Windows圖形設(shè)備編程接口技術(shù),是傳統(tǒng)GDI技術(shù)的升級(jí)。GDI是Windows API中的圖形編程接口,是面向過程的圖形處理函數(shù)集合。GDI+完全集成到MS.NET Framework中,用于圖形編程,同時(shí)也是面向?qū)ο蟮摹DI+技術(shù)的所有功能包含在MS.NET Framework的6個(gè)命名空間中,這6個(gè)空間如圖1所示。
本文只探討涉及到 System.Drawing,System.Drawing.Drawing2D兩個(gè)命名空間所包含的部分功能在電力系統(tǒng)矢量圖中的應(yīng)用。
圖1 命名空間結(jié)構(gòu)關(guān)系
MS.NET框架類庫(kù)中封裝的 GDI+是.NET新型面向?qū)ο笳Z(yǔ)言C#、VB.NET等的圖形設(shè)計(jì)技術(shù),它提供了易于理解的、基于繼承的對(duì)象模型。與傳統(tǒng)圖形編程技術(shù)比較,GDI+技術(shù)具有以下優(yōu)點(diǎn):
(1)GDI+包含的類能夠直接實(shí)現(xiàn)那些用GDI很難編寫的功能,并且GDI+完全集成到MS.NET Framework中,大大提高了圖形應(yīng)用程序的開發(fā)效率。
(2)GDI+使用面向?qū)ο蟮念悓哟谓Y(jié)構(gòu)。GDI+編程包括創(chuàng)建圖形對(duì)象,設(shè)置其屬性和調(diào)用相關(guān)對(duì)象的方法,同時(shí)使用方法重載,因此在調(diào)用GDI+對(duì)象的方法時(shí),可以選擇帶有最合適參數(shù)集的方法(或重載)。
(3)在同一操作中既有繪制圖形的輪廓,又填充其內(nèi)部區(qū)域,這兩個(gè)操作沒有本質(zhì)上的聯(lián)系。但GDI+能識(shí)別繪制圖形的輪廓和填充其內(nèi)部區(qū)域之間的區(qū)別,并為這兩個(gè)任務(wù)提供了不同的操作,從而使繪制圖形表面更靈活。
(4)在使用其他圖形處理系統(tǒng)時(shí),會(huì)得到繪圖表面的設(shè)備信息,然后把這些設(shè)備信息作為一個(gè)參數(shù)傳遞給繪圖函數(shù)。這些設(shè)備上下文信息維護(hù)了許多狀態(tài),例如當(dāng)前的鋼筆、筆刷、點(diǎn)(在繪制線條時(shí)等使用)。GDI+則為開發(fā)人員隱藏了這種復(fù)雜性,提供了一種更為簡(jiǎn)便的方法,消除了因?yàn)殚_發(fā)人員沒有設(shè)置所有必要的狀態(tài)(因此會(huì)隨機(jī)“繼承”代碼其他部分中的狀態(tài))而引起的錯(cuò)誤。
(5)在GDI+中提供了GraphicsPath和Region兩個(gè)重要的類,這兩個(gè)類用來處理更不規(guī)則的形狀,同時(shí)可以把一組形狀組合起來,進(jìn)行更高效的處理,使用GraphicsPath和Region類繪制復(fù)雜的路徑和形狀,但在屏幕上顯示完成的路徑或形狀這一操作,可以在一種方法調(diào)用中完成,從而簡(jiǎn)化復(fù)雜圖元的設(shè)計(jì)、繪制。
圖形操作功能包括圖元的繪制、點(diǎn)選、圖元的縮放、旋轉(zhuǎn)、平移等變換功能、圖元尺寸調(diào)整、打印等。
電力系統(tǒng)繼電保護(hù)整定計(jì)算及定值管理軟件所涉及的電氣元件包括發(fā)電機(jī)、變壓器(包括雙繞組變壓器、三繞組變壓器、自耦變壓器)、斷路器、母線、線路、接地裝置等。基于MS.NET的GDI+技術(shù)不僅提供了實(shí)現(xiàn)圖元繪制的筆和筆刷的屬性(包括筆的顏色,寬度以及筆刷的顏色),而且還擁有大量的繪制圖形的方法,以及由一系列圖形組合而成的圖元的圖形路徑GraphicPath類。
系統(tǒng)普通圖元和電氣設(shè)備圖元都可以設(shè)計(jì)由GDI+動(dòng)態(tài)創(chuàng)建繪制,內(nèi)存占用小,運(yùn)行時(shí)可由用戶動(dòng)態(tài)定制其線寬、顏色、線型等,任意調(diào)整其尺寸、任意旋轉(zhuǎn)等,對(duì)圖元進(jìn)行縮放等操作時(shí),不存在圖元變形和失真,用戶定制圖元操作簡(jiǎn)單,工作量小,是純粹的矢量圖。而現(xiàn)有的電力系統(tǒng)矢量圖形,大多在設(shè)計(jì)時(shí)或運(yùn)行時(shí)通過繪圖工具來定制設(shè)備圖元,以位圖方式存放,在圖元繪制時(shí)載入相應(yīng)的位圖圖元,內(nèi)存占用大,縮放操作時(shí)圖元存在變形和失真,用戶定制圖元操作復(fù)雜、工作量大。
1.3.1 繪圖區(qū)域,坐標(biāo)系統(tǒng)設(shè)置
GDI+可以提供三種繪圖表面(即窗體,打印機(jī),圖像),當(dāng)我們利用計(jì)算機(jī)進(jìn)行圖元繪制時(shí),指的是計(jì)算機(jī)顯示屏幕上的一個(gè)窗口,即窗體。窗體由客戶區(qū)域和非客戶區(qū)域組成,客戶區(qū)域就是我們可以在其中繪圖的矩形區(qū)域,繪圖區(qū)域的大小根據(jù)我們的需要,使用以下代碼屬性來設(shè)置修改繪圖區(qū)域的大小。即:
This.ClientSize= new Size(width,height);width,height為一組整數(shù)值,表示繪圖矩形區(qū)域的寬度和高度。
GDI+技術(shù)的坐標(biāo)系采用通用坐標(biāo)系,頁(yè)坐標(biāo)系,設(shè)備坐標(biāo)系三種。
通用坐標(biāo)系是我們?cè)趹?yīng)用程序中引用的坐標(biāo)系,無(wú)論何時(shí)向任一繪圖函數(shù)傳遞坐標(biāo),我們都是在通用坐標(biāo)系下表示這些坐標(biāo),坐標(biāo)用浮點(diǎn)精度表示。頁(yè)坐標(biāo)系的配置決定了繪圖操作的單位,度量單位是Pixel,它的原點(diǎn)位于客戶區(qū)域的左上角。設(shè)備坐標(biāo)系基于像素坐標(biāo)——也是相對(duì)于客戶區(qū)域的左上角(或頁(yè)面可打印區(qū)域的左上角)。
所以,當(dāng)GDI+向一個(gè)設(shè)備(如顯示器)輸出時(shí),會(huì)發(fā)生兩次坐標(biāo)轉(zhuǎn)換:一次通用變換(world transformation)(通用坐標(biāo)向頁(yè)坐標(biāo)的轉(zhuǎn)換),以及一次頁(yè)變換(頁(yè)坐標(biāo)向設(shè)備坐標(biāo)的變換)。
應(yīng)用GDI+技術(shù)進(jìn)行圖形編程時(shí),繪圖函數(shù)使用通用坐標(biāo)系,而圖元變換是通過一次通用變換(world transformation)(通用坐標(biāo)向頁(yè)坐標(biāo)的轉(zhuǎn)換)的機(jī)制實(shí)現(xiàn)平移、縮放、旋轉(zhuǎn)等功能。
1.3.2 應(yīng)用GDI+技術(shù)繪制圖元
電力系統(tǒng)繼電保護(hù)電氣接線圖的各種電氣元件,可以看成是由各種圖形(如圓、直線、弧、曲線等)組合而成,如發(fā)電機(jī)圖元可以認(rèn)為是由一個(gè)圓、一段弧和一條直線(引出線部分)組成,只需要通過調(diào)用GDI+進(jìn)行圖元各組成部分的繪制設(shè)計(jì)。圖元所占用的內(nèi)存和繪圖資源,由MS.NET公共語(yǔ)言運(yùn)行時(shí)CLR中無(wú)用內(nèi)存單元垃圾回收器GC自動(dòng)管理,不存在內(nèi)存泄漏問題。
在繪制由各種基本圖形組合而成的電氣元件時(shí),我們充分應(yīng)用GDI+提供的GraphicPath類,由GraphicPath類生成的對(duì)象表示一組子路徑或圖形。每個(gè)圖形是一條連接起來的路徑,由一系列直線段、曲線段和幾何圖形組成。這些線段和幾何圖形用GDI+中的任意標(biāo)準(zhǔn)方式來描述——圓弧、橢圓、矩形等。要?jiǎng)?chuàng)建一個(gè)圖元,只需按正確的順序繪制圖元的各個(gè)組成部分,GraphicPath對(duì)象就把圖元計(jì)算為一個(gè)把這些組成輪廓以指定的順序連接起來后所得的輪廓。以下是一個(gè)以發(fā)電機(jī)圖元為例,應(yīng)用GDI+技術(shù),用C#程序語(yǔ)言編寫的發(fā)電機(jī)圖元繪制的程序片段:
運(yùn)行該繪圖程序后,繪制的發(fā)電機(jī)圖元如圖2所示。
圖2 發(fā)電機(jī)圖元
對(duì)圖元進(jìn)行平移、旋轉(zhuǎn)、縮放等操作,首先要對(duì)操作的圖元進(jìn)行點(diǎn)選,圖元的點(diǎn)選通過GDI+提供的Region類中的IsVisible方法來實(shí)現(xiàn),即判斷當(dāng)前鼠標(biāo)點(diǎn)擊的坐標(biāo)是否包含在所選擇的、經(jīng)過圖形變換處理后的圖元路徑的內(nèi)部區(qū)域中。如果圖元路徑區(qū)域含有該點(diǎn)的坐標(biāo),則表明圖元是所要選取的圖元,同時(shí)以選取框表示選中的圖元。圖3是圖2所示的發(fā)電機(jī)圖元,通過點(diǎn)選操作后旋轉(zhuǎn)90度的圖元。
圖3 旋轉(zhuǎn)后的發(fā)電機(jī)圖元
1.3.3 圖元變換
矢量圖形系統(tǒng)中對(duì)各種圖元的點(diǎn)選、平移、旋轉(zhuǎn)、縮放等操作,傳統(tǒng)技術(shù)要進(jìn)行大量復(fù)雜繁瑣的坐標(biāo)變換數(shù)值計(jì)算,而利用GDI+技術(shù)提供的圖形變換方法,不需要作任何直接的坐標(biāo)變換運(yùn)算,大大簡(jiǎn)化了其運(yùn)算過程,可以得到更簡(jiǎn)捷的解決方案。
應(yīng)用GDI+技術(shù)實(shí)現(xiàn)圖元變換,實(shí)際操作的是一個(gè)Matrix對(duì)象,該對(duì)象由方法建立,Matrix對(duì)象定義了所謂的仿射變換(保持共線性變換,意味著平行線在變換之后總是保持平行)。因此,在執(zhí)行圖元的簡(jiǎn)單變換或是復(fù)雜變換,都是仿射變換。在一個(gè)繪圖區(qū)域中應(yīng)用GDI+技術(shù)進(jìn)行圖元變換時(shí),它會(huì)應(yīng)用于后繼的所有繪圖操作,每次執(zhí)行繪圖操作時(shí),GDI+都通過應(yīng)用當(dāng)前的變換來改變繪圖操作的結(jié)果。
圖元變換時(shí)采用的Matrix表示如下:
實(shí)現(xiàn)圖元變換功能的各種方法如下:
(1)ScaleTransform在通用變換中應(yīng)用一次縮放;
(2)TranslateTransform在通用變換中應(yīng)用一次平移(水平或垂直移動(dòng));
(3)RotateTtransform按指定的度數(shù)在通用變換中圍繞點(diǎn)(0,0)執(zhí)行一次旋轉(zhuǎn);
(4)MultiplyTransform在通用變換中追加一次變換Matrix對(duì)象。即現(xiàn)有一個(gè)變換,我們使用MultiplyTransform方法,在現(xiàn)有變換中追加指定的變換。
圖形是數(shù)據(jù)的一種形象的表現(xiàn)形式,它的特點(diǎn)是形象和直觀。數(shù)據(jù)庫(kù)是數(shù)據(jù)存儲(chǔ)、處理和管理的工具。任何一個(gè)系統(tǒng)的建立,其實(shí)質(zhì)都是數(shù)據(jù)庫(kù)的數(shù)據(jù)建立。
圖元數(shù)據(jù)庫(kù)交互設(shè)計(jì)的關(guān)鍵是面向設(shè)備的建模方式的實(shí)現(xiàn),就是把設(shè)備圖元對(duì)象與數(shù)據(jù)庫(kù)記錄一一對(duì)應(yīng),在定義一個(gè)設(shè)備圖元對(duì)象的同時(shí)自動(dòng)追加一條數(shù)據(jù)庫(kù)記錄;同時(shí)設(shè)備圖元的模型參數(shù)集合及其錄入界面根據(jù)數(shù)據(jù)庫(kù)記錄的結(jié)構(gòu)自動(dòng)修正。利用設(shè)備對(duì)象圖元生成數(shù)據(jù)庫(kù)記錄是圖元數(shù)據(jù)庫(kù)的基礎(chǔ)。當(dāng)數(shù)據(jù)庫(kù)記錄的字段改變時(shí),設(shè)備圖元的模型參數(shù)和錄入界面必須做出相應(yīng)的修正,才能做到圖形數(shù)據(jù)庫(kù)的交互。
圖元數(shù)據(jù)庫(kù)通過 MS.NET的最新技術(shù) ADO.NET進(jìn)行訪問。ADO.NET徹底地支持像Web這樣的分布式體系結(jié)構(gòu),并利用XML在分布式組件中傳送數(shù)據(jù)。而且ADO.NET將各種邏輯條件進(jìn)行組合來處理離散的記錄集合,這些集合中包含了任意數(shù)據(jù)類型,即使和數(shù)據(jù)庫(kù)失去聯(lián)系,設(shè)備照樣可以工作。當(dāng)斷開時(shí),用戶可以利用結(jié)果集進(jìn)行工作,ADO.NET將所做的變化都隱藏起來,只有當(dāng)需要對(duì)本地?cái)?shù)據(jù)所做的修改發(fā)回?cái)?shù)據(jù)庫(kù)時(shí),連接才有必要。連接只是暫時(shí)地利用該連接單向地發(fā)送對(duì)本地?cái)?shù)據(jù)所做的添加、更新和刪除等操作。
本文結(jié)合在電力系統(tǒng)繼電保護(hù)綜合計(jì)算及信息管理系統(tǒng)項(xiàng)目開發(fā)過程中的體會(huì),介紹了GDI+技術(shù)在基于MS.NET的電力系統(tǒng)矢量圖形系統(tǒng)中的具體應(yīng)用。實(shí)際應(yīng)用表明,所采用的技術(shù)手段較之傳統(tǒng)方法簡(jiǎn)便靈活、設(shè)計(jì)簡(jiǎn)單、開發(fā)工作量小、效率高,程序代碼更易于維護(hù)、復(fù)用率高,不需要進(jìn)行大量的坐標(biāo)變換數(shù)值計(jì)算,運(yùn)行速度也較快。GDI+在電力系統(tǒng)圖形設(shè)計(jì)應(yīng)用中具有較好的實(shí)用價(jià)值,有廣泛的應(yīng)用前景。
[1] 劉偉,許珉,楊宛輝.面向?qū)ο蟮碾娏ο到y(tǒng)圖形程序設(shè)計(jì)方法[J].繼電器,2003,(11).
[2] 吳文傳,張伯明,湯磊,等.支持SCADA/PAS/DTS一體化的圖形系統(tǒng)[J].電力系統(tǒng)自動(dòng)化,2001,(5).
[3] 劉秀玲,陳超英.配電網(wǎng)地理信息系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)與圖形繪制[J].電力系統(tǒng)自動(dòng)化,2001,(10).
[4] 陳躍輝,陳金富,段獻(xiàn)忠.圖形化的電力系統(tǒng)規(guī)劃自動(dòng)化研究[J].電力系統(tǒng)自動(dòng)化,2002,(2).
[5] Eric White.GDI+程序設(shè)計(jì)[M].楊浩,張哲峰,譯.北京:清華大學(xué)出版社,2002.
[6] Jesse Liberty.C#程序設(shè)計(jì)[M]劉基誠(chéng),譯.北京:中國(guó)電力出版社,2002.
[7] 張超,陳允平.圖形程序設(shè)計(jì)在繼電保護(hù)計(jì)算輔助整定計(jì)算軟件開發(fā)中的應(yīng)用[J].繼電器,2002,(2).