中易网

如何取得等值线图的等级参数 surfer

答案:2  悬赏:40  
解决时间 2021-03-02 16:45
如何取得等值线图的等级参数 surfer
最佳答案
Mike Lamar: 我想让我的应用程序从 Surfer 取得等值线图的限制,我
运行这个应用程序,它启动了 surfer 并生成了地图。然后我可以在 Surfer 中改变等值线图的等级属性。例如我设置最小值为 0,最大值为 500,间距为 100。 OK,当我手工设定好后,我希望我的应用程序可以取得这些值,这样在以后我就可以通过 Levels.AutoGenerate(MinLevel:=0, MaxLevel:=500, Interval:=100) 来使用他们了。

Tom Bresnahan:使用 ContourMap 对象的 Levels 集合可以取得 Z 等级的最小值和最大值以及等级数,并且我们可以通过计算间接的得到他的间距。

Set surf = GetObject(,"surfer.application")
Set plotdoc1 = surf.ActiveDocument
Set mapframe1 = plotdoc1.Shapes("Map")
Set contourmap1 = mapframe1.Overlays("Contours")
Set levels1 = contourmap1.Levels
numlevels = levels1.Count '等级数
minlevel = levels1(1) '第一等级
maxlevel = levels1(numlevels) '最后等级
contourinterval = (maxlevel - minlevel) / (numlevels - 1)

Mike Lamar:谢谢回复,果然能行,不过有些小问题:
我启动 Surfer,显示等值线图,等等。然后当我在 Surfer 中打开等值线的属性对话框,其最小等级是 -20,最大值 520,间距是 20。因此我将这些值改变为最小值 0,最大值 500,间距 100。
我点击应用,地图显示了我作的更改。现在我回到我的应用程序,这时候 Surfer 仍然在运行,我点击按钮,可是获得是原来的 -20, 520 和 20,而不是我刚才输入的值。
嗯,难道这是一个 bug?或者我漏什么?

Tom Bresnahan:看来你参考的是该等值线图对象的旧副本。在你改变了等值线等级后,要取得该等值线图对象的一个新副本才行。

Mike Lamar:原来如斯。
但我就是完全使用你上面贴的代码,结果还是那样。我得到原始的等值线图的值,而不是新的。这绝对是在我按了等值线图属性对话框中“应用”和“确认”按钮并且地图已经改变之后。

Tom Bresnahan:这个问题确实存在。

- 为了刷新 ContourMap 等级,保存该地图为 SRF 文件,关闭该文件,打开该文件然后重新运行脚本。

另外的方法是将该地图剪切到剪贴板,然后粘贴回 Surfer 窗口。

- 为了避免这个问题,可以创建一个定制的对话框:

'将这个代码加入前面的脚本
Begin Dialog UserDialog 400,203,"等值线等级" ' %GRID:10,7,1,1
Text 30,35,130,14,"最小 Z 等级",.minlvl_txt
Text 30,65,150,21,"最大 Z 等级",.maxlvl_txt
Text 30,95,140,14,"等值线间距",.CI_txt
TextBox 180,35,110,21,.lvlmin
TextBox 180,65,110,21,.lvlmax
TextBox 180,95,110,21,.lvlinterval
OKButton 90,147,90,21
CancelButton 200,147,90,21
End Dialog
Dim dlg As UserDialog
dlg.lvlmin = CStr(minlevel)
dlg.lvlmax = CStr(maxlevel)
dlg.lvlinterval = CStr(contourinterval)
retval = Dialog (dlg)
If retval <> -1 Then End
With dlg
numlevels = 1 + ( (CDbl(.lvlmax) - CDbl(.lvlmin)) / CDbl(.lvlinterval) )
Debug.Print CDbl(lvlmin);CDbl(.lvlmax);CDbl(.lvlinterval);numlevels
ReDim levelsarray(1 To numlevels)
For i = 1 To numlevels
'Debug.Print CDbl(.lvlmin) + (i-1)*CDbl(.lvlinterval)
levelsarray(i) = CDbl(.lvlmin) + (i-1)*CDbl(.lvlinterval)
Next i
levels1.Set(levelsarray)
End With
numlevels = levels1.Count 'number of levels
minlevel = levels1(1) 'first level
maxlevel = levels1(numlevels) 'last level
contourinterval = (maxlevel - minlevel) / (numlevels - 1)
Debug.Print numlevels;minlevel;maxlevel;contourinterval

Mike Lamar:严重感谢。
这里还有一个问题,当我运行我的程序来设置一个有四个不同覆盖的等值线图的等级时,最小值为 0,最大值为 1000,间距 100,我使用一个等级文件来设置等值线。
我使用下面的代码设置每个覆盖:

Sub DisplayContourShading(olay As Integer)
' 设置等值线图等级
Set ConMap = MapFrame.Overlays(olay) 'olay is overlay index
Set ConLevels = ConMap.Levels
ConLevels.AutoGenerate minlevel:=minContour, maxlevel:=maxContour, Interval:=contourInterval
If mapElements.levelFile <> "" Then
Set ContourLevels = ConMap.Levels
ContourLevels.LoadFile mapElements.levelFile
End If
End Sub

当我进入 surfer 并检查等值线图属性时,等级看起来很好。但是,当我点击等级标签时我发现了不同的最小值、最大值和间距其中一个是 -20、 520 和 20,另外一个是 -50、 1550 和 50。
全部回答
双击图形--找到等级(即contours属性)--再找到标注--再找到 字体,
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
玉龙副食地址有知道的么?有点事想过去
买回来的鲜松磨怎么清冼
dvd,svcd,ts,meg2格式那个更清楚?
玩英雄联盟,去哪里看些视频提高技术的,比如
用PS存储的PDF格式时,怎么设置才能出现出血标
品味聚我想知道这个在什么地方
工人文化宫驾校道路驾驶训练基地地址在哪,我
男人出轨对家运有问题吗
英雄联盟的智能+自我 释放技能1234是什么意思
正能量副食店地址在什么地方,想过去办事
单反手柄买原厂的好还是副厂的好?如何鉴别真
有那些开会的好地方
宜家建材我想知道这个在什么地方
淡妆浓妆适合什么人
三体地球往事27无人忏悔中第一个孩子请教了什
推荐资讯
船舶首航仪式做完后可以不出海吗
铁锅鱼村怎么去啊,有知道地址的么
纸厂排怎么去啊,有知道地址的么
一个刚毕业的会计,是在国企好还是在私企好呢
韩国tayo巴士在韩国卖多少钱
庆云领结婚证为什么要100多元
伊利在新西兰建设生产基地的原因
高二不读了,会考也考了,还要挂学籍才能拿毕业
德莉玛淋浴房在什么地方啊,我要过去处理事情
平行蒙太奇和交叉蒙太奇
上海市航空服务学校好吗
双树村卫生室地址在哪,我要去那里办事
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?