基于 MS.NET的 GDI+在电力系统矢量图中的应用
2012-02-09胡润滋胡鹏飞
胡润滋,胡鹏飞
(1.重庆市电力公司调度控制中心,重庆 400014;2.重庆市电力公司检修分公司,重庆 400039)
0 引言
矢量图形系统是电力系统分析、计算、设计、监控、管理等诸多应用系统实现图形可视化的基础,现有的电力系统矢量图形系统,大多数是利用传统的Windows图形设备接口技术GDI构建起来的,对各种电气元件图元的绘制及图元的点选、旋转、平移、缩放等操作,需要进行图元坐标变换等大量数值计算。图形程序设计比较复杂,开发工作量大、代码维护比较困难[1-4]。而MS.NET框架的类层次结构,较好地封装了新一代的图形设备接口技术GDI+,大大简化了基于Windows和Web的图形应用系统的开发难度,利用GDI+技术进行电力系统矢量图形系统的设计开发,避免了传统技术的弊端,具有较好的实际应用价值。
本文结合在电力系统继电保护综合计算及信息管理系统的实际项目开发过程中的体会,介绍GDI+核心技术在电力系统矢量图形系统开发中的具体应用。实际应用表明,所采用的技术手段较传统方法简便灵活,设计简单、开发工作量小,效率高,程序代码更易于维护、复用率高,不需要进行大量的坐标变换数值计算,运行速度也较快。
1 基于GDI+技术图元绘制及变换
1.1 GDI+技术
GDI+是最新的Windows图形设备编程接口技术,是传统GDI技术的升级。GDI是Windows API中的图形编程接口,是面向过程的图形处理函数集合。GDI+完全集成到MS.NET Framework中,用于图形编程,同时也是面向对象的。GDI+技术的所有功能包含在MS.NET Framework的6个命名空间中,这6个空间如图1所示。
本文只探讨涉及到 System.Drawing,System.Drawing.Drawing2D两个命名空间所包含的部分功能在电力系统矢量图中的应用。
图1 命名空间结构关系
1.2 GDI+技术较传统图形编程技术的优势
MS.NET框架类库中封装的 GDI+是.NET新型面向对象语言C#、VB.NET等的图形设计技术,它提供了易于理解的、基于继承的对象模型。与传统图形编程技术比较,GDI+技术具有以下优点:
(1)GDI+包含的类能够直接实现那些用GDI很难编写的功能,并且GDI+完全集成到MS.NET Framework中,大大提高了图形应用程序的开发效率。
(2)GDI+使用面向对象的类层次结构。GDI+编程包括创建图形对象,设置其属性和调用相关对象的方法,同时使用方法重载,因此在调用GDI+对象的方法时,可以选择带有最合适参数集的方法(或重载)。
(3)在同一操作中既有绘制图形的轮廓,又填充其内部区域,这两个操作没有本质上的联系。但GDI+能识别绘制图形的轮廓和填充其内部区域之间的区别,并为这两个任务提供了不同的操作,从而使绘制图形表面更灵活。
(4)在使用其他图形处理系统时,会得到绘图表面的设备信息,然后把这些设备信息作为一个参数传递给绘图函数。这些设备上下文信息维护了许多状态,例如当前的钢笔、笔刷、点(在绘制线条时等使用)。GDI+则为开发人员隐藏了这种复杂性,提供了一种更为简便的方法,消除了因为开发人员没有设置所有必要的状态(因此会随机“继承”代码其他部分中的状态)而引起的错误。
(5)在GDI+中提供了GraphicsPath和Region两个重要的类,这两个类用来处理更不规则的形状,同时可以把一组形状组合起来,进行更高效的处理,使用GraphicsPath和Region类绘制复杂的路径和形状,但在屏幕上显示完成的路径或形状这一操作,可以在一种方法调用中完成,从而简化复杂图元的设计、绘制。
1.3 GDI+技术图形功能方案设计
图形操作功能包括图元的绘制、点选、图元的缩放、旋转、平移等变换功能、图元尺寸调整、打印等。
电力系统继电保护整定计算及定值管理软件所涉及的电气元件包括发电机、变压器(包括双绕组变压器、三绕组变压器、自耦变压器)、断路器、母线、线路、接地装置等。基于MS.NET的GDI+技术不仅提供了实现图元绘制的笔和笔刷的属性(包括笔的颜色,宽度以及笔刷的颜色),而且还拥有大量的绘制图形的方法,以及由一系列图形组合而成的图元的图形路径GraphicPath类。
系统普通图元和电气设备图元都可以设计由GDI+动态创建绘制,内存占用小,运行时可由用户动态定制其线宽、颜色、线型等,任意调整其尺寸、任意旋转等,对图元进行缩放等操作时,不存在图元变形和失真,用户定制图元操作简单,工作量小,是纯粹的矢量图。而现有的电力系统矢量图形,大多在设计时或运行时通过绘图工具来定制设备图元,以位图方式存放,在图元绘制时载入相应的位图图元,内存占用大,缩放操作时图元存在变形和失真,用户定制图元操作复杂、工作量大。
1.3.1 绘图区域,坐标系统设置
GDI+可以提供三种绘图表面(即窗体,打印机,图像),当我们利用计算机进行图元绘制时,指的是计算机显示屏幕上的一个窗口,即窗体。窗体由客户区域和非客户区域组成,客户区域就是我们可以在其中绘图的矩形区域,绘图区域的大小根据我们的需要,使用以下代码属性来设置修改绘图区域的大小。即:
This.ClientSize= new Size(width,height);width,height为一组整数值,表示绘图矩形区域的宽度和高度。
GDI+技术的坐标系采用通用坐标系,页坐标系,设备坐标系三种。
通用坐标系是我们在应用程序中引用的坐标系,无论何时向任一绘图函数传递坐标,我们都是在通用坐标系下表示这些坐标,坐标用浮点精度表示。页坐标系的配置决定了绘图操作的单位,度量单位是Pixel,它的原点位于客户区域的左上角。设备坐标系基于像素坐标——也是相对于客户区域的左上角(或页面可打印区域的左上角)。
所以,当GDI+向一个设备(如显示器)输出时,会发生两次坐标转换:一次通用变换(world transformation)(通用坐标向页坐标的转换),以及一次页变换(页坐标向设备坐标的变换)。
应用GDI+技术进行图形编程时,绘图函数使用通用坐标系,而图元变换是通过一次通用变换(world transformation)(通用坐标向页坐标的转换)的机制实现平移、缩放、旋转等功能。
1.3.2 应用GDI+技术绘制图元
电力系统继电保护电气接线图的各种电气元件,可以看成是由各种图形(如圆、直线、弧、曲线等)组合而成,如发电机图元可以认为是由一个圆、一段弧和一条直线(引出线部分)组成,只需要通过调用GDI+进行图元各组成部分的绘制设计。图元所占用的内存和绘图资源,由MS.NET公共语言运行时CLR中无用内存单元垃圾回收器GC自动管理,不存在内存泄漏问题。
在绘制由各种基本图形组合而成的电气元件时,我们充分应用GDI+提供的GraphicPath类,由GraphicPath类生成的对象表示一组子路径或图形。每个图形是一条连接起来的路径,由一系列直线段、曲线段和几何图形组成。这些线段和几何图形用GDI+中的任意标准方式来描述——圆弧、椭圆、矩形等。要创建一个图元,只需按正确的顺序绘制图元的各个组成部分,GraphicPath对象就把图元计算为一个把这些组成轮廓以指定的顺序连接起来后所得的轮廓。以下是一个以发电机图元为例,应用GDI+技术,用C#程序语言编写的发电机图元绘制的程序片段:
运行该绘图程序后,绘制的发电机图元如图2所示。
图2 发电机图元
对图元进行平移、旋转、缩放等操作,首先要对操作的图元进行点选,图元的点选通过GDI+提供的Region类中的IsVisible方法来实现,即判断当前鼠标点击的坐标是否包含在所选择的、经过图形变换处理后的图元路径的内部区域中。如果图元路径区域含有该点的坐标,则表明图元是所要选取的图元,同时以选取框表示选中的图元。图3是图2所示的发电机图元,通过点选操作后旋转90度的图元。
图3 旋转后的发电机图元
1.3.3 图元变换
矢量图形系统中对各种图元的点选、平移、旋转、缩放等操作,传统技术要进行大量复杂繁琐的坐标变换数值计算,而利用GDI+技术提供的图形变换方法,不需要作任何直接的坐标变换运算,大大简化了其运算过程,可以得到更简捷的解决方案。
应用GDI+技术实现图元变换,实际操作的是一个Matrix对象,该对象由方法建立,Matrix对象定义了所谓的仿射变换(保持共线性变换,意味着平行线在变换之后总是保持平行)。因此,在执行图元的简单变换或是复杂变换,都是仿射变换。在一个绘图区域中应用GDI+技术进行图元变换时,它会应用于后继的所有绘图操作,每次执行绘图操作时,GDI+都通过应用当前的变换来改变绘图操作的结果。
图元变换时采用的Matrix表示如下:
实现图元变换功能的各种方法如下:
(1)ScaleTransform在通用变换中应用一次缩放;
(2)TranslateTransform在通用变换中应用一次平移(水平或垂直移动);
(3)RotateTtransform按指定的度数在通用变换中围绕点(0,0)执行一次旋转;
(4)MultiplyTransform在通用变换中追加一次变换Matrix对象。即现有一个变换,我们使用MultiplyTransform方法,在现有变换中追加指定的变换。
2 图元数据库交互设计
图形是数据的一种形象的表现形式,它的特点是形象和直观。数据库是数据存储、处理和管理的工具。任何一个系统的建立,其实质都是数据库的数据建立。
图元数据库交互设计的关键是面向设备的建模方式的实现,就是把设备图元对象与数据库记录一一对应,在定义一个设备图元对象的同时自动追加一条数据库记录;同时设备图元的模型参数集合及其录入界面根据数据库记录的结构自动修正。利用设备对象图元生成数据库记录是图元数据库的基础。当数据库记录的字段改变时,设备图元的模型参数和录入界面必须做出相应的修正,才能做到图形数据库的交互。
图元数据库通过 MS.NET的最新技术 ADO.NET进行访问。ADO.NET彻底地支持像Web这样的分布式体系结构,并利用XML在分布式组件中传送数据。而且ADO.NET将各种逻辑条件进行组合来处理离散的记录集合,这些集合中包含了任意数据类型,即使和数据库失去联系,设备照样可以工作。当断开时,用户可以利用结果集进行工作,ADO.NET将所做的变化都隐藏起来,只有当需要对本地数据所做的修改发回数据库时,连接才有必要。连接只是暂时地利用该连接单向地发送对本地数据所做的添加、更新和删除等操作。
3 结束语
本文结合在电力系统继电保护综合计算及信息管理系统项目开发过程中的体会,介绍了GDI+技术在基于MS.NET的电力系统矢量图形系统中的具体应用。实际应用表明,所采用的技术手段较之传统方法简便灵活、设计简单、开发工作量小、效率高,程序代码更易于维护、复用率高,不需要进行大量的坐标变换数值计算,运行速度也较快。GDI+在电力系统图形设计应用中具有较好的实用价值,有广泛的应用前景。
[1] 刘伟,许珉,杨宛辉.面向对象的电力系统图形程序设计方法[J].继电器,2003,(11).
[2] 吴文传,张伯明,汤磊,等.支持SCADA/PAS/DTS一体化的图形系统[J].电力系统自动化,2001,(5).
[3] 刘秀玲,陈超英.配电网地理信息系统数据库设计与图形绘制[J].电力系统自动化,2001,(10).
[4] 陈跃辉,陈金富,段献忠.图形化的电力系统规划自动化研究[J].电力系统自动化,2002,(2).
[5] Eric White.GDI+程序设计[M].杨浩,张哲峰,译.北京:清华大学出版社,2002.
[6] Jesse Liberty.C#程序设计[M]刘基诚,译.北京:中国电力出版社,2002.
[7] 张超,陈允平.图形程序设计在继电保护计算辅助整定计算软件开发中的应用[J].继电器,2002,(2).