感觉认识实例:
一、Application
Caption 主窗体标题
WindowState 主窗体状态(srfWindowStateMaximized,SrfWindowStateMinimized,即最大化最小等)
Documents 所拥的Document集合
ShowStatusBar 是否显示状态栏
ShowToolBars 是否显示工具栏
ActiveDocument 当前活动Document对象
方法:
GridConvert 各种Grid文件的转换
GridSplineSmooth 插值时平滑网格数据
Quit 退出Surfer
二、Documents
派生两对象:PlotDocument 和 WksDocument
PlotDocument含形状对象:ShapeCollection集合
ShapeCollection集合有:Rectangle,PloyLine,ContourMap,BaseMap,Axes,ScaleBars,
Symbol(符号),Text(文本)
创建新文档用Add方法。
主要属性:
Saved 最近修改是否保存
Type Document类型(srfDocPlot,srfDocWks,srfDocGrid 三种类型)
常用方法:
Activate 使Document窗体为当前窗体
Close 关闭
Save 保存(指定一文件)
SaveAs 另存为
先来一个简单操作的例子。
下面在VB中操作surfer
在VB中引用surfer 8 Type library
然后按下建立,可以看到VB就可以操作surfer了。
由上例可以看出,实际上和操作excel是一样的。
比如:用VB打开了surfer,退出VB,surfer并不关闭。原因是VB没有向surfer发出关闭命令。
三:Shapes Collection
绘图集合,这是操作的重点。
属性:
Rotation 设置或返回旋转角度
Selected 是否选中
方法:
Delete 删除
Deselect 取消选中
Select 选中
四、 Selection Collection
大多命令都是对选择中的对象有效。所以选中才有更效地进行操作。
注意:从选中集合中删除对象,只表明对象不在选中之列,实际还在存在 的。
五: 名字参数
Surfer支持位置参数,就是平时的参数,同时它还支持名字参数,即命名参数。
比如: msgBox(Prompt:="提示框来了",Button:=vbOKOnly)
命名参数的好处就是顺序可以乱,程序自动确定相应的参数值。对于一个函数或方法有很多参数进,好处是显而晚风的。
第一个实例只有surfer的壳子,没有内容,正如excel打开后,没有book和sheet一样。
需要添加一些文档、图形及表之类的。
六、开始的过程一般这样:
dim srf as Object
set srf=createobject("surfer.Application") ‘即dim srf as new surfer.application
主程序创建出来后,就要加入东西:
dim doc as object '定义绘图对象
set doc=srf.documents.add(1) '加入一个对象,这个1表示srfDocPlot 即绘图文档
生成一个surfer绘图窗体:
dim winPlot as object
Set winPlot=doc.windows(1) '设置一个新绘图窗体。
现在加一个绘图窗体。
注意:在vb中都是用I开头的接口,比如文档对象:IDocument。所以找不到对象时,试试I开头的。或者F2从对象浏览器中查找
七、操作图形
VB并不能把surfer”拿进“来进行操作,它只是控制它。
常用的图形方法,就是用VB控制surfer,让surfer来做它专精的事,最后的结果保存为图片。然后VB再把这个图片入到VB程序中来。
任意原始数据在处理前都必须进行网格化,形成均匀的网格文件,为下一步的绘图做好准备。
网格化方法是Application的方法,它有50多个参数,吓!是这么多!如果用位置参数固定位置写的话,得累死人。
所以这里用命名参数法,特定指定同个就行了,其余采用默认值。命名参数的好处就体现出现了。
这里采用surfer8中samples例子文件列中DEMOGRID.dat数据来网格化。
@H_301_246@Option Explicit Dim srf As New Surfer.Application '类似excel Private Sub Command1_Click() Dim doc As Surfer.IDocument '类似book Dim winPlot As Surfer.IWindow '类似sheet srf.Caption = "白话魔法师" '标题 srf.Visible = True Set doc = srf.Documents.Add(srfDocPlot) Set winPlot = doc.Windows(srfWinPlot) '网格化一个dat文件 srf.GridData DataFile:=App.Path & "\DEMOGRID.Dat",xCol:=1,yCol:=2,zCol:=3,algorithm:=srfKriging,showreport:=False,_ outgrid:=App.Path & "\DEMOGRID.grd" End Sub
DataFile是数据源,即Dat文件所在
outgrid是目标所在,即保存位置
结果:在工程保存目录 中存放网格文件。
回顾一下对象模型,对于图形的操作,理清创建对象的先后
Application->Documents->PlotDocument->Shapes->mapFrame->Overlays->这才到了我们的各种图
添加图形时返回的是mapFrame对象,含坐标系及相应的通用属性。
比如: set mapFrame=shapes.addContourMap("demogrid.grid")
它并不是等值线本身,因为它包含坐标轴等,要取得等值线就得在这个集合中取第一项。
如: Set contourMap=MapFrame.overLays(1)
再看一个例子:
@H_301_246@Option Explicit Dim srf As New Surfer.Application '类似excel Private Sub Command1_Click() Dim doc As Surfer.IDocument '类似book Dim winPlot As Surfer.IWindow '类似sheet srf.Visible = True '设置为真便于我们查看后面程序的情况,正式发布时为False Set doc = srf.Documents.Add(srfDocPlot) Set winPlot = doc.Windows(srfWinPlot) '网格化一个dat文件 srf.GridData DataFile:=App.Path & "\DEMOGRID.Dat",_ outgrid:=App.Path & "\DEMOGRID.grd" Dim Shapes As Surfer.IShapes Dim mapFrame As Surfer.IMapFrame '各种图形总称,不是wireFrame Set Shapes = doc.Shapes Set mapFrame = Shapes.AddSurface(App.Path & "\DEMOGRID.grd") '加入表面图(曲面图) Set mapFrame = Shapes.AddContourMap(App.Path & "\DEMOGRID.grd") '加入等值线 '这样doc中的shapes集合中就有两个图了,下面进行叠加 doc.Selection.DeselectAll '先清除全部所选择 Shapes(1).Selected = True '第一个图选中(曲面图) Shapes(2).Selected = True '第二个图选中(等值线图) doc.Selection.OverlayMaps '图层叠加 If Dir(App.Path & "1.jpg") <> "" Then '检测是否有文件,有就删除它 Kill App.Path & "1.jpg" End If doc.Export App.Path & "1.jpg" '输出图片 Picture1.Picture = LoadPicture(App.Path & "1.jpg") '加载到VB中 ' srf.Documents.CloseAll srfSaveChangesNo '不提示存盘进行关闭 ' srf.Quit End Sub