2 @package nviz_mapdisp.py
4 @brief Nviz extension for wxGUI
6 This module implements 3D visualization mode of map display.
11 (C) 2008-2009 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 Martin Landa <landa.martin gmail.com> (Google SoC 2008)
26 from threading
import Thread
29 import wx.lib.scrolledpanel
as scrolled
30 from wx.lib.newevent
import NewEvent
31 from wx
import glcanvas
35 from debug
import Debug
36 from mapdisp_window
import MapWindow
37 from goutput
import wxCmdOutput
38 from preferences
import globalSettings
as UserSettings
39 from workspace
import Nviz
as NvizDefault
43 except (ImportError, NameError):
46 wxUpdateProperties, EVT_UPDATE_PROP = NewEvent()
47 wxUpdateView, EVT_UPDATE_VIEW = NewEvent()
48 wxUpdateLight, EVT_UPDATE_LIGHT = NewEvent()
66 """!Get display instance"""
70 """!OpenGL canvas for Map Display Window"""
71 def __init__(self, parent, id = wx.ID_ANY,
72 Map =
None, tree =
None, lmgr =
None):
75 glcanvas.GLCanvas.__init__(self, parent, id)
76 MapWindow.__init__(self, parent, id,
97 os.environ[
'GRASS_REGION'] = self.Map.SetRegion()
103 self.
log = self.lmgr.goutput
104 logerr = self.lmgr.goutput.GetLog(err =
True)
105 logmsg = self.lmgr.goutput.GetLog()
107 self.
log = logmsg = sys.stdout
111 self.parent.statusbarWin[
'progress'],
113 self.nvizThread.start()
115 self.
_display = self.nvizThread.GetDisplay()
118 del os.environ[
'GRASS_REGION']
120 self.
img = wx.Image(self.Map.mapfile, wx.BITMAP_TYPE_ANY)
128 self.
view = copy.deepcopy(UserSettings.Get(group =
'nviz', key =
'view'))
129 self.
iview = UserSettings.Get(group =
'nviz', key =
'view', internal =
True)
132 self.
light = copy.deepcopy(UserSettings.Get(group =
'nviz', key =
'light'))
135 self.Bind(wx.EVT_SIZE, self.
OnSize)
136 self.Bind(wx.EVT_PAINT, self.
OnPaint)
137 self.Bind(wx.EVT_LEFT_UP, self.
OnLeftUp)
139 self.Bind(wx.EVT_MOTION, self.OnMotion)
145 self.Bind(wx.EVT_CLOSE, self.
OnClose)
155 size = self.GetClientSize()
156 if self.
size != size \
157 and self.GetContext():
158 Debug.msg(3,
"GLCanvas.OnSize(): w = %d, h = %d" % \
159 (size.width, size.height))
161 self._display.ResizeWindow(size.width,
167 Debug.msg(1,
"GLCanvas.OnPaint()")
169 dc = wx.PaintDC(self)
173 self._display.InitView()
182 if hasattr(self.lmgr,
"nviz"):
183 self.lmgr.nviz.UpdatePage(
'view')
184 self.lmgr.nviz.UpdatePage(
'light')
185 layer = self.GetSelectedLayer()
187 if layer.type ==
'raster':
188 self.lmgr.nviz.UpdatePage(
'surface')
189 self.lmgr.nviz.UpdatePage(
'fringe')
190 elif layer.type ==
'vector':
191 self.lmgr.nviz.UpdatePage(
'vector')
196 win = self.lmgr.nviz.FindWindowById( \
197 self.lmgr.nviz.win[
'vector'][
'lines'][
'surface'])
206 wheel = event.GetWheelRotation()
209 current = event.GetPositionTuple()[:]
210 Debug.msg (5,
"GLWindow.OnMouseMotion(): wheel = %d" % wheel)
211 prev_value = self.
view[
'persp'][
'value']
213 value = -1 * self.
view[
'persp'][
'step']
215 value = self.
view[
'persp'][
'step']
216 self.
view[
'persp'][
'value'] += value
217 if self.
view[
'persp'][
'value'] < 1:
218 self.
view[
'persp'][
'value'] = 1
219 elif self.
view[
'persp'][
'value'] > 100:
220 self.
view[
'persp'][
'value'] = 100
222 if prev_value != self.
view[
'persp'][
'value']:
223 if hasattr(self.lmgr,
"nviz"):
224 self.lmgr.nviz.UpdateSettings()
226 self._display.SetView(self.
view[
'position'][
'x'], self.
view[
'position'][
'y'],
227 self.
iview[
'height'][
'value'],
228 self.
view[
'persp'][
'value'],
229 self.
view[
'twist'][
'value'])
240 """!Convert image coordinates to real word coordinates
242 @param x, y image coordinates
244 @return easting, northing
245 @return None on error
247 size = self.GetClientSize()
249 sid, x, y, z = self._display.GetPointOnSurface(x, y)
258 if self.mouse[
"use"] ==
"nvizQuerySurface":
260 elif self.mouse[
"use"] ==
"nvizQueryVector":
264 """!Query surface on given position"""
265 result = self._display.QueryMap(event.GetX(), event.GetY())
267 self.qpoints.append((result[
'x'], result[
'y'], result[
'z']))
268 self.log.WriteLog(
"%-30s: %.3f" % (_(
"Easting"), result[
'x']))
269 self.log.WriteLog(
"%-30s: %.3f" % (_(
"Northing"), result[
'y']))
270 self.log.WriteLog(
"%-30s: %.3f" % (_(
"Elevation"), result[
'z']))
271 self.log.WriteLog(
"%-30s: %s" % (_(
"Surface map elevation"), result[
'elevation']))
272 self.log.WriteLog(
"%-30s: %s" % (_(
"Surface map color"), result[
'color']))
276 dxy = math.sqrt(pow(prev[0]-curr[0], 2) +
277 pow(prev[1]-curr[1], 2))
278 dxyz = math.sqrt(pow(prev[0]-curr[0], 2) +
279 pow(prev[1]-curr[1], 2) +
280 pow(prev[2]-curr[2], 2))
281 self.log.WriteLog(
"%-30s: %.3f" % (_(
"XY distance from previous"), dxy))
282 self.log.WriteLog(
"%-30s: %.3f" % (_(
"XYZ distance from previous"), dxyz))
283 self.log.WriteLog(
"%-30s: %.3f" % (_(
"Distance along surface"),
284 self._display.GetDistanceAlongSurface(result[
'id'],
288 self.log.WriteLog(
"%-30s: %.3f" % (_(
"Distance along exag. surface"),
289 self._display.GetDistanceAlongSurface(result[
'id'],
293 self.log.WriteCmdLog(
'-' * 80)
295 self.log.WriteLog(_(
"No point on surface"))
296 self.log.WriteCmdLog(
'-' * 80)
299 """!Query vector on given position"""
300 self.log.WriteWarning(_(
"Function not implemented yet"))
301 self.log.WriteCmdLog(
'-' * 80)
304 """!Change view settings"""
306 self._display.SetView(data[
'position'][
'x'], data[
'position'][
'y'],
307 self.
iview[
'height'][
'value'],
308 data[
'persp'][
'value'],
309 data[
'twist'][
'value'])
311 if event
and event.zExag
and 'value' in data[
'z-exag']:
312 self._display.SetZExag(data[
'z-exag'][
'value'])
318 """!Change light settings"""
320 self._display.SetLight(x = data[
'position'][
'x'], y = data[
'position'][
'y'],
321 z = data[
'position'][
'z'] / 100., color = data[
'color'],
322 bright = data[
'bright'] / 100.,
323 ambient = data[
'ambient'] / 100.)
324 self._display.DrawLightingModel()
327 """!Updates the canvas anytime there is a change to the
328 underlaying images or to the geometry of the canvas.
330 @param render re-render map composition
336 if self.
render[
'quick']
is False:
337 self.parent.statusbarWin[
'progress'].Show()
338 self.parent.statusbarWin[
'progress'].SetRange(2)
339 self.parent.statusbarWin[
'progress'].SetValue(0)
341 if self.
render[
'quick']
is False:
342 self.parent.statusbarWin[
'progress'].SetValue(1)
343 self._display.Draw(
False, -1)
344 elif self.
render[
'quick']
is True:
346 mode = wxnviz.DRAW_QUICK_SURFACE | wxnviz.DRAW_QUICK_VOLUME
348 mode |= wxnviz.DRAW_QUICK_VLINES
349 if self.
render[
'vpoints']:
350 mode |= wxnviz.DRAW_QUICK_VPOINTS
351 self._display.Draw(
True, mode)
359 if self.
render[
'quick']
is False:
360 self.parent.statusbarWin[
'progress'].SetValue(2)
362 self.parent.statusbarWin[
'progress'].Hide()
364 Debug.msg(3,
"GLWindow.UpdateMap(): quick = %d, -> time = %g" % \
365 (self.
render[
'quick'], (stop-start)))
370 self._display.EraseMap()
374 """!Check if layer (item) is already loaded
376 @param item layer item
378 layer = self.tree.GetPyData(item)[0][
'maplayer']
379 data = self.tree.GetPyData(item)[0][
'nviz']
384 if layer.type ==
'raster':
385 if 'object' not in data[
'surface']:
387 elif layer.type ==
'vector':
388 if 'object' not in data[
'vlines']
and \
389 'object' not in data[
'points']:
394 def _GetDataLayers(self, item, litems):
395 """!Return get list of enabled map layers"""
397 while item
and item.IsOk():
398 type = self.tree.GetPyData(item)[0][
'type']
400 subItem = self.tree.GetFirstChild(item)[0]
402 item = self.tree.GetNextSibling(item)
404 if not item.IsChecked()
or \
405 type
not in (
'raster',
'vector',
'3d-raster'):
406 item = self.tree.GetNextSibling(item)
411 item = self.tree.GetNextSibling(item)
414 """!Load raster/vector from current layer tree
422 item = self.tree.GetFirstChild(self.tree.root)[0]
427 while(len(listOfItems) > 0):
428 item = listOfItems.pop()
429 type = self.tree.GetPyData(item)[0][
'type']
435 elif type ==
'3d-raster':
437 elif type ==
'vector':
444 layer = self.tree.GetPyData(item)[0][
'maplayer']
445 npoints, nlines, nfeatures, mapIs3D = self.lmgr.nviz.VectorInfo(layer)
451 GError(parent = self,
457 Debug.msg(3,
"GLWindow.LoadDataLayers(): time = %f" % (stop-start))
460 """!Unload any layers that have been deleted from layer tree"""
465 item = self.tree.GetFirstChild(self.tree.root)[0]
471 if layer
not in listOfItems:
472 ltype = self.tree.GetPyData(layer)[0][
'type']
474 if ltype ==
'raster':
476 elif ltype ==
'3d-raster':
478 elif ltype ==
'vector':
487 self.lmgr.nviz.UpdateSettings()
491 Debug.msg(3,
"GLWindow.UnloadDataLayers(): time = %f" % (stop-start))
494 """!Set 3D view properties from cmd (d.vect)
496 @param item Layer Tree item
499 cmd = self.tree.GetPyData(item)[0][
'cmd']
500 if cmd[0] !=
'd.vect':
504 key, value = opt.split(
'=')
508 data[
'lines'][
'color'][
'value'] = value
509 data[
'points'][
'color'][
'value'] = value
512 """!Set map object properties
514 Properties must be afterwards updated by
515 UpdateMapObjProperties().
517 @param item layer item
518 @param id nviz layer id (or -1)
519 @param nvizType nviz data type (surface, points, vector)
521 type = self.tree.GetPyData(item)[0][
'maplayer'].type
523 data = self.tree.GetPyData(item)[0][
'nviz']
527 self.tree.GetPyData(item)[0][
'nviz'] = {}
528 data = self.tree.GetPyData(item)[0][
'nviz']
532 data[nvizType] = self.nvizDefault.SetSurfaceDefaultProp()
534 elif type ==
'vector':
536 data[
'vector'] = self.nvizDefault.SetVectorDefaultProp()
539 elif type ==
'3d-raster':
541 data[nvizType] = self.nvizDefault.SetVolumeDefaultProp()
546 data[
'surface'] = self.nvizDefault.SetSurfaceDefaultProp()
548 if not data[
'vector'][
'lines']:
549 self.nvizDefault.SetVectorLinesDefaultProp(data[
'vector'][
'lines'])
550 if not data[
'vector'][
'points']:
551 self.nvizDefault.SetVectorPointsDefaultProp(data[
'vector'][
'points'])
554 for sec
in data.keys():
555 for sec1
in data[sec].keys():
556 for sec2
in data[sec][sec1].keys():
558 data[sec][sec1][sec2][
'update'] =
None
560 event = wxUpdateProperties(data = data)
561 wx.PostEvent(self, event)
565 if type
in (
'raster',
'3d-raster'):
566 data[nvizType][
'object'] = {
'id' : id,
568 elif type ==
'vector':
569 data[
'vector'][nvizType][
'object'] = {
'id' : id,
575 """!Load 2d raster map and set surface attributes
582 """!Load 3d raster map and set surface attributes
588 def _loadRaster(self, item):
589 """!Load 2d/3d raster map and set its attributes
593 layer = self.tree.GetPyData(item)[0][
'maplayer']
595 if layer.type
not in (
'raster',
'3d-raster'):
598 if layer.type ==
'raster':
599 id = self._display.LoadSurface(str(layer.name),
None,
None)
601 errorMsg = _(
"Loading raster map")
602 elif layer.type ==
'3d-raster':
603 id = self._display.LoadVolume(str(layer.name),
None,
None)
605 errorMsg = _(
"Loading 3d raster map")
610 if layer.type
in (
'raster',
'3d-raster'):
611 self.log.WriteError(
"%s <%s> %s" % (errorMsg, layer.name, _(
"failed")))
613 self.log.WriteError(_(
"Unsupported layer type '%s'") % layer.type)
615 self.layers.append(item)
621 event = wxUpdateProperties(data = data)
622 wx.PostEvent(self, event)
625 if hasattr(self.lmgr,
"nviz")
and \
626 item == self.GetSelectedLayer(type =
'item'):
627 toolWin = self.lmgr.nviz
628 if layer.type ==
'raster':
629 win = toolWin.FindWindowById( \
630 toolWin.win[
'vector'][
'lines'][
'surface'])
639 """!Unload 2d raster map
646 """!Unload 3d raster map
652 def _unloadRaster(self, item):
653 """!Unload 2d/3d raster map
655 @param item layer item
657 layer = self.tree.GetPyData(item)[0][
'maplayer']
659 if layer.type
not in (
'raster',
'3d-raster'):
662 data = self.tree.GetPyData(item)[0][
'nviz']
664 if layer.type ==
'raster':
666 unloadFn = self._display.UnloadSurface
667 errorMsg = _(
"Unable to unload raster map")
668 successMsg = _(
"Raster map")
671 unloadFn = self._display.UnloadVolume
672 errorMsg = _(
"Unable to unload 3d raster map")
673 successMsg = _(
"3d raster map")
675 id = data[nvizType][
'object'][
'id']
677 if unloadFn(id) == 0:
678 self.log.WriteError(
"%s <%s>" % (errorMsg, layer.name))
680 self.log.WriteLog(
"%s <%s> %s" % (successMsg, layer.name, _(
"unloaded successfully")))
682 data[nvizType].pop(
'object')
684 self.layers.remove(item)
687 if hasattr(self.lmgr,
"nviz")
and \
688 layer.type ==
'raster':
689 toolWin = self.lmgr.nviz
690 win = toolWin.FindWindowById( \
691 toolWin.win[
'vector'][
'lines'][
'surface'])
695 """!Load 2D or 3D vector map overlay
697 @param item layer item
698 @param points True to load points, False to load lines, None
701 layer = self.tree.GetPyData(item)[0][
'maplayer']
702 if layer.type !=
'vector':
709 vecTypes = (
'points',
'lines')
712 vecTypes = (
'points', )
715 vecTypes = (
'lines', )
718 for vecType
in vecTypes:
719 if vecType ==
'lines':
720 id = self._display.LoadVector(str(layer.GetName()),
False)
722 id = self._display.LoadVector(str(layer.GetName()),
True)
724 self.log.WriteError(_(
"Loading vector map <%(name)s> (%(type)s) failed") % \
725 {
'name' : layer.name,
'type' : vecType })
729 self.layers.append(item)
732 data = self.tree.GetPyData(item)[0][
'nviz']
733 event = wxUpdateProperties(data = data)
734 wx.PostEvent(self, event)
737 if hasattr(self.lmgr,
"nviz")
and \
738 item == self.GetSelectedLayer(type =
'item'):
739 toolWin = self.lmgr.nviz
741 toolWin.UpdatePage(
'vector')
747 """!Unload vector map overlay
749 @param item layer item
750 @param points,lines True to unload given feature type
752 layer = self.tree.GetPyData(item)[0][
'maplayer']
753 data = self.tree.GetPyData(item)[0][
'nviz'][
'vector']
763 vecTypes = (
'points',
'lines')
765 vecTypes = (
'points', )
767 vecTypes = (
'lines', )
769 for vecType
in vecTypes:
770 if 'object' not in data[vecType]:
773 id = data[vecType][
'object'][
'id']
775 if vecType ==
'lines':
776 ret = self._display.UnloadVector(id,
False)
778 ret = self._display.UnloadVector(id,
True)
780 self.log.WriteError(_(
"Unable to unload vector map <%(name)s> (%(type)s)") % \
781 {
'name': layer.name,
'type' : vecType })
783 self.log.WriteLog(_(
"Vector map <%(name)s> (%(type)s) unloaded successfully") % \
784 {
'name' : layer.name,
'type' : vecType })
786 data[vecType].pop(
'object')
791 """!Reset (unload data)"""
793 type = self.tree.GetPyData(item)[0][
'maplayer'].type
796 elif type ==
'3d-raster':
798 elif type ==
'vector':
804 """!Set display extents to match selected raster or vector
809 layer = self.GetSelectedLayer()
814 Debug.msg (3,
"GLWindow.OnZoomToMap(): layer = %s, type = %s" % \
815 (layer.name, layer.type))
817 self._display.SetViewportDefault()
820 """!Reset to default view"""
821 self.
view[
'z-exag'][
'value'], \
822 self.
iview[
'height'][
'value'], \
823 self.
iview[
'height'][
'min'], \
824 self.
iview[
'height'][
'max'] = self._display.SetViewDefault()
826 self.
view[
'z-exag'][
'min'] = 0
827 self.
view[
'z-exag'][
'max'] = self.
view[
'z-exag'][
'value'] * 10
829 self.
view[
'position'][
'x'] = UserSettings.Get(group =
'nviz', key =
'view',
830 subkey = (
'position',
'x'))
831 self.
view[
'position'][
'y'] = UserSettings.Get(group =
'nviz', key =
'view',
832 subkey = (
'position',
'y'))
833 self.
view[
'persp'][
'value'] = UserSettings.Get(group =
'nviz', key =
'view',
834 subkey = (
'persp',
'value'))
836 self.
view[
'twist'][
'value'] = UserSettings.Get(group =
'nviz', key =
'view',
837 subkey = (
'twist',
'value'))
839 event = wxUpdateView(zExag =
False)
840 wx.PostEvent(self, event)
843 """!Generic method to update data layer properties"""
846 if 'surface' in data:
847 id = data[
'surface'][
'object'][
'id']
850 data[
'surface'][
'object'][
'init'] =
True
852 elif 'volume' in data:
853 id = data[
'volume'][
'object'][
'id']
856 data[
'volume'][
'object'][
'init'] =
True
858 elif 'vector' in data:
859 for type
in (
'lines',
'points'):
860 if 'object' in data[
'vector'][type]:
861 id = data[
'vector'][type][
'object'][
'id']
864 data[
'vector'][type][
'object'][
'init'] =
True
867 """!Update surface map object properties"""
869 for attrb
in (
'topo',
'color',
'mask',
870 'transp',
'shine',
'emit'):
871 if attrb
not in data[
'attribute']
or \
872 'update' not in data[
'attribute'][attrb]:
875 map = data[
'attribute'][attrb][
'map']
876 value = data[
'attribute'][attrb][
'value']
883 self._display.UnsetSurfaceMask(id)
884 elif attrb ==
'transp':
885 self._display.UnsetSurfaceTransp(id)
886 elif attrb ==
'emit':
887 self._display.UnsetSurfaceEmit(id)
893 self._display.SetSurfaceTopo(id, map, str(value))
894 elif attrb ==
'color':
895 self._display.SetSurfaceColor(id, map, str(value))
896 elif attrb ==
'mask':
899 self._display.SetSurfaceMask(id,
False, str(value))
900 elif attrb ==
'transp':
901 self._display.SetSurfaceTransp(id, map, str(value))
902 elif attrb ==
'shine':
903 self._display.SetSurfaceShine(id, map, str(value))
904 elif attrb ==
'emit':
905 self._display.SetSurfaceEmit(id, map, str(value))
906 data[
'attribute'][attrb].pop(
'update')
909 if 'update' in data[
'draw'][
'resolution']:
910 coarse = data[
'draw'][
'resolution'][
'coarse']
911 fine = data[
'draw'][
'resolution'][
'fine']
913 if data[
'draw'][
'all']:
914 self._display.SetSurfaceRes(-1, fine, coarse)
916 self._display.SetSurfaceRes(id, fine, coarse)
917 data[
'draw'][
'resolution'].pop(
'update')
920 if 'update' in data[
'draw'][
'mode']:
921 if data[
'draw'][
'mode'][
'value'] < 0:
922 data[
'draw'][
'mode'][
'value'] = \
923 self.nvizDefault.GetDrawMode(mode = data[
'draw'][
'mode'][
'desc'][
'mode'],
924 style = data[
'draw'][
'mode'][
'desc'][
'style'],
925 shade = data[
'draw'][
'mode'][
'desc'][
'shading'],
927 style = data[
'draw'][
'mode'][
'value']
928 if data[
'draw'][
'all']:
929 self._display.SetSurfaceStyle(-1, style)
931 self._display.SetSurfaceStyle(id, style)
932 data[
'draw'][
'mode'].pop(
'update')
935 if 'update' in data[
'draw'][
'wire-color']:
936 color = data[
'draw'][
'wire-color'][
'value']
937 if data[
'draw'][
'all']:
938 self._display.SetWireColor(-1, str(color))
940 self._display.SetWireColor(id, str(color))
941 data[
'draw'][
'wire-color'].pop(
'update')
944 if 'update' in data[
'position']:
945 x = data[
'position'][
'x']
946 y = data[
'position'][
'y']
947 z = data[
'position'][
'z']
948 self._display.SetSurfacePosition(id, x, y, z)
949 data[
'position'].pop(
'update')
950 data[
'draw'][
'all'] =
False
953 """!Update volume (isosurface/slice) map object properties"""
954 if 'update' in data[
'draw'][
'resolution']:
955 self._display.SetIsosurfaceRes(id, data[
'draw'][
'resolution'][
'value'])
956 data[
'draw'][
'resolution'].pop(
'update')
958 if 'update' in data[
'draw'][
'shading']:
959 if data[
'draw'][
'shading'][
'value'] < 0:
960 data[
'draw'][
'shading'][
'value'] = \
961 self.nvizDefault.GetDrawMode(shade = data[
'draw'][
'shading'],
963 data[
'draw'][
'shading'].pop(
'update')
969 for isosurf
in data[
'isosurface']:
970 for attrb
in (
'color',
'mask',
971 'transp',
'shine',
'emit'):
972 if attrb
not in isosurf
or \
973 'update' not in isosurf[attrb]:
975 map = isosurf[attrb][
'map']
976 value = isosurf[attrb][
'value']
983 self._display.UnsetIsosurfaceMask(id, isosurfId)
984 elif attrb ==
'transp':
985 self._display.UnsetIsosurfaceTransp(id, isosurfId)
986 elif attrb ==
'emit':
987 self._display.UnsetIsosurfaceEmit(id, isosurfId)
992 elif attrb ==
'color':
993 self._display.SetIsosurfaceColor(id, isosurfId, map, str(value))
994 elif attrb ==
'mask':
997 self._display.SetIsosurfaceMask(id, isosurfId,
False, str(value))
998 elif attrb ==
'transp':
999 self._display.SetIsosurfaceTransp(id, isosurfId, map, str(value))
1000 elif attrb ==
'shine':
1001 self._display.SetIsosurfaceShine(id, isosurfId, map, str(value))
1002 elif attrb ==
'emit':
1003 self._display.SetIsosurfaceEmit(id, isosurfId, map, str(value))
1004 isosurf[attrb].pop(
'update')
1008 """!Update vector layer properties
1011 @param data properties
1012 @param type lines/points
1014 if type ==
'points':
1020 """!Update vector line map object properties"""
1022 if 'update' in data[
'color']
or \
1023 'update' in data[
'width']
or \
1024 'update' in data[
'mode']:
1025 width = data[
'width'][
'value']
1026 color = data[
'color'][
'value']
1027 if data[
'mode'][
'type'] ==
'flat':
1029 if 'surface' in data:
1034 self._display.SetVectorLineMode(id, color,
1037 if 'update' in data[
'color']:
1038 data[
'color'].pop(
'update')
1039 if 'update' in data[
'width']:
1040 data[
'width'].pop(
'update')
1041 if 'update' in data[
'mode']:
1042 data[
'mode'].pop(
'update')
1045 if 'update' in data[
'height']:
1046 self._display.SetVectorLineHeight(id,
1047 data[
'height'][
'value'])
1048 data[
'height'].pop(
'update')
1051 if 'update' in data[
'mode']:
1052 sid = self.
GetLayerId(type =
'raster', name = data[
'mode'][
'surface'])
1054 self._display.SetVectorLineSurface(id, sid)
1056 data[
'mode'].pop(
'update')
1059 """!Update vector point map object properties"""
1060 if 'update' in data[
'size']
or \
1061 'update' in data[
'width']
or \
1062 'update' in data[
'marker']
or \
1063 'update' in data[
'color']:
1064 ret = self._display.SetVectorPointMode(id, data[
'color'][
'value'],
1065 data[
'width'][
'value'], float(data[
'size'][
'value']),
1066 data[
'marker'][
'value'] + 1)
1070 error = _(
"Vector point layer not found (id = %d)") % id
1072 error = _(
"Unable to set data layer properties (id = %d)") % id
1075 raise gcmd.GException(_(
"Setting data layer properties failed.\n\n%s") % error)
1077 for prop
in (
'size',
'width',
'marker',
'color'):
1078 if 'update' in data[prop]:
1079 data[prop].pop(
'update')
1082 if 'update' in data[
'height']:
1083 self._display.SetVectorPointHeight(id,
1084 data[
'height'][
'value'])
1085 data[
'height'].pop(
'update')
1088 if 'update' in data[
'mode']:
1089 sid = self.
GetLayerId(type =
'raster', name = data[
'mode'][
'surface'])
1091 self._display.SetVectorPointSurface(id, sid)
1093 data[
'mode'].pop(
'update')
1096 """!Return list of map layer names of given type"""
1100 mapLayer = self.tree.GetPyData(item)[0][
'maplayer']
1101 if type != mapLayer.GetType():
1104 layerName.append(mapLayer.GetName())
1109 """!Get layer object id or -1"""
1114 mapLayer = self.tree.GetPyData(item)[0][
'maplayer']
1115 if type != mapLayer.GetType()
or \
1116 name != mapLayer.GetName():
1119 data = self.tree.GetPyData(item)[0][
'nviz']
1121 if type ==
'raster':
1122 return data[
'surface'][
'object'][
'id']
1123 elif type ==
'vpoint':
1124 return data[
'vector'][
'points'][
'object'][
'id']
1125 elif type ==
'vline':
1126 return data[
'vector'][
'lines'][
'object'][
'id']
1127 elif type ==
'3d-raster':
1128 return data[
'volume'][
'object'][
'id']
1133 """!This draws the DC to a buffer that can be saved to a file.
1135 @todo fix BufferedPaintDC
1137 @param FileName file name
1138 @param FileType type of bitmap
1139 @param width image width
1140 @param height image height
1142 self._display.SaveToFile(FileName, width, height)
1153 """!Get display instance"""
1159 self.lmgr.nviz.OnResetView(
None)