[GRASS-SVN] r42749 - in grass/trunk/gui/wxpython: gui_modules xml

svn_grass at osgeo.org svn_grass at osgeo.org
Fri Jul 9 17:02:13 EDT 2010


Author: martinl
Date: 2010-07-09 21:02:13 +0000 (Fri, 09 Jul 2010)
New Revision: 42749

Modified:
   grass/trunk/gui/wxpython/gui_modules/gmodeler.py
   grass/trunk/gui/wxpython/gui_modules/preferences.py
   grass/trunk/gui/wxpython/xml/menudata_modeler.xml
Log:
wxGUI/modeler: conditions implemented (initial)


Modified: grass/trunk/gui/wxpython/gui_modules/gmodeler.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/gmodeler.py	2010-07-09 20:58:44 UTC (rev 42748)
+++ grass/trunk/gui/wxpython/gui_modules/gmodeler.py	2010-07-09 21:02:13 UTC (rev 42749)
@@ -25,6 +25,7 @@
  - ModelLoopDialog
  - ActionPanel
  - ActionListCtrl
+ - ModelCondition
 
 (C) 2010 by the GRASS Development Team
 This program is free software under the GNU General Public License
@@ -304,7 +305,7 @@
                                  actions = alist,
                                  id = loop['id'])
             
-            for action in loopItem.GetActions():
+            for action in loopItem.GetItems():
                 action.SetLoop(loopItem)
             
             self.AddItem(loopItem)
@@ -895,7 +896,7 @@
                 # split condition
                 condVar, condText = re.split('\s*in\s*', cond)
                 
-                for action in item.GetActions():
+                for action in item.GetItems():
                     for vars()[condVar] in eval(condText):
                         self._runAction(action, params)
         
@@ -1101,14 +1102,28 @@
             fd.write('    pass\n')
         
         fd.write("\ndef main():\n")
+        indent = 4
         for item in self.model.GetItems():
             if isinstance(item, ModelAction):
-                self._writePythonAction(fd, item)
+                if item.GetLoopId():
+                    continue
+                self._writePythonAction(fd, item, indent)
             elif isinstance(item, ModelLoop):
-                # for action in item.GetActions():
-                #     fd.write('for %s:\n' % item.GetText())
-                #     self._writePythonAction(fd, action)
-                pass
+                # substitute conditiond
+                variables = self.model.GetVariables()
+                cond = item.GetText()
+                for variable in variables:
+                    pattern= re.compile('%' + variable)
+                    if pattern.search(cond):
+                        value = variables[variable].get('value', '')
+                        if variables[variable].get('type', 'string') == 'string':
+                            value = '"' + value + '"'
+                        cond = pattern.sub(value, cond)
+                fd.write('%sfor %s:\n' % (' ' * indent, cond))
+                indent += 4
+                for action in item.GetItems():
+                    self._writePythonAction(fd, action, indent)
+                indent -= 4
         
         fd.write("\n    return 0\n")
         
