□刘守东 □李怡文(河南省周口水文水资源勘测局)
绘制钻孔柱状图是凿井工作中的一项重要工作。随着计算机图形技术的普及,利用计算机绘制深水井柱状图取代了费时、费力、容易出错的传统手工绘制方法逐渐成为了主流。目前,计算机绘制柱状图主要是利用MapGis、AutoCad 等商业绘图软件制作,往往需要大量的软件授权费。针对上述问题,特别是只需要生成柱状图的简单绘图场合,文章提出了一种新的解决方案:采用MicrosoftExcel 为基础平台,利用MicrosoftExcel 内嵌的VBA 编程环境,快速生成深水井柱状图。
如图1所示,一张典型的深水井柱状图可以拆分3 个部分:表头、深度标尺、累进的地层数据。表头、深度标尺格式固定,不需要专门组织数据描述,因此描述一张深水井柱状图只需组织数据描述累进的地层数据即可。累进的地层数据由一个个的地层数据组成,每一个地层数据又包含5 个属性,分别是:层底深度、层厚、剖面、岩性、井斜。其中,剖面为填充图形,可由地层数据的岩性属性推出,故在程序设计中,用层底深度、层厚、岩性、井斜4 个属性来描述一个地层数据。利用MicrosoftExcel 数据表本身的行列组织性质,柱状图累进的地层数据可以如下组织:
以数据表一行表达单个地层数据,递增的行数表达地层数据累进的关系。以数据表中一行的前4 列表达单个地层数据的层底深度、层厚、岩性、井斜4 个属性。
图1 典型深水井柱状图及组成部分示例图
如图2所示,绘制一张深层井柱状图就简化为输入以MicrosoftExcel 数据表本身行列组织结构表达的累进地层数据。
如图1所示,一张典型的深水井柱状图可以拆分3 个部分:表头、深度标尺、累进的地层数据。相应的柱状图的描绘也是分为同样的3 部分先后描绘。
图2 累进地图数据在MicrosoftExcel 中的表达图
由于表头格式固定且需要工作表来容纳即将生成的深水井柱状图,故事先在工作簿中建立含有完整表头的工作表。将事先建立的包含表头的工作表通过VBA 操作拷贝重命名即可完成上述两项任务。
表头绘制主要涉及对工作表对象的操作,相关模块的伪码如下:
//复制“原件”工作表;
Sheets("原件").CopyBefore:=Sheets(2);
//将复制的工作表重命名;
Sheets("原件(2)").Name="柱状图"。
深度标尺涉及深度数据的表达的同时,还需要表达出地层数据的精度,例如层底深度最常见的是精确到小数点后一位或者两位。MicrosoftExcel 中没有相关的概念,为此程序设计中利用单元格行高来表达精度、将多个单元格合并来表达深度数据。以图一所示柱状图为例,每个深度标尺为25m,地层数据的精度为小数点后两位。为了表达出此柱状图的深度和精度数据,使用VBA 操作单元格对象,将绘图区单元格行高设置为0.01,同一列的2500 个单元格合并成一个单元格,以此合并后的单元格作为一个深度标尺。由于深度标尺是以一定量累进的,使用VBA 中的For-Next 语句构建循环,以此以上述方法依次画出每一个深度标尺。
深度标尺绘制主要涉及对单元格对象的操作,以图一所示柱状图为例,相关模块的伪码如下:
//柱状图开始的地层深度;
DimiBgnAsInteger;
//柱状图结束的地层深度
DimiEndAsInteger
//计算绘图区所需要的行数并在For-Next 循环中设置每一行行高
ForrowCnt=5To((iEnd-iBgn)/25+1)*2500+5
//设置一行行高
Rows(rowCnt).RowHeight=0.01
Next
//计算出需要描绘的深度标尺数量
DimiCntAsInteger
iTmp1=(iEnd+12.499)/25
iTmp2=(iBgn-12.499)/25
iCnt=iTmp1-iTmp2
//For-Next 循环中,描绘每一个深度标尺
Forcnt=0ToiCnt-1
//计算出所需要描绘深度标尺所占单元格,并选择
Cells(5+cnt*2500,1).Resize(2500,1).Select
//合并选中的单元格
Selection.Merge
//设置合并后单元格的字体、对其方式等各种属性
WithSelection
.HorizontalAlignment=xlCenter
.VerticalAlignment=xlBottom
…….
//计算当前单元格对应深度标尺的深度并设置
DimiTmpAsInteger
iTmp=(iBgn-12.499)/25+cnt+1
ActiveCell.Value=iTmp*25
Next
地层数据的绘制类似于深度标尺的绘制,不同的是:地层数据根据其层厚属性来决定需要合并的单元格,依次在不同列的合并单元格里填充属性数字和填充图形。
柱状图剖面列为填充图形,由地层数据的岩性属性推出。为此,在程序设计中,将每种岩性和其要填充的图形单独列出(如图3所示)。描画时,读取岩性属性,利用VBA 的查找函数,找出该岩性属性所在单元行。根据查找到的行,偏移一列,读取该单元格的图案属性,将查到的图案属性填充到柱状图剖面列所要填充的合并单元格中。
图3 岩性填充图
剖面列图形填充主要涉及对VBA 的查找功能以及单元格对象属相的赋值,以图1所示柱状图为例,相关模块的伪码如下:
目前该程序设计只是基于特定柱状图描画(游标刻度尺25m递进,地层数据精确的小数点后两位)设计,在用户友好性和通用性方面有所不足。在实际使用中,可将柱状图可变量,例如游标刻度尺递进数、地层数据精确度,设计成输入变量,根据读取的数值描画,增加程序的通用性。同时,在输入界面加入对话框、按钮,做到一键描画,增加程序的易用性。