[GRASS-SVN] r70368 - grass-addons/grass7/vector/v.krige
svn_grass at osgeo.org
svn_grass at osgeo.org
Sat Jan 14 03:26:49 PST 2017
Author: marisn
Date: 2017-01-14 03:26:49 -0800 (Sat, 14 Jan 2017)
New Revision: 70368
Added:
grass-addons/grass7/vector/v.krige/vkrige.py
Log:
v.krige now is an addon thus its GUI also should be in addons (#3256)
Copied: grass-addons/grass7/vector/v.krige/vkrige.py (from rev 70367, grass/trunk/gui/wxpython/modules/vkrige.py)
===================================================================
--- grass-addons/grass7/vector/v.krige/vkrige.py (rev 0)
+++ grass-addons/grass7/vector/v.krige/vkrige.py 2017-01-14 11:26:49 UTC (rev 70368)
@@ -0,0 +1,759 @@
+"""
+MODULE: vkrige
+
+AUTHOR(S): Anne Ghisla <a.ghisla AT gmail.com>
+
+PURPOSE: Dedicated GUI for v.krige script.
+
+DEPENDS: R 2.x, packages gstat, maptools and spgrass6, optional: automap
+
+COPYRIGHT: (C) 2009 by the GRASS Development Team
+
+This program is free software under the GNU General Public
+License (>=v2). Read the file COPYING that comes with GRASS
+for details.
+"""
+
+#@TODO move here imports related to wxGUI
+
+# generic imports
+import os
+import sys
+from tempfile import gettempdir
+import time
+import thread
+from core.utils import _
+
+# dependencies to be checked once, as they are quite
+# time-consuming. cfr. grass.parser.
+
+try:
+ import grass.script as grass
+except ImportError:
+ sys.exit(_("No GRASS-python library found."))
+
+from core import globalvar
+from gui_core import gselect
+from core import gconsole
+from gui_core import goutput
+from core.settings import UserSettings
+from gui_core.widgets import GNotebook
+from core.giface import Notification
+from gui_core.wrap import SpinCtrl
+#import help
+
+import wx
+# import wx.lib.plot as plot # for plotting the variogram.
+import rpy2.robjects as robjects
+import rpy2.rinterface as rinterface
+
+# global variables
+# instead of sys.maxint, not working with SpinCtrl on 64bit [reported by
+# Bob Moskovitz]
+maxint = 1e6
+
+#@TODO move away functions not regarding the GUI
+
+
+class KrigingPanel(wx.Panel):
+ """Main panel. Contains all widgets except Menus and Statusbar. """
+
+ def __init__(self, parent, Rinstance, controller, *args, **kwargs):
+ wx.Panel.__init__(self, parent, *args, **kwargs)
+
+ self.parent = parent
+ self.border = 4
+
+ # 1. Input data
+ InputBoxSizer = wx.StaticBoxSizer(
+ wx.StaticBox(
+ self,
+ id=wx.ID_ANY,
+ label=_("Input Data")),
+ orient=wx.HORIZONTAL)
+
+ flexSizer = wx.FlexGridSizer(cols=3, hgap=5, vgap=5)
+ flexSizer.AddGrowableCol(1)
+
+ flexSizer.Add(
+ wx.StaticText(
+ self,
+ id=wx.ID_ANY,
+ label=_("Point dataset:")),
+ flag=wx.ALIGN_CENTER_VERTICAL)
+ self.InputDataMap = gselect.VectorSelect(parent=self,
+ ftype='points',
+ updateOnPopup=False)
+ self.InputDataMap.SetFocus()
+ flexSizer.Add(self.InputDataMap, flag=wx.ALIGN_CENTER_VERTICAL)
+
+ RefreshButton = wx.Button(self, id=wx.ID_REFRESH)
+ RefreshButton.Bind(wx.EVT_BUTTON, self.OnButtonRefresh)
+ flexSizer.Add(RefreshButton, flag=wx.ALIGN_CENTER_VERTICAL)
+
+ flexSizer.Add(
+ wx.StaticText(
+ self,
+ id=wx.ID_ANY,
+ label=_("Numeric column:")),
+ flag=wx.ALIGN_CENTER_VERTICAL)
+ self.InputDataColumn = gselect.ColumnSelect(self, id=wx.ID_ANY)
+ flexSizer.Add(self.InputDataColumn)
+
+ self.InputDataMap.GetChildren()[0].Bind(
+ wx.EVT_TEXT, self.OnInputMapChanged)
+ self.InputDataColumn.GetChildren()[0].Bind(
+ wx.EVT_TEXT, self.OnInputColumnChanged)
+
+ InputBoxSizer.Add(flexSizer)
+
+ # 2. Kriging. In book pages one for each R package. Includes variogram
+ # fit.
+ KrigingSizer = wx.StaticBoxSizer(
+ wx.StaticBox(
+ self,
+ id=wx.ID_ANY,
+ label=_("Kriging")),
+ wx.HORIZONTAL)
+
+ self.RPackagesBook = GNotebook(
+ parent=self, style=globalvar.FNPageDStyle)
+
+ # , "geoR"]: #@TODO: enable it if/when it'll be implemented.
+ for Rpackage in ["gstat"]:
+ self.CreatePage(
+ package=Rpackage,
+ Rinstance=Rinstance,
+ controller=controller)
+
+ # Command output. From menuform module, cmdPanel class
+ self._gconsole = gconsole.GConsole(guiparent=self)
+ self.goutput = goutput.GConsoleWindow(
+ parent=self, gconsole=self._gconsole, margin=False)
+ self.goutputId = self.RPackagesBook.GetPageCount()
+ self.outpage = self.RPackagesBook.AddPage(
+ page=self.goutput, text=_("Command output"), name='output')
+ self._gconsole.Bind(
+ gconsole.EVT_CMD_RUN,
+ lambda event: self._switchPageHandler(
+ event=event,
+ notification=Notification.MAKE_VISIBLE))
+ self._gconsole.Bind(
+ gconsole.EVT_CMD_DONE,
+ lambda event: self._switchPageHandler(
+ event=event,
+ notification=Notification.RAISE_WINDOW))
+ self.RPackagesBook.SetSelection(0)
+ KrigingSizer.Add(self.RPackagesBook, proportion=1, flag=wx.EXPAND)
+
+ # 3. Output Parameters.
+ OutputSizer = wx.StaticBoxSizer(
+ wx.StaticBox(
+ self,
+ id=wx.ID_ANY,
+ label=_("Output")),
+ wx.HORIZONTAL)
+
+ OutputParameters = wx.GridBagSizer(hgap=5, vgap=5)
+ OutputParameters.Add(
+ wx.StaticText(
+ self, id=wx.ID_ANY,
+ label=_("Name for the output raster map:")),
+ flag=wx.ALIGN_CENTER_VERTICAL, pos=(0, 0))
+ self.OutputMapName = gselect.Select(parent=self, id=wx.ID_ANY,
+ type='raster',
+ mapsets=[grass.gisenv()['MAPSET']])
+ OutputParameters.Add(self.OutputMapName, flag=wx.EXPAND | wx.ALL,
+ pos=(0, 1))
+ self.VarianceRasterCheckbox = wx.CheckBox(
+ self, id=wx.ID_ANY, label=_("Export variance map as well: "))
+ self.VarianceRasterCheckbox.SetValue(state=True)
+ OutputParameters.Add(self.VarianceRasterCheckbox,
+ flag=wx.ALIGN_CENTER_VERTICAL,
+ pos=(1, 0))
+ self.OutputVarianceMapName = gselect.Select(
+ parent=self, id=wx.ID_ANY, type='raster',
+ mapsets=[grass.gisenv()['MAPSET']])
+ self.VarianceRasterCheckbox.Bind(
+ wx.EVT_CHECKBOX, self.OnVarianceCBChecked)
+ OutputParameters.Add(
+ self.OutputVarianceMapName,
+ flag=wx.EXPAND | wx.ALL,
+ pos=(
+ 1,
+ 1))
+
+ self.OverwriteCheckBox = wx.CheckBox(self, id=wx.ID_ANY, label=_(
+ "Allow output files to overwrite existing files"))
+ self.OverwriteCheckBox.SetValue(
+ UserSettings.Get(
+ group='cmd',
+ key='overwrite',
+ subkey='enabled'))
+ OutputParameters.Add(self.OverwriteCheckBox,
+ pos=(2, 0), span=(1, 2))
+
+ OutputParameters.AddGrowableCol(1)
+ OutputSizer.Add(
+ OutputParameters,
+ proportion=0,
+ flag=wx.EXPAND | wx.ALL,
+ border=self.border)
+
+ # 4. Run Button and Quit Button
+ ButtonSizer = wx.BoxSizer(wx.HORIZONTAL)
+ HelpButton = wx.Button(self, id=wx.ID_HELP)
+ HelpButton.Bind(wx.EVT_BUTTON, self.OnHelpButton)
+ QuitButton = wx.Button(self, id=wx.ID_EXIT)
+ QuitButton.Bind(wx.EVT_BUTTON, self.OnCloseWindow)
+ # no stock ID for Run button..
+ self.RunButton = wx.Button(self, id=wx.ID_ANY, label=_("&Run"))
+ self.RunButton.Bind(wx.EVT_BUTTON, self.OnRunButton)
+ # disable it on loading the interface, as input map is not set
+ self.RunButton.Enable(False)
+ ButtonSizer.Add(
+ HelpButton,
+ proportion=0,
+ flag=wx.ALIGN_LEFT | wx.ALL,
+ border=self.border)
+ ButtonSizer.Add(
+ QuitButton,
+ proportion=0,
+ flag=wx.ALIGN_RIGHT | wx.ALL,
+ border=self.border)
+ ButtonSizer.Add(
+ self.RunButton,
+ proportion=0,
+ flag=wx.ALIGN_RIGHT | wx.ALL,
+ border=self.border)
+
+ # Main Sizer. Add each child sizer as soon as it is ready.
+ Sizer = wx.BoxSizer(wx.VERTICAL)
+ Sizer.Add(
+ InputBoxSizer,
+ proportion=0,
+ flag=wx.EXPAND | wx.ALL,
+ border=self.border)
+ Sizer.Add(
+ KrigingSizer,
+ proportion=1,
+ flag=wx.EXPAND | wx.ALL,
+ border=self.border)
+ Sizer.Add(
+ OutputSizer,
+ proportion=0,
+ flag=wx.EXPAND | wx.ALL,
+ border=self.border)
+ Sizer.Add(
+ ButtonSizer,
+ proportion=0,
+ flag=wx.ALIGN_RIGHT | wx.ALL,
+ border=self.border)
+ self.SetSizerAndFit(Sizer)
+
+ # last action of __init__: update imput data list.
+ # it's performed in the few seconds gap while user examines interface before clicking anything.
+ #@TODO: implement a splashcreen IF the maps cause a noticeable lag [markus' suggestion]
+ self.InputDataMap.GetElementList()
+
+ def CreatePage(self, package, Rinstance, controller):
+ """Creates the three notebook pages, one for each R package """
+ for package in [
+ "gstat"]: # @TODO add here other packages when they will be implemented
+ classobj = eval("RBook" + package + "Panel")
+ setattr(
+ self,
+ "RBook" +
+ package +
+ "Panel",
+ (classobj(
+ self,
+ id=wx.ID_ANY,
+ Rinstance=Rinstance,
+ controller=controller)))
+ self.RPackagesBook.AddPage(
+ page=getattr(
+ self,
+ "RBook" +
+ package +
+ "Panel"),
+ text=package)
+
+ def OnButtonRefresh(self, event):
+ """Forces refresh of list of available layers. """
+ self.InputDataMap.GetElementList()
+
+ def OnCloseWindow(self, event):
+ """Cancel button pressed"""
+ self.parent.Close()
+ event.Skip()
+
+ def OnHelpButton(self, event):
+ grass.run_command('g.manual', entry='v.krige')
+ event.Skip()
+
+ def OnInputMapChanged(self, event):
+ """Refreshes list of columns."""
+ MapName = event.GetString()
+ self.InputDataColumn.InsertColumns(
+ vector=MapName, layer=1, excludeKey=False,
+ type=['integer', 'double precision'])
+
+ def OnInputColumnChanged(self, event):
+ """Fills output map name TextCtrl """
+ MapName = self.InputDataMap.GetValue()
+ enable = bool(self.InputDataColumn.GetValue())
+ self.RunButton.Enable(enable)
+ self.RBookgstatPanel.PlotButton.Enable(enable)
+
+ if enable:
+ self.OutputMapName.SetValue(MapName.split("@")[0] + "_kriging")
+ self.OutputVarianceMapName.SetValue(
+ MapName.split("@")[0] + "_kriging.var")
+ else:
+ self.OutputMapName.SetValue('')
+ self.OutputVarianceMapName.SetValue('')
+
+ def OnRunButton(self, event):
+ """Execute R analysis. """
+ #@FIXME: send data to main method instead of running it here.
+
+ #-1: get the selected notebook page. The user shall know that [s]he can modify settings in all
+ # pages, but only the selected one will be executed when Run is
+ # pressed.
+ SelectedPanel = self.RPackagesBook.GetCurrentPage()
+
+ if self.RPackagesBook.GetPageText(
+ self.RPackagesBook.GetSelection()) == 'Command output':
+ self._gconsole.WriteError(
+ "No parameters for running. Please select \"gstat\" tab, check parameters and re-run.")
+ return False # no break invoked by above function
+
+ # mount command string as it would have been written on CLI
+ command = [
+ "v.krige",
+ "input=" +
+ self.InputDataMap.GetValue(),
+ "column=" +
+ self.InputDataColumn.GetValue(),
+ "output=" +
+ self.OutputMapName.GetValue(),
+ "package=" +
+ '%s' %
+ self.RPackagesBook.GetPageText(
+ self.RPackagesBook.GetSelection())]
+
+ if not hasattr(
+ SelectedPanel, 'VariogramCheckBox') or not SelectedPanel.VariogramCheckBox.IsChecked():
+ command.append(
+ "model=" + '%s' %
+ SelectedPanel.ModelChoicebox.GetStringSelection().split(" ")[0])
+
+ for i in ['Sill', 'Nugget', 'Range', 'Kappa']:
+ if getattr(SelectedPanel, i + "ChextBox").IsChecked():
+ command.append(
+ i.lower() +
+ "=" +
+ '%s' %
+ getattr(
+ SelectedPanel,
+ i +
+ 'Ctrl').GetValue())
+
+ if SelectedPanel.KrigingRadioBox.GetStringSelection() == "Block kriging":
+ command.append(
+ "block=" + '%s' %
+ SelectedPanel.BlockSpinBox.GetValue())
+ if self.OverwriteCheckBox.IsChecked():
+ command.append("--overwrite")
+ if self.VarianceRasterCheckbox.IsChecked():
+ command.append(
+ "output_var=" +
+ self.OutputVarianceMapName.GetValue())
+
+ # give it to the output console
+ #@FIXME: it runs the command as a NEW instance. Reimports data, recalculates variogram fit..
+ # otherwise I can use Controller() and mimic RunCmd behaviour.
+ self._gconsole.RunCmd(command)
+
+ def OnVarianceCBChecked(self, event):
+ self.OutputVarianceMapName.Enable(event.IsChecked())
+
+ def _switchPageHandler(self, event, notification):
+ self._switchPage(notification=notification)
+ event.Skip()
+
+ def _switchPage(self, notification):
+ """Manages @c 'output' notebook page according to event notification."""
+ if notification == Notification.HIGHLIGHT:
+ self.RPackagesBook.HighlightPageByName('output')
+ if notification == Notification.MAKE_VISIBLE:
+ self.RPackagesBook.SetSelectionByName('output')
+ if notification == Notification.RAISE_WINDOW:
+ self.RPackagesBook.SetSelectionByName('output')
+ self.SetFocus()
+ self.Raise()
+
+
+class KrigingModule(wx.Frame):
+ """Kriging module for GRASS GIS. Depends on R and its packages gstat and geoR. """
+
+ def __init__(self, parent, Rinstance, controller, *args, **kwargs):
+ wx.Frame.__init__(self, parent, *args, **kwargs)
+ # setting properties and all widgettery
+ self.SetTitle(_("Kriging Module"))
+ self.SetIcon(
+ wx.Icon(
+ os.path.join(
+ globalvar.ICONDIR,
+ 'grass_dialog.ico'),
+ wx.BITMAP_TYPE_ICO))
+ self.log = Log(self)
+ self.CreateStatusBar()
+ self.log.message(_("Ready."))
+
+ self.Panel = KrigingPanel(self, Rinstance, controller)
+ self.SetMinSize(self.GetBestSize())
+ self.SetSize(self.GetBestSize())
+
+
+class Log:
+ """The log output is redirected to the status bar of the containing frame. """
+
+ def __init__(self, parent):
+ self.parent = parent
+
+ def message(self, text_string):
+ """Updates status bar """
+ self.parent.SetStatusText(text_string.strip())
+
+
+class RBookPanel(wx.Panel):
+ """Generic notebook page with shared widgets and empty kriging functions. """
+
+ def __init__(self, parent, *args, **kwargs):
+ wx.Panel.__init__(self, parent, *args, **kwargs)
+
+ self.parent = parent
+
+ self.VariogramSizer = wx.StaticBoxSizer(
+ wx.StaticBox(
+ self,
+ id=wx.ID_ANY,
+ label=_("Variogram fitting")),
+ wx.HORIZONTAL)
+ self.LeftSizer = wx.BoxSizer(wx.VERTICAL)
+ self.RightSizer = wx.BoxSizer(wx.VERTICAL)
+ self.ParametersSizer = wx.GridBagSizer(vgap=5, hgap=5)
+
+ self.VariogramSizer.Add(
+ self.LeftSizer,
+ proportion=0,
+ flag=wx.EXPAND | wx.ALL,
+ border=parent.border)
+ self.VariogramSizer.Add(
+ self.RightSizer,
+ proportion=0,
+ flag=wx.EXPAND | wx.ALL,
+ border=parent.border)
+
+ # left side of Variogram fitting. The checkboxes and spinctrls.
+ # no stock ID for Run button..
+ self.PlotButton = wx.Button(
+ self, id=wx.ID_ANY, label=_("Plot/refresh variogram"))
+ self.PlotButton.Bind(wx.EVT_BUTTON, self.OnPlotButton)
+ # grey it out until a suitable layer is available
+ self.PlotButton.Enable(False)
+ self.LeftSizer.Add(
+ self.PlotButton,
+ proportion=0,
+ flag=wx.ALL,
+ border=parent.border)
+ self.LeftSizer.Add(
+ self.ParametersSizer,
+ proportion=0,
+ flag=wx.EXPAND | wx.ALL,
+ border=parent.border)
+
+ self.ParametersList = ["Sill", "Nugget", "Range", "Kappa"]
+ MinValues = [0, 0, 1, 0.1]
+ for n in self.ParametersList:
+ setattr(
+ self,
+ n + "ChextBox",
+ wx.CheckBox(
+ self,
+ id=self.ParametersList.index(n),
+ label=_(
+ n + ":")))
+ # Kappa must be float
+ if n == "Kappa":
+ setattr(
+ self,
+ n + "Ctrl",
+ (wx.SpinCtrlDouble(
+ self,
+ id=wx.ID_ANY,
+ min=MinValues[
+ self.ParametersList.index(n)],
+ max=maxint,
+ inc=0.1,
+ initial=0.5)))
+ else:
+ setattr(
+ self,
+ n + "Ctrl",
+ (SpinCtrl(
+ self,
+ id=wx.ID_ANY,
+ min=MinValues[
+ self.ParametersList.index(n)],
+ max=maxint)))
+ getattr(self, n + "ChextBox").Bind(wx.EVT_CHECKBOX,
+ self.UseValue,
+ id=self.ParametersList.index(n))
+ setattr(self, n + "Sizer", (wx.BoxSizer(wx.HORIZONTAL)))
+ self.ParametersSizer.Add(getattr(self, n + "ChextBox"),
+ flag=wx.ALIGN_CENTER_VERTICAL,
+ pos=(self.ParametersList.index(n), 0))
+ self.ParametersSizer.Add(getattr(self, n + "Ctrl"),
+ flag=wx.EXPAND | wx.ALIGN_CENTER_VERTICAL,
+ pos=(self.ParametersList.index(n), 1))
+
+ # right side of the Variogram fitting. The plot area.
+ #Plot = wx.StaticText(self, id= wx.ID_ANY, label = "Check Plot Variogram to interactively fit model.")
+ #PlotPanel = wx.Panel(self)
+ #self.PlotArea = plot.PlotCanvas(PlotPanel)
+ #self.PlotArea.SetInitialSize(size = (250,250))
+ #self.RightSizer.Add(PlotPanel, proportion=0, flag= wx.EXPAND|wx.ALL, border=parent.border)
+
+ self.KrigingSizer = wx.StaticBoxSizer(
+ wx.StaticBox(
+ self,
+ id=wx.ID_ANY,
+ label=_("Kriging techniques")),
+ wx.VERTICAL)
+
+ # , "Universal kriging"] #@FIXME: i18n on the list?
+ KrigingList = ["Ordinary kriging", "Block kriging"]
+ self.KrigingRadioBox = wx.RadioBox(self,
+ id=wx.ID_ANY,
+ choices=KrigingList,
+ majorDimension=1,
+ style=wx.RA_SPECIFY_COLS)
+ self.KrigingRadioBox.Bind(wx.EVT_RADIOBOX, self.HideBlockOptions)
+ self.KrigingSizer.Add(
+ self.KrigingRadioBox,
+ proportion=0,
+ flag=wx.EXPAND | wx.ALL,
+ border=parent.border)
+
+ # block kriging parameters. Size.
+ BlockSizer = wx.BoxSizer(wx.HORIZONTAL)
+ BlockLabel = wx.StaticText(self, id=wx.ID_ANY, label=_("Block size:"))
+ self.BlockSpinBox = SpinCtrl(self, id=wx.ID_ANY, min=1, max=maxint)
+ # default choice is Ordinary kriging so block param is disabled
+ self.BlockSpinBox.Enable(False)
+ BlockSizer.Add(
+ BlockLabel,
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL,
+ border=parent.border)
+ BlockSizer.Add(
+ self.BlockSpinBox,
+ flag=wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
+ border=parent.border)
+ self.KrigingSizer.Add(
+ BlockSizer,
+ flag=wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
+ border=parent.border)
+
+ self.Sizer = wx.BoxSizer(wx.VERTICAL)
+ self.Sizer.Add(
+ self.VariogramSizer,
+ proportion=0,
+ flag=wx.EXPAND | wx.ALL,
+ border=parent.border)
+ self.Sizer.Add(
+ self.KrigingSizer,
+ proportion=0,
+ flag=wx.EXPAND | wx.ALL,
+ border=parent.border)
+
+ def HideBlockOptions(self, event):
+ self.BlockSpinBox.Enable(event.GetInt() == 1)
+
+ def OnPlotButton(self, event):
+ """Plots variogram with current options. """
+ pass
+
+ def UseValue(self, event):
+ """Enables/Disables the SpinCtrl in respect of the checkbox. """
+ n = self.ParametersList[event.GetId()]
+ getattr(self, n + "Ctrl").Enable(event.IsChecked())
+
+
+class RBookgstatPanel(RBookPanel):
+ """Subclass of RBookPanel, with specific gstat options and kriging functions. """
+
+ def __init__(self, parent, Rinstance, controller, *args, **kwargs):
+ RBookPanel.__init__(self, parent, *args, **kwargs)
+
+ # assigns Rinstance, that comes from the GUI call of v.krige.py.
+ robjects = Rinstance
+ self.controller = controller
+
+ if robjects.r.require('automap')[0]:
+ self.VariogramCheckBox = wx.CheckBox(
+ self, id=wx.ID_ANY, label=_("Auto-fit variogram"))
+ self.LeftSizer.Insert(
+ 0,
+ self.VariogramCheckBox,
+ proportion=0,
+ flag=wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
+ border=4)
+ self.SetSizerAndFit(self.Sizer)
+ self.VariogramCheckBox.Bind(wx.EVT_CHECKBOX, self.HideOptions)
+ self.VariogramCheckBox.SetValue(state=True) # check it by default
+
+ # Get list of available models. Show long name but use short one
+ ModelFactor = robjects.r.vgm()
+ ModelList = robjects.r.levels(ModelFactor[1])
+ self.ModelListShort = robjects.r.levels(ModelFactor[0])
+ #@FIXME: no other way to let the Python pick it up..
+ # and this is te wrong place where to load this list. should be at the
+ # very beginning.
+ self.ModelChoicebox = wx.Choice(self, id=wx.ID_ANY, choices=ModelList)
+
+ # disable model parameters' widgets by default
+ for n in ["Sill", "Nugget", "Range", "Kappa"]:
+ getattr(self, n + "Ctrl").Enable(False)
+ self.ModelChoicebox.Enable(False)
+
+ VariogramSubSizer = wx.BoxSizer(wx.HORIZONTAL)
+ VariogramSubSizer.Add(wx.StaticText(self,
+ id=wx.ID_ANY,
+ label=_("Model: ")),
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL,
+ border=4)
+ VariogramSubSizer.Add(self.ModelChoicebox,
+ flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL,
+ border=4)
+
+ self.LeftSizer.Insert(2, item=VariogramSubSizer)
+
+ self.SetSizerAndFit(self.Sizer)
+
+ def HideOptions(self, event):
+ self.ModelChoicebox.Enable(not event.IsChecked())
+ for n in ["Sill", "Nugget", "Range", "Kappa"]:
+ if not event.IsChecked():
+ getattr(self, n + "Ctrl").Enable(True)
+ getattr(self, n + "ChextBox").SetValue(True)
+ # grey it out keeping it checked.. improvable
+ getattr(self, n + "ChextBox").Enable(False)
+ else:
+ getattr(self, n + "Ctrl").Enable(False)
+ getattr(self, n + "ChextBox").SetValue(False)
+ getattr(self, n + "ChextBox").Enable(True)
+ #@FIXME: was for n in self.ParametersSizer.GetChildren(): n.Enable(False) but doesn't work
+
+ def OnPlotButton(self, event):
+ """Plots variogram with current options. """
+ # BIG WARNING: smell of code duplication. Fix this asap. emminchia!
+ # controller = Controller() # sed, if needed,
+ #controller = self.controller
+ map = self.parent.InputDataMap.GetValue()
+ column = self.parent.InputDataColumn.GetValue()
+
+ # import data or pick them up
+ if self.controller.InputData is None:
+ self.controller.InputData = self.controller.ImportMap(
+ map=map, column=column)
+ # fit the variogram or pick it up
+ #~ Formula = self.controller.ComposeFormula(column = column,
+ #~ isblock = self.KrigingRadioBox.GetStringSelection() == "Block kriging")
+ if hasattr(
+ self, 'VariogramCheckBox') and self.VariogramCheckBox.IsChecked():
+ self.model = ''
+ for each in ("Sill", "Nugget", "Range", "Kappa"):
+ if getattr(self, each + 'ChextBox').IsChecked():
+ setattr(
+ self, each.lower(), getattr(
+ self, each + "Ctrl").GetValue())
+ else:
+ setattr(self, each.lower(), robjects.r('''NA'''))
+
+ else:
+ self.model = self.ModelListShort[
+ self.ModelChoicebox.GetSelection()]
+ for each in ("Sill", "Nugget", "Range", "Kappa"):
+ # @FIXME will be removed when chextboxes will be frozen
+ if getattr(self, each + 'ChextBox').IsChecked():
+ setattr(
+ self, each.lower(), getattr(
+ self, each + "Ctrl").GetValue())
+
+ isblock = self.KrigingRadioBox.GetStringSelection() == "Block kriging"
+ if isblock is not '':
+ self.predictor = 'x+y'
+ else:
+ self.predictor = '1'
+
+ self.controller.Variogram = self.controller.FitVariogram(
+ robjects.Formula(str(column) + "~" + self.predictor),
+ self.controller.InputData, model=self.model, sill=self.sill,
+ nugget=self.nugget, range=self.range, kappa=self.kappa)
+
+ ''' Fill parameters with autofitted values '''
+ if hasattr(
+ self, 'VariogramCheckBox') and self.VariogramCheckBox.IsChecked():
+ for i in range(len(self.ModelListShort)):
+ if self.ModelListShort[
+ i] == self.controller.Variogram['model']:
+ self.ModelChoicebox.SetSelection(i)
+ break
+ if not getattr(self, 'SillChextBox').IsChecked():
+ self.sill = self.controller.Variogram['variogrammodel'][1][1]
+ self.SillCtrl.SetValue(self.sill)
+ if not getattr(self, 'NuggetChextBox').IsChecked():
+ self.nugget = self.controller.Variogram['variogrammodel'][1][0]
+ self.NuggetCtrl.SetValue(self.nugget)
+ if not getattr(self, 'RangeChextBox').IsChecked():
+ self.range = self.controller.Variogram['variogrammodel'][2][1]
+ self.RangeCtrl.SetValue(self.range)
+ if not getattr(self, 'KappaChextBox').IsChecked():
+ self.kappa = self.controller.Variogram['variogrammodel'][3][1]
+ self.KappaCtrl.SetValue(self.kappa)
+
+ # use R plot function, in a separate window.
+ thread.start_new_thread(self.plot, ())
+
+ def plot(self):
+ # robjects.r.X11()
+ # robjects.r.png("variogram.png")
+ textplot = robjects.r.plot(self.controller.Variogram['datavariogram'],
+ self.controller.Variogram['variogrammodel'])
+ print textplot
+ self.refresh()
+ # robjects.r['dev.off']()
+
+ def refresh(self):
+ while True:
+ rinterface.process_revents()
+ time.sleep(0.2)
+
+
+class RBookgeoRPanel(RBookPanel):
+ """Subclass of RBookPanel, with specific geoR options and kriging functions. """
+
+ def __init__(self, parent, *args, **kwargs):
+ RBookPanel.__init__(self, parent, *args, **kwargs)
+ #@TODO: change these two lines as soon as geoR f(x)s are integrated.
+ for n in self.GetChildren():
+ n.Hide()
+ self.Sizer.Add(
+ wx.StaticText(
+ self,
+ id=wx.ID_ANY,
+ label=_("Work in progress! No functionality provided.")))
+ self.SetSizerAndFit(self.Sizer)
More information about the grass-commit
mailing list