Forráskód Böngészése

wxGUI: hightlight queried features (patch by krejcmat)

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@67751 15284696-431f-4ddb-bdfa-cd5b030d7da7
Martin Landa 9 éve
szülő
commit
ba6efdad25
2 módosított fájl, 23 hozzáadás és 33 törlés
  1. 3 0
      gui/wxpython/gui_core/vselect.py
  2. 20 33
      gui/wxpython/mapdisp/frame.py

+ 3 - 0
gui/wxpython/gui_core/vselect.py

@@ -371,6 +371,9 @@ class VectorSelectHighlighter():
         self.data['Category'] = cats
 
     def Clear(self):
+        self.data['Category'] = list()
+        self.data['Map'] = None
+        self.data['Layer']= None
         self.mapdisp.RemoveQueryLayer()
         self.giface.GetMapWindow().UpdateMap(render = False)
 

+ 20 - 33
gui/wxpython/mapdisp/frame.py

@@ -9,7 +9,7 @@ Can be used either from Layer Manager or as d.mon backend.
 Classes:
  - mapdisp::MapFrame
 
-(C) 2006-2014 by the GRASS Development Team
+(C) 2006-2016 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.
@@ -53,7 +53,7 @@ from mapwin.analysis import ProfileController, MeasureDistanceController, \
     MeasureAreaController
 from gui_core.forms import GUI
 from core.giface import Notification
-from gui_core.vselect import VectorSelectBase
+from gui_core.vselect import VectorSelectBase, VectorSelectHighlighter
 
 from mapdisp import statusbar as sb
 
@@ -203,6 +203,8 @@ class MapFrame(SingleMapFrame):
         # initialize layers to query (d.what.vect/rast)
         self._vectQueryLayers = []
         self._rastQueryLayers = []
+        # initialize highlighter for vector features
+        self._highlighter_layer = None
 
         self.measureController = None
 
@@ -891,6 +893,8 @@ class MapFrame(SingleMapFrame):
         """
         Debug.msg(1, "QueryMap(): raster=%s vector=%s" % (','.join(rast),
                                                           ','.join(vect)))
+        if self._highlighter_layer is None:
+            self._highlighter_layer = VectorSelectHighlighter(mapdisp=self._giface.GetMapDisplay(), giface=self._giface)
 
         # use display region settings instead of computation region settings
         self.tmpreg = os.getenv("GRASS_REGION")
@@ -910,7 +914,9 @@ class MapFrame(SingleMapFrame):
                        message=_("Failed to query vector map(s) <{maps}>. "
                                  "Check database settings and topology.").format(maps=','.join(vect)))
         self._QueryMapDone()
-        if 'Id' in vectQuery:
+
+        self._highlighter_layer.Clear()
+        if 'Category' in vectQuery[0]:
             self._queryHighlight(vectQuery)
 
         result = rastQuery + vectQuery
@@ -928,6 +934,8 @@ class MapFrame(SingleMapFrame):
         self.dialogs['query'] = None
         self._vectQueryLayers = []
         self._rastQueryLayers = []
+        self._highlighter_layer.Clear()
+        self._highlighter_layer = None
         event.Skip()
 
     def _onRedirectQueryOutput(self, output, style='log'):
@@ -939,36 +947,15 @@ class MapFrame(SingleMapFrame):
 
     def _queryHighlight(self, vectQuery):
         """Highlight category from query."""
-        cats = name = None
-        for res in vectQuery:
-            cats = {res['Layer']: [res['Category']]}
-            name = res['Map']
-        try:
-            qlayer = self.Map.GetListOfLayers(name = globalvar.QUERYLAYER)[0]
-        except IndexError:
-            qlayer = None
-
-        if not (cats and name):
-            if qlayer:
-                self.Map.DeleteLayer(qlayer)
-                self.MapWindow.UpdateMap(render = False, renderVector = False)
-            return
-
-        if not self.IsPaneShown('3d') and self.IsAutoRendered():
-            # highlight feature & re-draw map
-            if qlayer:
-                qlayer.SetCmd(self.AddTmpVectorMapLayer(name, cats,
-                                                        useId = False,
-                                                        addLayer = False))
-            else:
-                qlayer = self.AddTmpVectorMapLayer(name, cats, useId = False)
-            
-            # set opacity based on queried layer
-            # TODO fix
-            # opacity = layer.maplayer.GetOpacity(float = True)
-            # qlayer.SetOpacity(opacity)
-            
-            self.MapWindow.UpdateMap(render = False, renderVector = False)
+        if len(vectQuery) > 0:
+            self._highlighter_layer.SetLayer(vectQuery[0]['Layer'])
+            self._highlighter_layer.SetMap(vectQuery[0]['Map'])
+            tmp = list()
+            for i in vectQuery:
+                tmp.append(i['Category'])
+
+            self._highlighter_layer.SetCats(tmp)
+            self._highlighter_layer.DrawSelected()
 
     def _QueryMapDone(self):
         """Restore settings after querying (restore GRASS_REGION)