[GRASS-dev] [GRASS-SVN] r60376 - grass/trunk/gui/wxpython/core

Anna Petrášová kratochanna at gmail.com
Tue May 20 08:22:07 PDT 2014


Hi,

I committed a change to rendering which could help to run d.mon and wxGUI
together. The environment is changed only for the rendering process and not
for the entire wxGUI. There is a lot of other places which should be
changed like this but the rendering is the most important. Please test, I
tried to test it already (d.mon, wms, georectifier) but more testing is
still needed.

Anna


On Tue, May 20, 2014 at 11:14 AM, <svn_grass at osgeo.org> wrote:

> Author: annakrat
> Date: 2014-05-20 08:14:42 -0700 (Tue, 20 May 2014)
> New Revision: 60376
>
> Modified:
>    grass/trunk/gui/wxpython/core/render.py
>    grass/trunk/gui/wxpython/core/ws.py
> Log:
> wxGUI/rendering: change environment only for subprocesses; wxGUI amd d.mon
> should now work together
>
> Modified: grass/trunk/gui/wxpython/core/render.py
> ===================================================================
> --- grass/trunk/gui/wxpython/core/render.py     2014-05-20 14:55:52 UTC
> (rev 60375)
> +++ grass/trunk/gui/wxpython/core/render.py     2014-05-20 15:14:42 UTC
> (rev 60376)
> @@ -86,10 +86,11 @@
>          self.renderMgr = None
>
>          self.Map = Map
> -        self.type      = None
> +        self.type = None
>          self.SetType(ltype)
> -        self.name  = name
> -
> +        self.name = name
> +        self.environ = os.environ.copy()
> +
>          if self.type == 'command':
>              self.cmd = list()
>              for c in cmd:
> @@ -136,7 +137,7 @@
>                                   {'type' : self.type, 'name' : self.name
> })
>
>          if self.mapfile:
> -            os.environ["GRASS_PNGFILE"] = self.mapfile
> +            self.environ["GRASS_PNGFILE"] = self.mapfile
>
>          # execute command
>          try:
> @@ -147,9 +148,9 @@
>                      if ret != 0:
>                          break
>                      if not read:
> -                        os.environ["GRASS_PNG_READ"] = "TRUE"
> +                        self.environ["GRASS_PNG_READ"] = "TRUE"
>
> -                os.environ["GRASS_PNG_READ"] = "FALSE"
> +                self.environ["GRASS_PNG_READ"] = "FALSE"
>              else:
>                  ret, msg = self._runCommand(self.cmd)
>              if ret != 0:
> @@ -165,11 +166,7 @@
>                      continue
>                  grass.try_remove(f)
>                  f = None
> -
> -        # stop monitor
> -        if self.mapfile and "GRASS_PNGFILE" in os.environ:
> -            del os.environ["GRASS_PNGFILE"]
> -
> +
>          self.forceRender = False
>
>          return self.mapfile
> @@ -180,11 +177,12 @@
>          if self.type == 'wms':
>              ret = 0
>              msg = ''
> -            self.renderMgr.Render(cmd)
> +            self.renderMgr.Render(cmd, env=self.environ)
>          else:
>              ret, msg = RunCommand(cmd[0],
>                                    getErrorMsg = True,
>                                    quiet = True,
> +                                  env=self.environ,
>                                    **cmd[1])
>
>          return ret, msg
> @@ -301,6 +299,10 @@
>          # for re-rendering
>          self.forceRender = True
>
> +    def SetEnvironment(self, environ):
> +        """!Sets environment for rendering."""
> +        self.environ = environ
> +
>      def IsDownloading(self):
>          """!Is data downloading from web server e. g. wms"""
>          if self.renderMgr is None:
> @@ -385,10 +387,7 @@
>
>          self.overlays  = list()  # stack of available overlays
>          self.ovlookup  = dict()  # lookup dictionary for overlay items
> and overlays
> -
> -        # environment settings
> -        self.env   = dict()
> -
> +
>          # path to external gisrc
>          self.gisrc = gisrc
>
> @@ -396,7 +395,6 @@
>          self.mapfile = grass.tempfile(create = False) + '.ppm'
>
>          # setting some initial env. variables
> -        self._initGisEnv() # g.gisenv
>          if not self.GetWindow():
>              sys.stderr.write(_("Trying to recover from default
> region..."))
>              RunCommand('g.region', flags='d')
> @@ -405,16 +403,12 @@
>          self.progressInfo = None
>
>          # GRASS environment variable (for rendering)
> -        self.env = {"GRASS_BACKGROUNDCOLOR" : "000000",
> -               "GRASS_PNG_COMPRESSION" : "0",
> -               "GRASS_TRUECOLOR"       : "TRUE",
> -               "GRASS_TRANSPARENT"     : "TRUE",
> -               "GRASS_PNG_READ"        : "FALSE",
> -               }
> +        self.default_env = {"GRASS_BACKGROUNDCOLOR" : "000000",
> +                            "GRASS_PNG_COMPRESSION" : "0",
> +                            "GRASS_TRUECOLOR"       : "TRUE",
> +                            "GRASS_TRANSPARENT"     : "TRUE"
> +                            }
>
> -        for k, v in self.env.iteritems():
> -            os.environ[k] = v
> -
>          # projection info
>          self.projinfo = self._projInfo()
>
> @@ -424,30 +418,6 @@
>          self.layerChanged = Signal('Map.layerChanged')
>          self.updateProgress = Signal('Map.updateProgress')
>
> -    def _runCommand(self, cmd, **kwargs):
> -        """!Run command in environment defined by self.gisrc if
> -        defined"""
> -        # use external gisrc if defined
> -        gisrc_orig = os.getenv("GISRC")
> -        if self.gisrc:
> -            os.environ["GISRC"] = self.gisrc
> -
> -        ret = cmd(**kwargs)
> -
> -        # back to original gisrc
> -        if self.gisrc:
> -            os.environ["GISRC"] = gisrc_orig
> -
> -        return ret
> -
> -    def _initGisEnv(self):
> -        """!Stores GRASS variables (g.gisenv) to self.env variable
> -        """
> -        if not os.getenv("GISBASE"):
> -            sys.exit(_("GISBASE not set. You must be in GRASS GIS to run
> this program."))
> -
> -        self.env = self._runCommand(grass.gisenv)
> -
>      def GetProjInfo(self):
>          """!Get projection info"""
>          return self.projinfo
> @@ -459,10 +429,11 @@
>          if not grass.find_program('g.proj', '--help'):
>              sys.exit(_("GRASS module '%s' not found. Unable to start map "
>                         "display window.") % 'g.proj')
> -
> -        ret = self._runCommand(RunCommand, prog = 'g.proj',
> -                               read = True, flags = 'p')
> -
> +        env = os.environ.copy()
> +        if self.gisrc:
> +            env['GISRC'] = self.gisrc
> +        ret = RunCommand(prog='g.proj', read=True, flags='p', env=env)
> +
>          if not ret:
>              return projinfo
>
> @@ -482,9 +453,10 @@
>      def GetWindow(self):
>          """!Read WIND file and set up self.wind dictionary"""
>          # FIXME: duplicated region WIND == g.region (at least some values)
> -        filename = os.path.join (self.env['GISDBASE'],
> -                                 self.env['LOCATION_NAME'],
> -                                 self.env['MAPSET'],
> +        env = grass.gisenv()
> +        filename = os.path.join (env['GISDBASE'],
> +                                 env['LOCATION_NAME'],
> +                                 env['MAPSET'],
>                                   "WIND")
>          try:
>              windfile = open (filename, "r")
> @@ -626,15 +598,10 @@
>          @see GetCurrentRegion()
>          """
>          region = {}
> -
> -        tmpreg = os.getenv("GRASS_REGION")
> -        if tmpreg:
> -            del os.environ["GRASS_REGION"]
> -
> -        # use external gisrc if defined
> -        gisrc_orig = os.getenv("GISRC")
> +
> +        env = os.environ.copy()
>          if self.gisrc:
> -            os.environ["GISRC"] = self.gisrc
> +            env['GISRC'] = self.gisrc
>
>          # do not update & shell style output
>          cmd = {}
> @@ -673,6 +640,7 @@
>          ret, reg, msg = RunCommand('g.region',
>                                     read = True,
>                                     getErrorMsg = True,
> +                                   env=env,
>                                     **cmd)
>
>          if ret != 0:
> @@ -698,15 +666,7 @@
>                  region[key] = float(val)
>              except ValueError:
>                  region[key] = val
> -
> -        # back to original gisrc
> -        if self.gisrc:
> -            os.environ["GISRC"] = gisrc_orig
> -
> -        # restore region
> -        if tmpreg:
> -            os.environ["GRASS_REGION"] = tmpreg
> -
> +
>          Debug.msg (3, "Map.GetRegion(): %s" % region)
>
>          if update:
> @@ -884,7 +844,7 @@
>
>          return selected
>
> -    def _renderLayers(self, force = False, overlaysOnly = False):
> +    def _renderLayers(self, env, force = False, overlaysOnly = False):
>          """!Render all map layers into files
>
>          @param force True to force rendering
> @@ -913,6 +873,7 @@
>
>              # render
>              if force or layer.forceRender:
> +                layer.SetEnvironment(env)
>                  if not layer.Render():
>                      continue
>
> @@ -935,13 +896,13 @@
>
>          return maps, masks, opacities
>
> -    def GetMapsMasksAndOpacities(self, force, windres):
> +    def GetMapsMasksAndOpacities(self, force, windres, env):
>          """!
>          Used by Render function.
>
>          @return maps, masks, opacities
>          """
> -        return self._renderLayers(force)
> +        return self._renderLayers(force=force, env=env)
>
>      def Render(self, force = False, windres = False):
>          """!Creates final image composite
> @@ -955,22 +916,21 @@
>          @return name of file with rendered image or None
>          """
>          wx.BeginBusyCursor()
> +        env = os.environ.copy()
> +        env.update(self.default_env)
>          # use external gisrc if defined
> -        gisrc_orig = os.getenv("GISRC")
>          if self.gisrc:
> -            os.environ["GISRC"] = self.gisrc
> -
> -        tmp_region = os.getenv("GRASS_REGION")
> -        os.environ["GRASS_REGION"] = self.SetRegion(windres)
> -        os.environ["GRASS_WIDTH"]  = str(self.width)
> -        os.environ["GRASS_HEIGHT"] = str(self.height)
> +            env['GISRC'] = self.gisrc
> +        env['GRASS_REGION'] = self.SetRegion(windres)
> +        env['GRASS_WIDTH'] = str(self.width)
> +        env['GRASS_HEIGHT'] = str(self.height)
>          driver = UserSettings.Get(group = 'display', key = 'driver',
> subkey = 'type')
>          if driver == 'png':
> -            os.environ["GRASS_RENDER_IMMEDIATE"] = "png"
> +            env['GRASS_RENDER_IMMEDIATE'] = 'png'
>          else:
> -            os.environ["GRASS_RENDER_IMMEDIATE"] = "cairo"
> +            env['GRASS_RENDER_IMMEDIATE'] = 'cairo'
>
> -        maps, masks, opacities = self.GetMapsMasksAndOpacities(force,
> windres)
> +        maps, masks, opacities = self.GetMapsMasksAndOpacities(force,
> windres, env)
>
>          # ugly hack for MSYS
>          if sys.platform != 'win32':
> @@ -1000,7 +960,8 @@
>                                    bgcolor = bgcolor,
>                                    width = self.width,
>                                    height = self.height,
> -                                  output = self.mapfile)
> +                                  output = self.mapfile,
> +                                  env=env)
>
>              if ret != 0:
>                  print >> sys.stderr, _("ERROR: Rendering failed. Details:
> %s") % msg
> @@ -1008,17 +969,7 @@
>                  return None
>
>          Debug.msg (3, "Map.Render() force=%s file=%s" % (force,
> self.mapfile))
> -
> -        # back to original region
> -        if tmp_region:
> -            os.environ["GRASS_REGION"] = tmp_region
> -        else:
> -            del os.environ["GRASS_REGION"]
> -
> -        # back to original gisrc
> -        if self.gisrc:
> -            os.environ["GISRC"] = gisrc_orig
> -
> +
>          wx.EndBusyCursor()
>          if not maps:
>              return None
>
> Modified: grass/trunk/gui/wxpython/core/ws.py
> ===================================================================
> --- grass/trunk/gui/wxpython/core/ws.py 2014-05-20 14:55:52 UTC (rev 60375)
> +++ grass/trunk/gui/wxpython/core/ws.py 2014-05-20 15:14:42 UTC (rev 60376)
> @@ -16,8 +16,8 @@
>
>  @author Stepan Turek <stepan.turek seznam.cz> (mentor: Martin Landa)
>  """
> -import os
>  import sys
> +import copy
>
>  import wx
>  from wx.lib.newevent import NewEvent
> @@ -76,7 +76,7 @@
>      def __del__(self):
>          grass.try_remove(self.tempMap)
>
> -    def Render(self, cmd):
> +    def Render(self, cmd, env):
>          """!If it is needed, download missing WMS data.
>
>          @todo lmgr deletes mapfile and maskfile when order of layers
> @@ -85,10 +85,11 @@
>          if not haveGdal:
>              return
>
> -        self.dstSize['cols'] = int(os.environ["GRASS_WIDTH"])
> -        self.dstSize['rows'] = int(os.environ["GRASS_HEIGHT"])
> +        env = copy.copy(env)
> +        self.dstSize['cols'] = int(env["GRASS_WIDTH"])
> +        self.dstSize['rows'] = int(env["GRASS_HEIGHT"])
>
> -        region = self._getRegionDict()
> +        region = self._getRegionDict(env)
>          self._fitAspect(region, self.dstSize)
>
>          self.updateMap = True
> @@ -127,23 +128,12 @@
>
>              if Debug.GetLevel() < 3:
>                  cmdList.append('--quiet')
> -
> -            tempPngfile = None
> -            if "GRASS_PNGFILE" in os.environ:
> -                tempPngfile = os.environ["GRASS_PNGFILE"]
> -            os.environ["GRASS_PNGFILE"] = self.tempMap
>
> -            tempRegion = os.environ["GRASS_REGION"]
> -            os.environ["GRASS_REGION"] = self._createRegionStr(region)
> +            env["GRASS_PNGFILE"] = self.tempMap
> +            env["GRASS_REGION"] = self._createRegionStr(region)
>
> -            self.thread.RunCmd(cmdList, env = os.environ.copy(), stderr =
> self.cmdStdErr)
> +            self.thread.RunCmd(cmdList, env=env, stderr=self.cmdStdErr)
>
> -            os.environ.pop("GRASS_PNGFILE")
> -            if tempPngfile:
> -                os.environ["GRASS_PNGFILE"] = tempPngfile
> -
> -            os.environ["GRASS_REGION"] = tempRegion
> -
>      def OnCmdOutput(self, event):
>          """!Print cmd output according to debug level.
>          """
> @@ -181,11 +171,11 @@
>
>          self.dataFetched.emit()
>
> -    def _getRegionDict(self):
> +    def _getRegionDict(self, env):
>          """!Parse string from GRASS_REGION env variable into dict.
>          """
>          region = {}
> -        parsedRegion = os.environ["GRASS_REGION"].split(';')
> +        parsedRegion = env["GRASS_REGION"].split(';')
>          for r in parsedRegion:
>              r = r.split(':')
>              r[0] = r[0].strip()
>
> _______________________________________________
> grass-commit mailing list
> grass-commit at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/grass-commit
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/grass-dev/attachments/20140520/60e78ff4/attachment-0001.html>


More information about the grass-dev mailing list