APP下载

油田工程应用软件图形编辑关键技术

2014-10-26侯进才刘洁

油气与新能源 2014年4期
关键词:图元集输绘图

侯进才* 刘洁

(1.中国石油天然气管道局国际事业部;2.中国石油集团石油职业卫生技术服务中心)

侯进才等. 油田工程应用软件图形编辑关键技术. 石油规划设计,2013,24(4):46~49

一款优秀的软件,不仅要能出色地完成系统功能,而且还要有美观、方便的操作界面才能获得用户的青睐。图形用户界面简单的操作,能给用户留下深刻的印象,用户易于接受并积极使用。油气集输系统设备和参数众多、工艺流程复杂,应用最优化理论和计算机技术对其进行模拟优化已经取得了良好的效果。但是,由于模拟优化过程比较复杂繁琐,如果对整个工艺流程不是非常熟悉,就会增大软件的操作难度,进而影响软件的使用率。如果将油气集输系统的优化设计与工艺流程的图形显示相结合,开发出能够满足用户工艺流程图形编辑处理的优化设计软件,则能够显著地提高油田工程应用软件的使用率。以油气集输管网图形建模程序为例,从实用角度出发详细地给出了用 C++ Builder实现建模过程中图形绘制、编辑和存储等关键技术,这些技术对于编制可视化的图形建模程序是通用的。

1 图形程序关键技术

1.1 绘图区及坐标系

绘图区是图形建模程序主界面的主体部分,主要用于进行管网图形的绘制、编辑、修改、显示等操作。C++ Builder提供的 TImage元件可以装载图形,并能将其看做是一块画布,在上面绘图并显示。因此,本程序应用该组件提供的矩形区域作为绘图区。

Windows应用程序在其客户区绘制图形时,首先要给出客户区的坐标系统。绘图区域上的每一个点用x和y两个坐标表示,而在所有的GDI(Graphics Device Interface,图形设备接口)绘制函数中,这些坐标使用的是一种“逻辑单位”。当 GDI函数将结果输出到某个物理设备(如屏幕或打印机)上时,Windows将逻辑坐标转换成设备坐标。逻辑坐标所在的坐标系称为“窗口”,将设备坐标所在的坐标系称为“视口”;逻辑坐标和设备坐标的转换是由映射模式决定的,Windows提供了多种类映射方式,其中MM_TEXT(“文本”映射模式)是最简单的一种方式,在这种映像方式下窗口和视口中的坐标单位都是像素点,坐标方向相同:x向的正方向向右,y向的正方向向下,本程序就采用这种映射方式实现逻辑坐标和设备坐标的转换。

在开发图形建模程序图形编辑器时,如果选择一个固定的坐标映像方式,就不能实现图形无极放缩的要求,因而大多数映像方式的设备无关性就没有实际的意义。在本图形建模程序中图形元素的坐标是采用双精度型来表示,而MM_TEXT映像方式下坐标的单位是像素(整数)。因此,对于Windows消息(如 WM_MOUSE_MOVE)所获得的鼠标光标的坐标值即屏幕坐标,为了实现其与图形元素的实际坐标之间的映射[1],程序定义了两个函数Field_Win和Win_Field来完成坐标转换,然后进行图形元素的处理和存储。在这两个函数中,给出一个确定实际坐标和屏幕坐标比例关系的变量pd_MapScale,调整其大小即可以实现图形的无极缩放。同时,还有图幅宽度常量(Bx、By)和滚动条位置变量(Xs、Ys)。坐标映射函数 Field_Win和W in_Field如下:

为了与用户日常绘图习惯相适应,在本程序开发的实际坐标系中,取绘图区的左下角点为原点,设其坐标为(Min X_,Min Y_)。在视口中绘制图形元素时,只采用MM_TEXT映像方式,通过实际坐标与逻辑坐标的转换来绘制图形。图形系统的坐标系建立后,调整视图屏幕的实际起点 Min X_,Min Y_就可以实现图形的滚动,调整逻辑坐标和实际坐标的比例关系 pd_MapScale就可以实现图形的无极缩放。

1.2 图元的绘制

图元的绘制可以使用位图和绘图函数两种方式,采用位图绘图时,由各元件的位图在绘图区域拼装组成网络拓扑图。绘图函数主要是指GDI中的各种图形绘制和控制函数。C++ Builder中的TCanvas类封装了Windows GDI以及相关的图像绘制和控制函数,并且为绘图对象提供了抽象的画布,可以指定使用的画笔、画刷和字体,实现绘制、填充各种图案和直线以及写入文本[2]。程序中图元的绘制主要是通过调用TCanvas类的各种方法实现的,具体为,节点类用Stretch Draw函数调用已经存在的位图绘制,管线类用 MoveTo(int X,int Y)、LineTo(int X,int Y)等绘图函数绘制。