@@ -1120,14 +1135,14 @@
     sys.exit(main())
 """)
         
-    def _writePythonAction(self, fd, item):
+    def _writePythonAction(self, fd, item, indent):
         task = menuform.GUI().ParseCommand(cmd = item.GetLog(string = False),
                                            show = None)
         opts = task.get_options()
         flags = ''
         params = list()
-        strcmd = "    grass.run_command("
-        indent = len(strcmd)
+        strcmd = "%sgrass.run_command(" % (' ' * indent)
+        cmdIndent = len(strcmd)
         for f in opts['flags']:
             if f.get('value', False) == True:
                 name = f.get('name', '')
@@ -1148,12 +1163,12 @@
         
         fd.write(strcmd + '"%s"' % task.get_name())
         if flags:
-            fd.write(",\n%sflags = '%s'" % (' ' * indent, flags))
+            fd.write(",\n%sflags = '%s'" % (' ' * cmdIndent, flags))
         if len(params) > 0:
             fd.write(",\n")
             for opt in params[:-1]:
-                fd.write("%s%s,\n" % (' ' * indent, opt))
-            fd.write("%s%s)\n" % (' ' * indent, params[-1]))
+                fd.write("%s%s,\n" % (' ' * cmdIndent, opt))
+            fd.write("%s%s)\n" % (' ' * cmdIndent, params[-1]))
         else:
             fd.write(")\n")
         
@@ -1178,14 +1193,29 @@
         self.ModelChanged()
         
         width, height = self.canvas.GetSize()
-        loop = ModelLoop(self, x = width/2, y = height/2)
+        loop = ModelLoop(self, x = width/2, y = height/2,
+                         id = len(self.model.GetActions()) + 1)
         self.canvas.diagram.AddShape(loop)
         loop.Show(True)
         
         self._addEvent(loop)
         
         self.canvas.Refresh()
-
+        
+    def OnDefineCondition(self, event):
+        """!Define new condition in the model"""
+        self.ModelChanged()
+        
+        width, height = self.canvas.GetSize()
+        cond = ModelCondition(self, x = width/2, y = height/2,
+                              id = len(self.model.GetActions()) + 1)
+        self.canvas.diagram.AddShape(cond)
+        loop.Show(True)
+        
+        self._addEvent(cond)
+        
+        self.canvas.Refresh()
+    
     def OnAddAction(self, event):
         """!Add action to model"""
         if self.searchDialog is None:
@@ -1461,17 +1491,17 @@
     def DefineLoop(self, loop):
         """!Define loop with given list of actions"""
         parent = loop
-        actions = loop.GetActions()
+        actions = loop.GetItems()
         if not actions:
             return
         
-        for action in loop.GetActions():
+        for action in loop.GetItems():
             rel = ModelRelation(parent, action)
             self.AddLine(rel)
             parent = action
         
         # close loop
-        action = loop.GetActions()[-1]
+        action = loop.GetItems()[-1]
         rel = ModelRelation(action, loop)
         self.AddLine(rel)
         dx = loop.GetWidth() / 2 + 50
@@ -2083,7 +2113,7 @@
                 alist = list()
                 for aId in dlg.GetActions():
                     alist.append(self.frame.GetModel().GetAction(aId))
-                shape.SetActions(alist)
+                shape.SetItems(alist)
                 self.frame.DefineLoop(shape)
             self.frame.GetCanvas().Refresh()
             
@@ -2823,7 +2853,7 @@
         if text:
             self.fd.write('%s<condition>%s</condition>\n' %
                           (' ' * self.indent, self._filterValue(text)))
-        for action in loop.GetActions():
+        for action in loop.GetItems():
             self.fd.write('%s<loop-action>%d</loop-action>\n' %
                           (' ' * self.indent, action.GetId()))
         self.indent -= 4
@@ -3625,7 +3655,7 @@
         menu.Destroy()
         
 class ModelLoop(ModelObject, ogl.RectangleShape):
-    def __init__(self, parent, x, y, id = -1, width = None, height = None, text = None, actions = []):
+    def __init__(self, parent, x, y, id = -1, width = None, height = None, text = None, items = []):
         """!Defines a loop"""
         ModelObject.__init__(self, id)
         
@@ -3635,7 +3665,7 @@
             width = UserSettings.Get(group='modeler', key='loop', subkey=('size', 'width'))
         if not height:
             height = UserSettings.Get(group='modeler', key='loop', subkey=('size', 'height'))
-        self.actions = actions # list of actions in the loop
+        self.items = items # list of items in the loop
         
         if self.parent.GetCanvas():
             ogl.RectangleShape.__init__(self, width, height)
@@ -3645,23 +3675,26 @@
             self.SetY(y)
             self.SetPen(wx.BLACK_PEN)
             self.SetCornerRadius(100)
-            self.AddText('(' + str(self.id) + ') ' + text)
+            if text:
+                self.AddText('(' + str(self.id) + ') ' + text)
+            else:
+                self.AddText('(' + str(self.id) + ')')
         
     def GetText(self):
         """!Get loop text"""
         return self.text
 
-    def GetActions(self):
-        """!Get actions (id)"""
-        return self.actions
+    def GetItems(self):
+        """!Get items (id)"""
+        return self.items
 
     def SetId(self, id):
         """!Set loop id"""
         self.id = id
 
-    def SetActions(self, actions):
-        """!Set actions (id)"""
-        self.actions = actions
+    def SetItems(self, items):
+        """!Set items (id)"""
+        self.items = items
 
     def SetText(self, cond):
         """!Set loop text (condition)"""
@@ -3685,7 +3718,7 @@
         self.condText = wx.TextCtrl(parent = self.panel, id = wx.ID_ANY,
                                     value = shape.GetText())
         self.listBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
-                                    label=" %s " % _("List of actions in loop"))
+                                    label=" %s " % _("List of items in loop"))
         self.actionList = ActionCheckListCtrl(parent = self.panel,
                                               columns = [_("ID"), _("Name"),
                                                          _("Command")])
@@ -3948,7 +3981,35 @@
     def OnBeginEdit(self, event):
         """!Disable editing"""
         event.Veto()
+
+class ModelCondition(ModelObject, ogl.PolygonShape):
+    def __init__(self, parent, x, y, id = -1, width = None, height = None, text = None, items = []):
+        """!Defines a condition"""
+        ModelObject.__init__(self, id)
         
+        self.parent  = parent
+        self.text    = text
+        if not width:
+            width = UserSettings.Get(group='modeler', key='condition', subkey=('size', 'width'))
+        if not height:
+            height = UserSettings.Get(group='modeler', key='condition', subkey=('size', 'height'))
+        self.items = items # list of items in the loop
+        
+        if self.parent.GetCanvas():
+            ogl.PolygonShape.__init__(self)
+            points = [(x, y - height / 2),
+                      (x + width / 2, y),
+                      (x, y + height / 2),
+                      (x - width / 2, y)]
+            self.Create(points)
+            
+            self.SetCanvas(self.parent)
+            self.SetPen(wx.BLACK_PEN)
+            if text:
+                self.AddText('(' + str(self.id) + ') ' + text)
+            else:
+                self.AddText('(' + str(self.id) + ')')
+        
 def main():
     app = wx.PySimpleApp()
     wx.InitAllImageHandlers()

Modified: grass/trunk/gui/wxpython/gui_modules/preferences.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/preferences.py	2010-07-09 20:58:44 UTC (rev 42748)
+++ grass/trunk/gui/wxpython/gui_modules/preferences.py	2010-07-09 21:02:13 UTC (rev 42749)
@@ -558,6 +558,12 @@
                         'height' : 50,
                         },
                     },
+                'condition' : {
+                    'size' : {
+                        'width' : 100,
+                        'height' : 50,
+                        },
+                    },
                 },
             }
         

Modified: grass/trunk/gui/wxpython/xml/menudata_modeler.xml
===================================================================
--- grass/trunk/gui/wxpython/xml/menudata_modeler.xml	2010-07-09 20:58:44 UTC (rev 42748)
+++ grass/trunk/gui/wxpython/xml/menudata_modeler.xml	2010-07-09 21:02:13 UTC (rev 42749)
@@ -41,6 +41,7 @@
 	  <label>Export to Python</label>
 	  <help>Export model to Python script</help>
 	  <handler>OnExportPython</handler>
+	  <shortcut>Ctrl+E</shortcut>
 	</menuitem>
 	<separator />
 	<menuitem>
@@ -83,11 +84,17 @@
 	</menuitem>
 	<menuitem>
 	  <label>Add loop</label>
-	  <help>Adds loop to model</help>
+	  <help>Adds loop (for) to model</help>
 	  <handler>OnDefineLoop</handler>
 	  <shortcut>Ctrl+L</shortcut>
 	</menuitem>
 	<menuitem>
+	  <label>Add condition</label>
+	  <help>Adds condition (if/else) to model</help>
+	  <handler>OnDefineCondition</handler>
+	  <shortcut>Ctrl+I</shortcut>
+	</menuitem>
+	<menuitem>
 	  <label>Remove item</label>
 	  <help>Remove action/data from model</help>
 	  <handler>OnRemoveItem</handler>



More information about the grass-commit mailing list