ResForm高级应用宏编辑.docx

上传人:b****7 文档编号:9793418 上传时间:2023-02-06 格式:DOCX 页数:21 大小:139.62KB
下载 相关 举报
ResForm高级应用宏编辑.docx_第1页
第1页 / 共21页
ResForm高级应用宏编辑.docx_第2页
第2页 / 共21页
ResForm高级应用宏编辑.docx_第3页
第3页 / 共21页
ResForm高级应用宏编辑.docx_第4页
第4页 / 共21页
ResForm高级应用宏编辑.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

ResForm高级应用宏编辑.docx

《ResForm高级应用宏编辑.docx》由会员分享,可在线阅读,更多相关《ResForm高级应用宏编辑.docx(21页珍藏版)》请在冰豆网上搜索。

ResForm高级应用宏编辑.docx

ResForm高级应用宏编辑

ResForm高级应用——宏编辑

本文以一些常用的例子为主线介绍如何使用ResForm脚本语言。

旨在通过短小精炼的内容编排以及浅显的实例,抛砖引玉,将复杂难懂的计算机语言变成用一门可以快速掌握的工具。

用一个下午,或者临睡前时间,甚至在飞机上、上下班途中,您就有可能一口气把它读完。

是不是有点兴趣味了呢?

下面就让我们一起来开始吧!

1三个术语

在这里,我们先简单介绍一下这样3个术语:

1.ResForm脚本语言:

一种计算机语言;

2.宏:

用于实现特定功能的代码段;

3.宏脚本语言编辑器:

编写或编辑宏的工具(或工作界面)。

2宏脚本语言编辑

针对不同工作需求,软件提供了标准宏、裸体宏两种宏语言编辑、应用模式。

标准宏是完整的宏代码,它拥有main主函数,在不同的单井图文档中都可使用已有的标准宏代码处理数据。

裸体宏仅对某个单井图中的某个图道进行处理,比较简单、灵活。

2.1标准宏编辑器

打开单井图后,在不选择任何图道的情况下,单击主窗口工具条上的

【编辑并执行宏】按钮,即可打开标准宏编辑器,见图1:

1.单击

按钮新建一个宏;

2.单击

打开一个已有的宏;

3.单击

保存当前编辑的宏;

4.单击

执行宏。

2.2裸体宏编辑器

选中单井图上一个图道后,点击工具条中的

工具按钮,或者单击右键,选择【编辑/执行宏】命令即可将其打开,见图2;:

图2

在图2所示的对话框中,上方可以设置循环范围以及是否为“自动循环”,中间代码编辑区域直接输入代码即可,不需要写main主函数。

3第一个宏

首先,我们需要打开宏脚本语言编辑器:

打开任意一张单井图,单击【编辑并执行宏】

功能按钮,在代码编辑区域内键入代码(图3):

voidmain()

{

}

宏脚本编辑器非常聪明,在输入过程中,它将自动提示您要输入的内容。

按上↑下↓键选择,回车Enter键确认,或者直接键入即将输入的下一个符号,如空格、点号“.”等即可。

main()表示程序执行的主入口函数,你可以将其简单理解为程序的开始标记。

代码段需要用一对大括号括起。

ShowMsg表示显示一个消息框,内容文本两侧需要用引号括起,语句结束时输入分号。

宏脚本语言中的符号一律使用英文符号。

单击【执行】

按钮,可以看到运行结果(图4)。

到这里,我们的第一个宏就完成了,接下来的内容里,我们将通过实际工作中的例子来进行介绍,期间也会穿插一些编程中涉及的知识点。

4实例Ⅰ计算孔隙度

4.1算法描述

如果某口井岩心分析孔隙度与补偿密度相关性较好,存在下述关系式:

——计算孔隙度,代码中用POR表示;

DEN——补偿密度;

——岩石骨架密度,隐含值取2.65,代码中用DG表示;

——流体密度,隐含值取1,代码中用DF表示。

4.2代码实现

在这里,我们需要编写一段代码,它完成的工作是:

根据已有公式计算得到计算孔隙度数值,并将其加载至对应的图道里。

首先,单击

