4 Rendering map layers and overlays into map composition image.
12 (C) 2006-2011 by the GRASS Development Team
13 This program is free software under the GNU General Public
14 License (>=v2). Read the file COPYING that comes with GRASS
17 @author Michael Barton
18 @author Jachym Cepicky
19 @author Martin Landa <landa.martin gmail.com>
31 compatPath = os.path.join(globalvar.ETCWXDIR,
"compat")
32 sys.path.append(compatPath)
38 from wx.lib.newevent
import NewEvent
45 from debug
import Debug
as Debug
46 from preferences
import globalSettings
as UserSettings
48 wxUpdateProgressBar, EVT_UPDATE_PRGBAR = NewEvent()
57 """!Virtual class which stores information about layers (map layers and
58 overlays) of the map composition.
60 For map layer use MapLayer class.
61 For overlays use Overlay class.
63 def __init__(self, type, cmd, name = None,
64 active =
True, hidden =
False, opacity = 1.0):
66 @todo pass cmd as tuple instead of list
68 @param type layer type ('raster', 'vector', 'overlay', 'command', etc.)
69 @param cmd GRASS command to render layer,
70 given as list, e.g. ['d.rast', 'map=elevation@PERMANENT']
71 @param name layer name, e.g. 'elevation@PERMANENT' (for layer tree)
72 @param active layer is active, will be rendered only if True
73 @param hidden layer is hidden, won't be listed in Layer Manager if True
74 @param opacity layer opacity <0;1>
79 if self.
type ==
'command':
82 self.cmd.append(utils.CmdToTuple(c))
84 self.
cmd = utils.CmdToTuple(cmd)
92 Debug.msg (3,
"Layer.__init__(): type=%s, cmd='%s', name=%s, " \
93 "active=%d, opacity=%d, hidden=%d" % \
98 self.
gtemp = tempfile.mkstemp()[1]
100 if self.
type ==
'overlay':
106 Debug.msg (3,
"Layer.__del__(): layer=%s, cmd='%s'" %
110 """!Render layer to image
112 @return rendered image filename
113 @return None on error
119 if self.
type ==
'3d-raster':
122 Debug.msg (3,
"Layer.Render(): type=%s, name=%s" % \
126 layertypes = (
'raster',
'rgb',
'his',
'shaded',
'rastarrow',
'rastnum',
127 'vector',
'thememap',
'themechart',
128 'grid',
'geodesic',
'rhumb',
'labels',
129 'command',
'rastleg',
132 if self.
type not in layertypes:
133 raise gcmd.GException(_(
"<%(name)s>: layer type <%(type)s> is not supported") % \
134 {
'type' : self.
type,
'name' : self.
name})
137 if UserSettings.Get(group=
'display', key=
'driver', subkey=
'type') ==
'cairo':
145 self.
gtemp = tempfile.mkstemp()[1]
147 if self.
type ==
'overlay':
153 os.environ[
"GRASS_CAIROFILE"] = self.
mapfile
156 self.
gtemp = tempfile.mkstemp()[1]
158 if self.
type ==
'overlay':
164 os.environ[
"GRASS_PNGFILE"] = self.
mapfile
168 if self.
type ==
'command':
171 ret, msg = gcmd.RunCommand(c[0],
178 os.environ[
"GRASS_PNG_READ"] =
"TRUE"
180 os.environ[
"GRASS_PNG_READ"] =
"FALSE"
182 ret, msg = gcmd.RunCommand(self.
cmd[0],
188 raise gcmd.GException(value = _(
"'%(cmd)s' failed. Details: %(det)s") % \
189 {
'cmd' : self.
cmd[0],
'det' : msg })
192 print >> sys.stderr, e.value
197 os.remove(self.
gtemp)
198 except (OSError, TypeError):
204 if UserSettings.Get(group=
'display', key=
'driver', subkey=
'type') ==
'cairo':
207 del os.environ[
"GRASS_CAIROFILE"]
208 elif "GRASS_PNGFILE" in os.environ:
209 del os.environ[
"GRASS_PNGFILE"]
216 """!Get GRASS command as list of string.
218 @param string get command as string if True otherwise as list
220 @return command list/string
223 if self.
type ==
'command':
226 scmd.append(utils.GetCmdString(c))
228 return ';'.join(scmd)
230 return utils.GetCmdString(self.
cmd)
235 """!Get map layer type"""
239 """!Get map element type"""
240 if self.
type ==
'raster':
246 Get layer opacity level
248 @param float get opacity level in <0,1> otherwise <0,100>
250 @return opacity level
255 return int (self.
opacity * 100)
258 """!Get map layer name
260 @param fullyQualified True to return fully qualified name as a
261 string 'name@mapset' otherwise directory { 'name', 'mapset' }
264 @return string / directory
270 return {
'name' : self.name.split(
'@')[0],
271 'mapset' : self.name.split(
'@')[1] }
273 return {
'name' : self.
name,
277 """!Check if layer is activated for rendering"""
281 """!Set layer type"""
282 if type
not in (
'raster',
'3d-raster',
'vector',
283 'overlay',
'command',
284 'shaded',
'rgb',
'his',
'rastarrow',
'rastnum',
285 'thememap',
'themechart',
'grid',
'labels',
292 """!Set layer name"""
296 """!Active or deactive layer"""
297 self.
active = bool(enable)
300 """!Hide or show map layer in Layer Manager"""
301 self.
hidden = bool(enable)
304 """!Set opacity value"""
313 """!Set new command for layer"""
314 if self.
type ==
'command':
317 self.cmd.append(utils.CmdToTuple(c))
319 self.
cmd = utils.CmdToTuple(cmd)
320 Debug.msg(3,
"Layer.SetCmd(): cmd='%s'" % self.
GetCmd(string =
True))
326 def __init__(self, type, cmd, name = None,
327 active =
True, hidden =
False, opacity = 1.0):
328 """!Represents map layer in the map canvas
330 @param type layer type ('raster', 'vector', 'command', etc.)
331 @param cmd GRASS command to render layer,
332 given as list, e.g. ['d.rast', 'map=elevation@PERMANENT']
333 @param name layer name, e.g. 'elevation@PERMANENT' (for layer tree) or None
334 @param active layer is active, will be rendered only if True
335 @param hidden layer is hidden, won't be listed in Layer Manager if True
336 @param opacity layer opacity <0;1>
338 Layer.__init__(self, type, cmd, name,
339 active, hidden, opacity)
342 """!Get mapset of map layer
345 @return '' on error (no name given)
351 return self.name.split(
'@')[1]
357 active =
True, hidden =
True, opacity = 1.0):
358 """!Represents overlay displayed in map canvas
360 @param id overlay id (for PseudoDC)
361 @param type overlay type ('barscale', 'legend', etc.)
362 @param cmd GRASS command to render overlay,
363 given as list, e.g. ['d.legend', 'map=elevation@PERMANENT']
364 @param active layer is active, will be rendered only if True
365 @param hidden layer is hidden, won't be listed in Layer Manager if True
366 @param opacity layer opacity <0;1>
368 Layer.__init__(self,
'overlay', cmd, type,
369 active, hidden, opacity)
374 """!Map composition (stack of map layers and overlays)
396 self.
mapfile = tempfile.mkstemp(suffix =
'.ppm')[1]
402 os.environ[
"GRASS_TRANSPARENT"] =
"TRUE"
403 os.environ[
"GRASS_BACKGROUNDCOLOR"] =
"ffffff"
408 def _runCommand(self, cmd, **kwargs):
409 """!Run command in environment defined by self.gisrc if
412 gisrc_orig = os.getenv(
"GISRC")
414 os.environ[
"GISRC"] = self.
gisrc
420 os.environ[
"GISRC"] = gisrc_orig
424 def _initGisEnv(self):
425 """!Stores GRASS variables (g.gisenv) to self.env variable
427 if not os.getenv(
"GISBASE"):
428 sys.exit(_(
"GISBASE not set. You must be in GRASS GIS to run this program."))
433 """!Get projection info"""
437 """!Return region projection and map units information
440 if not grass.find_program(
'g.proj', [
'--help']):
441 sys.exit(_(
"GRASS module '%s' not found. Unable to start map "
442 "display window.") %
'g.proj')
444 ret = self.
_runCommand(gcmd.RunCommand, prog =
'g.proj',
445 read =
True, flags =
'p')
450 for line
in ret.splitlines():
452 key, val =
map(
lambda x: x.strip(), line.split(
':'))
456 elif "XY location (unprojected)" in line:
457 projinfo[
'proj'] =
'xy'
458 projinfo[
'units'] =
''
464 """!Read WIND file and set up self.wind dictionary"""
466 filename = os.path.join (self.
env[
'GISDBASE'],
467 self.
env[
'LOCATION_NAME'],
471 windfile = open (filename,
"r")
473 sys.exit(_(
"Error: Unable to open '%(file)s'. Reason: %(ret)s. wxGUI exited.\n") % \
474 {
'file' : filename,
'ret' : e})
476 for line
in windfile.readlines():
478 key, value = line.split(
":", 1)
479 self.
wind[key.strip()] = value.strip()
486 """!Adjusts display resolution to match monitor size in
487 pixels. Maintains constant display resolution, not related to
488 computational region. Do NOT use the display resolution to set
489 computational resolution. Set computational resolution through
501 Debug.msg (3,
"Map.AdjustRegion(): %s" % self.
region)
506 """!Sets display extents to even multiple of current
507 resolution defined in WIND file from SW corner. This must be
508 done manually as using the -a flag can produce incorrect
520 n = float(self.
region[
'n'])
521 s = float(self.
region[
's'])
522 e = float(self.
region[
'e'])
523 w = float(self.
region[
'w'])
526 new[
'rows'] = math.fabs(
round((n-s)/nsres))
527 new[
'cols'] = math.fabs(
round((e-w)/ewres))
530 new[
's'] = nsres *
round(s/nsres)
531 new[
'w'] = ewres *
round(w/ewres)
532 new[
'n'] = new[
's'] + (new[
'rows'] * nsres)
533 new[
'e'] = new[
'w'] + (new[
'cols'] * ewres)
538 """!Align region extent based on display size from center point"""
541 res = self.
region[
"ewres"]
543 res = self.
region[
"nsres"]
545 Debug.msg(3,
"Map.AlignExtentFromDisplay(): width=%d, height=%d, res=%f, center=%f,%f" % \
547 self.
region[
'center_northing']))
549 ew = (self.
width / 2) * res
550 ns = (self.
height / 2) * res
559 if self.
region[
'n'] > 90.0:
561 if self.
region[
's'] < -90.0:
565 """!Change size of rendered map.
567 @param width,height map size
569 @return True on success
570 @return False on failure
573 self.
width = int(width)
575 Debug.msg(2,
"Map.ChangeMapSize(): width=%d, height=%d" % \
583 def GetRegion(self, rast = [], zoom = False, vect = [], regionName = None,
584 n =
None, s =
None, e =
None, w =
None, default =
False,
586 """!Get region settings (g.region -upgc)
588 Optionally extent, raster or vector map layer can be given.
590 @param rast list of raster maps
591 @param zoom zoom to raster map (ignore NULLs)
592 @param vect list of vector maps
593 @param regionName named region or None
594 @param n,s,e,w force extent
595 @param default force default region settings
596 @param update if True update current display region settings
598 @return region settings as directory, e.g. {
599 'n':'4928010', 's':'4913700', 'w':'589980',...}
603 tmpreg = os.getenv(
"GRASS_REGION")
605 del os.environ[
"GRASS_REGION"]
608 gisrc_orig = os.getenv(
"GISRC")
610 os.environ[
"GISRC"] = self.
gisrc
614 cmd[
'flags'] =
'ugpc'
620 cmd[
'region'] = regionName
633 cmd[
'zoom'] = rast[0]
635 cmd[
'rast'] =
','.join(rast)
638 cmd[
'vect'] =
','.join(vect)
640 ret, reg, msg = gcmd.RunCommand(
'g.region',
647 message = _(
"Unable to zoom to raster map <%s>.") % rast[0] + \
648 "\n\n" + _(
"Details:") +
" %s" % msg
650 message = _(
"Unable to zoom to vector map <%s>.") % vect[0] + \
651 "\n\n" + _(
"Details:") +
" %s" % msg
653 message = _(
"Unable to get current geographic extent. "
654 "Force quiting wxGUI. Please manually run g.region to "
659 for r
in reg.splitlines():
660 key, val = r.split(
"=", 1)
662 region[key] = float(val)
668 os.environ[
"GISRC"] = gisrc_orig
672 os.environ[
"GRASS_REGION"] = tmpreg
674 Debug.msg (3,
"Map.GetRegion(): %s" % region)
682 """!Get current display region settings"""
686 """!Render string for GRASS_REGION env. variable, so that the
687 images will be rendered from desired zoom level.
689 @param windres uses resolution from WIND file rather than
690 display (for modules that require set resolution like
693 @return String usable for GRASS_REGION variable or None
699 region = copy.copy(self.
region)
700 for key
in (
'nsres',
'ewres',
701 'rows',
'cols',
'cells'):
702 region[key] = compRegion[key]
709 for key
in self.wind.keys():
711 grass_region +=
"north: %s; " % \
715 grass_region +=
"south: %s; " % \
719 grass_region +=
"east: %s; " % \
723 grass_region +=
"west: %s; " % \
726 elif key ==
"e-w resol":
727 grass_region +=
"e-w resol: %f; " % \
730 elif key ==
"n-s resol":
731 grass_region +=
"n-s resol: %f; " % \
735 grass_region +=
'cols: %d; ' % \
739 grass_region +=
'rows: %d; ' % \
743 grass_region += key +
": " + self.
wind[key] +
"; "
745 Debug.msg (3,
"Map.SetRegion(): %s" % grass_region)
752 def GetListOfLayers(self, l_type = None, l_mapset = None, l_name = None,
753 l_active =
None, l_hidden =
None):
754 """!Returns list of layers of selected properties or list of
757 @param l_type layer type, e.g. raster/vector/wms/overlay (value or tuple of values)
758 @param l_mapset all layers from given mapset (only for maplayers)
759 @param l_name all layers with given name
760 @param l_active only layers with 'active' attribute set to True or False
761 @param l_hidden only layers with 'hidden' attribute set to True or False
763 @return list of selected layers
767 if type(l_type) == types.StringType:
772 if one_type
and l_type ==
'overlay':
781 if one_type
and layer.type != l_type:
783 elif not one_type
and layer.type
not in l_type:
787 if (l_mapset !=
None and l_type !=
'overlay')
and \
788 layer.GetMapset() != l_mapset:
792 if l_name !=
None and layer.name != l_name:
796 if l_active !=
None and \
798 if layer.active == l_active
and \
799 layer.hidden == l_hidden:
800 selected.append(layer)
803 elif l_active !=
None:
804 if layer.active == l_active:
805 selected.append(layer)
808 elif l_hidden !=
None:
809 if layer.hidden == l_hidden:
810 selected.append(layer)
814 selected.append(layer)
816 Debug.msg (3,
"Map.GetListOfLayers(): numberof=%d" % len(selected))
820 def _renderLayers(self, force, mapWindow, maps, masks, opacities):
825 if layer ==
None or layer.active ==
False:
830 layer.force_render
or \
831 layer.mapfile ==
None or \
832 (
not os.path.isfile(layer.mapfile)
or not os.path.getsize(layer.mapfile)):
833 if not layer.Render():
839 event = wxUpdateProgressBar(value = ilayer)
840 wx.PostEvent(mapWindow, event)
843 if layer.type !=
"overlay":
844 maps.append(layer.mapfile)
845 masks.append(layer.maskfile)
846 opacities.append(str(layer.opacity))
848 Debug.msg (3,
"Map.Render() type=%s, layer=%s " % (layer.type, layer.name))
851 def Render(self, force = False, mapWindow = None, windres = False):
852 """!Creates final image composite
854 This function can conditionaly use high-level tools, which
855 should be avaliable in wxPython library
857 @param force force rendering
858 @param reference for MapFrame instance (for progress bar)
859 @param windres use region resolution (True) otherwise display resolution
861 @return name of file with rendered image or None
869 gisrc_orig = os.getenv(
"GISRC")
871 os.environ[
"GISRC"] = self.
gisrc
873 tmp_region = os.getenv(
"GRASS_REGION")
874 os.environ[
"GRASS_REGION"] = self.
SetRegion(windres)
875 os.environ[
"GRASS_WIDTH"] = str(self.
width)
876 os.environ[
"GRASS_HEIGHT"] = str(self.
height)
877 if UserSettings.Get(group=
'display', key=
'driver', subkey=
'type') ==
'cairo':
878 os.environ[
"GRASS_AUTO_WRITE"] =
"TRUE"
879 if "GRASS_RENDER_IMMEDIATE" in os.environ:
880 del os.environ[
"GRASS_RENDER_IMMEDIATE"]
881 os.environ[
"GRASS_RENDER_IMMEDIATE"] =
"TRUE"
883 os.environ[
"GRASS_PNG_AUTO_WRITE"] =
"TRUE"
884 os.environ[
"GRASS_PNG_READ"] =
"FALSE"
885 os.environ[
"GRASS_COMPRESSION"] =
"0"
886 os.environ[
"GRASS_TRUECOLOR"] =
"TRUE"
887 os.environ[
"GRASS_RENDER_IMMEDIATE"] =
"TRUE"
892 if not subprocess.mswindows:
893 mapstr =
",".join(maps)
894 maskstr =
",".join(masks)
899 mapstr += item.replace(
'\\',
'/')
900 mapstr = mapstr.rstrip(
',')
903 maskstr += item.replace(
'\\',
'/')
904 maskstr = maskstr.rstrip(
',')
905 mapoutstr = self.mapfile.replace(
'\\',
'/')
908 bgcolor =
':'.join(
map(str, UserSettings.Get(group =
'display', key =
'bgcolor',
911 complist = [
"g.pnmcomp",
912 "in=%s" %
",".join(maps),
913 "mask=%s" %
",".join(masks),
914 "opacity=%s" %
",".join(opacities),
915 "background=%s" % bgcolor,
916 "width=%s" % str(self.
width),
917 "height=%s" % str(self.
height),
922 os.environ[
"GRASS_REGION"] = tmp_region
924 del os.environ[
"GRASS_REGION"]
928 ret = gcmd.RunCommand(
'g.pnmcomp',
929 input =
'%s' %
",".join(maps),
930 mask =
'%s' %
",".join(masks),
931 opacity =
'%s' %
",".join(opacities),
932 background = bgcolor,
938 print >> sys.stderr, _(
"ERROR: Rendering failed")
942 Debug.msg (3,
"Map.Render() force=%s file=%s" % (force, self.
mapfile))
946 os.environ[
"GISRC"] = gisrc_orig
954 def AddLayer(self, type, command, name = None,
955 l_active =
True, l_hidden =
False, l_opacity = 1.0, l_render =
False,
957 """!Adds generic map layer to list of layers
959 @param type layer type ('raster', 'vector', etc.)
960 @param command GRASS command given as list
961 @param name layer name
962 @param l_active layer render only if True
963 @param l_hidden layer not displayed in layer tree if True
964 @param l_opacity opacity level range from 0(transparent) - 1(not transparent)
965 @param l_render render an image if True
966 @param pos position in layer list (-1 for append)
968 @return new layer on success
969 @return None on failure
973 if l_opacity < 0: l_opacity = 0
974 elif l_opacity > 1: l_opacity = 1
975 layer =
MapLayer(type = type, name = name, cmd = command,
976 active = l_active, hidden = l_hidden, opacity = l_opacity)
980 self.layers.insert(pos, layer)
982 self.layers.append(layer)
984 Debug.msg (3,
"Map.AddLayer(): layer=%s" % layer.name)
986 if not layer.Render():
994 """!Removes layer from list of layers
996 @param layer layer instance in layer tree
997 @param overlay delete overlay (use self.DeleteOverlay() instead)
999 @return removed layer on success or None
1001 Debug.msg (3,
"Map.DeleteLayer(): name=%s" % layer.name)
1010 base = os.path.split(layer.mapfile)[0]
1011 mapfile = os.path.split(layer.mapfile)[1]
1012 tempbase = mapfile.split(
'.')[0]
1013 if base ==
'' or tempbase ==
'':
1015 basefile = os.path.join(base, tempbase) +
r'.*'
1016 for f
in glob.glob(basefile):
1025 """!Reorder list to match layer tree
1027 @param layerList list of layers
1032 for layer
in self.
layers:
1034 layerNameList += layer.name +
','
1035 Debug.msg (4,
"Map.ReoderLayers(): layers=%s" % \
1039 """!Change map layer properties
1041 @param layer map layer instance
1042 @param type layer type ('raster', 'vector', etc.)
1043 @param command GRASS command given as list
1044 @param name layer name
1045 @param active layer render only if True
1046 @param hidden layer not displayed in layer tree if True
1047 @param opacity opacity level range from 0(transparent) - 1(not transparent)
1048 @param render render an image if True
1050 Debug.msg (3,
"Map.ChangeLayer(): layer=%s" % layer.name)
1053 layer.SetType(kargs[
'type'])
1055 if 'command' in kargs:
1056 layer.SetCmd(kargs[
'command'])
1059 layer.SetName(kargs[
'name'])
1061 if 'active' in kargs:
1062 layer.SetActive(kargs[
'active'])
1064 if 'hidden' in kargs:
1065 layer.SetHidden(kargs[
'hidden'])
1067 if 'opacity' in kargs:
1068 layer.SetOpacity(kargs[
'opacity'])
1070 if render
and not layer.Render():
1077 """!Changes opacity value of map layer
1079 @param layer layer instance in layer tree
1080 @param l_opacity opacity level <0;1>
1083 if l_opacity < 0: l_opacity = 0
1084 elif l_opacity > 1: l_opacity = 1
1086 layer.opacity = l_opacity
1087 Debug.msg (3,
"Map.ChangeOpacity(): layer=%s, opacity=%f" % \
1088 (layer.name, layer.opacity))
1091 """!Enable or disable map layer
1093 @param layer layer instance in layer tree
1094 @param active to be rendered (True)
1096 layer.active = active
1098 Debug.msg (3,
"Map.ChangeLayerActive(): name='%s' -> active=%d" % \
1099 (layer.name, layer.active))
1102 """!Change name of the layer
1104 @param layer layer instance in layer tree
1105 @param name layer name to set up
1107 Debug.msg (3,
"Map.ChangeLayerName(): from=%s to=%s" % \
1112 """!Removes layer from layer list
1114 Layer is defined by name@mapset or id.
1116 @param name layer name (must be unique)
1117 @param id layer index in layer list
1119 @return removed layer on success
1120 @return None on failure
1125 for layer
in self.
layers:
1126 if layer.name == name:
1128 os.remove(layer.mapfile)
1129 os.remove(layer.maskfile)
1130 self.layers.remove(layer)
1134 return self.layers.pop(id)
1139 """!Get index of layer in layer list.
1141 @param layer layer instace in layer tree
1142 @param overlay use list of overlays instead
1145 @return -1 if layer not found
1153 return list.index(layer)
1158 l_active =
True, l_hidden =
True, l_opacity = 1.0, l_render =
False):
1159 """!Adds overlay (grid, barscale, legend, etc.) to list of
1162 @param id overlay id (PseudoDC)
1163 @param type overlay type (barscale, legend)
1164 @param command GRASS command to render overlay
1165 @param l_active overlay activated (True) or disabled (False)
1166 @param l_hidden overlay is not shown in layer tree (if True)
1167 @param l_render render an image (if True)
1169 @return new layer on success
1170 @retutn None on failure
1172 Debug.msg (2,
"Map.AddOverlay(): cmd=%s, render=%d" % (command, l_render))
1173 overlay =
Overlay(id = id, type = type, cmd = command,
1174 active = l_active, hidden = l_hidden, opacity = l_opacity)
1177 self.overlays.append(overlay)
1179 if l_render
and command !=
'' and not overlay.Render():
1186 """!Change overlay properities
1188 Add new overlay if overlay with 'id' doesn't exist.
1190 @param id overlay id (PseudoDC)
1191 @param type overlay type (barscale, legend)
1192 @param command GRASS command to render overlay
1193 @param l_active overlay activated (True) or disabled (False)
1194 @param l_hidden overlay is not shown in layer tree (if True)
1195 @param l_render render an image (if True)
1197 @return new layer on success
1201 overlay =
Overlay(id, type =
None, cmd =
None)
1204 overlay.SetName(kargs[
'type'])
1206 if 'command' in kargs:
1207 overlay.SetCmd(kargs[
'command'])
1209 if 'active' in kargs:
1210 overlay.SetActive(kargs[
'active'])
1212 if 'hidden' in kargs:
1213 overlay.SetHidden(kargs[
'hidden'])
1215 if 'opacity' in kargs:
1216 overlay.SetOpacity(kargs[
'opacity'])
1218 if render
and command != []
and not overlay.Render():
1225 """!Return overlay(s) with 'id'
1227 @param id overlay id
1228 @param list return list of overlays of True
1229 otherwise suppose 'id' to be unique
1231 @return list of overlays (list=True)
1232 @return overlay (list=False)
1233 @retur None (list=False) if no overlay or more overlays found
1237 if overlay.id == id:
1251 @param id overlay id
1253 @return removed overlay on success or None
1258 """!Clean layer stack - go trough all layers and remove them
1261 Removes also l_mapfile and l_maskfile
1263 @return False on failure
1264 @return True on success
1267 dir = os.path.dirname(self.
mapfile)
1269 removepath = os.path.join(dir,base)+
r'*'
1270 for f
in glob.glob(removepath):
1272 for layer
in self.
layers:
1274 dir = os.path.dirname(layer.mapfile)
1275 base = os.path.basename(layer.mapfile).
split(
'.')[0]
1276 removepath = os.path.join(dir,base)+
r'*'
1277 for f
in glob.glob(removepath):
1279 self.layers.remove(layer)
1283 dir = os.path.dirname(overlay.mapfile)
1284 base = os.path.basename(overlay.mapfile).
split(
'.')[0]
1285 removepath = os.path.join(dir,base)+
r'*'
1286 for f
in glob.glob(removepath):
1288 self.overlays.remove(overlay)
1295 """!Reverse list of layers"""
1296 return self.layers.reverse()
1298 if __name__ ==
"__main__":
1299 """!Test of Display class.
1300 Usage: display=Render()
1303 gettext.install(
'grasswxpy', os.path.join(os.getenv(
"GISBASE"),
'locale'), unicode =
True)
1305 print "Initializing..."
1306 grass.run_command(
"g.region", flags =
"d")
1312 map.AddLayer(type =
"raster",
1313 name =
"elevation.dem",
1314 command = [
"d.rast",
"elevation.dem@PERMANENT",
"catlist=1000-1500",
"-i"],
1317 map.AddLayer(type =
"vector",
1319 command = [
"d.vect",
"streams@PERMANENT",
"color=red",
"width=3",
"type=line"])
1321 image = map.Render(force =
True)
1324 os.system(
"display %s" % image)