nviztask.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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. self.task.set_flag('overwrite', True)
  149. self.task.set_param('output', 'tobechanged')
  150. cmd = self.task.get_cmd(ignoreErrors = False, ignoreRequired = False, ignoreDefault = True)
  151. commands.append(CmdToTuple(cmd))
  152. return commands
  153. def GetCommand(self):
  154. if not self.task:
  155. return None
  156. self.task.set_flag('overwrite', True)
  157. self.task.set_param('output', 'tobechanged')
  158. cmd = self.task.get_cmd(ignoreErrors = False, ignoreRequired = False, ignoreDefault = True)
  159. return CmdToTuple(cmd)
  160. def GetRegion(self):
  161. return self.region
  162. def test():
  163. import gettext
  164. gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode = True)
  165. nviz = NvizTask('/home/anna/testy/nviz/t12.gxw')
  166. # nviz = NvizState('/home/anna/testy/nviz/t3.gxw')
  167. # cmd = nviz.GetCommand()
  168. cmds = nviz.GetCommandSeries(['aspect','elevation'], 'color_map')
  169. for cmd in cmds:
  170. print cmd
  171. returncode, message = RunCommand(getErrorMsg = True, prog = cmd[0], **cmd[1])
  172. print returncode, message
  173. if __name__ == '__main__':
  174. test()