[GRASS-SVN] r30194 - grass/trunk/gui/wxpython/gui_modules

svn_grass at osgeo.org svn_grass at osgeo.org
Sat Feb 16 18:16:27 EST 2008


Author: cmbarton
Date: 2008-02-16 18:16:27 -0500 (Sat, 16 Feb 2008)
New Revision: 30194

Added:
   grass/trunk/gui/wxpython/gui_modules/mcalc_builder.py
Log:
New mapcalc builder

Added: grass/trunk/gui/wxpython/gui_modules/mcalc_builder.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/mcalc_builder.py	                        (rev 0)
+++ grass/trunk/gui/wxpython/gui_modules/mcalc_builder.py	2008-02-16 23:16:27 UTC (rev 30194)
@@ -0,0 +1,400 @@
+"""
+MODULE:    mcalc_builder.py
+
+CLASSES:
+    * MapCalcFrame
+
+PURPOSE:   GRASS builds r.mapcalc statements
+
+           Usage:
+           mcalc_builder
+
+AUTHOR(S): GRASS Development Team
+           Original author: Michael Barton, Arizona State University
+
+COPYRIGHT: (C) 2008 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.
+"""
+
+import wx
+import os,sys
+import time
+
+import grassenv
+import gcmd
+import gselect
+import subprocess
+
+imagePath = os.path.join( os.getenv("GISBASE"), "etc", "wxpython")
+sys.path.append(imagePath)
+import images
+imagepath = images.__path__[0]
+sys.path.append(imagepath)
+
+class MapCalcFrame(wx.Frame):
+    """Mapcalc Frame class"""
+    def __init__(self, parent, id, title, pos=wx.DefaultPosition,
+                 size=wx.DefaultSize, style=wx.TAB_TRAVERSAL|wx.DEFAULT_FRAME_STYLE):
+
+        wx.Frame.__init__(self, parent, id, title, pos=pos, size=size, style=style)
+        
+        self.Centre(wx.BOTH)
+        self.SetTitle(_("GRASS Mapcalc Statement Builder") )
+        #self.SetIcon(wx.Icon(os.path.join(imagepath, 
+        #                                  'grass_sql.png'),
+        #                     wx.BITMAP_TYPE_ANY))
+
+        #
+        # variables
+        #
+        self.parent = parent
+        self.heading = 'mapcalc statement'
+        self.newmap = ''
+        self.funct_list = [
+                        'abs(x)',
+                        'acos(x)',
+                        'asin(x)',
+                        'atan(x)',
+                        'atan(x,y)',
+                        'cos(x)',
+                        'double(x)',
+                        'eval([x,y,...,]z)',
+                        'exp(x)',
+                        'exp(x,y)',
+                        'float(x)',
+                        'graph(x,x1,y1[x2,y2..])',
+                        'if(x)',
+                        'if(x,a)',
+                        'if(x,a,b)',
+                        'if(x,a,b,c)',
+                        'int(x)',
+                        'isnull(x)',
+                        'log(x)',
+                        'log(x,b)',
+                        'max(x,y[,z...])',
+                        'median(x,y[,z...])',
+                        'min(x,y[,z...])',
+                        'mode(x,y[,z...])',
+                        'not(x)',
+                        'pow(x,y)',
+                        'rand(a,b)',
+                        'round(x)',
+                        'sin(x)',
+                        'sqrt(x)',
+                        'tan(x)',
+                        'xor(x,y)',
+                        'row()',
+                        'col()',
+                        'x()',
+                        'y()',
+                        'ewres()',
+                        'nsres()',
+                        'null()'
+                        ]
+
+        # Init
+
+
+        #
+        # Buttons
+        #
+        self.btn_clear = wx.Button(self, -1, "Clear")
+        self.btn_help = wx.Button(self, -1, "Help")
+        self.btn_run = wx.Button(self, -1, "Run")
+        self.btn_close = wx.Button(self, -1, "Close")
+
+        self.btn_pow = wx.Button(self, -1, "^")
+        self.btn_pow.SetToolTipString('exponent')
+        self.btn_div = wx.Button(self, -1, "/")
+        self.btn_div.SetToolTipString('divide')
+        self.btn_add = wx.Button(self, -1, "+")
+        self.btn_add.SetToolTipString('add')
+        self.btn_minus = wx.Button(self, -1, "-")
+        self.btn_minus.SetToolTipString('subtract')
+        self.btn_mod = wx.Button(self, -1, "%")
+        self.btn_mod.SetToolTipString('modulus')
+        self.btn_mult = wx.Button(self, -1, "*")
+        self.btn_mult.SetToolTipString('multiply')
+
+        self.btn_paren = wx.Button(self, -1, "( )") 
+
+        self.btn_lshift = wx.Button(self, -1, "<<")
+        self.btn_lshift.SetToolTipString('left shift')
+        self.btn_rshift = wx.Button(self, -1, ">>")
+        self.btn_rshift.SetToolTipString('right shift')
+        self.btn_rshiftu = wx.Button(self, -1, ">>>")
+        self.btn_rshiftu.SetToolTipString('right shift (unsigned)')
+        self.btn_gt = wx.Button(self, -1, ">")
+        self.btn_gt.SetToolTipString('greater than')
+        self.btn_gteq = wx.Button(self, -1, ">=")
+        self.btn_gteq.SetToolTipString('greater than or equal to')
+        self.btn_lt = wx.Button(self, -1, "<")
+        self.btn_lt.SetToolTipString('less than or equal to')
+        self.btn_lteq = wx.Button(self, -1, "<=")
+        self.btn_lteq.SetToolTipString('less than')
+        self.btn_eq = wx.Button(self, -1, "==")
+        self.btn_eq.SetToolTipString('equal to')
+        self.btn_noteq = wx.Button(self, -1, "!=")
+        self.btn_noteq.SetToolTipString('not equal to')
+
+        self.btn_compl = wx.Button(self, -1, "~")
+        self.btn_compl.SetToolTipString("one's complement")
+        self.btn_not = wx.Button(self, -1, "!")
+        self.btn_not.SetToolTipString("NOT")
+        self.btn_andbit = wx.Button(self, -1, '&')
+        self.btn_andbit.SetToolTipString("bitwise AND")
+        self.btn_orbit = wx.Button(self, -1, "|")
+        self.btn_orbit.SetToolTipString("bitwise OR")
+        self.btn_and = wx.Button(self, -1, "&&&")
+        self.btn_and.SetToolTipString('logical AND')
+        self.btn_andnull = wx.Button(self, -1, "&&&&&")
+        self.btn_andnull.SetToolTipString('logical AND (ignores NULLs')
+        self.btn_or = wx.Button(self, -1, "||")
+        self.btn_or.SetToolTipString('logical OR')
+        self.btn_ornull = wx.Button(self, -1, "|||")
+        self.btn_ornull.SetToolTipString('logical OR (ignores NULLs')
+        self.btn_cond = wx.Button(self, -1, "?:") 
+        self.btn_cond.SetToolTipString('conditional')
+        
+        #
+        # Text labels
+        #
+        #self.label_headding = wx.StaticText(self, -1, '')
+
+        #
+        # Text areas
+        #
+        self.text_mcalc = wx.TextCtrl(self, -1, '', size=(-1,75),style=wx.TE_MULTILINE)
+        
+        #
+        # Map and function insertion text and ComboBoxes
+        self.newmaplabel = wx.StaticText(self, -1, 'Name of new map to create')
+        self.newmaptxt = wx.TextCtrl(self, wx.ID_ANY, size=(250,-1))
+        self.mapsellabel = wx.StaticText(self, -1, 'Insert existing map')
+        self.mapselect = gselect.Select(self, wx.ID_ANY, size=(250,-1),
+                                        type='cell', multiple=False)
+        self.functlabel = wx.StaticText(self, -1, 'Insert mapcalc function')
+        self.function = wx.ComboBox(self, wx.ID_ANY, "", (-1,-1), 
+                         (250, -1), self.funct_list, wx.CB_DROPDOWN
+                         | wx.CB_READONLY
+                         | wx.TE_PROCESS_ENTER
+                         #| wx.CB_SORT
+                         )
+        #
+        # Bindings
+        #
+        self.btn_compl.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_not.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_pow.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_div.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_add.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_minus.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_mod.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_mult.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_lshift.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_rshift.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_rshiftu.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_gt.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_gteq.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_lt.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_lteq.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_eq.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_noteq.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_andbit.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_orbit.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_and.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_andnull.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_or.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_ornull.Bind(wx.EVT_BUTTON, self.AddMark)        
+        self.btn_cond.Bind(wx.EVT_BUTTON, self.AddMark)
+        self.btn_paren.Bind(wx.EVT_BUTTON, self.AddMark)
+        
+        self.btn_close.Bind(wx.EVT_BUTTON, self.OnClose)
+        self.btn_clear.Bind(wx.EVT_BUTTON, self.OnClear)
+        self.btn_run.Bind(wx.EVT_BUTTON, self.OnMCalcRun)
+        self.btn_help.Bind(wx.EVT_BUTTON, self.OnHelp)
+        
+        self.newmaptxt.Bind(wx.EVT_TEXT, self.OnNewmap)
+        
+        #self.mapselect.Bind(wx.EVT_COMBOBOX, self.OnSelect)
+        self.mapselect.Bind(wx.EVT_TEXT, self.OnSelect)
+        #self.mapselect.Bind(wx.EVT_TEXT_ENTER, self.OnSelect)
+        self.function.Bind(wx.EVT_COMBOBOX, self.OnSelect)
+        #self.function.Bind(wx.EVT_TEXT, self.OnSelect)
+        self.function.Bind(wx.EVT_TEXT_ENTER, self.OnSelect)
+
+        self.__doLayout()
+
+    def __doLayout(self):
+        #mcalc_box = wx.StaticBox(self, -1, "%s" % self.heading)
+        #mcalc_boxsizer = wx.StaticBoxSizer(mcalc_box,wx.VERTICAL)
+        #mcalc_boxsizer.Add(self.text_mcalc, flag=wx.EXPAND)
+
+        pagesizer = wx.BoxSizer(wx.VERTICAL)
+        
+        controlsizer = wx.BoxSizer(wx.HORIZONTAL)
+        btnpanelsizer = wx.GridBagSizer(1,1)
+
+        buttonsizer1 = wx.GridBagSizer(5,1)
+        buttonsizer1.Add(self.btn_add, (0,0))
+        buttonsizer1.Add(self.btn_minus, (0,1))
+        buttonsizer1.Add(self.btn_mod, (5,0))
+        buttonsizer1.Add(self.btn_mult, (1,0))
+        buttonsizer1.Add(self.btn_div, (1,1))
+        buttonsizer1.Add(self.btn_pow, (5,1))
+        buttonsizer1.Add(self.btn_gt, (2,0))
+        buttonsizer1.Add(self.btn_gteq, (2,1))
+        buttonsizer1.Add(self.btn_eq, (4,0))
+        buttonsizer1.Add(self.btn_lt, (3,0))
+        buttonsizer1.Add(self.btn_lteq, (3,1))
+        buttonsizer1.Add(self.btn_noteq, (4,1))
+
+        buttonsizer2 = wx.GridBagSizer(5,1)
+        buttonsizer2.Add(self.btn_and, (0,0))
+        buttonsizer2.Add(self.btn_andbit, (1,0))
+        buttonsizer2.Add(self.btn_andnull, (2,0))
+        buttonsizer2.Add(self.btn_or, (0,1))
+        buttonsizer2.Add(self.btn_orbit, (1,1))
+        buttonsizer2.Add(self.btn_ornull, (2,1))
+        buttonsizer2.Add(self.btn_lshift, (3,0))
+        buttonsizer2.Add(self.btn_rshift, (3,1))
+        buttonsizer2.Add(self.btn_rshiftu, (4,0))
+        buttonsizer2.Add(self.btn_cond, (5,0))
+        buttonsizer2.Add(self.btn_compl, (5,1))
+        buttonsizer2.Add(self.btn_not, (4,1))
+
+        buttonsizer3 = wx.GridBagSizer(7, 1)
+        buttonsizer3.Add(self.newmaplabel, (0,0), (1,2), wx.ALIGN_CENTER)
+        buttonsizer3.Add(self.newmaptxt, (1,0), (1,2))
+        buttonsizer3.Add(self.mapsellabel, (2,0), (1,2), wx.ALIGN_CENTER)
+        buttonsizer3.Add(self.mapselect, (3,0), (1,2))
+        buttonsizer3.Add(self.functlabel, (4,0), (1,2), wx.ALIGN_CENTER)
+        buttonsizer3.Add(self.function, (5,0), (1,2))
+        buttonsizer3.Add(self.btn_clear, (6,0))
+        buttonsizer3.Add(self.btn_paren, (6,1))
+        
+        buttonsizer4 = wx.GridSizer(4, 3, 3, 3)
+        buttonsizer4.Add(self.btn_run,0,wx.RIGHT,5)
+        buttonsizer4.Add(self.btn_close,0,wx.RIGHT,5)
+        buttonsizer4.Add(self.btn_help,0,wx.RIGHT,5)
+        
+        label = wx.StaticText(self, -1, 'Mapcalc operators')
+
+        btnpanelsizer.Add(label, (0,0), (1,2), wx.ALIGN_CENTER)
+        btnpanelsizer.Add(buttonsizer1, (1,0), (1,1), wx.RIGHT|wx.TOP, 5)
+        btnpanelsizer.Add(buttonsizer2, (1,1), (1,1), wx.LEFT|wx.TOP, 5)
+
+        controlsizer.Add(btnpanelsizer, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.RIGHT, border=20)
+        controlsizer.Add(buttonsizer3, proportion=0)
+        
+        pagesizer.Add(controlsizer, flag=wx.EXPAND|wx.ALL,border=10)        
+        pagesizer.Add(self.text_mcalc, flag=wx.EXPAND|wx.ALL,border=5)
+        pagesizer.Add(buttonsizer4, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, border=5)
+        self.SetAutoLayout(True)
+        self.SetSizer(pagesizer)
+        pagesizer.Fit(self)
+        #pagesizer.SetSizeHints(self)
+        self.Layout()
+        self.Show(True)
+
+    def AddMark(self,event):
+        if event.GetId() == self.btn_compl.GetId(): mark = "~"
+        elif event.GetId() == self.btn_not.GetId(): mark = "!"
+        elif event.GetId() == self.btn_pow.GetId(): mark = "^"
+        elif event.GetId() == self.btn_div.GetId(): mark = "/"
+        elif event.GetId() == self.btn_add.GetId(): mark = "+"
+        elif event.GetId() == self.btn_minus.GetId(): mark = "-"
+        elif event.GetId() == self.btn_mod.GetId(): mark = "%"
+        elif event.GetId() == self.btn_mult.GetId(): mark = "*"
+        elif event.GetId() == self.btn_lshift.GetId(): mark = "<<"
+        elif event.GetId() == self.btn_rshift.GetId(): mark = ">>"
+        elif event.GetId() == self.btn_rshiftu.GetId(): mark = ">>>"
+        elif event.GetId() == self.btn_gt.GetId(): mark = ">"
+        elif event.GetId() == self.btn_gteq.GetId(): mark = ">="
+        elif event.GetId() == self.btn_lt.GetId(): mark = "<"
+        elif event.GetId() == self.btn_lteq.GetId(): mark = "<="
+        elif event.GetId() == self.btn_eq.GetId(): mark = "=="
+        elif event.GetId() == self.btn_noteq.GetId(): mark = "!="
+        elif event.GetId() == self.btn_andbit.GetId(): mark = "&"
+        elif event.GetId() == self.btn_orbit.GetId(): mark = "|"
+        elif event.GetId() == self.btn_or.GetId(): mark =  "||"
+        elif event.GetId() == self.btn_ornull.GetId(): mark = "|||"
+        elif event.GetId() == self.btn_and.GetId(): mark = "&&"
+        elif event.GetId() == self.btn_andnull.GetId(): mark = "&&&"
+        elif event.GetId() == self.btn_cond.GetId(): mark = "?:"
+        elif event.GetId() == self.btn_brackets.GetId(): mark = "()"        
+        self.__addSomething(mark)
+        
+    def OnNewmap(self, event):
+        self.newmap = event.GetString()
+
+    def OnSelect(self, event):
+        item = event.GetString()
+        self.__addSomething(item)
+        self.text_mcalc.SetFocus()
+
+    def __addSomething(self,what):
+        self.text_mcalc.SetFocus()
+        mcalcstr = self.text_mcalc.GetValue()
+        newmcalcstr = ''
+        position = self.text_mcalc.GetInsertionPoint()
+        
+        selection = self.text_mcalc.GetSelection()
+
+        newmcalcstr = mcalcstr[:position]
+        
+        try:
+            if newmcalcstr[-1] != " ":
+                newmcalcstr += " "
+        except:
+            pass
+        newmcalcstr += what
+        position_offset = len(what)
+        newmcalcstr += " "+mcalcstr[position:]
+
+        self.text_mcalc.SetValue(newmcalcstr)
+        self.text_mcalc.SetInsertionPoint(position+position_offset)
+        self.text_mcalc.Update()
+
+    def OnMCalcRun(self,event):
+        if self.newmap == '':
+            wx.MessageBox("You must enter the name of a new map to create")
+            return
+
+        if self.parent:
+            try:
+                mctxt = self.text_mcalc.GetValue().strip().replace("\n"," ")
+                mctxt = mctxt.replace(" ","")
+                cmdstr = 'r.mapcalc %s=%s' % (self.newmap,mctxt)
+                cmdlist = ['r.mapcalc', ' %s=%s' % (self.newmap,mctxt)]
+                p = os.system(cmdstr)
+                #p = gcmd.Command(cmdlist, stderr=None)
+                #print p.PrintModuleOutput
+            except:
+                pass
+
+    def OnClear(self, event):
+        self.text_mcalc.SetValue("")
+        
+    def OnHelp(self, event):
+        cmdlist = ['g.manual','r.mapcalc']
+        gcmd.Command(cmdlist)
+        pass
+
+    def OnClose(self,event):
+        self.Destroy()
+
+if __name__ == "__main__":
+
+    if len(sys.argv) != 2:
+        print >>sys.stderr, __doc__
+        sys.exit()
+
+    app = wx.App(0)
+    sqlb = SQLFrame(None, -1, 'SQL Builder',sys.argv[1])
+    app.MainLoop()
+
+



More information about the grass-commit mailing list