[GRASS-SVN] r42727 - in grass/trunk/gui/wxpython: . gui_modules xml
svn_grass at osgeo.org
svn_grass at osgeo.org
Thu Jul 8 15:29:09 EDT 2010
Author: martinl
Date: 2010-07-08 19:29:09 +0000 (Thu, 08 Jul 2010)
New Revision: 42727
Modified:
grass/trunk/gui/wxpython/gui_modules/gmodeler.py
grass/trunk/gui/wxpython/gui_modules/location_wizard.py
grass/trunk/gui/wxpython/gui_modules/toolbars.py
grass/trunk/gui/wxpython/wxgui.py
grass/trunk/gui/wxpython/xml/menudata_modeler.xml
Log:
wxGUI/modeler: progress in looping
Modified: grass/trunk/gui/wxpython/gui_modules/gmodeler.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/gmodeler.py 2010-07-08 17:38:35 UTC (rev 42726)
+++ grass/trunk/gui/wxpython/gui_modules/gmodeler.py 2010-07-08 19:29:09 UTC (rev 42727)
@@ -178,6 +178,24 @@
return None
+ def FindData(self, value, prompt):
+ """!Find data item in the model
+
+ @param value value
+ @param prompt prompt
+
+ @return ModelData instance
+ @return None if not found
+ """
+ for action in self.GetActions():
+ for rel in action.GetRelations():
+ dataItem = rel.GetData()
+ if dataItem.GetValue() == value and \
+ dataItem.GetPrompt() == prompt:
+ return dataItem
+
+ return None
+
def LoadModel(self, filename):
"""!Load model definition stored in GRASS Model XML file (gxm)
@@ -256,8 +274,8 @@
else:
relation = ModelRelation(actionItem, dataItem, rel['name'])
relation.SetControlPoints(rel['points'])
+ actionItem.AddRelation(relation)
dataItem.AddRelation(relation)
- actionItem.AddRelation(relation)
dataItem.Update()
@@ -566,7 +584,9 @@
def OnCanvasRefresh(self, event):
"""!Refresh canvas"""
+ self.SetStatusText(_("Redrawing model..."), 0)
self.GetCanvas().Refresh()
+ self.SetStatusText("", 0)
def OnCloseWindow(self, event):
"""!Close window"""
@@ -841,15 +861,28 @@
self.goutput.cmdThread.SetId(-1)
for item in self.model.GetItems():
- print item
if not item.IsEnabled():
continue
if isinstance(item, ModelAction):
self._runAction(item, params)
elif isinstance(item, ModelLoop):
- print item.GetText()
+ cond = item.GetText()
+ # substitute variables in condition
+ variables = self.model.GetVariables()
+ for variable in variables:
+ pattern = re.compile('%' + variable)
+ if pattern.search(cond):
+ value = variables[variable].get('value', '')
+ vtype = variables[variable].get('type', 'string')
+ if vtype == 'string':
+ value = '"' + value + '"'
+ cond = pattern.sub(value, cond)
+ # split condition
+ condVar, condText = re.split('\s*in\s*', cond)
+
for action in item.GetActions():
- self._runAction(action, params)
+ for vars()[condVar] in eval(condText):
+ self._runAction(action, params)
if params:
dlg.Destroy()
@@ -1154,6 +1187,7 @@
self._addEvent(action)
self.model.AddItem(action)
+ self.actionPanel.Update()
self.canvas.Refresh()
time.sleep(.1)
@@ -1168,7 +1202,7 @@
if win:
win.Raise()
-
+
def OnAddData(self, event):
"""!Add data item to model"""
# add action to canvas
@@ -1233,37 +1267,32 @@
continue
data = self.model.FindData(p.get('value', ''),
- p.get('prompt', ''))
+ p.get('prompt', ''))
if data:
if p.get('age', 'old') == 'old':
rel = ModelRelation(data, layer, p.get('name', ''))
- data.AddRelation(rel, direction = 'from')
- self.AddLine(rel)
else:
rel = ModelRelation(layer, data, p.get('name', ''))
- data.AddRelation(rel, direction = 'to')
- self.AddLine(rel)
+ layer.AddRelation(rel)
+ data.AddRelation(rel)
+ self.AddLine(rel)
data.Update()
continue
data = ModelData(self, value = p.get('value', ''),
prompt = p.get('prompt', ''),
x = x.pop(), y = height/2)
- layer.AddData(data)
+ self._addEvent(data)
self.canvas.diagram.AddShape(data)
data.Show(True)
-
- self._addEvent(data)
- self.model.AddData(data)
-
+
if p.get('age', 'old') == 'old':
rel = ModelRelation(data, layer, p.get('name', ''))
- data.AddRelation(rel, direction = 'from')
- self.AddLine(rel)
else:
rel = ModelRelation(layer, data, p.get('name', ''))
- data.AddRelation(rel, direction = 'to')
- self.AddLine(rel)
+ layer.AddRelation(rel)
+ data.AddRelation(rel)
+ self.AddLine(rel)
data.Update()
# valid ?
@@ -2005,8 +2034,13 @@
### shape.SetPropDialog(dlg)
dlg.CentreOnParent()
if dlg.ShowModal() == wx.ID_OK:
- shape.SetActions(dlg.GetActions())
+ shape.SetText(dlg.GetCondition())
+ alist = list()
+ for aId in dlg.GetActions():
+ alist.append(self.frame.GetModel().GetAction(aId))
+ shape.SetActions(alist)
self.frame.DefineLoop(shape)
+ self.frame.GetCanvas().Refresh()
dlg.Destroy()
@@ -2169,18 +2203,22 @@
self.SetSize((500, 275))
def _layout(self):
+ cmdSizer = wx.StaticBoxSizer(self.cmdBox, wx.VERTICAL)
+ cmdSizer.Add(item = self.cmd_prompt, proportion = 1,
+ flag = wx.EXPAND)
+
btnSizer = wx.StdDialogButtonSizer()
btnSizer.AddButton(self.btnCancel)
btnSizer.AddButton(self.btnOk)
btnSizer.Realize()
mainSizer = wx.BoxSizer(wx.VERTICAL)
- mainSizer.Add(item=self.search, proportion=0,
- flag=wx.EXPAND | wx.ALL, border=3)
- mainSizer.Add(item=self.cmd_prompt, proportion=1,
- flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, border=3)
- mainSizer.Add(item=btnSizer, proportion=0,
- flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
+ mainSizer.Add(item = self.search, proportion = 0,
+ flag = wx.EXPAND | wx.ALL, border = 3)
+ mainSizer.Add(item = cmdSizer, proportion = 1,
+ flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, border = 3)
+ mainSizer.Add(item = btnSizer, proportion = 0,
+ flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
self.panel.SetSizer(mainSizer)
mainSizer.Fit(self.panel)
@@ -2263,6 +2301,19 @@
def GetTo(self):
"""!Get id of 'to' shape"""
return self.toShape
+
+ def GetData(self):
+ """!Get related ModelData instance
+
+ @return ModelData instance
+ @return None if not found
+ """
+ if isinstance(self.fromShape, ModelData):
+ return self.fromShape
+ elif isinstance(self.toShape, ModelData):
+ return self.toShape
+
+ return None
def GetName(self):
"""!Get parameter name"""
@@ -2550,14 +2601,11 @@
dataList = list()
for action in model.GetActions():
for rel in action.GetRelations():
- if rel.GetFrom() == action:
- dataItem = rel.GetTo()
- else:
- dataItem = rel.GetFrom()
+ dataItem = rel.GetData()
if dataItem not in dataList:
dataList.append(dataItem)
self._data(dataList)
-
+
self._footer()
def _filterValue(self, value):
@@ -2609,6 +2657,8 @@
def _variables(self):
"""!Write model variables"""
+ if not self.variables:
+ return
self.fd.write('%s<variables>\n' % (' ' * self.indent))
self.indent += 4
for name, values in self.variables.iteritems():
@@ -2628,14 +2678,12 @@
def _items(self):
"""!Write actions/loops"""
- self.indent += 4
for item in self.items:
if isinstance(item, ModelAction):
self._action(item)
elif isinstance(item, ModelLoop):
self._loop(item)
- self.indent -= 4
-
+
def _action(self, action):
"""!Write actions"""
self.fd.write('%s<action id="%d" name="%s" pos="%d,%d" size="%d,%d">\n' % \
@@ -2680,7 +2728,6 @@
def _data(self, dataList):
"""!Write data"""
- self.indent += 4
for data in dataList:
self.fd.write('%s<data pos="%d,%d" size="%d,%d">\n' % \
(' ' * self.indent, data.GetX(), data.GetY(),
@@ -2733,9 +2780,8 @@
(' ' * self.indent, self._filterValue(text)))
for action in loop.GetActions():
self.fd.write('%s<loop-action>%d</loop-action>\n' %
- (' ' * self.indent, action))
+ (' ' * self.indent, action.GetId()))
self.indent -= 4
-
self.fd.write('%s</loop>\n' % (' ' * self.indent))
class PreferencesDialog(PreferencesBaseDialog):
@@ -3571,7 +3617,13 @@
def SetActions(self, actions):
"""!Set actions (id)"""
self.actions = actions
-
+
+ def SetText(self, cond):
+ """!Set loop text (condition)"""
+ self.text = cond
+ self.ClearText()
+ self.AddText('(' + str(self.id) + ') ' + self.text)
+
class ModelLoopDialog(wx.Dialog):
"""!Loop properties dialog"""
def __init__(self, parent, shape, id = wx.ID_ANY, title = _("Loop properties"),
@@ -3589,9 +3641,9 @@
value = shape.GetText())
self.listBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
label=" %s " % _("List of actions in loop"))
- self.actionList = ActionListCtrl(parent = self.panel,
- columns = [_("ID"), _("Name"),
- _("Command")])
+ self.actionList = ActionCheckListCtrl(parent = self.panel,
+ columns = [_("ID"), _("Name"),
+ _("Command")])
self.actionList.Populate(self.parent.GetModel().GetActions())
@@ -3643,6 +3695,10 @@
return ids
+ def GetCondition(self):
+ """!Get loop condition"""
+ return self.condText.GetValue()
+
class ActionPanel(wx.Panel):
def __init__(self, parent, id = wx.ID_ANY,
**kwargs):
@@ -3679,8 +3735,10 @@
self.list.OnReload(None)
class ActionListCtrl(ModelListCtrl):
- def __init__(self, parent, columns, **kwargs):
+ def __init__(self, parent, columns, disablePopup = False, **kwargs):
"""!List of model actions"""
+ self.disablePopup = disablePopup
+
ModelListCtrl.__init__(self, parent, columns, **kwargs)
self.SetColumnWidth(1, 100)
self.SetColumnWidth(2, 65)
@@ -3779,6 +3837,9 @@
def OnRightUp(self, event):
"""!Mouse right button up"""
+ if self.disablePopup:
+ return
+
if not hasattr(self, "popupID1"):
self.popupID1 = wx.NewId()
self.popupID2 = wx.NewId()
@@ -3810,14 +3871,23 @@
aId = 1
for item in model.GetItems():
- print item
item.SetId(aId)
aId += 1
self.OnReload(None)
self.frame.GetCanvas().Refresh()
self.frame.ModelChanged()
-
+
+class ActionCheckListCtrl(ActionListCtrl, listmix.CheckListCtrlMixin):
+ def __init__(self, parent, columns, **kwargs):
+ ActionListCtrl.__init__(self, parent, columns, disablePopup = True, **kwargs)
+ listmix.CheckListCtrlMixin.__init__(self)
+ self.SetColumnWidth(0, 50)
+
+ def OnBeginEdit(self, event):
+ """!Disable editing"""
+ event.Veto()
+
def main():
app = wx.PySimpleApp()
wx.InitAllImageHandlers()
Modified: grass/trunk/gui/wxpython/gui_modules/location_wizard.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/location_wizard.py 2010-07-08 17:38:35 UTC (rev 42726)
+++ grass/trunk/gui/wxpython/gui_modules/location_wizard.py 2010-07-08 19:29:09 UTC (rev 42727)
@@ -33,7 +33,6 @@
"""
import os
import shutil
-import re
import string
import sys
import locale
Modified: grass/trunk/gui/wxpython/gui_modules/toolbars.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/toolbars.py 2010-07-08 17:38:35 UTC (rev 42726)
+++ grass/trunk/gui/wxpython/gui_modules/toolbars.py 2010-07-08 19:29:09 UTC (rev 42727)
@@ -1426,12 +1426,12 @@
wx.ITEM_NORMAL, Icons['modelToPython'].GetLabel(), Icons['modelToPython'].GetDesc(),
self.parent.OnExportPython),
('', '', '', '', '', '', ''),
+ (self.action, 'action', Icons['modelActionAdd'].GetBitmap(),
+ wx.ITEM_NORMAL, Icons['modelActionAdd'].GetLabel(), Icons['modelActionAdd'].GetDesc(),
+ self.parent.OnAddAction),
(self.data, 'data', Icons['modelDataAdd'].GetBitmap(),
wx.ITEM_NORMAL, Icons['modelDataAdd'].GetLabel(), Icons['modelDataAdd'].GetDesc(),
self.parent.OnAddData),
- (self.action, 'action', Icons['modelActionAdd'].GetBitmap(),
- wx.ITEM_NORMAL, Icons['modelActionAdd'].GetLabel(), Icons['modelActionAdd'].GetDesc(),
- self.parent.OnAddAction),
(self.relation, 'relation', Icons['modelRelation'].GetBitmap(),
wx.ITEM_NORMAL, Icons['modelRelation'].GetLabel(), Icons['modelRelation'].GetDesc(),
self.parent.OnDefineRelation),
@@ -1439,12 +1439,12 @@
(self.redraw, 'redraw', Icons['modelRedraw'].GetBitmap(),
wx.ITEM_NORMAL, Icons['modelRedraw'].GetLabel(), Icons['modelRedraw'].GetDesc(),
self.parent.OnCanvasRefresh),
+ (self.validate, 'validate', Icons['modelValidate'].GetBitmap(),
+ wx.ITEM_NORMAL, Icons['modelValidate'].GetLabel(), Icons['modelValidate'].GetDesc(),
+ self.parent.OnValidateModel),
(self.run, 'run', Icons['modelRun'].GetBitmap(),
wx.ITEM_NORMAL, Icons['modelRun'].GetLabel(), Icons['modelRun'].GetDesc(),
self.parent.OnRunModel),
- (self.validate, 'validate', Icons['modelValidate'].GetBitmap(),
- wx.ITEM_NORMAL, Icons['modelValidate'].GetLabel(), Icons['modelValidate'].GetDesc(),
- self.parent.OnValidateModel),
('', '', '', '', '', '', ''),
(self.settings, "settings", Icons["modelSettings"].GetBitmap(),
wx.ITEM_NORMAL, Icons["modelSettings"].GetLabel(), Icons["modelSettings"].GetDesc(),
Modified: grass/trunk/gui/wxpython/wxgui.py
===================================================================
--- grass/trunk/gui/wxpython/wxgui.py 2010-07-08 17:38:35 UTC (rev 42726)
+++ grass/trunk/gui/wxpython/wxgui.py 2010-07-08 19:29:09 UTC (rev 42727)
@@ -22,7 +22,6 @@
import sys
import os
import time
-import re
import string
import getopt
import platform
Modified: grass/trunk/gui/wxpython/xml/menudata_modeler.xml
===================================================================
--- grass/trunk/gui/wxpython/xml/menudata_modeler.xml 2010-07-08 17:38:35 UTC (rev 42726)
+++ grass/trunk/gui/wxpython/xml/menudata_modeler.xml 2010-07-08 19:29:09 UTC (rev 42727)
@@ -65,18 +65,18 @@
<label>&Model</label>
<items>
<menuitem>
+ <label>Add action</label>
+ <help>Add action (GRASS module) to model</help>
+ <handler>OnAddAction</handler>
+ <shortcut>Ctrl+A</shortcut>
+ </menuitem>
+ <menuitem>
<label>Add data</label>
<help>Add data item to model</help>
<handler>OnAddData</handler>
<shortcut>Ctrl+D</shortcut>
</menuitem>
<menuitem>
- <label>Add action</label>
- <help>Add action (GRASS module) to model</help>
- <handler>OnAddAction</handler>
- <shortcut>Ctrl+A</shortcut>
- </menuitem>
- <menuitem>
<label>Define relation</label>
<help>Define relation between data and action items</help>
<handler>OnDefineRelation</handler>
More information about the grass-commit
mailing list