Browse Source

wxGUI: fix SaveToFile() - multithread rendering

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@65321 15284696-431f-4ddb-bdfa-cd5b030d7da7
Martin Landa 10 years ago
parent
commit
83cfd05335
1 changed files with 28 additions and 9 deletions
  1. 28 9
      gui/wxpython/mapwin/buffered.py

+ 28 - 9
gui/wxpython/mapwin/buffered.py

@@ -623,20 +623,34 @@ class BufferedMapWindow(MapWindowBase, wx.Window):
         :param width: image width
         :param height: image height
         """
-        busy = wx.BusyInfo(message = _("Please wait, exporting image..."),
-                           parent = self)
+        Debug.msg(1, "MapWindow.SaveToFile(): %s (%dx%d)", FileName, width, height)
+        
+        self._fileName = FileName
+        self._fileType = FileType
+        
+        self._busy = wx.BusyInfo(message = _("Please wait, exporting image..."),
+                                 parent = self)
         wx.Yield()
 
         self.Map.ChangeMapSize((width, height))
-        ibuffer = wx.EmptyBitmap(max(1, width), max(1, height))
         self.Map.Render(force = True, windres = self._properties.resolution)
+        renderMgr = self.Map.GetRenderMgr()
+        renderMgr.renderDone.disconnect(self._updateMFinished)
+        renderMgr.renderDone.connect(self._saveToFileDone)
+
+    def _saveToFileDone(self):
+        renderMgr = self.Map.GetRenderMgr()
+        renderMgr.renderDone.disconnect(self._saveToFileDone)
+        
+        ibuffer = wx.EmptyBitmap(max(1, self.Map.width), max(1, self.Map.height))
+        
         img = self.GetImage()
         self.pdc.RemoveAll()
         self.Draw(self.pdc, img, drawid = 99)
 
         # compute size ratio to move overlay accordingly
         cSize = self.GetClientSizeTuple()
-        ratio = float(width) / cSize[0], float(height) / cSize[1]
+        ratio = float(self.Map.width) / cSize[0], float(self.Map.height) / cSize[1]
 
         # redraw legend, scalebar
         for img in self.GetOverlay():
@@ -666,13 +680,18 @@ class BufferedMapWindow(MapWindowBase, wx.Window):
         self.pdc.DrawToDC(dc)
         if self.pdcVector:
             self.pdcVector.DrawToDC(dc)
-        ibuffer.SaveFile(FileName, FileType)
-
-        busy.Destroy()
-
+        ibuffer.SaveFile(self._fileName, self._fileType)
+        
+        self._busy.Destroy()
+        del self._busy
+        del self._fileName
+        del self._fileType
+        
+        renderMgr.renderDone.connect(self._updateMFinished)
+        
         self.UpdateMap(render = True)
         self.Refresh()
-
+        
     def GetOverlay(self):
         """Converts rendered overlay files to wx.Image