浏览代码

wxGUI: specify pdc in Graphics API, change pdc where rdigit objects are drawn to avoid problems with pen styles (other than solid) when drawing using wx.GCDC

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@63937 15284696-431f-4ddb-bdfa-cd5b030d7da7
Anna Petrášová 10 年之前
父节点
当前提交
acefdde4a0

+ 1 - 1
gui/wxpython/mapwin/analysis.py

@@ -76,7 +76,7 @@ class AnalysisControllerBase:
         item.SetCoords(coords)
         item.SetCoords(coords)
         # draw
         # draw
         self._mapWindow.ClearLines()
         self._mapWindow.ClearLines()
-        self._registeredGraphics.Draw(pdc=self._mapWindow.pdcTmp)
+        self._registeredGraphics.Draw()
         self._mapWindow.Refresh()
         self._mapWindow.Refresh()
         wx.Yield()
         wx.Yield()
 
 

+ 16 - 17
gui/wxpython/mapwin/buffered.py

@@ -209,8 +209,8 @@ class BufferedMapWindow(MapWindowBase, wx.Window):
         self.pdc = wx.PseudoDC()
         self.pdc = wx.PseudoDC()
         # used for digitization tool
         # used for digitization tool
         self.pdcVector = None
         self.pdcVector = None
-        # decorations (region box, etc.)
-        self.pdcDec = wx.PseudoDC()
+        # transparent objects (region box, raster digitizer)
+        self.pdcTransparent = wx.PseudoDC()
         # pseudoDC for temporal objects (select box, measurement tool, etc.)
         # pseudoDC for temporal objects (select box, measurement tool, etc.)
         self.pdcTmp = wx.PseudoDC()
         self.pdcTmp = wx.PseudoDC()
 
 
@@ -555,21 +555,16 @@ class BufferedMapWindow(MapWindowBase, wx.Window):
             self.pdc.DrawBitmap(self.bufferLast, 0, 0, False)
             self.pdc.DrawBitmap(self.bufferLast, 0, 0, False)
             self.pdc.DrawToDC(dc)
             self.pdc.DrawToDC(dc)
 
 
-        # draw decorations (e.g. region box)
+        # draw semitransparent objects (e.g. region box, raster digitizer objects)
         try:
         try:
             gcdc = wx.GCDC(dc)
             gcdc = wx.GCDC(dc)
-            self.pdcDec.DrawToDC(gcdc)
+            self.pdcTransparent.DrawToDC(gcdc)
         except NotImplementedError as e:
         except NotImplementedError as e:
             print >> sys.stderr, e
             print >> sys.stderr, e
-            self.pdcDec.DrawToDC(dc)
-        # draw temporary object on the foreground
-        try:
-            gcdc = wx.GCDC(dc)
-            self.pdcTmp.DrawToDC(gcdc)
-        except NotImplementedError as e:
-            print >> sys.stderr, e
-            self.pdcTmp.DrawToDC(dc)
+            self.pdcTransparent.DrawToDC(dc)
 
 
+        # draw temporary object on the foreground
+        self.pdcTmp.DrawToDC(dc)
 
 
         if switchDraw:
         if switchDraw:
             self.redrawAll = False
             self.redrawAll = False
@@ -854,7 +849,7 @@ class BufferedMapWindow(MapWindowBase, wx.Window):
         # clear pseudoDcs
         # clear pseudoDcs
         #
         #
         for pdc in (self.pdc,
         for pdc in (self.pdc,
-                    self.pdcDec,
+                    self.pdcTransparent,
                     self.pdcTmp):
                     self.pdcTmp):
             pdc.Clear()
             pdc.Clear()
             pdc.RemoveAll()
             pdc.RemoveAll()
@@ -905,7 +900,7 @@ class BufferedMapWindow(MapWindowBase, wx.Window):
 
 
             for item in self.graphicsSetList:
             for item in self.graphicsSetList:
                 try:
                 try:
