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