Browse Source

fix d.to.rast, which was broken since new rendering

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@69754 15284696-431f-4ddb-bdfa-cd5b030d7da7
Anna Petrášová 8 years ago
parent
commit
c8705b4647
2 changed files with 56 additions and 52 deletions
  1. 47 49
      gui/wxpython/mapdisp/frame.py
  2. 9 3
      gui/wxpython/mapwin/buffered.py

+ 47 - 49
gui/wxpython/mapdisp/frame.py

@@ -665,7 +665,7 @@ class MapFrame(SingleMapFrame):
 
 
         dlg.Destroy()
         dlg.Destroy()
 
 
-    def DOutFile(self, command):
+    def DOutFile(self, command, callback=None):
         """Saves map to image by running d.out.file from gui or d.mon.
         """Saves map to image by running d.out.file from gui or d.mon.
         Command is expected to be validated by parser.
         Command is expected to be validated by parser.
         """
         """
@@ -699,7 +699,7 @@ class MapFrame(SingleMapFrame):
             if each['ext'] == extType:
             if each['ext'] == extType:
                 bitmapType = each['type']
                 bitmapType = each['type']
                 break
                 break
-        self.MapWindow.SaveToFile(name, bitmapType, int(width), int(height))
+        self.MapWindow.SaveToFile(name, bitmapType, int(width), int(height), callback)
 
 
     def DOutFileOptData(self, dcmd, layer, params, propwin):
     def DOutFileOptData(self, dcmd, layer, params, propwin):
         """Dummy function which is called when d.out.file is called
         """Dummy function which is called when d.out.file is called
@@ -713,6 +713,49 @@ class MapFrame(SingleMapFrame):
     def DToRast(self, command):
     def DToRast(self, command):
         """Saves currently loaded composition of layers as a raster map.
         """Saves currently loaded composition of layers as a raster map.
         """
         """
+        def _DToRastDone():
+            # import back as red, green, blue rasters
+            returncode, messages = RunCommand(
+                'r.in.gdal', flags='o', input=pngFile, output=tmpName, quiet=True,
+                overwrite=overwrite, getErrorMsg=True)
+            if not returncode == 0:
+                self._giface.WriteError(_('Failed to run d.to.rast:\n') + messages)
+                return
+            # set region for composite
+            grass.use_temp_region()
+            returncode, messages = RunCommand('g.region', raster=tmpName + '.red',
+                                              quiet=True, getErrorMsg=True)
+            if not returncode == 0:
+                grass.del_temp_region()
+                self._giface.WriteError(_('Failed to run d.to.rast:\n') + messages)
+                return
+            # composite
+            returncode, messages = RunCommand(
+                'r.composite', red=tmpName + '.red', green=tmpName + '.green',
+                blue=tmpName + '.blue', output=outputRaster, quiet=True,
+                overwrite=overwrite, getErrorMsg=True)
+            grass.del_temp_region()
+            RunCommand(
+                'g.remove',
+                type='raster',
+                flags='f',
+                quiet=True,
+                name=[tmpName + '.red', tmpName + '.green', tmpName + '.blue'])
+            if not returncode == 0:
+                self._giface.WriteError(_('Failed to run d.to.rast:\n') + messages)
+                grass.try_remove(pngFile)
+                return
+    
+            # alignExtent changes only region variable
+            oldRegion = self.GetMap().GetCurrentRegion().copy()
+            self.GetMap().AlignExtentFromDisplay()
+            region = self.GetMap().GetCurrentRegion().copy()
+            self.GetMap().region.update(oldRegion)
+            RunCommand('r.region', map=outputRaster, n=region['n'], s=region['s'],
+                       e=region['e'], w=region['w'], quiet=True)
+            grass.try_remove(pngFile)
+
+
         if self.IsPaneShown('3d'):
         if self.IsPaneShown('3d'):
             self._giface.WriteError(
             self._giface.WriteError(
                 _('d.to.rast can be used only in 2D mode.'))
                 _('d.to.rast can be used only in 2D mode.'))
@@ -734,54 +777,9 @@ class MapFrame(SingleMapFrame):
         tmpName = 'd_to_rast_tmp'
         tmpName = 'd_to_rast_tmp'
         pngFile = grass.tempfile(create=False) + '.png'
         pngFile = grass.tempfile(create=False) + '.png'
         dOutFileCmd = ['d.out.file', 'output=' + pngFile, 'format=png']
         dOutFileCmd = ['d.out.file', 'output=' + pngFile, 'format=png']
