Explorar el Código

wxGUI/mapdisp: querying uses giface to ask for layers (layer representation not finished), querying in d.mon works

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@54881 15284696-431f-4ddb-bdfa-cd5b030d7da7
Vaclav Petras hace 12 años
padre
commit
0e71617fb8

+ 2 - 2
gui/wxpython/core/giface.py

@@ -88,9 +88,9 @@ class StandaloneGrassInterface():
         function(text)
         os.environ["GRASS_MESSAGE_FORMAT"] = orig
 
-    def GetLayerTree(self):
+    def GetLayerList(self):
         return None
-
+        
     def GetMapDisplay(self):
         """!Get current map display.
         """

+ 33 - 1
gui/wxpython/lmgr/giface.py

@@ -15,6 +15,35 @@ This program is free software under the GNU General Public License
 @author Vaclav Petras <wenzeslaus gmail.com>
 """
 
+
+class Layer(object):
+    def __init__(self, pydata):
+        self._pydata = pydata
+
+    def __getattr__(self, name):
+        return self._pydata[0][name]
+
+
+class LayerList(object):
+    def __init__(self, tree):
+        self._tree = tree
+
+#    def __iter__(self):
+#        for in :
+#            yield 
+
+    def GetSelectedLayers(self, checkedOnly = True):
+        items = self._tree.GetSelectedLayer(multi = True, checkedOnly = True)
+        layers = []
+        for item in items:
+            layer = Layer(self._tree.GetPyData(item))
+            layers.append(layer)
+        return layers
+
+    def GetLayerInfo(self, layer):
+        return Layer(self._tree.GetPyData(layer))
+
+
 class LayerManagerGrassInterface:
     def __init__(self, lmgr):
         self.lmgr = lmgr
@@ -41,7 +70,10 @@ class LayerManagerGrassInterface:
         self.lmgr._gconsole.WriteError(line = line)
 
     def GetLayerTree(self):
-        return self.lmgr.GetLayerTree()
+        return LayerList(self.lmgr.GetLayerTree())
+
+    def GetLayerList(self):
+        return LayerList(self.lmgr.GetLayerTree())
 
     def GetMapDisplay(self):
         """!Get current map display.

+ 15 - 9
gui/wxpython/mapdisp/frame.py

@@ -638,7 +638,7 @@ class MapFrame(SingleMapFrame):
             if pgnum > -1:
                 self.layerbook.DeletePage(pgnum)
 
-    def Query(self, x, y, layers):
+    def Query(self, x, y):
         """!Query selected layers. 
 
         Calls QueryMap in case of raster or more vectors,
@@ -647,9 +647,10 @@ class MapFrame(SingleMapFrame):
         @param x,y coordinates
         @param layers selected tree item layers
         """
+        layers = self._giface.GetLayerList().GetSelectedLayers(checkedOnly = True)
         filteredLayers = []
         for layer in layers:
-            ltype = self.tree.GetLayerInfo(layer, key = 'maplayer').GetType()
+            ltype = layer.maplayer.GetType()
             if ltype in ('raster', 'rgb', 'his',
                          'vector', 'thememap', 'themechart'):
                 filteredLayers.append(layer)
@@ -662,7 +663,12 @@ class MapFrame(SingleMapFrame):
         layers = filteredLayers
         # set query snap distance for v.what at map unit equivalent of 10 pixels
         qdist = 10.0 * ((self.Map.region['e'] - self.Map.region['w']) / self.Map.width)
-        east, north = self.MapWindow.Pixel2Cell((x, y))
+
+        # TODO: replace returning None by exception or so
+        try:
+            east, north = self.MapWindow.Pixel2Cell((x, y))
+        except TypeError:
+            return
 
         posWindow = self.ClientToScreen((x + self.MapWindow.dialogOffset,
                                          y + self.MapWindow.dialogOffset))
@@ -671,7 +677,7 @@ class MapFrame(SingleMapFrame):
         nVectors = 0
         isDbConnection = False
         for l in layers:
-            maplayer = self.tree.GetLayerInfo(l, key = 'maplayer')
+            maplayer = l.maplayer
             if maplayer.GetType() == 'raster':
                 isRaster = True
                 break
@@ -705,8 +711,8 @@ class MapFrame(SingleMapFrame):
         vcmd = ['v.what', '--v']
         
         for layer in layers:
-            ltype = self.tree.GetLayerInfo(layer, key = 'maplayer').GetType()
-            dcmd = self.tree.GetLayerInfo(layer, key = 'cmd')
+            ltype = layer.maplayer.GetType()
+            dcmd = layer.cmd
             name, found = GetLayerNameFromCmd(dcmd)
             
             if not found:
