Bläddra i källkod

wxGUI/mapswipe: export display to graphic file added

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@53419 15284696-431f-4ddb-bdfa-cd5b030d7da7
Anna Petrášová 12 år sedan
förälder
incheckning
22f3ec35ef
2 ändrade filer med 75 tillägg och 2 borttagningar
  1. 72 2
      gui/wxpython/swipe/frame.py
  2. 3 0
      gui/wxpython/swipe/toolbars.py

+ 72 - 2
gui/wxpython/swipe/frame.py

@@ -14,17 +14,19 @@ This program is free software under the GNU General Public License
 @author Anna Kratochvilova <kratochanna gmail.com>
 @author Anna Kratochvilova <kratochanna gmail.com>
 """
 """
 
 
+import os
 import sys
 import sys
-import  wx
+import wx
 import time
 import time
 
 
 import grass.script as grass
 import grass.script as grass
 
 
 from gui_core.mapdisp   import DoubleMapFrame
 from gui_core.mapdisp   import DoubleMapFrame
+from gui_core.dialogs   import GetImageHandlers
 from core.render        import Map
 from core.render        import Map
 from mapdisp            import statusbar as sb
 from mapdisp            import statusbar as sb
 from core.debug         import Debug
 from core.debug         import Debug
-from core.gcmd          import RunCommand, GError
+from core.gcmd          import RunCommand, GError, GMessage
 from mapdisp.statusbar  import EVT_AUTO_RENDER
 from mapdisp.statusbar  import EVT_AUTO_RENDER
 
 
 from swipe.toolbars  import SwipeMapToolbar, SwipeMainToolbar, SwipeMiscToolbar
 from swipe.toolbars  import SwipeMapToolbar, SwipeMainToolbar, SwipeMiscToolbar
@@ -358,6 +360,74 @@ class SwipeMapFrame(DoubleMapFrame):
         # self.OnSize(None)
         # self.OnSize(None)
         splitter.OnSashChanged(None)
         splitter.OnSashChanged(None)
 
 
+    def _saveToFile(self, fileName, fileType):
+        """!Creates composite image by rendering both images and
+        pasting them into the new one.
+
+        @todo specify size of the new image (problem is inaccurate scaling)
+        @todo make dividing line width and color optional
+        """
+        # get size paramteres
+        x, y = self.secondMapWindow.GetImageCoords()
+        width, height = self.splitter.GetClientSize()
+        lineWidth = 1
+        # render to temporary files
+        filename1 = grass.tempfile(False) + '1'
+        filename2 = grass.tempfile(False) + '2'
+        self.firstMapWindow.SaveToFile(filename1, fileType, width, height)
+        self.secondMapWindow.SaveToFile(filename2, fileType, width, height)
+        # create empty white image  - needed for line
+        im = wx.EmptyImage(width, height)
+        im.Replace(0, 0, 0, 255, 255, 255)
+
+        # paste images
+        if self.splitter.GetSplitMode() == wx.SPLIT_HORIZONTAL:
+            im1 = wx.Image(filename1).GetSubImage((0, 0, width, -y))
+            im.Paste(im1, 0, 0)
+            im.Paste(wx.Image(filename2), -x, -y + lineWidth)
+        else:
+            im1 = wx.Image(filename1).GetSubImage((0, 0, -x, height))
+            im.Paste(im1, 0, 0)
+            im.Paste(wx.Image(filename2), -x + lineWidth, -y)
+        im.SaveFile(fileName, fileType)
+
+        # remove temporary files
+        grass.try_remove(filename1)
+        grass.try_remove(filename2)
+
+    def SaveToFile(self, event):
+        """!Save map to image
+        """
+        img = self.firstMapWindow.img or self.secondMapWindow.img
+        if not img:
+            GMessage(parent = self,
+                     message = _("Nothing to render (empty map). Operation canceled."))
+            return
+        filetype, ltype = GetImageHandlers(img)
+        
+        # get filename
+        dlg = wx.FileDialog(parent = self,
+                            message = _("Choose a file name to save the image "
+                                        "(no need to add extension)"),
+                            wildcard = filetype,
+                            style = wx.SAVE | wx.FD_OVERWRITE_PROMPT)
+        
+        if dlg.ShowModal() == wx.ID_OK:
+            path = dlg.GetPath()
+            if not path:
+                dlg.Destroy()
+                return
+            
+            base, ext = os.path.splitext(path)
+            fileType = ltype[dlg.GetFilterIndex()]['type']
+            extType  = ltype[dlg.GetFilterIndex()]['ext']
+            if ext != extType:
+                path = base + '.' + extType
+            
+            self._saveToFile(path, fileType)
+            
+        dlg.Destroy()
+
     def OnSwitchOrientation(self, event):
     def OnSwitchOrientation(self, event):
         """!Switch orientation of the sash."""
         """!Switch orientation of the sash."""
         Debug.msg(3, "SwipeMapFrame.OnSwitchOrientation()")
         Debug.msg(3, "SwipeMapFrame.OnSwitchOrientation()")

+ 3 - 0
gui/wxpython/swipe/toolbars.py

@@ -72,6 +72,9 @@ class SwipeMapToolbar(BaseToolbar):
                                       self.parent.OnZoomBack),
                                       self.parent.OnZoomBack),
                                      ("zoomToMap", icons["zoomExtent"],
                                      ("zoomToMap", icons["zoomExtent"],
                                       self.parent.OnZoomToMap),
                                       self.parent.OnZoomToMap),
+                                     (None, ),
+                                     ('saveFile', icons['saveFile'],
+                                      self.parent.SaveToFile),
                                     ))
                                     ))
                                     
                                     
     def SetActiveMap(self, index):
     def SetActiveMap(self, index):