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

(原文已在期刊上发表,本文为删去基本理论的简化版本)@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@

首先声明对象以及数据类型,引用CorelDrawExcel的对象变量。代码如下:@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.83181.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程序绘图区的坐标位置,我们根据110万的比例尺设定绘图坐标原点(183.83181.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@

@H_301_1@

以上程序均在Windows XP操作系统Vb.net2003CorelDraw12环境下运行通过。根据测试400多口井数据的输入在配置为赛扬1.6G1G DDRⅡ内存,60GB HDDPC机上运行的时间为5分钟,而之前人工输入至少需要1天的时间,且容易出错。因此本程序简化了数据处理工作,提高了绘图工作效率。运行效果如图45@H_301_1@

@H_301_1@

@H_301_1@

@H_301_1@

4. 程序操作界面@H_301_1@

@H_301_3@@H_301_1@

@H_301_1@

@H_301_1@

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

5. 运行结果对比@H_301_1@

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

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 --------------------------...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, t...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integ...