要绘制一个图元,基本思路就是对鼠标左键的3个事件分别进行编程:一是,当按下鼠标左键时,首先要判断绘制的是哪一类图元,然后记录下鼠标在绘图区中的逻辑坐标,并创建一个图元的对象指针,用这个对象指针调用该对象类的绘图函数,通过TCanvas类中的方法进行图元的绘制;二是,当按下左键并移动鼠标时,应用画布Canvas属性画笔Pen模式PenMode中的pmXor模式(异或模式,或者也可以用 pmNotXor模式),让 Pen的Color属性和绘图区的Color属性做XOR运算,并在同一位置画两次线,删除掉原先绘制的图元,然后更新参考点坐标,恢复Pen的模式为pmCopy(复制模式);三是,当放开左键时,调用绘图函数绘制图元,并给出图元基础信息交互界面,确认图元绘制操作和完成信息存储。一方面,各个图元独立地拥有着自己的图元信息,因而,用户依然可以对其进行单独的编辑操作;另一方面,这些信息都保存在数据库中,当图形重新加载时,就可以利用这些图元信息做到准确无误地恢复整个图纸。

在管线的绘制过程中,使用了计算机图形学中的橡皮筋技术[3],它主要针对变形类的要求,动态地、连续地将变形过程表现出来,常常用来构造直线段。在绘图过程中,动态地显示中间图形,供设计者通过定位器(鼠标、键盘等)进行调节与控制,直到满意后才确定下来。

图元拾取是指在图形空间通过某些策略搜寻到所需的几何元素[4]。它是任何交互式绘图程序都必须具备的基本功能,是对图元进行移动、删除、修改等编辑操作的前提和基础,只有首先完成了拾取操作才能对图元进行其他各种编辑操作。拾取效率直接关系到交互操作的快慢,尤其是生成一个复杂图形时,拾取效率显得尤为重要;另外,拾取的准确度及可靠性同样影响系统操作的可靠性及效率。拾取图元的基本方法是:在屏幕上拾取一点,判断该点在哪一图元上[3]。程序充分考虑各种图元的外形特征,将图元的拾取分为点的拾取和线段的拾取两大类[5]。

第一类点的拾取:为了方便用户进行拾取操作,系统设定一个拾取精度r(r>0),在当前光标位置为 Pl()时,如果某个图元节点的屏幕坐标P (x, y )满足:

即鼠标点击点和待拾取点的距离小于给定的拾取精度,则表明点P(x,y)被选中。

图1 线段的拾取方法

具体判别方法是:线段P0P1所在直线的方程为:

垂直于线段P0P1的直线族可以表示为:

则光标点位于矩形区域的判别条件为:

式(5)中,第一个条件表示光标点 Pl()位于过线段两端点处的两条直线之间,第二个条件表示光标点 Pl()到线段P0P1的垂直距离应不超过r0。

在设计拾取算法时,为了保证在各种情况下能准确地拾取到所需的图元,将拾取精度同窗口变化、图形缩放等因素结合起来,并用系数β表示。此外,为了提高图元拾取效率,判断某个图元是否被选中时,首先进行初选,方法是判断图元的属性是否当前操作图元,对通过初选的图元进行进一步的比较。一旦图元选取成功则终止比较以避免无谓的计算,同时,根据选中图元的 ID号从数据资源中找到图元类的其他信息,从而为图元的编辑做好准备。拾取完成以后,给出相应的交互式操作界面。

1.3 图元的移动

图元在绘图区绘制好后,为适合网络拓扑的合理布局,有时需要进行位置的调整,即图元的移动操作。利用程序来实现图元移动的操作,无论是向上、向下、向左、向右等,其原理是一样的。先通过左键鼠标准确地拾取待移动的图元,拖动到合适的位置以后,放开鼠标左键,更新该图元的坐标信息,并将屏幕坐标转换为实际坐标存入到数据库中,然后重新绘制集输管网图形,实现了图元的移动。

1.4 图元的删除

当一个图元创建完毕后,如果不符合条件,可点击工具栏上相应图元类的删除按钮;然后,拾取不符合条件的图元,可以将其删除。在程序中,当删除事件被触发后,调用该图元的 Delete接口方法,将图元的删除属性赋值为 true,并通过节点编号找到对应的ID,然后在数据库中找到相应的数据记录,利用数据库的ADO命令将其删除;最后,重新绘制集输管网图形,实现了图元的删除操作。

1.5 图元的存储

