nviztask.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. """!
  2. @package animation.nviztask
  3. @brief Conversion from workspace file to m.nviz.image command
  4. Classes:
  5. - nviztask::NvizTask
  6. (C) 2012 by the GRASS Development Team
  7. This program is free software under the GNU General Public License
  8. (>=v2). Read the file COPYING that comes with GRASS for details.
  9. @author Anna Kratochvilova <kratochanna gmail.com>
  10. """
  11. import os
  12. import sys
  13. try:
  14. import xml.etree.ElementTree as etree
  15. except ImportError:
  16. import elementtree.ElementTree as etree # Python <= 2.4
  17. from pprint import pprint
  18. if __name__ == '__main__':
  19. sys.path.append(os.path.join(os.environ['GISBASE'], "etc", "gui", "wxpython"))
  20. from core.workspace import ProcessWorkspaceFile
  21. from core.gcmd import RunCommand, GException
  22. from core.utils import GetLayerNameFromCmd, CmdToTuple, _
  23. from grass.script import task as gtask
  24. from grass.script import core as grass
  25. class NvizTask:
  26. def __init__(self):
  27. self.task = None
  28. self.filename = None
  29. self.region = {}
  30. def Load(self, filename):
  31. self.task = gtask.grassTask("m.nviz.image")
  32. self.filename = filename
  33. try:
  34. gxwXml = ProcessWorkspaceFile(etree.parse(self.filename))
  35. except Exception, e:
  36. raise GException(_("Reading workspace file <%s> failed.\n"
  37. "Invalid file, unable to parse XML document.") % filename)
  38. # for display in gxwXml.displays:
  39. # pprint(display)
  40. # for layer in gxwXml.layers:
  41. # pprint(layer)
  42. # pprint(gxwXml.nviz_state)
  43. if not gxwXml.nviz_state:
  44. raise GException(_("No 3d view information in workspace file <%s>.") % self.filename)
  45. self._getExtent(gxwXml)
  46. self._processState(gxwXml.nviz_state)
  47. self._processLayers(gxwXml.layers)
  48. def _getExtent(self, root):
  49. for display in root.displays:
  50. if display['viewMode'] == '3d':
  51. self.region['w'], self.region['s'],\
  52. self.region['e'], self.region['n'] = display['extent']
  53. def _processLayers(self, layers):
  54. for layer in layers:
  55. if not layer['checked']:
  56. continue
  57. if not layer['nviz']:
  58. continue
  59. layerName, found = GetLayerNameFromCmd(layer['cmd'], fullyQualified = False,
  60. param = 'map')
  61. if not found:
  62. continue
  63. if 'surface' in layer['nviz']:
  64. self._processSurface(layer['nviz']['surface'], mapName = layerName)
  65. def _processSurface(self, surface, mapName):
  66. self._setMultiTaskParam('elevation_map', mapName)
  67. # attributes like color, shine, transparency
  68. attributes = ('color', 'shine', 'transp') # mask missing
  69. parameters = (('color_map', 'color'),
  70. ('shininess_map', 'shininess_value'),
  71. ('transparency_map', 'transparency_value'))
  72. for attr, params in zip(attributes, parameters):
  73. mapname = None
  74. const = None
  75. if attr in surface['attribute']:
  76. if surface['attribute'][attr]['map']:
  77. mapname = surface['attribute'][attr]['value']
  78. else:
  79. const = surface['attribute'][attr]['value']
  80. else:
  81. if attr == 'transp':
  82. const = 0
  83. elif attr == 'color':
  84. mapname = mapName
  85. if mapname:
  86. self._setMultiTaskParam(params[0], mapname)
  87. else:
  88. self._setMultiTaskParam(params[1], const)
  89. # draw mode
  90. for mode in ('mode', 'shading', 'style'):
  91. value = surface['draw']['mode']['desc'][mode]
  92. self._setMultiTaskParam(mode, value)
  93. # wire color
  94. value = surface['draw']['wire-color']['value']
  95. self._setMultiTaskParam('wire_color', value)
  96. # resolution
  97. for mode1, mode2 in zip(('coarse', 'fine'), ('resolution_coarse', 'resolution_fine')):
  98. value = surface['draw']['resolution'][mode1]
  99. self._setMultiTaskParam(mode2, value)
  100. # position
  101. pos = []
  102. for coor in ('x', 'y', 'z'):
  103. pos.append(str(surface['position'][coor]))
  104. value = ','.join(pos)
  105. self._setMultiTaskParam('surface_position', value)
  106. def _processState(self, state):
  107. color = state['view']['background']['color']
  108. self.task.set_param('bgcolor', self._join(color, delim = ':'))
  109. self.task.set_param('position', self._join((state['view']['position']['x'],
  110. state['view']['position']['y'])))
  111. self.task.set_param('height', state['iview']['height']['value'])
  112. self.task.set_param('perspective', state['view']['persp']['value'])
  113. self.task.set_param('twist', state['view']['twist']['value'])
  114. # TODO: fix zexag
  115. self.task.set_param('zexag', state['view']['z-exag']['value'])
  116. self.task.set_param('focus', self._join((state['iview']['focus']['x'],
  117. state['iview']['focus']['y'],
  118. state['iview']['focus']['z'])))
  119. self.task.set_param('light_position', self._join((state['light']['position']['x'],
  120. state['light']['position']['y'],
  121. state['light']['position']['z']/100.)))
  122. color = state['light']['color'][:3]
  123. self.task.set_param('light_color', self._join(color, delim = ':'))
  124. self.task.set_param('light_brightness', int(state['light']['bright']))
  125. self.task.set_param('light_ambient', state['light']['ambient'])
  126. def _setMultiTaskParam(self, param, value):
  127. last = self.task.get_param(param)['value']
  128. self.task.set_param(param, self._join((last, value)))
  129. def _join(self, toJoin, delim = ','):
  130. toJoin = filter(self._ignore, toJoin)
  131. return delim.join(map(str, toJoin))
  132. def _ignore(self, value):
  133. if value == '' or value is None:
  134. return False
  135. else:
  136. return True
  137. def ListMapParameters(self):
  138. # params = self.task.get_list_params()
  139. # parameter with 'map' name
  140. # params = filter(lambda x: 'map' in x, params)
  141. return ('elevation_map', 'color_map', 'vline','vpoint')
  142. def GetCommandSeries(self, series, paramName):
  143. commands = []
  144. if not self.task:
  145. return commands
  146. for value in series:
  147. self.task.set_param(paramName, value)
  148. # FIXME: we assume we want always default color map
  149. if paramName == 'elevation_map':
  150. self.task.set_param('color_map', '')
  151. self.task.set_flag('overwrite', True)
  152. self.task.set_param('output', 'tobechanged')
  153. cmd = self.task.get_cmd(ignoreErrors = False, ignoreRequired = False, ignoreDefault = True)
  154. commands.append(CmdToTuple(cmd))
  155. return commands
  156. def GetCommand(self):
  157. if not self.task:
  158. return None
  159. self.task.set_flag('overwrite', True)
  160. self.task.set_param('output', 'tobechanged')
  161. cmd = self.task.get_cmd(ignoreErrors = False, ignoreRequired = False, ignoreDefault = True)
  162. return CmdToTuple(cmd)
  163. def GetRegion(self):
  164. return self.region
  165. def test():
  166. nviz = NvizTask('/home/anna/testy/nviz/t12.gxw')
  167. # nviz = NvizState('/home/anna/testy/nviz/t3.gxw')
  168. # cmd = nviz.GetCommand()
  169. cmds = nviz.GetCommandSeries(['aspect','elevation'], 'color_map')
  170. for cmd in cmds:
  171. print cmd
  172. returncode, message = RunCommand(getErrorMsg = True, prog = cmd[0], **cmd[1])
  173. print returncode, message
  174. if __name__ == '__main__':
  175. test()