@@ -784,9 +790,9 @@ class MapFrame(SingleMapFrame):
         Attribute data of selected vector object are displayed in GUI dialog.
         Data can be modified (On Submit)
         """
-        mapName = self.tree.GetLayerInfo(layer, key = 'maplayer').name
+        mapName = layer.maplayer.name
         
-        if self.tree.GetLayerInfo(layer, key = 'maplayer').GetMapset() != \
+        if layer.maplayer.GetMapset() != \
                 grass.gisenv()['MAPSET']:
             mode = 'display'
         else:
@@ -832,7 +838,7 @@ class MapFrame(SingleMapFrame):
                     qlayer = self.AddTmpVectorMapLayer(mapName, cats, useId = False)
                 
                 # set opacity based on queried layer
-                opacity = self.tree.GetLayerInfo(layer, key = 'maplayer').GetOpacity(float = True)
+                opacity = layer.maplayer.GetOpacity(float = True)
                 qlayer.SetOpacity(opacity)
                 
                 self.MapWindow.UpdateMap(render = False, renderVector = False)

+ 52 - 2
gui/wxpython/mapdisp/main.py

@@ -226,6 +226,54 @@ class DMonMap(Map):
         """
         return self._renderCmdFile(force, windres)
 
+
+class Layer(object):
+    def __init__(self, maplayer):
+        self._maplayer = maplayer
+
+    def __getattr__(self, name):
+        if name == 'cmd':
+            return utils.CmdTupleToList(self._maplayer.GetCmd())
+        elif hasattr(self._maplayer, name):
+            return getattr(self._maplayer, name)
+        elif name == 'maplayer':
+            return self._maplayer
+        elif name == 'type':
+            return self._maplayer.GetType()
+            #elif name == 'ctrl':
+        elif name == 'label':
+            return self._maplayer.GetName()
+            #elif name == 'maplayer' : None,
+            #elif name == 'propwin':
+
+
+class LayerList(object):
+    def __init__(self, map):
+        self._map = map
+
+#    def __iter__(self):
+#        for in :
+#            yield
+
+    def GetSelectedLayers(self, checkedOnly=True):
+        # hidden and selected vs checked and selected
+        items = self._map.GetListOfLayers()
+        layers = []
+        for item in items:
+            layer = Layer(item)
+            layers.append(layer)
+        return layers
+
+
+class DMonGrassInterface(StandaloneGrassInterface):
+    def __init__(self, mapframe):
+        StandaloneGrassInterface.__init__(self)
+        self._mapframe = mapframe
+
+    def GetLayerList(self):
+        return LayerList(self._mapframe.GetMap())
+
+
 class DMonFrame(MapFrame):
     def OnZoomToMap(self, event):
         layers = self.MapWindow.GetMap().GetListOfLayers()
@@ -244,9 +292,11 @@ class MapApp(wx.App):
 
         # actual use of StandaloneGrassInterface not yet tested
         # needed for adding functionality in future
+        giface = DMonGrassInterface(None)
         self.mapFrm = DMonFrame(parent = None, id = wx.ID_ANY, Map = self.Map,
-                                giface = StandaloneGrassInterface(),
-                                size = monSize)
+                                giface = giface, size = monSize)
+        # FIXME: hack to solve dependency
+        giface._mapframe = self.mapFrm
         # self.SetTopWindow(Map)
         self.mapFrm.GetMapWindow().SetAlwaysRenderEnabled(True)
         self.mapFrm.Show()

+ 1 - 9
gui/wxpython/mapdisp/mapwindow.py

@@ -1175,15 +1175,7 @@ class BufferedWindow(MapWindow, wx.Window):
             self.frame.StatusbarUpdate()
             
         elif self.mouse["use"] == "query":
-            # querying
-            if self.frame.IsStandalone():
-                GMessage(parent = self.frame,
-                         message = _("Querying is not implemented in standalone mode of Map Display"))
-                return
-
-            layers = self.tree.GetSelectedLayer(multi = True, checkedOnly = True)
-
-            self.frame.Query(self.mouse['begin'][0],self.mouse['begin'][1], layers)
+            self.frame.Query(self.mouse['begin'][0],self.mouse['begin'][1])
         
         elif self.mouse["use"] in ["measure", "profile"]:
             # measure or profile

+ 1 - 3
gui/wxpython/nviz/mapwindow.py

@@ -769,9 +769,7 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
                          message = _("Querying is not implemented in standalone mode of Map Display"))
                 return
 
-            layers = self.tree.GetSelectedLayer(multi = True, checkedOnly = True)
-
-            self.frame.Query(self.mouse['begin'][0],self.mouse['begin'][1], layers)
+            self.frame.Query(self.mouse['begin'][0],self.mouse['begin'][1])
 
         elif self.mouse["use"] in ('arrow', 'scalebar'):
             self.lmgr.nviz.FindWindowById(