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

svn_grass at osgeo.org svn_grass at osgeo.org
Wed Aug 6 09:55:31 EDT 2008


Author: martinl
Date: 2008-08-06 09:55:31 -0400 (Wed, 06 Aug 2008)
New Revision: 32575

Modified:
   grass/trunk/gui/wxpython/gui_modules/gcmd.py
   grass/trunk/gui/wxpython/gui_modules/mapdisp.py
   grass/trunk/gui/wxpython/gui_modules/render.py
   grass/trunk/gui/wxpython/gui_modules/toolbars.py
   grass/trunk/gui/wxpython/gui_modules/vdigit.py
   grass/trunk/gui/wxpython/gui_modules/wxgui_utils.py
Log:
wxGUI/vdidit: allow to hide currently edited map layer (item checkbox), remember map layer even its position in layer tree is changed
various render-related fixes
(merge from devbr6, r32574)


Modified: grass/trunk/gui/wxpython/gui_modules/gcmd.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/gcmd.py	2008-08-06 13:53:50 UTC (rev 32574)
+++ grass/trunk/gui/wxpython/gui_modules/gcmd.py	2008-08-06 13:55:31 UTC (rev 32575)
@@ -62,12 +62,13 @@
         self.title = title
         
     def __str__(self):
-        wx.MessageBox(parent=self.parent,
-                      caption=self.title,
-                      message=self.message,
-                      style=wx.ICON_ERROR | wx.CENTRE)
-
-        # return 'GException: %s' % self.message
+        dlg = wx.MessageDialog(parent=self.parent,
+                               caption=self.title,
+                               message=self.message,
+                               style=wx.ICON_ERROR | wx.CENTRE)
+        dlg.SetIcon(wx.Icon(os.path.join(globalvar.ETCDIR, 'grass_error.ico'), wx.BITMAP_TYPE_ICO))
+        dlg.ShowModal()
+        
         return ''
 
 class GStdError(GException):
@@ -429,7 +430,7 @@
                     content = ""
                 
                 if type:
-                    content += line.split(':')[1].strip()
+                    content += line.split(':', 1)[1].strip()
             else: # stderr
                 msg.append((None, line.strip()))
 

Modified: grass/trunk/gui/wxpython/gui_modules/mapdisp.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/mapdisp.py	2008-08-06 13:53:50 UTC (rev 32574)
+++ grass/trunk/gui/wxpython/gui_modules/mapdisp.py	2008-08-06 13:55:31 UTC (rev 32575)
@@ -681,7 +681,7 @@
         #
         digitToolbar = self.parent.toolbars['vdigit']
         if renderVector and digitToolbar and \
-                digitToolbar.layerSelectedID != None:
+                digitToolbar.GetLayer():
             # set region
             self.parent.digit.driver.UpdateRegion()
             # re-calculate threshold for digitization tool
@@ -689,7 +689,9 @@
             # draw map
             self.pdcVector.Clear()
             self.pdcVector.RemoveAll()
-            self.parent.digit.driver.DrawMap()
+            item = self.tree.FindItemByData('maplayer', digitToolbar.GetLayer())
+            if self.tree.IsItemChecked(item):
+                self.parent.digit.driver.DrawMap()
 
         #
         # render overlays
@@ -1075,13 +1077,12 @@
             east, north = self.Pixel2Cell(self.mouse['begin'])
 
             try:
-                map = digitToolbar.layers[digitToolbar.layerSelectedID].name
+                map = digitToolbar.GetLayer().GetName()
             except:
                 map = None
-                dlg = wx.MessageDialog(self, _("No vector map selected for editing."),
-                                       _("Error"), wx.OK | wx.ICON_ERROR)
-                dlg.ShowModal()
-                dlg.Destroy()
+                wx.MessageBox(parent=self,
+                              message=_("No vector map selected for editing."),
+                              caption=_("Error"), style=wx.OK | wx.ICON_ERROR | wx.CENTRE)
                 event.Skip()
                 return
 
@@ -1706,14 +1707,13 @@
                     digitToolbar.type in ["line", "boundary"]:
                 # -> add new line / boundary
                 try:
-                    map = digitToolbar.layers[digitToolbar.layerSelectedID].name
+                    map = digitToolbar.GetLayer().GetName()
                 except:
                     map = None
-                    dlg = wx.MessageDialog(self, _("No vector map selected for editing."),
-                                           _("Error"), wx.OK | wx.ICON_ERROR)
-                    dlg.ShowModal()
-                    dlg.Destroy()
-
+                    wx.MessageBox(parent=self,
+                                  message=_("No vector map selected for editing."),
+                                  caption=_("Error"), style=wx.OK | wx.ICON_ERROR | wx.CENTRE)
+                    
                 if map:
                     # mapcoords = []
                     # xy -> EN

