Browse Source

d.mon wx: better integration of vector legend, fix d.erase when no legend is there, d.erase now removes overlays properly

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@69168 15284696-431f-4ddb-bdfa-cd5b030d7da7
Anna Petrášová 8 years ago
parent
commit
591d6d2f8d

+ 2 - 2
display/d.mon/render_cmd.py

@@ -107,7 +107,7 @@ if __name__ == "__main__":
     width, height, legfile = read_env_file(os.path.join(path, 'env'))
     if mon.startswith('wx'):
         mapfile = tempfile.NamedTemporaryFile(dir=path).name
-        if cmd[0] in ('d.barscale', 'd.legend', 'd.northarrow'):
+        if cmd[0] in ('d.barscale', 'd.legend', 'd.northarrow', 'd.legend.vect'):
             mapfile += '.png'
         else:
             mapfile += '.ppm'
@@ -117,7 +117,7 @@ if __name__ == "__main__":
 
     render(cmd, mapfile)
     update_cmd_file(os.path.join(path, 'cmd'), cmd, mapfile)
-    if cmd[0] == 'd.erase':
+    if cmd[0] == 'd.erase' and os.path.exists(legfile):
         os.remove(legfile)
 
 

+ 3 - 0
gui/wxpython/core/render.py

@@ -481,6 +481,9 @@ class RenderMapMgr(wx.EvtHandler):
         if os.path.exists(self.Map.mapfile):
             os.remove(self.Map.mapfile)
 
+    def UpdateRenderEnv(self, env):
+        self._render_env.update(env)
+
     def _renderLayers(self, env, force=False, overlaysOnly=False):
         """Render all map layers into files
 

+ 4 - 6
gui/wxpython/mapdisp/frame.py

@@ -142,8 +142,8 @@ class MapFrame(SingleMapFrame):
             properties=self.mapWindowProperties, overlays=self.decorations)
         self.MapWindow2D.mapQueried.connect(self.Query)
         self.MapWindow2D.overlayActivated.connect(self._activateOverlay)
-        self.MapWindow2D.overlayRemoved.connect(self._removeOverlay)
-        self.MapWindow2D.overlayRemoved.connect(self._removeOverlay)
+        self.MapWindow2D.overlayRemoved.connect(self.RemoveOverlay)
+        self.MapWindow2D.overlayRemoved.connect(self.RemoveOverlay)
         self._setUpMapWindow(self.MapWindow2D)
 
         self.MapWindow2D.mouseHandlerUnregistered.connect(self.ResetPointer)
@@ -407,7 +407,7 @@ class MapFrame(SingleMapFrame):
             self.MapWindow3D.ResetViewHistory()
             self.MapWindow3D.UpdateView(None)
             self.MapWindow3D.overlayActivated.connect(self._activateOverlay)
-            self.MapWindow3D.overlayRemoved.connect(self._removeOverlay)
+            self.MapWindow3D.overlayRemoved.connect(self.RemoveOverlay)
         else:
             self._switchMapWindow(self.MapWindow3D)
             os.environ['GRASS_REGION'] = self.Map.SetRegion(
@@ -1201,7 +1201,7 @@ class MapFrame(SingleMapFrame):
         else:
             dlg.Show()
 
-    def _removeOverlay(self, overlayId):
+    def RemoveOverlay(self, overlayId):
         """Hide overlay.
 
         :param overlayId: id of overlay
@@ -1255,14 +1255,12 @@ class MapFrame(SingleMapFrame):
         else:
             show = True
             cmd = ['d.legend.vect']
-            layers = self._giface.GetLayerList().GetSelectedLayers()
 
         GUI(parent=self, giface=self._giface, show=show, modal=False).ParseCommand(
             cmd, completed=(self.GetOptData, None, None))
 
         self.MapWindow.mouse['use'] = 'pointer'
 
-
     def AddArrow(self, cmd=None):
         """Handler for north arrow menu selection."""
         if self.IsPaneShown('3d'):

+ 18 - 1
gui/wxpython/mapdisp/main.py

@@ -104,6 +104,15 @@ class DMonMap(Map):
 
         self.renderMgr = RenderMapMgr(self)
 
+        # update legend file variable with the one d.mon uses
+        with open(monFile['env'], 'r') as f:
+            lines = f.readlines()
+            for line in lines:
+                if 'GRASS_LEGEND_FILE' in line:
+                    legfile = line.split('=', 1)[1].strip()
+                    self.renderMgr.UpdateRenderEnv({'GRASS_LEGEND_FILE': legfile})
+                    break
+
     def GetLayersFromCmdFile(self):
         """Get list of map layers from cmdfile
         """
@@ -142,6 +151,12 @@ class DMonMap(Map):
                     self.query.emit(ltype=utils.split(dWhatCmd)[
                                     0].split('.')[-1], maps=maps)
                     return
+            else:
+                # clean overlays after erase
+                self.oldOverlays = []
+                overlays = self._giface.GetMapDisplay().decorations.keys()
+                for each in overlays:
+                    self._giface.GetMapDisplay().RemoveOverlay(each)
 
             existingLayers = self.GetListOfLayers()
 
@@ -177,7 +192,7 @@ class DMonMap(Map):
 
                 args = {}
 
-                if ltype in ('barscale', 'rastleg', 'northarrow', 'text'):
+                if ltype in ('barscale', 'rastleg', 'northarrow', 'text', 'vectleg'):
                     # TODO: this is still not optimal
                     # it is there to prevent adding the same overlay multiple times
                     if cmd in self.oldOverlays:
@@ -190,6 +205,8 @@ class DMonMap(Map):
                         self._giface.GetMapDisplay().AddArrow(cmd=cmd)
                     elif ltype == 'text':
                         self._giface.GetMapDisplay().AddDtext(cmd=cmd)
+                    elif ltype == 'vectleg':
+                        self._giface.GetMapDisplay().AddLegendVect(cmd=cmd)
                     self.oldOverlays.append(cmd)
                     continue