按钮打开宏脚本编辑器,粘贴或键入下述语句(双斜杠//后面的文字为代码注释,可以不加),见图5:

//----------------------计算孔隙度----------------------

voidmain()

{

floatDG=2.65;//定义岩石骨架密度值

floatDF=1;//定义流体密度值

//新建曲线道,命名为POR

SCurveTracepor=this.Channels.AddTrace(WellTraceTypes.Curve,"POR");

por.Title="计算孔隙度";//定义道头显示内容

this.SetLoopRange(900,960);//设置循环的起止深度范围

//循环,根据公式计算并将值赋给图道

do{

por.Value=(this.DEN.Value-DG)/(DF-DG);

}while(this.NextRow());

}

//--------------------------------

图5

在详细讲解这段代码之前,我们先看看它的执行效果:

单击宏脚本语言编辑器对话框下方的

【执行】按钮,可以看到单井图上新建了一条“计算孔隙度”图道。

我们手动将数值范围设置为0~1之间,见图6:

图6

4.3代码详解

第4.2小结所示的代码中:

1.float:

是一种数据类型,用于浮点型数据。

2.SCurveTrace:

曲线类图道的公共类。

其它同类型的类还有:

SDiscreteTrace离散型数据道、SLayerTraceBase层对象型数据道等。

por为SCurveTrace实例化后的一个对象。

在这里,我们简单介绍一些编程的基本概念:

类是一个抽象的概念。

以现实生活为例,我们可以把小轿车、越野车、卡车等具有的共同特性抽象出来,构成“汽车”类。

类包含属性和方法。

属性相当于特征描述,如汽车具有颜色、箱型等。

方法相当于具有的行为,如汽车可以进行启动、前进、后退等活动。

对象是类这个抽象概念对应的实体。

如,有一辆车牌照号码为陕A55522的红色福特小轿车,那么这辆车就是将“汽车”类实例化的对象。

我们通过将类实例化成对象来使用这个类的属性和方法。

读到这里你是否有疑问?

为什么用这种类与对象的方式设计程序呢?

这样设计的好处,一是将编写的代码更加贴近真实生活,增加它的易读性;二是通过抽象把大程序分解成更易于管理的小单元,类似于“黑盒”。

就想您在使用宏脚本的某个类或方法时,不需要知道它们内部是怎样实现的。

3.this:

this是一个关键字。

关键字是计算机语言里事先定义的,有特别意义的标识符。

在ResForm脚本语言中,this相当于单文档类的实例。

在this之后输入点号“.”可以查看到单文档类下所有的图道类以及方法、属性等。

4.实心点号:

“.”表示“……的”。

5.Channels:

图道或图道组合的集合,可以理解为一个容器,能够放置一个或者多个图道。

6.AddTrace:

为Channels类所具有的一个方法,意为“添加图道”。

小括号内传递两个参数,分别代表图道类型为曲线道、图道名称为POR。

7.对象定义之后就可以使用了,por.Title="计算孔隙度"意为将por对象(por曲线道)定义道头显示内容设置为“计算孔隙度”。

8.SetLoopRange:

为单文档类下的一个方法,表示设置循环的起止深度范围,小括号内传递两个参数,分别是顶深和底深。

9.do-while循环:

do-while循环语义为:

“当满足某个条件时,一直做某件事情,直到判断条件不满足为止”。

在我们讨论的例子里:

do{

por.Value=(this.DEN.Value-DG)/(DF-DG);

}while(this.NextRow());

可以解释为在指定的深度范围内,根据DEN值以及公式,计算第一个采样点对应的por值,并把该值赋值给por。

接着计算第二个采样点的值,以此类推,直到深度大于给定的底深为止。

4.4深入了解

利用第4.2小结所示的代码中,我们虽然自动生成了一个计算孔隙度图道,但还未对其进行任何修饰。

如,设置曲线的数值范围、颜色、充填样式等,从而达到更好的显示效果。

为此,我们增加下述几行代码(图7):

//---------------------------------------------------

por.Left=0;//设置左刻度值

por.Right=1;//设置右刻度值

por.CurveColor=Color.Red;//设置曲线颜色为红色

por.FillMode=FillLogCurveMode.Left;//设置曲线充填样式为左充填

//设置充填画刷样式,参数分别有前景色、背景色、充填符号

por.FillBrush=newXBrush(COLORREF.Black,COLORREF.RGB(205,133,23),

HatchStyle.DashedHorizontal);

//--------------------------------------------

图7

其中:

1.Left、Right、CurveColor、FillMode、FillBrush均属于曲线道的属性,在这里我们完成了给por这条特定的曲线道赋值的任务;

2.除上述5个属性外,曲线道还具有其它属性。

我们可以通过输入por加实心点看到(图8):

属性前均有

作为标记。

紫红色小方框标记则代表方法,如

3.Color:

表示颜色,在Color后输入实心点即可选择想要的颜色。

4.FillMode:

表示充填样式。

在FillMode后输入等号,可选择FillLogCurveMode充填类型,包含左充填、右充填两种。

5.FillBrush:

表示充填画刷,这里需要通过关键词new创建一个画刷对象。

传递3个参数,分别是:

(1)前景色:

设置为黑色,用COLORREF.Black表示。

其中,COLORREF的用法与Color类似;

(2)背景色:

设置橙黄色,可以用RGB值表示为COLORREF.RGB(205,133,23);

(3)充填符号:

设置为水平虚线,用HatchStyle.DashedHorizontal表示。

单击

【执行】按钮,代码执行效果如图9:

图8

图9

同样,本实例实现的计算孔隙度工作还可以通过裸体宏代码来实现。

具体方法如下:

1.在单井图中创建“计算孔隙度”曲线道;

2.选中孔隙度道后,点右键,选择【编辑/执行宏】命令;

3.在弹出的对话框中设置循环顶、底深度范围,选中“自动循环”,输入如下孔隙度计算公式代码(图10):

//-----------------------------------------

//根据公式计算并将结果赋值给POR图道

this.POR.Value=((this.DEN.Value-2.65)/(1-2.65));

//-----------------------------------------

4.单击

执行宏后,点【确定】按钮;

5.设置图道刻度范围为“0-1”,可以看到得到的计算孔隙度杆状图(图11),此时只需要再设置图道显示样式即可。

 

图11

5实例Ⅱ计算泥质含量

5.1算法描述

如果泥质含量与测井曲线存在下述经验公式:

式中

——解释层段内第

条曲线测井值;

——第

条曲线在纯砂岩处的测井值;

——第

条曲线在纯泥岩处的测井值;

——第

条曲线测井相对值;

GCUR——地区经验系数,对第三纪地层为3.7;对老地层为2;也可以由本地区的实际资料统计获得。

——由第

条曲线求出泥质含量;

——表示任一条测井曲线,如GR、SP、RT、CNL、NLL,本节我们选用自然伽马GR曲线进行计算。

5.2代码实现

单击

按钮打开宏脚本编辑器,粘贴或键入下述语句:

//----------------------计算泥质含量----------------------

voidmain()

{

floatGCUR=3.7;//定义地层经验系数

floatGMAX=this.GR.GetMaxValue(900,945);//获得GR曲线最大值

floatGMIN=this.GR.GetMinValue(900,945);//获得GR曲线最小值

floatSH_value;//定义GR曲线测井相对值

//创建一个名为VSH的曲线道

SCurveTracevsh=this.Channels.AddTrace(WellTraceTypes.curve,"VSH");

vsh.Title="泥质含量";//设置道头标题

vsh.CurveColor=Color.Blue;//设置曲线颜色

vsh.CurveStyle=PenDashStyle.Dash;//设置曲线线型为虚线

vsh.CurveWidth=1.5;//设置曲线宽度

vsh.FillMode=FillLogCurveMode.Left;//设置曲线充填样式为左充填

//设置充填画刷,前景色为黑色、背景色为深灰色、充填符号为水平虚线

vsh.FillBrush=newXBrush(COLORREF.Black,COLORREF.DarkGray,

HatchStyle.DashedHorizontal);

vsh.Left=0;//设置曲线左刻度值

vsh.Right=100;//设置曲线右刻度值

//设置循环的起止深度范围为900~945m

this.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。

图12

5.3代码详解

第5.2小结所示的代码中:

1.GetMaxValue是曲线道类具有的一个方法,其功能是获得目标曲线在某个深度范围之内的最大值。

GetMaxValue方法具有两个参数,分别是顶深、底深。

如,:

this.GR.GetMinValue(顶深,底深)。

在方法名称后面键入一个小括号(左),系统会自动提示需要添加的参数及其数值类型。

2.floatSH_value定义了一个浮点型的变量,由于SH_value是参与计算的中间参数,所以这里没有进行赋值。

3.创建泥质含量道的方法与实例Ⅰ中是一样的,只是起了不同的对象名称和道名称。

道名称一般指计算机内部识别图道的唯一标识。

如,计算孔隙度POR、泥质含量VSH。

道标题名称指图道创建以后道标题上显示的文本名称,该名称不是唯一标识,可以根据需要修改。

定义时通过Title属性进行设置,如vsh.Title="泥质含量",双引号内部的文本即为图道生成后道标题处显示的内容。

4.CurveStyle:

表示曲线类图道“曲线线型”的属性。

在其后输入等号后,自动弹出PenDashStyle枚举类型,可以选择不同的值,如Dash(虚线)、DashDot(单点画线)等等。

5.CurveWidth:

表示曲线类图道“曲线线宽”的属性,直接赋值即可。

6.Pow方法:

表示指数计算函数。

传递两个参数,分别是基数、幂。

可以表示为Pow(10,5)。

5.4深入了解

同样,本实例实现的计算泥质含量工作还可以通过裸体宏代码来实现。

具体方法如下:

1.在单井图中创建曲线道,图道名称为VSH,标题为“泥质含量”;

2.选中泥质含量道后,点右键,选择【编辑/执行宏】命令;

3.在弹出的对话框中设置循环顶、底深度范围,选中“自动循环”,输入下述代码(图13):

//------------------------------------------------

floatGCUR=3.7;//定义地层经验系数

floatGMAX=this.GR.GetMaxValue(900,945);//获得GR曲线最大值

floatGMIN=this.GR.GetMinValue(900,945);//获得GR曲线最小值

floatSH_value;//定义GR曲线测井相对值

//计算GR曲线测井相对值

SH_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

图14

6实例Ⅲ自动生成岩性剖面

6.1算法描述

本节内容将介绍如何根据测井曲线自动生成岩性剖面。

这里,我们以自然电位SP为例,首先确定SP值与岩性之间存在的逻辑关系:

深度

SP值

岩性

含油气性

1370~1380

SP≥41

深灰色灰质泥岩

29<SP≤41

灰白色泥质石灰岩

其它

灰色泥岩

1380~1395

8<SP≤38

棕黄色生物灰岩

饱含油

其它

灰色泥岩

6.2代码实现

在这里,我们需要编写一段代码,它完成的工作是:

在循环1(深度段1370~1380)与循环2(深度段1380~1395)中分别根据SP值判断岩性并赋值给岩性道,最终实现岩性的自动划分。

单击

按钮打开宏脚本编辑器,粘贴或键入下述语句:

//------------------------------------------------------------

voidmain()

{

//新建岩性道,命名为LITHO

SLithoTracelitho=this.Channels.AddTrace(WellTraceTypes.Litho,"LITHO");

litho.Title="岩性";//定义道标题显示内容

litho.ColorColumnWidth=0;//定义岩性道颜色列宽度

this.SetLoopRange(1370,1380);//设置循环1的起止深度范围

//循环,根据SP曲线值不同,设置不同的岩性

do{

if(this.SP.Value>41){//如果SP值大于41,则执行

litho.ColorName="深灰色";//设置颜色为深灰色

litho.OilOccurence=0;//设置含油气性,0表示无

litho.PrefixName="";//设置岩性前缀

litho.MainName="灰质泥岩";//设置岩性

}

elseif((this.SP.Value>29)&&(this.SP.Value<=41)){//如果SP值大于29小于等于41,则执行

litho.ColorName="灰白色";//设置颜色为灰白色

litho.OilOccurence=0;//设置含油气性,0表示无

litho.PrefixName="泥质";//设置岩性前缀为泥质

litho.MainName="石灰岩";//设置岩性

}

else{//如果上述两种情况均不满足,则执行

litho.ColorName="灰色";//设置颜色为灰色

litho.OilOccurence=0;//设置含油气性,0表示无

litho.Prefix=0;//设置岩性前缀,0表示无

litho.MainName="泥岩";//设置岩性

}

}while(this.NextRow());//循环1结束

this.SetLoopRange(1380,1395);//设置循环2的起止深度范围

//循环,根据SP曲线值不同,设置不同的岩性

do{

if((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="";//设置岩性前缀

litho.MainName="灰质泥岩";//设置岩性

}

}while(this.NextRow());//循环2结束

}

//-----------------------------------------

在详细讲解这段代码之前,我们先看看它的执行效果:

单击宏脚本语言编辑器对话框下方的

【执行】按钮,可以看到单井图上新建了一个岩性道并自动划分了岩性,见图15。

图15

6.3代码详解

第6.2小节所示的代码中:

1.SLithoTrace:

岩性类图道的公共类。

litho为SLithoTrace实例化后的一个对象。

该语句意为创建一个岩性道对象,该对象的名称为LITHO;

2.岩性道有很多属性,如上一小节代码用到的:

(1)Title:

道标题;

(2)ColorColumnWidth:

颜色列宽;

(3)ColorName:

颜色名称;

(4)OilOccurence:

含油气性索引号;

(5)PrefixName:

岩性前缀名称;

(6)Prefix:

岩性前缀索引号;

(7)MainName:

岩性主名。

其中,索引号(如,OilOccurence)需赋值为整型数字,具体的值可以通过岩性配置中查找得到,见图16。

每个油气名称前的数字即为索引值,如“饱含油”为1、“富含油”为2。

颜色名称ColorName与岩性前缀名称PrefixName等需赋值为字符型,即把具体的名称用双引号括起来,如:

litho.ColorName="灰白色";

除本实例中用到的属性外,岩性道还有很多其它属性,您可以在宏脚本剪辑器中输入SLithoTrace类的实例化对象litho后,再输入一个实心圆点,系统将自动弹出该对象包含的各种方法与属性,见图17。

图17

7实例Ⅳ曲线自动解释小层

7.1算法描述

本节内容将介绍如何根据测井曲线自动生成分层。

这里,我们以自然电位测井曲线SP与电导率测井曲线RILD为例,它们与分层之间存在下述逻辑关系:

深度

SP值

RILD值

解释结论

1370~1400

SP<30

RILD≥1.1

油层

RILD<1.1

水层

SP≥30

7.2代码实现

在这里,我们需要编写一段代码,它完成的工作是:

新建一个解释分层图道。

在深度段13

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1