Modified: grass/trunk/gui/wxpython/gui_modules/render.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/render.py	2008-08-06 13:53:50 UTC (rev 32574)
+++ grass/trunk/gui/wxpython/gui_modules/render.py	2008-08-06 13:55:31 UTC (rev 32575)
@@ -132,7 +132,8 @@
                 gcmd.Command(['d.mon',
                               'start=cairo'], stderr=None)
         else:
-            os.environ["GRASS_PNGFILE"] = self.mapfile
+            if self.mapfile:
+                os.environ["GRASS_PNGFILE"] = self.mapfile
 
         #
         # execute command
@@ -189,10 +190,22 @@
         
         return int (self.opacity * 100)
 
-    def GetName(self):
-        """Get map layer name"""
-        return self.name
-    
+    def GetName(self, fullyQualified=True):
+        """Get map layer name
+
+        @param fullyQualified if True return 'name at mapset' otherwise
+        ('name', 'mapset')
+        """
+        if fullyQualified:
+            return self.name
+        else:
+            if '@' in self.name:
+                return { 'name' : self.name.split('@')[0],
+                         'mapset' : self.name.split('@')[1] }
+            else:
+                return { 'name' : self.name,
+                         'mapset' : '' }
+        
     def IsActive(self):
         """Check if layer is activated for rendering"""
         return self.active

Modified: grass/trunk/gui/wxpython/gui_modules/toolbars.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/toolbars.py	2008-08-06 13:53:50 UTC (rev 32574)
+++ grass/trunk/gui/wxpython/gui_modules/toolbars.py	2008-08-06 13:55:31 UTC (rev 32575)
@@ -358,9 +358,10 @@
         self.parent        = parent    # MapFrame
         self.layerTree     = layerTree # reference to layer tree associated to map display
 
-        # selected map to digitize
-        self.layerSelectedID  = None
-        self.layers     = []
+        # currently selected map layer for editing (reference to MapLayer instance)
+        self.mapLayer = None
+        # list of vector layers from Layer Manager (only in the current mapset)
+        self.layers   = [] 
 
         # default action (digitize new point, line, etc.)
         self.action     = "addLine"
@@ -536,10 +537,8 @@
     def OnExit (self, event=None):
         """Quit digitization tool"""
         # stop editing of the currently selected map layer
-        try:
-            self.StopEditing(self.layers[self.layerSelectedID])
-        except:
-            pass
+        if self.mapLayer:
+            self.StopEditing()
 
         # close dialogs if still open
         if self.settingsDialog:
@@ -765,8 +764,8 @@
         selected map layer activated for editing.
         """
         if event.GetSelection() == 0: # create new vector map layer
-            if self.layerSelectedID is not None:
-                openVectorMap = self.layers[self.layerSelectedID].name.split('@')[0]
+            if self.mapLayer:
+                openVectorMap = self.mapLayer.GetName(fullyQualified=False)['name']
             else:
                 openVectorMap = None
             mapName = gdialogs.CreateNewVector(self.parent,
@@ -790,115 +789,110 @@
         else:
             selection = event.GetSelection() - 1 # first option is 'New vector map'
 
-        if self.layerSelectedID == selection:
+        # skip currently selected map
+        if self.layers[selection] == self.mapLayer:
             return False
 
-        if self.layerSelectedID != None: # deactive map layer for editing
-            self.StopEditing(self.layers[self.layerSelectedID])
+        if self.mapLayer:
+            # deactive map layer for editing
+            self.StopEditing()
 
         # select the given map layer for editing
-        self.layerSelectedID = selection
-        self.StartEditing(self.layers[self.layerSelectedID])
+        self.StartEditing(self.layers[selection])
 
         event.Skip()
 
         return True
-    def StartEditing (self, layerSelected):
+    
+    def StartEditing (self, mapLayer):
         """
-        Start editing of selected vector map layer.
+        Start editing selected vector map layer.
 
