123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- """!
- @package animation.nviztask
- @brief Conversion from workspace file to m.nviz.image command
- Classes:
- - nviztask::NvizTask
- (C) 2012 by the GRASS Development Team
- This program is free software under the GNU General Public License
- (>=v2). Read the file COPYING that comes with GRASS for details.
- @author Anna Kratochvilova <kratochanna gmail.com>
- """
- import os
- import sys
- try:
- import xml.etree.ElementTree as etree
- except ImportError:
- import elementtree.ElementTree as etree # Python <= 2.4
- from pprint import pprint
- if __name__ == '__main__':
- sys.path.append(os.path.join(os.environ['GISBASE'], "etc", "gui", "wxpython"))
- from core.workspace import ProcessWorkspaceFile
- from core.gcmd import RunCommand, GException
- from core.utils import GetLayerNameFromCmd, CmdToTuple, _
- from grass.script import task as gtask
- from grass.script import core as grass
- class NvizTask:
- def __init__(self):
- self.task = None
- self.filename = None
- self.region = {}
- def Load(self, filename):
- self.task = gtask.grassTask("m.nviz.image")
- self.filename = filename
- try:
- gxwXml = ProcessWorkspaceFile(etree.parse(self.filename))
- except Exception, e:
- raise GException(_("Reading workspace file <%s> failed.\n"
- "Invalid file, unable to parse XML document.") % filename)
- # for display in gxwXml.displays:
- # pprint(display)
- # for layer in gxwXml.layers:
- # pprint(layer)
- # pprint(gxwXml.nviz_state)
- if not gxwXml.nviz_state:
- raise GException(_("No 3d view information in workspace file <%s>.") % self.filename)
- self._getExtent(gxwXml)
- self._processState(gxwXml.nviz_state)
- self._processLayers(gxwXml.layers)
- def _getExtent(self, root):
- for display in root.displays:
- if display['viewMode'] == '3d':
- self.region['w'], self.region['s'],\
- self.region['e'], self.region['n'] = display['extent']
- def _processLayers(self, layers):
- for layer in layers:
- if not layer['checked']:
- continue
- if not layer['nviz']:
- continue
- layerName, found = GetLayerNameFromCmd(layer['cmd'], fullyQualified = False,
- param = 'map')
- if not found:
- continue
- if 'surface' in layer['nviz']:
- self._processSurface(layer['nviz']['surface'], mapName = layerName)
- def _processSurface(self, surface, mapName):
- self._setMultiTaskParam('elevation_map', mapName)
- # attributes like color, shine, transparency
- attributes = ('color', 'shine', 'transp') # mask missing
- parameters = (('color_map', 'color'),
- ('shininess_map', 'shininess_value'),
- ('transparency_map', 'transparency_value'))
- for attr, params in zip(attributes, parameters):
- mapname = None
- const = None
- if attr in surface['attribute']:
- if surface['attribute'][attr]['map']:
- mapname = surface['attribute'][attr]['value']
- else:
- const = surface['attribute'][attr]['value']
- else:
- if attr == 'transp':
- const = 0
- elif attr == 'color':
- mapname = mapName
- if mapname:
- self._setMultiTaskParam(params[0], mapname)
- else:
- self._setMultiTaskParam(params[1], const)
- # draw mode
- for mode in ('mode', 'shading', 'style'):
- value = surface['draw']['mode']['desc'][mode]
- self._setMultiTaskParam(mode, value)
- # wire color
- value = surface['draw']['wire-color']['value']
- self._setMultiTaskParam('wire_color', value)
- # resolution
- for mode1, mode2 in zip(('coarse', 'fine'), ('resolution_coarse', 'resolution_fine')):
- value = surface['draw']['resolution'][mode1]
- self._setMultiTaskParam(mode2, value)
- # position
- pos = []
- for coor in ('x', 'y', 'z'):
- pos.append(str(surface['position'][coor]))
- value = ','.join(pos)
- self._setMultiTaskParam('surface_position', value)
- def _processState(self, state):
- color = state['view']['background']['color']
- self.task.set_param('bgcolor', self._join(color, delim = ':'))
- self.task.set_param('position', self._join((state['view']['position']['x'],
- state['view']['position']['y'])))
- self.task.set_param('height', state['iview']['height']['value'])
- self.task.set_param('perspective', state['view']['persp']['value'])
- self.task.set_param('twist', state['view']['twist']['value'])
- # TODO: fix zexag
- self.task.set_param('zexag', state['view']['z-exag']['value'])
- self.task.set_param('focus', self._join((state['iview']['focus']['x'],
- state['iview']['focus']['y'],
- state['iview']['focus']['z'])))
- self.task.set_param('light_position', self._join((state['light']['position']['x'],
- state['light']['position']['y'],
- state['light']['position']['z']/100.)))
- color = state['light']['color'][:3]
- self.task.set_param('light_color', self._join(color, delim = ':'))
- self.task.set_param('light_brightness', int(state['light']['bright']))
- self.task.set_param('light_ambient', state['light']['ambient'])
-
- def _setMultiTaskParam(self, param, value):
- last = self.task.get_param(param)['value']
- self.task.set_param(param, self._join((last, value)))
- def _join(self, toJoin, delim = ','):
- toJoin = filter(self._ignore, toJoin)
- return delim.join(map(str, toJoin))
- def _ignore(self, value):
- if value == '' or value is None:
- return False
- else:
- return True
- def ListMapParameters(self):
- # params = self.task.get_list_params()
- # parameter with 'map' name
- # params = filter(lambda x: 'map' in x, params)
- return ('elevation_map', 'color_map', 'vline','vpoint')
- def GetCommandSeries(self, series, paramName):
- commands = []
- if not self.task:
- return commands
- for value in series:
- self.task.set_param(paramName, value)
- # FIXME: we assume we want always default color map
- if paramName == 'elevation_map':
- self.task.set_param('color_map', '')
- self.task.set_flag('overwrite', True)
- self.task.set_param('output', 'tobechanged')
- cmd = self.task.get_cmd(ignoreErrors = False, ignoreRequired = False, ignoreDefault = True)
- commands.append(CmdToTuple(cmd))
- return commands
- def GetCommand(self):
- if not self.task:
- return None
- self.task.set_flag('overwrite', True)
- self.task.set_param('output', 'tobechanged')
- cmd = self.task.get_cmd(ignoreErrors = False, ignoreRequired = False, ignoreDefault = True)
- return CmdToTuple(cmd)
- def GetRegion(self):
- return self.region
- def test():
- nviz = NvizTask('/home/anna/testy/nviz/t12.gxw')
- # nviz = NvizState('/home/anna/testy/nviz/t3.gxw')
-
- # cmd = nviz.GetCommand()
- cmds = nviz.GetCommandSeries(['aspect','elevation'], 'color_map')
- for cmd in cmds:
- print cmd
- returncode, message = RunCommand(getErrorMsg = True, prog = cmd[0], **cmd[1])
- print returncode, message
- if __name__ == '__main__':
- test()
|