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