基于WPF的交互式绘图系统的开发
扫描二维码
随时随地手机看文章
交互式绘图系统是指能为用户提供交互式操作支持,使用户通过鼠标、键盘和手写笔等在图形终端上输入数据和图形信息,进行绘图,并对生成的图形进行修改、编辑等操作,设计完成后,保存设计结果,最终在显示屏或其他外部设备上进行图形输出的一整套设计及其应用软件,在CAD、办公自动化和其他领域得到了非常广泛的应用。现有绘图软件绘制复杂图形时会占用大量CPU,消耗大量内存,从而导致界面失去响应。WPF是一个新的编程模型,与传统GDI/GDI+绘图模型相比,WPF将CPU和GPU分开来利用,由于GPU的浮点计算能力远高于CPU,从而保证了大量计算的优先性,同时也能最小化CPU 使用率。WPF以DirectX作为核心绘图函数,DirectX绘图速度高于GDI/GDI+,能产生更好的视觉效果。对于需要大量浮点运算的图形图像来说, WPF是一个很好的选择。本文介绍了在VS2008环境下,以WPF为平台,用C#编写开发的一个交互式图形系统。
1交互式绘图系统的设计
1.1 系统的功能设计
基于WPF的交互式绘图系统主要由输入单元、基本绘图单元、图元编辑单元、图元修改单元、属性设置单元、输出单元组成。系统模块结构图如图1所示。
本系统实现了以下功能:
(1)基本图形元素(点、直线、折线、圆形、圆弧、椭圆、矩形、多边形、B样条、闭合B样条)以及文本的动态绘制与生成功能;
(2)编辑修改功能:对象的拾取、删除、复制、镜像、阵列、移动、旋转、填充、裁剪,平移缩放视图,测量封闭区域的面积;
(3)属性的设置:包括对图元的图层、线型、线宽、颜色;系统的背景色,文字的高度等属性进行设置;
(4)图形数据文件的读取、保存、打印等操作。
1.2 开发平台的选择
目前Windows环境下的图形程序接口主要有GDI/GDI+、Direct3D、OpenGL、WPF四种。GDI/GDI+通常是一个静态的显示系统,只有有限的动画支持,此外GDI/GDI+只支持二维图形开发。OpenGL是一个开放的三维图形软件包,由于它是图形的底层图形库,没有提供几何实体图元,不能直接用以描述场景。Direct3D以COM接口形式提供,所以较为复杂,稳定性差。WPF是微软新一代图形系统,运行在.NET Framework 3.0架构下。WPF 的核心是一个与分辨率无关并且基于向量的呈现引擎,旨在利用现代图形硬件的优势来最小化 CPU 使用率。在WPF中,底层的图形技术不再是GDI/GDI+,而是DirectX。
WPF在图形与界面开发方面,主要有以下几个优势[1]:
(1)丰富的绘图模型与文本模型。不同于以往的逐个像素的绘制,在WPF中可以直接处理基本形状、文本框以及其他UI元素。
(2)独立的图形解析。WPF 图形系统的基本度量单位是与设备无关的像素,它等于1英寸的 1/96。不管实际的屏幕分辨率是多少,每个与设备无关的像素都会自动缩放,以符合呈现该像素的系统上的每英寸点数 (dpi) 设置。
2交互式绘图系统的实现
2.1 系统的功能界面
交互式绘图系统的界面窗口主要由标题栏、菜单栏、工具栏、绘图区、工具箱、消息框和状态栏组成,如图2所示。
2.2 系统的功能实现
2.2.1 系统的窗口框架
WPF包含两个相互关联的编程接口,通常使用可扩展应用程序标记语言 (XAML) 标记实现应用程序的外观,而使用托管编程语言(代码隐藏)实现其行为。WPF中的Menu控件、ToolBar控件、StatusBar控件、GroupBox控件、TextBox控件以及Canvas面板[2]分别构成了应用程序主窗口顶端的菜单栏、工具栏、底端的状态栏与客户区左边的工具箱、下方的消息框以及绘图区。系统使用鼠标和键盘输入来绘制图形,Canvas 面板是用于创建复杂绘图的特别理想的选择,因为它支持对其子对象的绝对定位。框架窗口的逻辑树简图如图3所示。
2.2.2 图形的绘制与编辑功能
WPF提供了Shapes库来显示矢量图,WPF中的基本图形类主要位于System.Windows.Shapes命名空间。Shape类是所有图形类的基类,它定义了Stroke、StrokeThickness、Fill等通用属性,用来绘制形状轮廓的颜色、粗细以及形状的内部填充。具体的图形元素类(Line、Path、Polygon、Polyline、Ellipse、Rectangle)都由其派生而来。2D相关类型的层次结构图如图4所示。
[!--empirenews.page--]
Canvas 是顶级布局控件,Canvas面板类似传统的图形环境,利用坐标位置指定对象的摆放地点。Canvas的左上角为原点,X坐标向右,Y坐标向下。而一般的图形系统的坐标原点设定在绘图区的左下角,X坐标水平向右,Y坐标竖直向上,因此可利用WPF的Transform类,通过设定Canvas的RenderTransform来实现[3]。为了使图元大小根据窗口的大小进行缩放,可以将Canvas放在Viewbox内。以下是实现坐标变换的XAML片段:
<Viewbox>
<Canvas RenderTransformOrigin="0.5,0.5">
<Canvas.RenderTransform>
<TransformGroup >
<ScaleTransform ScaleY="-1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Viewbox>
图形元素的编辑与修改功能主要依靠计算机图形学的基本原理以及Windows表现层基础类库(WPF)来实现。WPF的System.Printing命名空间下的PrintDialog类主要用来实现打印单页或多页文件的功能,PrintDialog类显示一个打印对话框,与用户交互操作来完成打印功能。
2.2.3 曲线曲面造型功能
曲线曲面造型[4]是计算机辅助几何设计(CAGD)的核心,也是计算机图形学的一项重要内容。三次B样条曲线是曲线学中一个重要部分,它不但保留了Bezier曲线的优点,而且克服了其不具备局部性质的缺点,能更好地表示与设计自由型曲线曲面,通过几个控制点的移动能形成不同的曲线。系统提供了绘制B样条曲线与闭合B样条曲线的功能。绘制图形如图5所示。
动态生成B样条曲线的实现步骤如下:
(1)设定一个点集合List<Point> mousepts保存鼠标左键所按下的序列点;
(2)在鼠标移动过程中把鼠标的当前位置作为B样条曲线的临时终点,加入点集合mousepts;
(3)由点集合mousepts中的这些序列点反求B样条曲线的控制顶点[5];
(4)利用求出的B样条曲线的控制顶点得到B样条曲线上的序列离散点;
(5)将序列离散点依次加入多段线Polyline的Points集合,从而生成B样条曲线。
3 图形数据文件的存储与读取
系统图形数据文件的输出包含JPG和DXF两种格式。由于AutoCAD在全世界应用非常广泛,它的数据文件格式DXF已经成为事实上的一种标准,因此系统提供了自定义的图形数据文件格式与DXF格式相互转换的功能。DXF 文件本质上由代码及关联值对组成。代码(通常称为组码)表明其后的值的类型。使用这些组码和值对,可以将 DXF 文件组织到由记录组成的区域中,这些记录由组码和数据项目组成。在 DXF 文件中,每个组码和值都各占一行。DXF文件完整的结构[6]如图6所示。
程序中设计了两个基类ReadDXF和WriteDXF来分别读取和写入DXF文件。ReadDXF读取 DXF 文件,并且从给定段的给定对象中提取特定代码和值。与读取 DXF 文件相比,写入DXF文件更困难一些,因为必须保持图形的一致性,这样 AutoCAD 才能找到可接受的文件。AutoCAD 允许省略 DXF 文件中的很多项目,仍然能够获得可用的图形,但文件结尾处必须存在 EOF 项目。为了简便,WriteDXF省略了整个HEADER段、TABLES 段和BLOCKS 段,只包含 ENTITIES 段。
随着计算机系统、图形输入、图形输出设备的发展,计算机图形软件系统也有了很大的发展[7]。本文详细介绍了基于WPF的交互式绘图系统的功能与设计,并探讨了系统实现过程中的若干关键技术。该系统实现了其他图形软件具有的基本操作,并提供了自定义的图形数据文件格式与DXF格式相互转换的功能,操作方便,灵活,具有可扩展性,经过改进还可以成为适用于其它行业的通用的图形工具软件。
参考文献
[1] MACDONALD M. Pro WPF in C# 2008:Windows Presentation Foundation with .NET 3.5[M]. New York: Apress,2008.
[2] NATHAN A. WPF揭秘[M]. 瞿杰,译. 北京:人民邮电出版社,2008:109-111.
[3] PETZOLD C. Windows Presentation Foundation程序设计指南[M].蔡学镛,译. 北京:电子工业出版社, 2008:844-845.
[4] 朱永强,鲁聪达. 自由曲线曲面造型技术的综述[J].中国制造业信息化,2003,32(5):110-113.
[5] 孙家广,杨长贵.计算机图形学[M]. 北京:清华大学出版社, 1995.
[6] 谭超,张群会.基于AutoCAD 的DXF格式文件读写方法研究[J].计算机与网络,2009,35(21):46-49.
[7] 曾庆云. 计算机绘图技术的发展趋势[J]. 机械研究与应用,1996(4):37-38.