-        @param layerSelectedId id of layer to be edited
-        
-        @return True on success
-        @return False on error
+        @param mapLayer reference to MapLayer instance
         """
+        # reload vdigit module
         reload(vdigit)
         from vdigit import Digit as Digit
         self.parent.digit = Digit(mapwindow=self.parent.MapWindow)
+        
+        self.mapLayer = mapLayer
+        
+        # open vector map
         try:
-            self.layerSelectedID = self.layers.index(layerSelected)
-            mapLayer = self.layers[self.layerSelectedID]
-        except:
-            return False
-
-        try:
-            self.parent.digit.SetMapName(mapLayer.name)
+            self.parent.digit.SetMapName(mapLayer.GetName())
         except gcmd.DigitError, e:
-            self.layerSelectedID = None
+            self.mapLayer = None
             print >> sys.stderr, e # wxMessageBox
             return False
-
+        
         # update toolbar
-        self.combo.SetValue (layerSelected.name)
+        self.combo.SetValue(mapLayer.GetName())
         self.parent.toolbars['map'].combo.SetValue ('Digitize')
-        # set initial category number for new features (layer=1), etc.
-
-        Debug.msg (4, "VDigitToolbar.StartEditing(): layerSelectedID=%d layer=%s" % \
-                   (self.layerSelectedID, mapLayer.name))
-
-
+        
+        Debug.msg (4, "VDigitToolbar.StartEditing(): layer=%s" % mapLayer.GetName())
+        
         # deactive layer
         self.mapcontent.ChangeLayerActive(mapLayer, False)
 
         # change cursor
         if self.parent.MapWindow.mouse['use'] == 'pointer':
             self.parent.MapWindow.SetCursor(self.parent.cursors["cross"])
-
+        
         # create pseudoDC for drawing the map
         self.parent.MapWindow.pdcVector = wx.PseudoDC()
         self.parent.digit.driver.SetDevice(self.parent.MapWindow.pdcVector)
         # self.parent.MapWindow.UpdateMap()
         if not self.parent.MapWindow.resize:
             self.parent.MapWindow.UpdateMap(render=True)
-
+        
         return True
 
-    def StopEditing (self, layerSelected):
-        """
-        Stop editing of selected vector map layer.
-        """
+    def StopEditing (self):
+        """Stop editing of selected vector map layer.
 
-        if self.layers[self.layerSelectedID] == layerSelected:
-            self.layerSelectedID = None
-            Debug.msg (4, "VDigitToolbar.StopEditing(): layer=%s" % \
-                       (layerSelected.name))
-            self.combo.SetValue (_('Select vector map'))
-
-            # save changes (only for vdigit)
-            if UserSettings.Get(group='advanced', key='digitInterface', subkey='type') == 'vdigit':
-                if UserSettings.Get(group='vdigit', key='saveOnExit', subkey='enabled') is False:
-                    if self.parent.digit.GetUndoLevel() > 0:
-                        dlg = wx.MessageDialog(parent=self.parent, message=_("Do you want to save changes "
-                                                                             "in vector map <%s>?") % layerSelected.name,
-                                               caption=_("Save changes?"),
-                                               style=wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
-                        if dlg.ShowModal() == wx.ID_NO:
-                            # revert changes
-                            self.parent.digit.Undo(0)
-                        dlg.Destroy()
-
-            self.parent.digit.SetMapName(None) # -> close map
-
-            # re-active layer 
-            item = self.parent.tree.FindItemByData('maplayer', layerSelected)
-            if item and self.parent.tree.IsItemChecked(item):
-                self.mapcontent.ChangeLayerActive(layerSelected, True)
-
-            # change cursor
-            self.parent.MapWindow.SetCursor(self.parent.cursors["default"])
-
-            # disable pseudodc for vector map layer
-            self.parent.MapWindow.pdcVector = None
-            self.parent.digit.driver.SetDevice(None)
-
-            self.parent.digit.__del__() # FIXME: destructor is not called here (del)
-            self.parent.digit = None
-
-            return True
-
+        @return True on success
+        @return False on failure
+        """
+        if not self.mapLayer:
+            return False
         
-        return False
-
+        Debug.msg (4, "VDigitToolbar.StopEditing(): layer=%s" % self.mapLayer.GetName())
+        self.combo.SetValue (_('Select vector map'))
+        
+        # save changes (only for vdigit)
+        if UserSettings.Get(group='advanced', key='digitInterface', subkey='type') == 'vdigit':
+            if UserSettings.Get(group='vdigit', key='saveOnExit', subkey='enabled') is False:
+                if self.parent.digit.GetUndoLevel() > 0:
+                    dlg = wx.MessageDialog(parent=self.parent, message=_("Do you want to save changes "
+                                                                         "in vector map <%s>?") % self.mapLayer.GetName(),
+                                           caption=_("Save changes?"),
+                                           style=wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
+                    if dlg.ShowModal() == wx.ID_NO:
+                        # revert changes
+                        self.parent.digit.Undo(0)
+                    dlg.Destroy()
+        
+        self.parent.digit.SetMapName(None) # -> close map
+        
+        # re-active layer 
+        item = self.parent.tree.FindItemByData('maplayer', self.mapLayer)
+        if item and self.parent.tree.IsItemChecked(item):
+            self.mapcontent.ChangeLayerActive(self.mapLayer, True)
+        
+        # change cursor
+        self.parent.MapWindow.SetCursor(self.parent.cursors["default"])
+        
+        # disable pseudodc for vector map layer
+        self.parent.MapWindow.pdcVector = None
+        self.parent.digit.driver.SetDevice(None)
+        
+        self.parent.digit.__del__() # FIXME: destructor is not called here (del)
+        self.parent.digit = None
+        
+        self.mapLayer = None
+        
+        return True
+    
     def UpdateListOfLayers (self, updateTool=False):
         """
         Update list of available vector map layers.
@@ -911,8 +905,9 @@
                    updateTool)
 
         layerNameSelected = None