关于图元的保存,考虑到实现图形建模程序关闭后可重新调出已经画好的集输管网图再次进行操作,即,要求程序具有重画的功能,存为位图或图标等格式显然是不可取的,因此,将其几何结构以数据结构的形式存储在数据库中。几何图形数据有多种存储方式和存储方法,良好的存储方法将为整个系统的设计及功能的实现奠定基础。对于节点类,定义了结构体数组来存储节点的名称、x标和y坐标等几何信息,并将其作为一条记录,存储在相应的节点类数据表中。对于管线类,定义了单相链表来记录管线的起终点坐标,并将相关信息也存入到数据库中。当需要打开已经绘好的集输管网图时,只需从数据库中把相关的数据信息读出来放到结构体数组和链表中,再利用绘图函数就可以画出各图元,从而实现了图形的二次使用,也体现了数据图形一体化。另外,为了与其他图形编辑器的图形格式兼容,软件也设置了位图存储格式。

1.6 屏幕的缩放

屏幕缩放主要实现3个功能:屏幕放大、屏幕缩小和全屏显示。在屏幕的缩放过程中,各图元的实际坐标并没有发生变化,变化的是实际坐标与屏幕坐标比例关系变量pd_MapScale。当[pd_MapScale]变化后/[pd_MapScale]变化前>1时,屏幕放大;当[pd_MapScale]变化后/[pd_MapScale]变化前<1时,屏幕缩小。当用户点击工具栏上的屏幕放大工具按钮或点击“比例”菜单下“放大”选项时,pd_MapScale会以 10%的比例增大,变成原来的 1.1倍,即[pd_MapScale]变化后/[pd_MapScale]变化前=1.1,这时系统会自动调用绘图函数实现比例关系变量pd_MapScale变化后的图形绘制;同理,反之亦然。当用户需要在绘图区内显示已经绘制好的整个集输管网图时,系统会根据实际坐标的最值(包括x最大、最小和y最大、最小)与绘图区的宽度和高度之间的大小关系,来确定一个最优的实际坐标与屏幕坐标比例关系变量pd_MapScale,从而将整个集输管网图以最适合的大小显示给用户。

1.7 屏幕闪烁的消除

图形建模程序采用Canvas绘图技术,通过调用不同的绘图函数,实现节点、管线等图元的绘制与添加;然而,当用户对图形进行编辑操作时,需要重新绘制图形。重新绘制的过程总是先用背景色将显示区清除,然后再调用绘图函数进行绘制,而背景色往往与绘图内容反差很大,这样在短时间内背景色与显示图形的交替出现,使得显示窗口看起来在闪烁,即,屏幕闪烁是由于屏幕上显示内容更新不同步造成的。采用双缓冲绘图机理可以有效地消除屏幕闪烁。双缓冲机理是先在内存中创建一个与屏幕绘图区域一致的对象;然后,将图形绘制在内存对象上;最后,一次性将这个对象上的图形拷贝到屏幕上,这样显示内存中的数据达到了同时更新的目标,消除了屏幕闪烁现象。

2 结语

所给出的绘图区和坐标系统建立、图元绘制、拾取、移动、删除和存储以及屏幕缩放等程序设计思想可以用于类似的其他工程应用软件。在具体的软件开发过程中,线段类图元的移动可以考虑整体平移和固定一段移动另一端两种方式,以及选择多个图元同时移动等方式。此外,除了上述几种基本的图形绘制与编辑操作外,程序设计人员还可以根据实际需要增加其他功能,如,图元的复制、粘贴、撤销与重做等功能。针对具体工艺流程中涉及的阀、泵等有进出口的图元,以及油井、油罐等仅有一个入口或出口的图元,程序员还可以根据需要进行细化处理。

[1]张义宽.计算机图形学[M].西安: 西安电子科技大学出版社,2004.

[2]陈战林,张万里,耿宏运,等.C++ Bui l der组件大全[M].北京: 电子工业出版社,2002.

[3]何援军.计算机图形学[M].北京: 机械工业出版社,2006.

[4]李春雨.计算机图形学理论与实践[M].北京: 北京航空航天大学出版社,2004.

[5]柳朝阳,周小平.计算机图形学——图形的计算与显示原理[M].西安: 西安电子科技大学出版社,2005.

猜你喜欢

图元集输绘图
来自河流的你
“禾下乘凉图”绘图人
简述油气集输系统安全管理问题及对策
基于FLUENT天然气集输管道直角弯管磨损分析
学术出版物插图的编排要求(一):图注
联锁表自动生成软件的设计与实现
HYSYS软件在复杂山区页岩气集输管线中的应用
垂涎三尺
电气CAD接线图快速转换G图形的技术应用研究
煤层气田集输工艺优化建议概述