ResForm-高级应用-宏编辑_第1页
ResForm-高级应用-宏编辑_第2页
ResForm-高级应用-宏编辑_第3页
ResForm-高级应用-宏编辑_第4页
ResForm-高级应用-宏编辑_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上精选优质文档-倾情为你奉上专心-专注-专业专心-专注-专业精选优质文档-倾情为你奉上专心-专注-专业ResForm 高级应用宏编辑ResForm脚本语言是专门为基于ResForm构架下的地质研究、油藏工程、油藏描述等系列软件产品配置的编程语言。利用该脚本语言,可以轻松实现现有功能的特定扩展,提高工作的质量和效率。本文以一些常用的例子为主线介绍如何使用ResForm脚本语言。旨在通过短小精炼的内容编排以及浅显的实例,抛砖引玉,将复杂难懂的计算机语言变成用一门可以快速掌握的工具。用一个下午,或者临睡前时间,甚至在飞机上、上下班途中,您就有可能一口气把它读完。是不是有点兴趣

2、了呢?下面就让我们一起来开始吧!1三个术语在这里,我们先简单介绍一下这样3个术语:1ResForm脚本语言:一种计算机语言;2宏:用于实现特定功能的代码段;3宏脚本语言编辑器:编写或编辑宏的工具(或工作界面)。2宏脚本语言编辑针对不同工作需求,软件提供了标准宏、裸体宏两种宏语言编辑、应用模式。标准宏是完整的宏代码,它拥有main主函数,在不同的单井图文档中都可使用已有的标准宏代码处理数据。裸体宏仅对某个单井图中的某个图道进行处理,比较简单、灵活。2.1标准宏编辑器图1打开单井图后,在不选择任何图道的情况下,单击主窗口工具条上的【编辑并执行宏】按钮,即可打开标准宏编辑器,见图1:1单击按钮新建一

3、个宏;2单击打开一个已有的宏;3单击保存当前编辑的宏;4单击执行宏。2.2裸体宏编辑器选中单井图上一个图道后,点击工具条中的工具按钮,或者单击右键,选择【编辑/执行宏】命令即可将其打开,见图2;:123图2 在图2所示的对话框中,上方可以设置循环范围以及是否为“自动循环”,中间代码编辑区域直接输入代码即可,不需要写main主函数。3第一个宏首先,我们需要打开宏脚本语言编辑器:打开任意一张单井图,单击【编辑并执行宏】功能按钮,在代码编辑区域内键入代码(图3):void main()代码编辑区域图3宏脚本编辑器非常聪明,在输入过程中,它将自动提示您要输入的内容。按上下键选择,回车Enter键确认,

4、或者直接键入即将输入的下一个符号,如空格、点号“.”等即可。main()表示程序执行的主入口函数,你可以将其简单理解为程序的开始标记。代码段需要用一对大括号括起。图4ShowMsg表示显示一个消息框,内容文本两侧需要用引号括起,语句结束时输入分号。宏脚本语言中的符号一律使用英文符号。单击【执行】按钮,可以看到运行结果(图4)。到这里,我们的第一个宏就完成了,接下来的内容里,我们将通过实际工作中的例子来进行介绍,期间也会穿插一些编程中涉及的知识点。4实例 计算孔隙度4.1算法描述如果某口井岩心分析孔隙度与补偿密度相关性较好,存在下述关系式: 计算孔隙度,代码中用POR表示;DEN补偿密度;岩石骨

