如何取得等值线图的等级参数 surfer
1个回答
展开全部
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。
运行这个应用程序,它启动了 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。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询