加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

基于VB.Net的ActiveX技术在地质绘图中的应用

发布时间:2020-12-16 23:33:43 所属栏目:大数据 来源:网络整理
导读:(原文已在期刊上发表,本文为删去基本理论的简化版本) 5 应用实例 - VB 控制 CorelDraw 实现背景图下的井坐标定位 测井资料是储层评价工作中不可缺少的重要依据,在进行区域测井资料解释处理时,常常需要根据大量数据绘制相关工作图件(如区域井坐标位置图

(原文已在期刊上发表,本文为删去基本理论的简化版本)

5 应用实例- VB控制CorelDraw实现背景图下的井坐标定位

测井资料是储层评价工作中不可缺少的重要依据,在进行区域测井资料解释处理时,常常需要根据大量数据绘制相关工作图件(如区域井坐标位置图和井岩性柱状图等),采用原始的绘图方法在绘图软件中进行图件制作,耗时耗力。因此,我们采用了ActiveX技术实现了井坐标定位的绘图自动化。

5.1 井数据格式

3. 数据表格格式

首先定义数据表格格式,如图3。其中井况分为完钻(0)、未穿(△)、遇断层(※)。当井况不为完钻时,就将自动在数字后面加上相应的井况符号,提示此数据仅做为参考数值。

5.2 创建ActiveX对象

首先声明对象以及数据类型,引用CorelDrawExcel的对象变量。代码如下:

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.83181.81

'对应高斯坐标(20550000.00 4300000.00

cdrDoc.ActiveLayer.Shapes(I - 1).SetPosition(posX,posY)

Next I

根据绘图的比例尺和底图的在CorelDraw程序绘图区的坐标位置,我们根据110万的比例尺设定绘图坐标原点(183.83181.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.net2003CorelDraw12环境下运行通过。根据测试400多口井数据的输入在配置为赛扬1.6G1G DDRⅡ内存,60GB HDDPC机上运行的时间为5分钟,而之前人工输入至少需要1天的时间,且容易出错。因此本程序简化了数据处理工作,提高了绘图工作效率。运行效果如图45

4. 程序操作界面

(a)运行前 (b)运行后

5. 运行结果对比

本文的源代码可在网站资源中搜索“在CorelDraw中用VB.NET2003实现自动投井”

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读