5、架密度,隐含值取2.65,代码中用DG表示;流体密度,隐含值取1,代码中用DF表示。4.2代码实现在这里,我们需要编写一段代码,它完成的工作是:根据已有公式计算得到计算孔隙度数值,并将其加载至对应的图道里。首先,单击按钮打开宏脚本编辑器,粘贴或键入下述语句(双斜杠/后面的文字为代码注释,可以不加),见图5:/-计算孔隙度-void main()float DG = 2.65; /定义岩石骨架密度值float DF = 1; /定义流体密度值/新建曲线道,命名为PORSCurveTrace por = this.Channels.AddTrace(WellTraceTypes.Curve,POR

6、);por.Title = 计算孔隙度; /定义道头显示内容this.SetLoopRange(900,960); /设置循环的起止深度范围/循环,根据公式计算并将值赋给图道dopor.Value = (this.DEN.Value - DG)/(DF - DG);while(this.NextRow();/-图5在详细讲解这段代码之前,我们先看看它的执行效果:单击宏脚本语言编辑器对话框下方的【执行】按钮,可以看到单井图上新建了一条“计算孔隙度”图道。我们手动将数值范围设置为01之间,见图6:图64.3代码详解第4.2小结所示的代码中:1float:是一种数据类型,用于浮点型数据。2SCurv

7、eTrace:曲线类图道的公共类。其它同类型的类还有:离散型数据道、层对象型数据道等。por为SCurveTrace实例化后的一个对象。在这里,我们简单介绍一些编程的基本概念:类是一个抽象的概念。以现实生活为例,我们可以把小轿车、越野车、卡车等具有的共同特性抽象出来,构成“汽车”类。类包含属性和方法。属性相当于特征描述,如汽车具有颜色、箱型等。方法相当于具有的行为,如汽车可以进行启动、前进、后退等活动。对象是类这个抽象概念对应的实体。如,有一辆车牌照号码为陕A55522的红色福特小轿车,那么这辆车就是将“汽车”类实例化的对象。我们通过将类实例化成对象来使用这个类的属性和方法。读到这里你是否有疑

8、问?为什么用这种类与对象的方式设计程序呢?这样设计的好处,一是将编写的代码更加贴近真实生活,增加它的易读性;二是通过抽象把大程序分解成更易于管理的小单元,类似于“黑盒”。就想您在使用宏脚本的某个类或方法时,不需要知道它们内部是怎样实现的。3this: this是一个关键字。关键字是计算机语言里事先定义的,有特别意义的。在ResForm脚本语言中,this相当于单文档类的实例。在this之后输入点号“.”可以查看到单文档类下所有的图道类以及方法、属性等。4实心点号:“.”表示“的”。5Channels:图道或图道组合的集合,可以理解为一个容器,能够放置一个或者多个图道。6AddTrace:为Ch

9、annels类所具有的一个方法,意为“添加图道”。小括号内传递两个参数,分别代表图道类型为曲线道、图道名称为POR。7对象定义之后就可以使用了,por.Title = 计算孔隙度意为将por对象(por曲线道)定义道头显示内容设置为“计算孔隙度”。8SetLoopRange:为单文档类下的一个方法,表示设置循环的起止深度范围,小括号内传递两个参数,分别是顶深和底深。9do-while循环:do-while循环语义为:“当满足某个条件时,一直做某件事情,直到判断条件不满足为止”。在我们讨论的例子里:dopor.Value = (this.DEN.Value - DG)/(DF - DG);whi

10、le(this.NextRow();可以解释为在指定的深度范围内,根据DEN值以及公式,计算第一个采样点对应的por值,并把该值赋值给por。接着计算第二个采样点的值,以此类推,直到深度大于给定的底深为止。4.4深入了解利用第4.2小结所示的代码中,我们虽然自动生成了一个计算孔隙度图道,但还未对其进行任何修饰。如,设置曲线的数值范围、颜色、充填样式等,从而达到更好的显示效果。为此,我们增加下述几行代码(图7):/-por.Left = 0; /设置左刻度值por.Right = 1; /设置右刻度值por.CurveColor = Color.Red; /设置曲线颜色为红色por.FillMo

11、de = FillLogCurveMode.Left; /设置曲线充填样式为左充填/设置充填画刷样式,参数分别有前景色、背景色、充填符号por.FillBrush = new XBrush(COLORREF.Black,COLORREF.RGB(205,133,23),HatchStyle.DashedHorizontal);/-图7其中:1Left、Right、CurveColor、FillMode、FillBrush均属于曲线道的属性,在这里我们完成了给por这条特定的曲线道赋值的任务;2除上述5个属性外,曲线道还具有其它属性。我们可以通过输入por加实心点看到(图8):属性前均有作为标记

12、。紫红色小方框标记则代表方法,如。3Color:表示颜色,在Color后输入实心点即可选择想要的颜色。4FillMode:表示充填样式。在FillMode后输入等号,可选择FillLogCurveMode充填类型,包含左充填、右充填两种。5FillBrush:表示充填画刷,这里需要通过关键词new创建一个画刷对象。传递3个参数,分别是:(1)前景色:设置为黑色,用COLORREF.Black表示。其中,COLORREF的用法与Color类似;(2)背景色:设置橙黄色,可以用RGB值表示为COLORREF.RGB(205,133,23);(3)充填符号:设置为水平虚线,用HatchStyle.D

13、ashedHorizontal表示。单击【执行】按钮,代码执行效果如图9:图8图9同样,本实例实现的计算孔隙度工作还可以通过裸体宏代码来实现。具体方法如下:1在单井图中创建“计算孔隙度”曲线道;2选中孔隙度道后,点右键,选择【编辑/执行宏】命令;3在弹出的对话框中设置循环顶、底深度范围,选中“自动循环”,输入如下孔隙度计算公式代码(图10):/-/根据公式计算并将结果赋值给POR图道this.POR.Value = (this.DEN.Value - 2.65)/(1-2.65);图10/-4单击执行宏后,点【确定】按钮;5设置图道刻度范围为“0-1”,可以看到得到的计算孔隙度杆状图(图11)

14、,此时只需要再设置图道显示样式即可。图115实例 计算泥质含量5.1算法描述如果泥质含量与测井曲线存在下述经验公式: ()式中 解释层段内第条曲线测井值; 第条曲线在纯砂岩处的测井值; 第条曲线在纯泥岩处的测井值; 第条曲线测井相对值; GCUR地区经验系数,对第三纪地层为3.7;对老地层为2;也可以由本地区的实际资料统计获得。 由第条曲线求出泥质含量; 表示任一条测井曲线,如GR、SP、RT、CNL、NLL,本节我们选用自然伽马GR曲线进行计算。5.2代码实现单击按钮打开宏脚本编辑器,粘贴或键入下述语句:/-计算泥质含量-void main()float GCUR = 3.7; /定义地层经

15、验系数float GMAX = this.GR.GetMaxValue(900,945); /获得GR曲线最大值float GMIN = this.GR.GetMinValue(900,945); /获得GR曲线最小值float SH_value; /定义GR曲线测井相对值/创建一个名为VSH的曲线道SCurveTrace vsh = this.Channels.AddTrace(WellTraceTypes.curve,VSH);vsh.Title = 泥质含量; /设置道头标题vsh.CurveColor = Color.Blue; /设置曲线颜色vsh.CurveStyle = PenD

16、ashStyle.Dash; /设置曲线线型为虚线vsh.CurveWidth = 1.5; /设置曲线宽度vsh.FillMode = FillLogCurveMode.Left; /设置曲线充填样式为左充填/设置充填画刷,前景色为黑色、背景色为深灰色、充填符号为水平虚线vsh.FillBrush = new XBrush(COLORREF.Black,COLORREF.DarkGray,HatchStyle.DashedHorizontal);vsh.Left = 0; /设置曲线左刻度值vsh.Right = 100; /设置曲线右刻度值/设置循环的起止深度范围为900945mthis.

17、SetLoopRange(900,945);/循环,根据公式计算并赋值给vsh图道do/计算GR曲线测井相对值SH_value = (this.GR.Value - GMIN)/(GMAX - GMIN); /计算泥质含量并将结果赋值给图道vsh.Value = (this.Pow(2,(GCUR * SH_value) - 1)/(this.Pow(2,GCUR) - 1)*100;while(this.NextRow();/-在详细讲解这段代码之前,我们先看看它的执行效果:单击宏脚本语言编辑器对话框下方的【执行】按钮,可以看到单井图上新建了一条“泥质含量”图道,见图12。图125.3代码详

18、解第5.2小结所示的代码中:1GetMaxValue是曲线道类具有的一个方法,其功能是获得目标曲线在某个深度范围之内的最大值。GetMaxValue方法具有两个参数,分别是顶深、底深。如,:this.GR.GetMinValue(顶深,底深)。在方法名称后面键入一个小括号(左),系统会自动提示需要添加的参数及其数值类型。2float SH_value定义了一个浮点型的变量,由于SH_value是参与计算的中间参数,所以这里没有进行赋值。3创建泥质含量道的方法与实例中是一样的,只是起了不同的对象名称和道名称。道名称一般指计算机内部识别图道的唯一标识。如,计算孔隙度POR、泥质含量VSH。道标题名

19、称指图道创建以后道标题上显示的文本名称,该名称不是唯一标识,可以根据需要修改。定义时通过Title属性进行设置,如vsh.Title = 泥质含量,双引号内部的文本即为图道生成后道标题处显示的内容。4CurveStyle:表示曲线类图道“曲线线型”的属性。在其后输入等号后,自动弹出PenDashStyle枚举类型,可以选择不同的值,如Dash(虚线)、DashDot(单点画线)等等。5CurveWidth:表示曲线类图道“曲线线宽”的属性,直接赋值即可。6Pow方法:表示指数计算函数。传递两个参数,分别是基数、幂。如可以表示为Pow(10,5)。5.4深入了解同样,本实例实现的计算泥质含量工作

20、还可以通过裸体宏代码来实现。具体方法如下:1在单井图中创建曲线道,图道名称为VSH,标题为“泥质含量”;2选中泥质含量道后,点右键,选择【编辑/执行宏】命令;3在弹出的对话框中设置循环顶、底深度范围,选中“自动循环”,输入下述代码(图13):/-float GCUR = 3.7; /定义地层经验系数float GMAX = this.GR.GetMaxValue(900,945); /获得GR曲线最大值float GMIN = this.GR.GetMinValue(900,945); /获得GR曲线最小值float SH_value; /定义GR曲线测井相对值/计算GR曲线测井相对值 SH_

21、value = (this.GR.Value - GMIN)/(GMAX - GMIN); /计算泥质含量并将结果赋值给图道vsh.Value = (this.Pow(2,(GCUR * SH_value) - 1)/(this.Pow(2,GCUR) - 1)*100; /-4单击执行宏后,点【确定】按钮;5在单井图中可以看到得到计算出来的泥质含量曲线(图14),此时只需要再设置图道显示样式即可。图13图146实例 自动生成岩性剖面6.1算法描述本节内容将介绍如何根据测井曲线自动生成岩性剖面。这里,我们以自然电位SP为例,首先确定SP值与岩性之间存在的逻辑关系:深度SP值岩性含油气性1370

22、1380SP41深灰色灰质泥岩无29SP41灰白色泥质石灰岩无其它灰色泥岩无138013958SP38棕黄色生物灰岩饱含油其它灰色泥岩无6.2代码实现在这里,我们需要编写一段代码,它完成的工作是:在循环1(深度段13701380)与循环2(深度段13801395)中分别根据SP值判断岩性并赋值给岩性道,最终实现岩性的自动划分。单击按钮打开宏脚本编辑器,粘贴或键入下述语句:/-void main()/新建岩性道,命名为LITHOSLithoTrace litho = this.Channels.AddTrace(WellTraceTypes.Litho,LITHO);litho.Title =

23、岩性; /定义道标题显示内容litho.ColorColumnWidth = 0; /定义岩性道颜色列宽度this.SetLoopRange(1370, 1380); /设置循环1的起止深度范围/循环,根据SP曲线值不同,设置不同的岩性doif(this.SP.Value 41) /如果SP值大于41,则执行litho.ColorName = 深灰色; /设置颜色为深灰色litho.OilOccurence = 0; /设置含油气性,0表示无litho.PrefixName = ; /设置岩性前缀litho.MainName =灰质泥岩; /设置岩性else if(this.SP.Value

24、29) & (this.SP.Value 8) & (this.SP.Value = 38)/若SP大于8小于等于38,则执行litho.ColorName = 棕黄色; /设置颜色为棕黄色litho.OilOccurence = 1; /设置岩性前缀,1表示饱含油litho.PrefixName = ; /设置岩性前缀litho.MainName = 生物灰岩; /设置岩性else /如果SP值不符合上述条件,则执行litho.ColorName = 深灰色; /设置颜色为深灰色litho.OilOccurence = 0; /设置岩性前缀,0表示无litho.PrefixName = ;

25、/设置岩性前缀litho.MainName =灰质泥岩; /设置岩性while(this.NextRow(); /循环2结束/-在详细讲解这段代码之前,我们先看看它的执行效果:单击宏脚本语言编辑器对话框下方的【执行】按钮,可以看到单井图上新建了一个岩性道并自动划分了岩性,见图15。图156.3代码详解第6.2小节所示的代码中:1SLithoTrace:岩性类图道的公共类。litho为SLithoTrace实例化后的一个对象。该语句意为创建一个岩性道对象,该对象的名称为LITHO;2岩性道有很多属性,如上一小节代码用到的:(1)Title:道标题;图16(2)ColorColumnWidth:颜

26、色列宽;(3)ColorName:颜色名称;(4)OilOccurence:含油气性索引号;(5)PrefixName:岩性前缀名称;(6)Prefix:岩性前缀索引号;(7)MainName:岩性主名。其中,索引号(如,OilOccurence)需赋值为整型数字,具体的值可以通过岩性配置中查找得到,见图16。每个油气名称前的数字即为索引值,如“饱含油”为1、“富含油”为2。颜色名称ColorName与岩性前缀名称PrefixName等需赋值为字符型,即把具体的名称用双引号括起来,如:litho.ColorName = 灰白色;除本实例中用到的属性外,岩性道还有很多其它属性,您可以在宏脚本剪辑

27、器中输入SLithoTrace类的实例化对象litho后,再输入一个实心圆点,系统将自动弹出该对象包含的各种方法与属性,见图17。图177实例 曲线自动解释小层7.1算法描述本节内容将介绍如何根据测井曲线自动生成分层。这里,我们以自然电位测井曲线SP与电导率测井曲线RILD为例,它们与分层之间存在下述逻辑关系:深度SP值RILD值解释结论13701400SP30RILD1.1油层RILD1.1水层SP30无无7.2代码实现在这里,我们需要编写一段代码,它完成的工作是:新建一个解释分层图道。在深度段13701400范围内,当SP小于30时,若RILD的大于等于1.1,判断为油层;RILD的小于1

28、.1,判断为水层。当SP大于等于30,不执行任何操作。单击按钮打开宏脚本编辑器,粘贴或键入下述语句:/-该示例演示如何根据自然电位测井和电导率测井曲线自动分层-void main()float topDepth = 1370; / 定义处理井段顶深float bottomDepth = 1400; / 定义处理井段底深this.SetLoopRange(topDepth, bottomDepth); /设置循环的起止深度范围 /新建解释分层道,命名为“测井解释”SSandTrace sand = this.Channels.AddTrace(WellTraceTypes.Sand,测井解释);/循环,根据SP值与RILD值判断解释结论doif(this.SP.Value = 1.1 ) /若RILD值大于等于1.1,则执行sand .Lay

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论