-        if self.layerSelectedID != None: # name of currently selected layer
-            layerNameSelected = self.layers[self.layerSelectedID].name
+         # name of currently selected layer
+        if self.mapLayer:
+            layerNameSelected = self.mapLayer.GetName()
 
         # select vector map layer in the current mapset
         layerNameList = []
@@ -920,10 +915,10 @@
                                                       l_mapset=grassenv.GetGRASSVariable('MAPSET'))
         for layer in self.layers:
             if not layer.name in layerNameList: # do not duplicate layer
-                layerNameList.append (layer.name)
+                layerNameList.append (layer.GetName())
 
         if updateTool: # update toolbar
-            if self.layerSelectedID == None:
+            if not self.mapLayer:
                 value = _('Select vector map')
             else:
                 value = layerNameSelected
@@ -937,16 +932,14 @@
             else:
                 self.combo.SetItems([_('New vector map'), ] + layerNameList)
             
-            # update layer index
-            try:
-                self.layerSelectedID = layerNameList.index(value)
-            except ValueError:
-                self.layerSelectedID = None
-
             self.toolbar[self.numOfRows-1].Realize()
 
         return layerNameList
 
+    def GetLayer(self):
+        """Get selected layer for editing -- MapLayer instance"""
+        return self.mapLayer
+    
 class ProfileToolbar(AbstractToolbar):
     """
     Toolbar for profiling raster map
@@ -1018,7 +1011,7 @@
              wx.ITEM_NORMAL, Icons["quit"].GetLabel(), Icons["quit"].GetDesc(),
              self.parent.OnQuit),
             )
-
+    
 class NvizToolbar(AbstractToolbar):
     """
     Nviz toolbar

Modified: grass/trunk/gui/wxpython/gui_modules/vdigit.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/vdigit.py	2008-08-06 13:53:50 UTC (rev 32574)
+++ grass/trunk/gui/wxpython/gui_modules/vdigit.py	2008-08-06 13:55:31 UTC (rev 32575)
@@ -836,32 +836,32 @@
         """
         if len(coords) < 2:
             return
-
+        
         if UserSettings.Get(group='vdigit', key="categoryMode", subkey='selection') == 2:
             layer = -1 # -> no category
             cat   = -1
         else:
             layer = UserSettings.Get(group='vdigit', key="layer", subkey='value')
             cat   = self.SetCategory()
-
+        
         if line:
             type = wxvdigit.GV_LINE
         else:
             type = wxvdigit.GV_BOUNDARY
-
+        
         listCoords = []
         for c in coords:
             for x in c:
                 listCoords.append(x)
-
+        
         snap, thresh = self.__getSnapThreshold()
-
+        
         ret = self.digit.AddLine(type, listCoords, layer, cat,
                                  str(UserSettings.Get(group='vdigit', key="backgroundMap", subkey='value')), snap, thresh)
-
+        
         if ret == -1:
             raise gcmd.DigitError, _("Adding new feature to vector map <%s> failed.") % map
-
+        
         self.toolbar.EnableUndo()
         
     def DeleteSelectedLines(self):
@@ -870,7 +870,7 @@
         @return number of deleted lines
         """
         nlines = self.digit.DeleteLines(UserSettings.Get(group='vdigit', key='delRecord', subkey='enabled'))
-
+        
         if nlines > 0:
             self.toolbar.EnableUndo()
             
