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

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@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.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@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/grass-commit