(原文已在期刊上发表,本文为删去基本理论的简化版本)@H_301_1@
@H_301_3@5 应用实例- VB控制CorelDraw实现背景图下的井坐标定位@H_301_1@
测井资料是储层评价工作中不可缺少的重要依据,在进行区域测井资料解释处理时,常常需要根据大量数据绘制相关工作图件(如区域井坐标位置图和井岩性柱状图等),采用原始的绘图方法在绘图软件中进行图件制作,耗时耗力。因此,我们采用了ActiveX技术实现了井坐标定位的绘图自动化。@H_301_1@
5.1 井数据格式@H_301_1@
@H_301_1@
@H_301_1@
@H_301_1@
图3. 数据表格格式@H_301_1@
首先定义数据表格格式,如图3。其中井况分为完钻(0)、未穿(△)、遇断层(※)。当井况不为完钻时,就将自动在数字后面加上相应的井况符号,提示此数据仅做为参考数值。@H_301_1@
5.2 创建ActiveX对象@H_301_1@
首先声明对象以及数据类型,引用CorelDraw和Excel的对象变量。代码如下:@H_301_1@
Dim exApp As Excel.ApplicationClass@H_301_1@
Dim exBook As Excel.Workbook@H_301_1@
Dim exSheet As Excel.Worksheet@H_301_1@
exApp = New Excel.Application@H_301_1@
exBook = exApp.Workbooks.Open(Excelfilename)@H_301_1@
exSheet = exBook.Sheets.Item(1)@H_301_1@
exSheet.Activate()@H_301_1@
其中,前三个句分别为Excel应用程序,工作薄和工作表类型变量的声明,用以存取或引用相应的Excel对象。而后三句分别创建了Excel应用程序对象、工作薄对象和工作表对象。最后一句为将第一个工作表设置为工作状态。@H_301_1@
下面是CorelDraw对象的创建:@H_301_1@
Dim cdrApp As CorelDRAW.Application@H_301_1@
Dim cdrDoc As CorelDRAW.Document@H_301_1@
cdrApp = New CorelDRAW.Application@H_301_1@
cdrDoc = cdrApp.OpenDocument(CorelDRAW filename)@H_301_1@
cdrApp.ActiveDocument.ReferencePoint = cdrCenter@H_301_1@
'设置图形中心点为定位参考点@H_301_1@
cdrApp.Unit() = cdrMillimeter@H_301_1@
'设置单位为毫米@H_301_1@
cdrApp.Visible() = 1@H_301_1@
'程序可见@H_301_1@
其中,前两句分别声明了CorelDraw应用程序和工作薄变量的声明,用以存取或引用相应的CorelDraw对象。而后两句分别创建了CorelDraw应用程序对象和工作薄对象。最后三句对CorelDraw应用程序对象进行了参数的设定,分别是参考点位置,单位和应用程序工作状态,参数设置详见相关开发文档。@H_301_1@
@H_301_1@
5.3 程序实现@H_301_1@
定义对象与变量@H_301_1@
Dim WName,Font As String@H_301_1@
Dim Size As Single@H_301_1@
Dim Count,LocX,LocY,posX,posY As Double@H_301_1@
Dim Status,Stratathick,Sandthick,Sandrate As String@H_301_1@
Dim ConnectStr,sqlStr As String@H_301_1@
Dim I As Integer@H_301_1@
Dim MyConn As ADODB.Connection@H_301_1@
Dim rest,text As ADODB.Recordset@H_301_1@
Dim Left,Bottom As Double@H_301_1@
Dim sh_name,sh_data As CorelDRAW.Shape@H_301_1@
@H_301_1@
我们预先设置了一个包括了底图和图例的标准模板,其添加的层位都是在这个模板文件的基础上添加的。当数据输入完毕,程序会将修改后的文件自动按照设定的文件名另存一个文件。@H_301_1@
Count = TextBox3.Text '输入井数据个数=行数-1 @H_301_1@
'--------------------------------------创建图层@H_301_1@
cdrDoc.ActivePage.CreateLayer("井位")@H_301_1@
……@H_301_1@
'---------------------------------------输入井位@H_301_1@
For I = 1 To Count@H_301_1@
cdrDoc.ActivePage.Layers("图例").Activate()@H_301_1@
cdrDoc.ActiveLayer.Shapes.All.Copy()@H_301_1@
cdrDoc.ActivePage.Layers("井位").Activate()@H_301_1@
cdrDoc.ActiveLayer.Paste()@H_301_1@
Next I@H_301_1@
将井符号按照输入井数据的个数复制到以“井位”命名的层位;@H_301_1@
cdrDoc.ActiveLayer.Shapes.All()@H_301_1@
For I = 2 To Count + 1@H_301_1@
LocX = exSheet.Cells(I,3).Value@H_301_1@
LocY = exSheet.Cells(I,4).Value@H_301_1@
'输入井位@H_301_1@
posX = 183.83 + ((LocX - 20550000.0) / 100) (*)@H_301_1@
posY = 181.81 + ((LocY - 4300000.0) / 100) (**)@H_301_1@
'绘图坐标原点(183.83,181.81)@H_301_1@
'对应高斯坐标(20550000.00 4300000.00)@H_301_1@
cdrDoc.ActiveLayer.Shapes(I - 1).SetPosition(posX,posY)@H_301_1@
Next I@H_301_1@
根据绘图的比例尺和底图的在CorelDraw程序绘图区的坐标位置,我们根据1:10万的比例尺设定绘图坐标原点(183.83,181.81)所对应高斯坐标(20550000.00 4300000.00),所有的井坐标数据都将根据上面(*)和(**)两个公式对应到绘图区的位置,然后根据转换的绘图坐标值将井位符号定位到相应的位置。@H_301_1@
'---------------------------------------输入井名@H_301_1@
将上面输入井位的代码稍作修改就可以将井名标在井位的正下方,代码如下:@H_301_1@
For I = 2 To Count + 1@H_301_1@
cdrDoc.ActivePage.Layers("井名").Activate()@H_301_1@
WName = exSheet.Cells(I,2).Value@H_301_1@
输入井名@H_301_1@
……@H_301_1@
posX = 183.83 + ((LocX - 20550000.0#) / 100) @H_301_1@
posY = 181.81 + ((LocY - 4300000.0#) / 100) - 3.6 @H_301_1@
Left = 0@H_301_1@
Bottom = 0@H_301_1@
@H_301_1@
sh_name = cdrDoc.ActiveLayer.CreateArtisticText(Left,Bottom,_ WName,Font = "宋体",Size = 8)@H_301_1@
sh_name.SetPosition(posX,posY)@H_301_1@
Next I@H_301_1@
而数据的数据与输入井名一样,根据输入的数据名对应到相应的层位即可,然后将@H_301_1@
posY = 181.81 + ((LocY - 4300000.0#) / 100) - 3.6@H_301_1@
改为@H_301_1@
posY = 181.81 + ((LocY - 4300000.0#) / 100) + 3.6@H_301_1@
@H_301_1@
以上程序均在Windows XP操作系统、Vb.net2003、CorelDraw12环境下运行通过。根据测试400多口井数据的输入在配置为赛扬1.6G,1G DDRⅡ内存,60GB HDD的PC机上运行的时间为5分钟,而之前人工输入至少需要1天的时间,且容易出错。因此本程序简化了数据处理工作,提高了绘图工作效率。运行效果如图4,5。@H_301_1@
@H_301_1@
@H_301_1@
@H_301_1@
图4. 程序操作界面@H_301_1@
@H_301_1@
@H_301_1@
(a)运行前 (b)运行后@H_301_1@
图5. 运行结果对比@H_301_1@