您的位置:首页 > 编程语言 > VB

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

2009-03-16 14:05 302 查看
(原文已在期刊上发表,本文为删去基本理论的简化版本)

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. 运行结果对比
本文的源代码可在网站资源中搜索“在CorelDraw中用VB.NET2003实现自动投井”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