-        self.DOutFile(dOutFileCmd)
-        # import back as red, green, blue rasters
-        returncode, messages = RunCommand(
-            'r.in.gdal', flags='o', input=pngFile, output=tmpName, quiet=True,
-            overwrite=overwrite, getErrorMsg=True)
-        if not returncode == 0:
-            self._giface.WriteError(_('Failed to run d.to.rast:\n') + messages)
-            return
-        # set region for composite
-        grass.use_temp_region()
-        returncode, messages = RunCommand('g.region', raster=tmpName + '.red',
-                                          quiet=True, getErrorMsg=True)
-        if not returncode == 0:
-            grass.del_temp_region()
-            self._giface.WriteError(_('Failed to run d.to.rast:\n') + messages)
-            return
-        # composite
-        returncode, messages = RunCommand(
-            'r.composite', red=tmpName + '.red', green=tmpName + '.green',
-            blue=tmpName + '.blue', output=outputRaster, quiet=True,
-            overwrite=overwrite, getErrorMsg=True)
-        grass.del_temp_region()
-        RunCommand(
-            'g.remove',
-            type='raster',
-            flags='f',
-            quiet=True,
-            name=[
-                tmpName +
-                '.red',
-                tmpName +
-                '.green',
-                tmpName +
-                '.blue'])
-        if not returncode == 0:
-            self._giface.WriteError(_('Failed to run d.to.rast:\n') + messages)
-            grass.try_remove(pngFile)
-            return
-
-        # alignExtent changes only region variable
-        oldRegion = self.GetMap().GetCurrentRegion().copy()
-        self.GetMap().AlignExtentFromDisplay()
-        region = self.GetMap().GetCurrentRegion().copy()
-        self.GetMap().region.update(oldRegion)
-        RunCommand('r.region', map=outputRaster, n=region['n'], s=region['s'],
-                   e=region['e'], w=region['w'], quiet=True)
+        self.DOutFile(dOutFileCmd, callback=_DToRastDone)
+        
 
 
-        grass.try_remove(pngFile)
 
 
     def DToRastOptData(self, dcmd, layer, params, propwin):
     def DToRastOptData(self, dcmd, layer, params, propwin):
         """Dummy function which is called when d.to.rast is called
         """Dummy function which is called when d.to.rast is called

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

@@ -671,7 +671,7 @@ class BufferedMapWindow(MapWindowBase, wx.Window):
 
 
         event.Skip()
         event.Skip()
 
 
-    def SaveToFile(self, FileName, FileType, width, height):
+    def SaveToFile(self, FileName, FileType, width, height, callback=None):
         """This draws the pseudo DC to a buffer that can be saved to
         """This draws the pseudo DC to a buffer that can be saved to
         a file.
         a file.
 
 
@@ -689,18 +689,22 @@ class BufferedMapWindow(MapWindowBase, wx.Window):
 
 
         self._fileName = FileName
         self._fileName = FileName
         self._fileType = FileType
         self._fileType = FileType
+        self._saveToFileCallback = callback
 
 
         self._busy = wx.BusyInfo(message=_("Please wait, exporting image..."),
         self._busy = wx.BusyInfo(message=_("Please wait, exporting image..."),
                                  parent=self)
                                  parent=self)
         wx.Yield()
         wx.Yield()
 
 
         self.Map.ChangeMapSize((width, height))
         self.Map.ChangeMapSize((width, height))
-        self.Map.Render(force=True, windres=self._properties.resolution)
         renderMgr = self.Map.GetRenderMgr()
         renderMgr = self.Map.GetRenderMgr()
+        # this seems wrong, rendering should have callback
+        # when callback present, rendering does not emit signal
+        # just calls callback
         renderMgr.renderDone.disconnect(self._updateMFinished)
         renderMgr.renderDone.disconnect(self._updateMFinished)
         renderMgr.renderDone.connect(self._saveToFileDone)
         renderMgr.renderDone.connect(self._saveToFileDone)
+        self.Map.Render(force=True, windres=self._properties.resolution)
 
 
-    def _saveToFileDone(self):
+    def _saveToFileDone(self, callback=None):
         renderMgr = self.Map.GetRenderMgr()
         renderMgr = self.Map.GetRenderMgr()
         renderMgr.renderDone.disconnect(self._saveToFileDone)
         renderMgr.renderDone.disconnect(self._saveToFileDone)
 
 
@@ -756,6 +760,8 @@ class BufferedMapWindow(MapWindowBase, wx.Window):
 
 
         self.UpdateMap(render=True)
         self.UpdateMap(render=True)
         self.Refresh()
         self.Refresh()
+        if self._saveToFileCallback:
+            self._saveToFileCallback()
 
 
     def GetOverlay(self):
     def GetOverlay(self):
         """Converts rendered overlay files to wx.Image
         """Converts rendered overlay files to wx.Image