-                    item.Draw(self.pdcTmp)
+                    item.Draw()
                 except:
                 except:
                     GError(parent = self,
                     GError(parent = self,
                            message = _('Unable to draw registered graphics. '
                            message = _('Unable to draw registered graphics. '
@@ -950,7 +945,7 @@ class BufferedMapWindow(MapWindowBase, wx.Window):
             regionCoords.append((reg['w'], reg['s']))
             regionCoords.append((reg['w'], reg['s']))
             regionCoords.append((reg['w'], reg['n']))
             regionCoords.append((reg['w'], reg['n']))
             # draw region extent
             # draw region extent
-            self.DrawLines(pdc=self.pdcDec, polycoords=regionCoords)
+            self.DrawLines(pdc=self.pdcTransparent, polycoords=regionCoords)
 
 
     def EraseMap(self):
     def EraseMap(self):
         """Erase map canvas
         """Erase map canvas
@@ -960,7 +955,7 @@ class BufferedMapWindow(MapWindowBase, wx.Window):
         if hasattr(self, "digit"):
         if hasattr(self, "digit"):
             self.Draw(self.pdcVector, pdctype = 'clear')
             self.Draw(self.pdcVector, pdctype = 'clear')
 
 
-        self.Draw(self.pdcDec, pdctype = 'clear')
+        self.Draw(self.pdcTransparent, pdctype='clear')
         self.Draw(self.pdcTmp, pdctype = 'clear')
         self.Draw(self.pdcTmp, pdctype = 'clear')
 
 
         self.Map.AbortAllThreads()
         self.Map.AbortAllThreads()
@@ -2053,11 +2048,12 @@ class BufferedMapWindow(MapWindowBase, wx.Window):
         """Get render.Map() instance"""
         """Get render.Map() instance"""
         return self.Map
         return self.Map
 
 
-    def RegisterGraphicsToDraw(self, graphicsType, setStatusFunc=None, drawFunc=None,
+    def RegisterGraphicsToDraw(self, graphicsType, pdc=None, setStatusFunc=None, drawFunc=None,
                                mapCoords=True):
                                mapCoords=True):
         """This method registers graphics to draw.
         """This method registers graphics to draw.
 
 
         :param type: (string) - graphics type: "point", "line" or "rectangle"
         :param type: (string) - graphics type: "point", "line" or "rectangle"
+        :param pdc: PseudoDC object, default is pdcTmp
         :param setStatusFunc: function called before drawing each item
         :param setStatusFunc: function called before drawing each item
                               Status function should be in this form:
                               Status function should be in this form:
                               setStatusFunc(item, itemOrderNum)
                               setStatusFunc(item, itemOrderNum)
@@ -2074,8 +2070,11 @@ class BufferedMapWindow(MapWindowBase, wx.Window):
 
 
         :return: reference to GraphicsSet, which was added.
         :return: reference to GraphicsSet, which was added.
         """
         """
+        if not pdc:
+            pdc = self.pdcTmp
         item = GraphicsSet(parentMapWin=self,
         item = GraphicsSet(parentMapWin=self,
                            graphicsType=graphicsType,
                            graphicsType=graphicsType,
+                           pdc=pdc,
                            setStatusFunc=setStatusFunc,
                            setStatusFunc=setStatusFunc,
                            drawFunc=drawFunc,
                            drawFunc=drawFunc,
                            mapCoords=mapCoords)
                            mapCoords=mapCoords)

+ 11 - 13
gui/wxpython/mapwin/graphics.py

@@ -25,7 +25,7 @@ from core.utils import _
 
 
 class GraphicsSet:
 class GraphicsSet:
 
 
-    def __init__(self, parentMapWin, graphicsType,
+    def __init__(self, parentMapWin, graphicsType, pdc,
                  setStatusFunc=None, drawFunc=None, mapCoords=True):
                  setStatusFunc=None, drawFunc=None, mapCoords=True):
         """Class, which contains instances of GraphicsSetItem and
         """Class, which contains instances of GraphicsSetItem and
             draws them For description of parameters look at method
             draws them For description of parameters look at method
@@ -49,6 +49,7 @@ class GraphicsSet:
         self.parentMapWin = parentMapWin
         self.parentMapWin = parentMapWin
         self.setStatusFunc = setStatusFunc
         self.setStatusFunc = setStatusFunc
         self.mapCoords = mapCoords
         self.mapCoords = mapCoords
+        self.pdc = pdc
 
 
         if drawFunc:
         if drawFunc:
             self.drawFunc = drawFunc
             self.drawFunc = drawFunc
@@ -74,14 +75,11 @@ class GraphicsSet:
         elif self.graphicsType == "polygon":
         elif self.graphicsType == "polygon":
             self.drawFunc = self.parentMapWin.DrawPolygon
             self.drawFunc = self.parentMapWin.DrawPolygon
 
 
-    def Draw(self, pdc):
-        """Draws all containing items.
-
-        :param pdc: device context, where items are drawn
-        """
+    def Draw(self):
+        """Draws all containing items."""
         itemOrderNum = 0
         itemOrderNum = 0
         for item in self.itemsList:
         for item in self.itemsList:
-            self._clearId(pdc, item.GetId())
+            self._clearId(item.GetId())
             if self.setStatusFunc is not None:
             if self.setStatusFunc is not None:
                 self.setStatusFunc(item, itemOrderNum)
                 self.setStatusFunc(item, itemOrderNum)
 
 
@@ -111,7 +109,7 @@ class GraphicsSet:
                     self.properties["text"]['color'] = self.parentMapWin.pen.GetColour()
                     self.properties["text"]['color'] = self.parentMapWin.pen.GetColour()
                     self.properties["text"]['text'] = label
                     self.properties["text"]['text'] = label
 
 
-                self.drawFunc(pdc=pdc, drawid=item.GetId(),
+                self.drawFunc(pdc=self.pdc, drawid=item.GetId(),
                               coords=coords,
                               coords=coords,
                               text=self.properties["text"],
                               text=self.properties["text"],
                               size=self.properties["size"])
                               size=self.properties["size"])
@@ -127,7 +125,7 @@ class GraphicsSet:
                 else:
                 else:
                     coords = item.GetCoords()
                     coords = item.GetCoords()
 
 
-                self.drawFunc(pdc=pdc, pen=pen,
+                self.drawFunc(pdc=self.pdc, pen=pen,
                               coords=coords, drawid=item.GetId())
                               coords=coords, drawid=item.GetId())
 
 
             elif self.graphicsType == "rectangle":
             elif self.graphicsType == "rectangle":
@@ -144,7 +142,7 @@ class GraphicsSet:
                 else:
                 else:
                     coords = item.GetCoords()
                     coords = item.GetCoords()
 
 
-                self.drawFunc(pdc=pdc, pen=pen, brush=brush, drawid=item.GetId(),
+                self.drawFunc(pdc=self.pdc, pen=pen, brush=brush, drawid=item.GetId(),
                               point1=coords[0],
                               point1=coords[0],
                               point2=coords[1])
                               point2=coords[1])
 
 
@@ -162,7 +160,7 @@ class GraphicsSet:
                 else:
                 else:
                     coords = item.GetCoords()
                     coords = item.GetCoords()
 
 
-                self.drawFunc(pdc=pdc, pen=pen, brush=brush,
+                self.drawFunc(pdc=self.pdc, pen=pen, brush=brush,
                               coords=coords, drawid=item.GetId())
                               coords=coords, drawid=item.GetId())
             itemOrderNum += 1
             itemOrderNum += 1
 
 
@@ -357,10 +355,10 @@ class GraphicsSet:
         except ValueError:
         except ValueError:
             return None
             return None
 
 
-    def _clearId(self, pdc, drawid):
+    def _clearId(self, drawid):
         """Clears old object before drawing new object."""
         """Clears old object before drawing new object."""
         try:
         try:
-            pdc.ClearId(drawid)
+            self.pdc.ClearId(drawid)
         except:
         except:
             pass
             pass
 
 

+ 9 - 6
gui/wxpython/rdigit/controller.py

@@ -157,9 +157,9 @@ class RDigitController(wx.EvtHandler):
             self._finish()
             self._finish()
         # draw
         # draw
         self._mapWindow.ClearLines()
         self._mapWindow.ClearLines()
-        self._lines.Draw(pdc=self._mapWindow.pdcTmp)
-        self._areas.Draw(pdc=self._mapWindow.pdcTmp)
-        self._points.Draw(pdc=self._mapWindow.pdcTmp)
+        self._lines.Draw()
+        self._areas.Draw()
+        self._points.Draw()
         self._mapWindow.Refresh()
         self._mapWindow.Refresh()
 
 
     def _finish(self):
     def _finish(self):
@@ -190,9 +190,9 @@ class RDigitController(wx.EvtHandler):
         self.newFeatureCreated.emit()
         self.newFeatureCreated.emit()
 
 
         self._mapWindow.ClearLines()
         self._mapWindow.ClearLines()
-        self._points.Draw(pdc=self._mapWindow.pdcTmp)
-        self._areas.Draw(pdc=self._mapWindow.pdcTmp)
-        self._lines.Draw(pdc=self._mapWindow.pdcTmp)
+        self._points.Draw()
+        self._areas.Draw()
+        self._lines.Draw()
 
 
         self._mapWindow.Refresh()
         self._mapWindow.Refresh()
 
 
@@ -255,16 +255,19 @@ class RDigitController(wx.EvtHandler):
 
 
         color = self._drawColor[:3] + (self._drawTransparency,)
         color = self._drawColor[:3] + (self._drawTransparency,)
         self._areas = self._mapWindow.RegisterGraphicsToDraw(graphicsType='polygon',
         self._areas = self._mapWindow.RegisterGraphicsToDraw(graphicsType='polygon',
+                                                             pdc=self._mapWindow.pdcTransparent,
                                                              mapCoords=True)
                                                              mapCoords=True)
         self._areas.AddPen('pen1', wx.Pen(colour=color, width=2, style=wx.SOLID))
         self._areas.AddPen('pen1', wx.Pen(colour=color, width=2, style=wx.SOLID))
         self._areas.AddBrush('done', wx.Brush(colour=color, style=wx.SOLID))
         self._areas.AddBrush('done', wx.Brush(colour=color, style=wx.SOLID))
 
 
         self._lines = self._mapWindow.RegisterGraphicsToDraw(graphicsType='line',
         self._lines = self._mapWindow.RegisterGraphicsToDraw(graphicsType='line',
+                                                             pdc=self._mapWindow.pdcTransparent,
                                                              mapCoords=True)
                                                              mapCoords=True)
         self._lines.AddPen('pen1', wx.Pen(colour=color, width=2, style=wx.SOLID))
         self._lines.AddPen('pen1', wx.Pen(colour=color, width=2, style=wx.SOLID))
         self._lines.AddBrush('done', wx.Brush(colour=color, style=wx.SOLID))
         self._lines.AddBrush('done', wx.Brush(colour=color, style=wx.SOLID))
 
 
         self._points = self._mapWindow.RegisterGraphicsToDraw(graphicsType='point',
         self._points = self._mapWindow.RegisterGraphicsToDraw(graphicsType='point',
+                                                              pdc=self._mapWindow.pdcTransparent,
                                                               mapCoords=True)
                                                               mapCoords=True)
         self._points.AddPen('pen1', wx.Pen(colour=color, width=2, style=wx.SOLID))
         self._points.AddPen('pen1', wx.Pen(colour=color, width=2, style=wx.SOLID))
         self._points.AddBrush('done', wx.Brush(colour=color, style=wx.SOLID))
         self._points.AddBrush('done', wx.Brush(colour=color, style=wx.SOLID))

+ 4 - 4
gui/wxpython/rlisetup/sampling_frame.py

@@ -182,7 +182,7 @@ class RLiSetupMapPanel(wx.Panel):
         item.SetCoords(coords)
         item.SetCoords(coords)
         item.SetPropertyVal('hide', False)
         item.SetPropertyVal('hide', False)
         self.mapWindow.ClearLines()
         self.mapWindow.ClearLines()
-        self._registeredGraphics.Draw(self.mapWindow.pdcTmp)
+        self._registeredGraphics.Draw()
 
 
     def _mouseDbClick(self, x, y):
     def _mouseDbClick(self, x, y):
         item = self._registeredGraphics.GetItem(0)
         item = self._registeredGraphics.GetItem(0)
@@ -191,7 +191,7 @@ class RLiSetupMapPanel(wx.Panel):
         item.SetCoords(coords)
         item.SetCoords(coords)
         item.SetPropertyVal('hide', False)
         item.SetPropertyVal('hide', False)
         self.mapWindow.ClearLines()
         self.mapWindow.ClearLines()
-        self._registeredGraphics.Draw(self.mapWindow.pdc)
+        self._registeredGraphics.Draw()
         self.createRegion()
         self.createRegion()
 
 
     def createRegion(self):
     def createRegion(self):
@@ -294,7 +294,7 @@ class RLiSetupMapPanel(wx.Panel):
         self.mapWindow.pdcTmp.SetPen(pen)
         self.mapWindow.pdcTmp.SetPen(pen)
         self.mapWindow.pdcTmp.DrawCircle(circle.point[0], circle.point[1],
         self.mapWindow.pdcTmp.DrawCircle(circle.point[0], circle.point[1],
                                          circle.radius)
                                          circle.radius)
-        self._registeredGraphics.Draw(self.mapWindow.pdcTmp)
+        self._registeredGraphics.Draw()
         self.createCricle(circle)
         self.createCricle(circle)
 
 
     def createCricle(self, c):
     def createCricle(self, c):
@@ -352,7 +352,7 @@ class RLiSetupMapPanel(wx.Panel):
                   'e': max(p1[0], p2[0])}
                   'e': max(p1[0], p2[0])}
         item.SetPropertyVal('hide', False)
         item.SetPropertyVal('hide', False)
         self.mapWindow.ClearLines()
         self.mapWindow.ClearLines()
-        self._registeredGraphics.Draw(self.mapWindow.pdcTmp)
+        self._registeredGraphics.Draw()
         if self.samplingtype in [SamplingType.MUNITSR, SamplingType.MMVWINR]:
         if self.samplingtype in [SamplingType.MUNITSR, SamplingType.MMVWINR]:
             dlg = wx.MessageDialog(self, "Is this area ok?",
             dlg = wx.MessageDialog(self, "Is this area ok?",
                                    "select sampling unit",
                                    "select sampling unit",