Browse Source

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 12 years ago
parent
commit
0e71617fb8

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

@@ -88,9 +88,9 @@ class StandaloneGrassInterface():
         function(text)
         function(text)
         os.environ["GRASS_MESSAGE_FORMAT"] = orig
         os.environ["GRASS_MESSAGE_FORMAT"] = orig
 
 
-    def GetLayerTree(self):
+    def GetLayerList(self):
         return None
         return None
-
+        
     def GetMapDisplay(self):
     def GetMapDisplay(self):
         """!Get current map display.
         """!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>
 @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:
 class LayerManagerGrassInterface:
     def __init__(self, lmgr):
     def __init__(self, lmgr):
         self.lmgr = lmgr
         self.lmgr = lmgr
@@ -41,7 +70,10 @@ class LayerManagerGrassInterface:
         self.lmgr._gconsole.WriteError(line = line)
         self.lmgr._gconsole.WriteError(line = line)
 
 
     def GetLayerTree(self):
     def GetLayerTree(self):
-        return self.lmgr.GetLayerTree()
+        return LayerList(self.lmgr.GetLayerTree())
+
+    def GetLayerList(self):
+        return LayerList(self.lmgr.GetLayerTree())
 
 
     def GetMapDisplay(self):
     def GetMapDisplay(self):
         """!Get current map display.
         """!Get current map display.

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

@@ -638,7 +638,7 @@ class MapFrame(SingleMapFrame):
             if pgnum > -1:
             if pgnum > -1:
                 self.layerbook.DeletePage(pgnum)
                 self.layerbook.DeletePage(pgnum)
 
 
-    def Query(self, x, y, layers):
+    def Query(self, x, y):
         """!Query selected layers. 
         """!Query selected layers. 
 
 
         Calls QueryMap in case of raster or more vectors,
         Calls QueryMap in case of raster or more vectors,
@@ -647,9 +647,10 @@ class MapFrame(SingleMapFrame):
         @param x,y coordinates
         @param x,y coordinates
         @param layers selected tree item layers
         @param layers selected tree item layers
         """
         """
+        layers = self._giface.GetLayerList().GetSelectedLayers(checkedOnly = True)
         filteredLayers = []
         filteredLayers = []
         for layer in layers:
         for layer in layers:
-            ltype = self.tree.GetLayerInfo(layer, key = 'maplayer').GetType()
+            ltype = layer.maplayer.GetType()
             if ltype in ('raster', 'rgb', 'his',
             if ltype in ('raster', 'rgb', 'his',
                          'vector', 'thememap', 'themechart'):
                          'vector', 'thememap', 'themechart'):
                 filteredLayers.append(layer)
                 filteredLayers.append(layer)
@@ -662,7 +663,12 @@ class MapFrame(SingleMapFrame):
         layers = filteredLayers
         layers = filteredLayers
         # set query snap distance for v.what at map unit equivalent of 10 pixels
         # 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)
         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,
         posWindow = self.ClientToScreen((x + self.MapWindow.dialogOffset,
                                          y + self.MapWindow.dialogOffset))
                                          y + self.MapWindow.dialogOffset))
@@ -671,7 +677,7 @@ class MapFrame(SingleMapFrame):
         nVectors = 0
         nVectors = 0
         isDbConnection = False
         isDbConnection = False
         for l in layers:
         for l in layers:
-            maplayer = self.tree.GetLayerInfo(l, key = 'maplayer')
+            maplayer = l.maplayer
             if maplayer.GetType() == 'raster':
             if maplayer.GetType() == 'raster':
                 isRaster = True
                 isRaster = True
                 break
                 break
@@ -705,8 +711,8 @@ class MapFrame(SingleMapFrame):
         vcmd = ['v.what', '--v']
         vcmd = ['v.what', '--v']
         
         
         for layer in layers:
         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)
             name, found = GetLayerNameFromCmd(dcmd)
             
             
             if not found:
             if not found:
@@ -784,9 +790,9 @@ class MapFrame(SingleMapFrame):
         Attribute data of selected vector object are displayed in GUI dialog.
         Attribute data of selected vector object are displayed in GUI dialog.
         Data can be modified (On Submit)
         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']:
                 grass.gisenv()['MAPSET']:
             mode = 'display'
             mode = 'display'
         else:
         else:
@@ -832,7 +838,7 @@ class MapFrame(SingleMapFrame):
                     qlayer = self.AddTmpVectorMapLayer(mapName, cats, useId = False)
                     qlayer = self.AddTmpVectorMapLayer(mapName, cats, useId = False)
                 
                 
                 # set opacity based on queried layer
                 # 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)
                 qlayer.SetOpacity(opacity)
                 
                 
                 self.MapWindow.UpdateMap(render = False, renderVector = False)
                 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)
         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):
 class DMonFrame(MapFrame):
     def OnZoomToMap(self, event):
     def OnZoomToMap(self, event):
         layers = self.MapWindow.GetMap().GetListOfLayers()
         layers = self.MapWindow.GetMap().GetListOfLayers()
@@ -244,9 +292,11 @@ class MapApp(wx.App):
 
 
         # actual use of StandaloneGrassInterface not yet tested
         # actual use of StandaloneGrassInterface not yet tested
         # needed for adding functionality in future
         # needed for adding functionality in future
+        giface = DMonGrassInterface(None)
         self.mapFrm = DMonFrame(parent = None, id = wx.ID_ANY, Map = self.Map,
         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.SetTopWindow(Map)
         self.mapFrm.GetMapWindow().SetAlwaysRenderEnabled(True)
         self.mapFrm.GetMapWindow().SetAlwaysRenderEnabled(True)
         self.mapFrm.Show()
         self.mapFrm.Show()

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

@@ -1175,15 +1175,7 @@ class BufferedWindow(MapWindow, wx.Window):
             self.frame.StatusbarUpdate()
             self.frame.StatusbarUpdate()
             
             
         elif self.mouse["use"] == "query":
         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"]:
         elif self.mouse["use"] in ["measure", "profile"]:
             # measure or 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"))
                          message = _("Querying is not implemented in standalone mode of Map Display"))
                 return
                 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'):
         elif self.mouse["use"] in ('arrow', 'scalebar'):
             self.lmgr.nviz.FindWindowById(
             self.lmgr.nviz.FindWindowById(