"""! @package lmgr.pyshell @brief wxGUI Interactive Python Shell for Layer Manager Classes: - pyshell::PyShellWindow @todo Run pyshell and evaluate code in a separate instance of python & design the widget communicate back and forth with it (C) 2011 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. @author Martin Landa """ import sys import wx from wx.py.shell import Shell as PyShell from wx.py.version import VERSION import grass.script as grass import grass.pygrass as pygrass import grass.pygrass.modules as pgmodules class PyShellWindow(wx.Panel): """!Python Shell Window""" def __init__(self, parent, id = wx.ID_ANY, **kwargs): self.parent = parent # GMFrame wx.Panel.__init__(self, parent = parent, id = id, **kwargs) self.intro = _("Welcome to wxGUI Interactive Python Shell %s") % VERSION + "\n\n" + \ _("Type %s for more GRASS scripting related information.") % "\"help(grass)\"" + "\n" + \ _("Type %s to add raster or vector to the layer tree.") % "\"AddLayer()\"" + "\n\n" self.shell = PyShell(parent = self, id = wx.ID_ANY, introText = self.intro, locals={'grass': grass, 'pygrass': pygrass, 'r': pgmodules.shortcuts.raster, 'r3': pgmodules.shortcuts.raster3D, 'v': pgmodules.shortcuts.vector, 'i': pgmodules.shortcuts.imagery, 'db': pgmodules.shortcuts.database, 'g': pgmodules.shortcuts.general, 'ps': pgmodules.shortcuts.postscript, 't': pgmodules.shortcuts.temporal, 'giface': self.parent._giface, # for experimetal reasons only 'AddLayer': self.AddLayer}) sys.displayhook = self._displayhook self.btnClear = wx.Button(self, wx.ID_CLEAR) self.btnClear.Bind(wx.EVT_BUTTON, self.OnClear) self.btnClear.SetToolTipString(_("Delete all text from the shell")) self._layout() def _displayhook(self, value): print value # do not modify __builtin__._ def _layout(self): sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(item = self.shell, proportion = 1, flag = wx.EXPAND) btnSizer = wx.BoxSizer(wx.HORIZONTAL) btnSizer.Add(item = self.btnClear, proportion = 0, flag = wx.EXPAND | wx.RIGHT, border = 5) sizer.Add(item = btnSizer, proportion = 0, flag = wx.ALIGN_RIGHT | wx.ALL, border = 5) sizer.Fit(self) sizer.SetSizeHints(self) self.SetSizer(sizer) self.Fit() self.SetAutoLayout(True) self.Layout() def AddLayer(self, name, ltype = 'auto'): """!Add selected map to the layer tree @param name name of raster/vector map to be added @param type map type ('raster', 'vector', 'auto' for autodetection) """ fname = None if ltype == 'raster' or ltype != 'vector': # check for raster fname = grass.find_file(name, element = 'cell')['fullname'] if fname: ltype = 'raster' lcmd = 'd.rast' if not fname and (ltype == 'vector' or ltype != 'raster'): # if not found check for vector fname = grass.find_file(name, element = 'vector')['fullname'] if fname: ltype = 'vector' lcmd = 'd.vect' if not fname: return _("Raster or vector map <%s> not found") % (name) self.parent.GetLayerTree().AddLayer(ltype = ltype, lname = fname, lchecked = True, lcmd = [lcmd, 'map=%s' % fname]) if ltype == 'raster': return _('Raster map <%s> added') % fname return _('Vector map <%s> added') % fname def OnClear(self, event): """!Delete all text from the shell """ self.shell.clear() self.shell.showIntro(self.intro) self.shell.prompt()