task.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. """
  2. @package gui_core.task
  3. @brief Construct simple wxPython GUI from a GRASS command interface
  4. description.
  5. Classes:
  6. - GUI
  7. (C) 2000-2011 by the GRASS Development Team
  8. This program is free software under the GPL(>=v2) Read the file
  9. COPYING coming with GRASS for details.
  10. @author Jan-Oliver Wagner <jan@intevation.de>
  11. @author Bernhard Reiter <bernhard@intevation.de>
  12. @author Michael Barton, Arizona State University
  13. @author Daniel Calvelo <dca.gis@gmail.com>
  14. @author Martin Landa <landa.martin@gmail.com>
  15. @author Luca Delucchi <lucadeluge@gmail.com>
  16. """
  17. import sys
  18. import re
  19. import os
  20. import time
  21. import locale
  22. try:
  23. import xml.etree.ElementTree as etree
  24. except ImportError:
  25. import elementtree.ElementTree as etree # Python <= 2.4
  26. from core import globalvar
  27. import wx
  28. from grass.script import core as grass
  29. from grass.script import task as gtask
  30. from core.gcmd import GException, GError
  31. class GUI:
  32. def __init__(self, parent = None, show = True, modal = False,
  33. centreOnParent = False, checkError = False):
  34. """!Parses GRASS commands when module is imported and used from
  35. Layer Manager.
  36. """
  37. self.parent = parent
  38. self.show = show
  39. self.modal = modal
  40. self.centreOnParent = centreOnParent
  41. self.checkError = checkError
  42. self.grass_task = None
  43. self.cmd = list()
  44. global _blackList
  45. if self.parent:
  46. _blackList['enabled'] = True
  47. else:
  48. _blackList['enabled'] = False
  49. def GetCmd(self):
  50. """!Get validated command"""
  51. return self.cmd
  52. def ParseCommand(self, cmd, gmpath = None, completed = None):
  53. """!Parse command
  54. Note: cmd is given as list
  55. If command is given with options, return validated cmd list:
  56. - add key name for first parameter if not given
  57. - change mapname to mapname@mapset
  58. """
  59. start = time.time()
  60. dcmd_params = {}
  61. if completed == None:
  62. get_dcmd = None
  63. layer = None
  64. dcmd_params = None
  65. else:
  66. get_dcmd = completed[0]
  67. layer = completed[1]
  68. if completed[2]:
  69. dcmd_params.update(completed[2])
  70. # parse the interface decription
  71. try:
  72. global _blackList
  73. self.grass_task = gtask.parse_interface(cmd[0],
  74. blackList = _blackList)
  75. except ValueError, e: #grass.ScriptError, e:
  76. GError(e.value)
  77. return
  78. # if layer parameters previously set, re-insert them into dialog
  79. if completed is not None:
  80. if 'params' in dcmd_params:
  81. self.grass_task.params = dcmd_params['params']
  82. if 'flags' in dcmd_params:
  83. self.grass_task.flags = dcmd_params['flags']
  84. err = list()
  85. # update parameters if needed && validate command
  86. if len(cmd) > 1:
  87. i = 0
  88. cmd_validated = [cmd[0]]
  89. for option in cmd[1:]:
  90. if option[0] == '-': # flag
  91. if option[1] == '-':
  92. self.grass_task.set_flag(option[2:], True)
  93. else:
  94. self.grass_task.set_flag(option[1], True)
  95. cmd_validated.append(option)
  96. else: # parameter
  97. try:
  98. key, value = option.split('=', 1)
  99. except:
  100. if self.grass_task.firstParam:
  101. if i == 0: # add key name of first parameter if not given
  102. key = self.grass_task.firstParam
  103. value = option
  104. else:
  105. raise GException, _("Unable to parse command '%s'") % ' '.join(cmd)
  106. else:
  107. continue
  108. element = self.grass_task.get_param(key, raiseError = False)
  109. if not element:
  110. err.append(_("%(cmd)s: parameter '%(key)s' not available") % \
  111. { 'cmd' : cmd[0],
  112. 'key' : key })
  113. continue
  114. element = element['element']
  115. if element in ['cell', 'vector']:
  116. # mapname -> mapname@mapset
  117. try:
  118. name, mapset = value.split('@')
  119. except ValueError:
  120. mapset = grass.find_file(value, element)['mapset']
  121. curr_mapset = grass.gisenv()['MAPSET']
  122. if mapset and mapset != curr_mapset:
  123. value = value + '@' + mapset
  124. self.grass_task.set_param(key, value)
  125. cmd_validated.append(key + '=' + value)
  126. i += 1
  127. # update original command list
  128. cmd = cmd_validated
  129. if self.show is not None:
  130. self.mf = mainFrame(parent = self.parent, ID = wx.ID_ANY,
  131. task_description = self.grass_task,
  132. get_dcmd = get_dcmd, layer = layer)
  133. else:
  134. self.mf = None
  135. if get_dcmd is not None:
  136. # update only propwin reference
  137. get_dcmd(dcmd = None, layer = layer, params = None,
  138. propwin = self.mf)
  139. if self.show is not None:
  140. self.mf.notebookpanel.OnUpdateSelection(None)
  141. if self.show is True:
  142. if self.parent and self.centreOnParent:
  143. self.mf.CentreOnParent()
  144. else:
  145. self.mf.CenterOnScreen()
  146. self.mf.Show(self.show)
  147. self.mf.MakeModal(self.modal)
  148. else:
  149. self.mf.OnApply(None)
  150. self.cmd = cmd
  151. if self.checkError:
  152. return self.grass_task, err
  153. else:
  154. return self.grass_task
  155. def GetCommandInputMapParamKey(self, cmd):
  156. """!Get parameter key for input raster/vector map
  157. @param cmd module name
  158. @return parameter key
  159. @return None on failure
  160. """
  161. # parse the interface decription
  162. if not self.grass_task:
  163. enc = locale.getdefaultlocale()[1]
  164. if enc and enc.lower() == "cp932":
  165. p = re.compile('encoding="' + enc + '"', re.IGNORECASE)
  166. tree = etree.fromstring(p.sub('encoding="utf-8"',
  167. gtask.get_interface_description(cmd).decode(enc).encode('utf-8')))
  168. else:
  169. tree = etree.fromstring(gtask.get_interface_description(cmd))
  170. self.grass_task = gtask.processTask(tree).get_task()
  171. for p in self.grass_task.params:
  172. if p.get('name', '') in ('input', 'map'):
  173. age = p.get('age', '')
  174. prompt = p.get('prompt', '')
  175. element = p.get('element', '')
  176. if age == 'old' and \
  177. element in ('cell', 'grid3', 'vector') and \
  178. prompt in ('raster', '3d-raster', 'vector'):
  179. return p.get('name', None)
  180. return None