@@ -882,13 +882,13 @@
         @param move direction (x, y)
         """
         snap, thresh = self.__getSnapThreshold()
-
+        
         nlines = self.digit.MoveLines(move[0], move[1], 0.0, # TODO 3D
                                       str(UserSettings.Get(group='vdigit', key="backgroundMap", subkey='value')), snap, thresh)
-
+        
         if nlines > 0:
             self.toolbar.EnableUndo()
-            
+        
         return nlines
 
     def MoveSelectedVertex(self, coords, move):

Modified: grass/trunk/gui/wxpython/gui_modules/wxgui_utils.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/wxgui_utils.py	2008-08-06 13:53:50 UTC (rev 32574)
+++ grass/trunk/gui/wxpython/gui_modules/wxgui_utils.py	2008-08-06 13:55:31 UTC (rev 32575)
@@ -273,14 +273,14 @@
 
             layer = self.GetPyData(self.layer_selected)[0]['maplayer']
             # enable editing only for vector map layers available in the current mapset
-            digit = self.mapdisplay.toolbars['vdigit']
+            digitToolbar = self.mapdisplay.toolbars['vdigit']
             if layer.GetMapset() != grassenv.GetGRASSVariable("MAPSET"):
                 # only vector map in current mapset can be edited
                 self.popupMenu.Enable (self.popupID5, False)
                 self.popupMenu.Enable (self.popupID6, False)
-            elif digit and digit.layerSelectedID != None:
+            elif digitToolbar and digitToolbar.GetLayer():
                 # vector map already edited
-                if digit.layers[digit.layerSelectedID] == layer:
+                if digitToolbar.GetLayer() is layer:
                     self.popupMenu.Enable (self.popupID5, False)
                     self.popupMenu.Enable(self.popupID6, True)
                     self.popupMenu.Enable(self.popupID1, False)
@@ -535,7 +535,6 @@
             self.Bind(wx.EVT_BUTTON, self.OnLayerContextMenu, ctrl)
         # add layer to the layer tree
         if self.layer_selected and self.layer_selected != self.GetRootItem():
-            
             if self.GetPyData(self.layer_selected)[0]['type'] == 'group' \
                 and self.IsExpanded(self.layer_selected):
                 # add to group (first child of self.layer_selected) if group expanded
@@ -550,6 +549,8 @@
                 elif lgroup is True:
                     # -> last child of group (loading from workspace)
                     parent = self.GetItemParent(self.layer_selected)
+                    if parent is self.root: # first item in group
+                        parent=self.layer_selected
                     layer = self.AppendItem(parentId=parent,
                                             text='', ct_type=1, wnd=ctrl)
                 elif lgroup is None:
@@ -573,7 +574,7 @@
         # select new item
         self.SelectItem(layer, select=True)
         self.layer_selected = layer
-
+        
         # add text and icons for each layer ltype
         if ltype == 'raster':
             self.SetItemImage(layer, self.rast_icon)
@@ -673,10 +674,12 @@
 
         # use predefined layer name if given
         if lname:
-            if ltype != 'command':
-                if opacity:
-                    name = lname + ' (opacity: ' + str(opacity) + '%)'
-                self.SetItemText(layer, name )
+            if ltype == 'group':
+                self.SetItemText(layer, lname)
+            elif ltype != 'command':
+                name = lname + ' (opacity: ' + \
+                       str(self.GetPyData(layer)[0]['maplayer'].GetOpacity()) + '%)'
+                self.SetItemText(layer, name)
             else:
                 ctrl.SetValue(lname)
 
@@ -825,17 +828,26 @@
         """Enable/disable data layer"""
         item    = event.GetItem()
         checked = item.IsChecked()
-        
+
+        digitToolbar = self.mapdisplay.toolbars['vdigit']
         if self.first == False:
             # change active parameter for item in layers list in render.Map
             if self.GetPyData(item)[0]['type'] == 'group':
                 child, cookie = self.GetFirstChild(item)
                 while child:
                     self.CheckItem(child, checked)
-                    self.Map.ChangeLayerActive(self.GetPyData(child)[0]['maplayer'], checked)
+                    mapLayer = self.GetPyData(child)[0]['maplayer']
+                    if not digitToolbar or \
+                           (digitToolbar and digitToolbar.GetLayer() != mapLayer):
+                        # ignore when map layer is edited
+                        self.Map.ChangeLayerActive(mapLayer, checked)
                     child = self.GetNextSibling(child)
             else:
-                self.Map.ChangeLayerActive(self.GetPyData(item)[0]['maplayer'], checked)
+                mapLayer = self.GetPyData(item)[0]['maplayer']
+                if not digitToolbar or \
+                       (digitToolbar and digitToolbar.GetLayer() != mapLayer):
+                    # ignore when map layer is edited
+                    self.Map.ChangeLayerActive(mapLayer, checked)
 
         # update progress bar range (mapwindow statusbar)
         self.mapdisplay.onRenderGauge.SetRange(len(self.Map.GetListOfLayers(l_active=True)))



More information about the grass-commit mailing list