近年来,国内录井公司在国外的业务不断增多,市场不断扩大,但与国外录井公司相比,技术上还有一定差距,如录井图绘制系统。录井图是集测井、录井、地质、地化等勘探数据信息为一体的成果图,描述了钻井过程中地层在纵向上的变化情况,直观反映了油气在地层中的分布特征。目前国内的录井图绘制系统不能满足国外用户的需求,主要包括:国外图例、含油气等绘制方式与国内标准不同;曲线、符号等图元设置修改操作繁琐;数据录入与录井图成图相分离。国内录井公司购买国外录井图绘制软件又非常昂贵,后期维护困难。基于以上原因,开发了能够满足国外用户需求的录井图绘制系统,采用多种设计模式,使系统操作更灵活、功能扩展更方便。
2. 系统设计方案
2.1. 设计模式
设计模式(design pattern)是面向对象软件设计的经验总结,是特定场景下解决某一类常见问题的核心方案。使用设计模式的目的就是复用这些面向对象软件设计,更好地提高代码的可重用性和可维护性,降低各模块间的强耦合度。
每种设计模式对于一类通用设计结构的关键要素进行了命名、抽象和标识,这些设计结构能被用来构造可复用的面向对象设计。一般而言,模式有4个基本要素:模式名称、问题、解决方案和效果。“模式名称”描述了问题、解决方案和效果;“问题”描述了应在何种情况下使用设计模式;“解决方案”描述了一个设计的各个组成部分以及各组成部分之间的相互关系;“效果”描述了使用后的结果 [1] 。
录井图绘制系统LogMaker主要涉及以下4种设计模式。
1) MVC设计模式:包括3个基本部分:Model (模型)、View (视图)和Controller (控制器)。模型用来维护数据并提供数据访问方法;视图负责数据的显示;控制器用来处理用户的请求。
2) Observer设计模式:由Subject (目标)-Observer (观察者)两部分构成,当目标的状态发生改变时,向它的各个观察者发出通知,观察者将对观察目标的改变做出响应。
3) Abstract Factory设计模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 [2] 。
4) Composite设计模式:是一个以树形结构描述整体与部分关系的模式。它使得客户端可以向处理单个对象一样处理由他们复合而成的合成对象。
2.2. 系统架构
笔者提出的录井图绘制系统LogMaker架构如图1所示,从功能上分为6个模块:数据库模块、模板编辑模块、数据录入管理模块、岩性图例管理模块、符号管理模块、成图模块。
Figure 1. The LogMaker framework of mud logging plot drawing system
图1. 录井图绘制系统LogMaker架构图
数据库模块主要负责数据库连接,将数据库的数据进行抽象化,切割数据和数据库的逻辑联系,以应对多种数据持久化方案,并对其他模块提供数据支持。目前该系统支持Sql Server2000、Sql Server 2005、Oracle多种数据库。模板编辑模块实现模板的可视化管理,能够定制录井图需显示的内容,包括图头井基本信息、图尾制图信息、直线、表格、图例、符号、图片等图元和曲线、标尺、剖面、文本描述等图道。在模板编辑模块中,还实现了模板的导入和导出功能,便于模板的共享。数据录入管理模块根据模板定制内容自动生成数据录入表格,用户可连续输入,并支持Excel文件导入导出。成图模块调用数据库模块读取模板内容和相关数据,绘制成图。用户可在图件上进行文字和图形标注,并和图件一起保存在数据库中。在岩性图例和符号管理模块中可新建、编辑、删除岩性图例和符号,生成的图例和符号被显示在模板编辑模块、数据录入模块和成图模块中。
录井图绘制系统LogMaker具有良好的用户界面和人机交互性,每种图元对象都有显示、编辑、删除等功能,每个图道都可以任意拖拽、移动,操作方便灵活。
3. 设计模式在系统实现中的应用
录井图绘制系统LogMaker采用模板驱动方式,模板是表格、曲线、文本、图例、符号等图元按照一定方式排列、组合、叠加构成的。当需要绘制特定格式录井图时,只需将相应模板与数据结合。在系统的具体功能实现中,将MVC、Observer、Abstract Factory和Composite设计模式应用于开发中,从而提高系统在扩展和维护方面的能力。
3.1. MVC设计模式
MVC设计模式是图形用户界面软件经常使用的一种结构(图2)。通过模型(Model)、视图(View)和控制器(Controller)相互分离,使系统结构变得更清晰、更容易扩展和使用。在该系统中,View提供用户交互界面,负责图元的绘制和存放绘制相关的数据,如颜色、线性、图元属性等;Model处理数据的读取和保存;Controller负责处理用户的请求,完成图元的创建和属性编辑。
在曲线绘制功能实现中,log_curve_column_view类的m_curveProp变量包含了曲线绘制方式、线型等曲线属性,该变量通过GetCurveProp()方法取得。log_curve_column_model类中GetCurveInfo()和SetCurveInfo()方法主要用来获取和保存曲线表名、曲线名等数据信息。log_curve_column_controller类主要负责表格、直线等图元的创建,静态文本、动态文本的编辑以及字体、边框、表格拆分等属性的设置(图3)。
Figure 3. The MVC identifying plot of the drawing function
图3. 曲线绘制功能MVC类图
3.2. Observer设计模式
在MVC框架中,每个图元都作为一个独立的对象存在,模型(Model)作为图元的数据载体与视图(View)分离。通过Observer设计模式(图4),在视图、控制器和模型之间建立一种订阅/通知协议,一旦模型的数据发生变化,模型将通知有关视图进行更新。
Figure 4. The classifying diagram of Observer design pattern
图4. Observer设计模式类图
在该系统中,数据发生变化后,模型通过ToNotify()方法通知观察者iView更新,iView在收到指令后,对应图元视图的Update方法被调用。
void DesignPattern::Observer::Subject::
ToNotify( void )
{
……
Package::MVC::IView* view = dynamic_cast
(*it);
(*view)->Update(this);
}
3.3. Abstract Factory设计模式
录井图绘制系统LogMaker在视图和模型创建时都运用了Abstract Factory设计模式,现以视图工厂为例进行说明。系统中的所有视图类的大部分方法是一致的,主要有Render (CView* pView, CDC* pDC)、Update (DesignPattern::Observer::Subject* subj)、GetColumnWidth()、SetColumnWidth()等,对于不同类型的视图,这些方法的实现内容却是不一样的。为了实现具体视图类和方法的分离,首先将这些方法抽象为接口,如图5所示。
所有的具体视图类都继承该接口,实现接口中所定义的方法,而系统根据需要对具体的工厂进行实例化,并引用工厂对象创建具体视图对象,如图6所示。
Figure 6. The classifying plot of Abstract Factory view
图6. 视图Abstract Factory模式类图
除视图工厂外,数据库模块也应用了Abstract Factory设计模式。如果增加新的数据存储类型mysql,只要添加mysql数据库读写类和mysql工厂类,其他代码不动就可以支持新的数据库,有效地提高了系统的可维护性和扩展性。
3.4. Composite设计模式
录井图是一种基础图形,包括2种图元:基本图元(曲线、标尺、符号、文字、单元格等)和组合图元。其中组合图元也是由基本图元组合而成。在系统图道绘制中,使用了Composite设计模式,首先定义基本图元的容器类Component,然后再定义Composite类和Leaf类。如果是Leaf子类接收到指令,则直接处理;如果是Composite子类,它将请求发送给它的子类,即图元。系统中的曲线道、符号道、标尺道、岩屑剖面道等都采用Composite设计模式实现。Composite模式递归定义复合图元类,创建“整体与部分”的树形结构。
如图7所示,well_column_view类继承于Composite类,对应于图道组合,图道组合下面包括曲线道、符号道、标尺道等。log_curve_column_view类也继承于Composite类,对应于曲线道,用来存储log_curve_child_column_view类的实例。log_curve_child_column_view类就是对应的Leaf类的子类,代表曲线道上的每条曲线。
Figure 7. The Composite pattern of curve tract
图7. 曲线道Composite类图
4. 录井图输出
该系统生成的录井图(如图8)包括图头、图体和图尾。图头以表格形式显示某口井的基本信息、图片、图例和符号。图体则由井深、曲线、油气显示、岩性剖面、岩性百分比剖面、岩性描述等图道组成。图尾可显示制图信息。
除了绘图功能外,系统还具有放大、缩小、打印、定时刷新图件等功能,每次刷新后,新数据便显示在录井图上。此外,鼠标悬停在某个图道时,系统自动弹出提示框,显示鼠标所在位置的井深等信息。
5. 结语
简要介绍了设计模式,详细阐述了基于设计模式的录井图绘制系统logMaker的设计与实现。多种设计模式的运用,使系统具有灵活易用、易扩展、易维护的特点,弥补了国内录井图绘制软件在国外应用上的不足,满足了用户多样性的需求,为录井公司拓展海外市场提供了有力技术支撑。