rules.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. """
  2. MODULE: rules.py
  3. CLASSES:
  4. * RulesText
  5. PURPOSE: Dialog for interactive entry of rules for r.colors,
  6. r.reclass, r.recode, and v.reclass
  7. AUTHORS: The GRASS Development Team
  8. Michael Barton (Arizona State University)
  9. COPYRIGHT: (C) 2007 by the GRASS Development Team
  10. This program is free software under the GNU General Public
  11. License (>=v2). Read the file COPYING that comes with GRASS
  12. for details.
  13. """
  14. import os
  15. import sys
  16. import wx
  17. import gcmd
  18. import gselect
  19. import globalvar
  20. class RulesText(wx.Dialog):
  21. def __init__(self, parent, id=wx.ID_ANY, title=_("Enter rules"),
  22. pos=wx.DefaultPosition, size=wx.DefaultSize,
  23. style=wx.DEFAULT_DIALOG_STYLE,
  24. cmd=None):
  25. wx.Dialog.__init__(self, parent, id, title, pos, size, style)
  26. """
  27. Dialog for interactively entering rules
  28. for map management commands
  29. @param cmd command (given as list)
  30. """
  31. self.parent = parent
  32. self.cmd = cmd # map management command
  33. self.inmap = '' # input map to change
  34. self.outmap = '' # output map for reclass/recode
  35. self.rules = '' # rules for changing
  36. self.overwrite = False
  37. if self.cmd[0] == 'r.colors':
  38. label1 = _('Create new color table using color rules')
  39. label2 = _('Raster map:')
  40. label3 = None
  41. label4 = _('Enter color rules')
  42. seltype = 'cell'
  43. elif self.cmd[0] == 'r.reclass':
  44. label1 = _('Reclassify raster map using rules')
  45. label2 = _('Raster map to reclassify:')
  46. label3 = _('Reclassified raster map:')
  47. label4 = _('Enter reclassification rules')
  48. seltype = 'cell'
  49. elif self.cmd[0] == 'r.recode':
  50. label1 = _('Recode raster map using rules')
  51. label2 = _('Raster map to recode:')
  52. label3 = _('Recoded raster map:')
  53. label4 = _('Enter recoding rules')
  54. seltype = 'cell'
  55. elif self.cmd[0] == 'v.reclass':
  56. label1 = _('Reclassify vector map using SQL rules')
  57. label2 = _('Vector map to reclassify:')
  58. label3 = _('Reclassified vector map:')
  59. label4 = _('Enter reclassification rules')
  60. seltype = 'vector'
  61. # set window frame title
  62. self.SetTitle(label1)
  63. sizer = wx.BoxSizer(wx.VERTICAL)
  64. boxSizer = wx.GridBagSizer(hgap=5, vgap=5)
  65. boxSizer.AddGrowableCol(0)
  66. row = 0
  67. boxSizer.Add(item=wx.StaticText(parent=self, id=wx.ID_ANY, label=label2),
  68. flag=wx.ALIGN_CENTER_VERTICAL,
  69. pos=(row,0))
  70. self.selectionInput = gselect.Select(parent=self, id=wx.ID_ANY, size=globalvar.DIALOG_GSELECT_SIZE,
  71. type=seltype)
  72. boxSizer.Add(item=self.selectionInput,
  73. pos=(row,1))
  74. row += 1
  75. if self.cmd[0] != 'r.colors':
  76. boxSizer.Add(item=wx.StaticText(parent=self, id=wx.ID_ANY, label=label3),
  77. flag=wx.ALIGN_CENTER_VERTICAL,
  78. pos=(row, 0))
  79. self.selectionOutput = gselect.Select(parent=self, id=wx.ID_ANY, size=(300,-1),
  80. type=seltype)
  81. self.selectionOutput.Bind(wx.EVT_TEXT, self.OnSelectionOutput)
  82. boxSizer.Add(item=self.selectionOutput,
  83. pos=(row,1))
  84. row += 1
  85. # TODO remove (see Preferences dialog)
  86. self.ovrwrtcheck = wx.CheckBox(parent=self, id=wx.ID_ANY, label=_('overwrite existing file'))
  87. self.ovrwrtcheck.SetValue(self.overwrite)
  88. boxSizer.Add(item=self.ovrwrtcheck,
  89. pos=(row, 1))
  90. self.Bind(wx.EVT_CHECKBOX, self.OnOverwrite, self.ovrwrtcheck)
  91. row += 1
  92. boxSizer.Add(item=wx.StaticText(parent=self, id=wx.ID_ANY, label=label4),
  93. flag=wx.ALIGN_CENTER_VERTICAL,
  94. pos=(row, 0))
  95. helpbtn = wx.Button(parent=self, id=wx.ID_HELP)
  96. boxSizer.Add(item=helpbtn, flag=wx.ALIGN_RIGHT, pos=(row, 1))
  97. row += 1
  98. self.rulestxt = wx.TextCtrl(parent=self, id=wx.ID_ANY, value='',
  99. pos=wx.DefaultPosition, size=(400,150),
  100. style=wx.TE_MULTILINE |
  101. wx.HSCROLL |
  102. wx.TE_NOHIDESEL)
  103. self.rulestxt.SetFont(wx.Font(10, wx.FONTFAMILY_MODERN, wx.NORMAL, wx.NORMAL, 0, ''))
  104. boxSizer.Add(item=self.rulestxt, pos=(row, 0), flag=wx.EXPAND, span=(1, 2))
  105. sizer.Add(item=boxSizer, proportion=1,
  106. flag=wx.ALL ,border=10)
  107. line = wx.StaticLine(parent=self, id=wx.ID_ANY, size=(20,-1), style=wx.LI_HORIZONTAL)
  108. sizer.Add(item=line, proportion=0,
  109. flag=wx.GROW | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5)
  110. btnsizer = wx.StdDialogButtonSizer()
  111. btn = wx.Button(self, wx.ID_OK)
  112. btn.SetDefault()
  113. btnsizer.AddButton(btn)
  114. btn = wx.Button(self, wx.ID_CANCEL)
  115. btnsizer.AddButton(btn)
  116. btnsizer.Realize()
  117. sizer.Add(item=btnsizer, proportion=0,
  118. flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
  119. self.SetSizer(sizer)
  120. sizer.Fit(self)
  121. # bindings
  122. self.Bind(wx.EVT_BUTTON, self.OnHelp, helpbtn)
  123. self.selectionInput.Bind(wx.EVT_TEXT, self.OnSelectionInput)
  124. self.Bind(wx.EVT_TEXT, self.OnRules, self.rulestxt)
  125. def OnSelectionInput(self, event):
  126. self.inmap = event.GetString()
  127. def OnSelectionOutput(self, event):
  128. self.outmap = event.GetString()
  129. def OnRules(self, event):
  130. self.rules = event.GetString().strip()
  131. if self.cmd[0] == 'r.recode':
  132. self.rules = self.rules + '%s' % os.linesep
  133. def OnHelp(self, event):
  134. gcmd.RunCommand('g.manual',
  135. quiet = True,
  136. entry = self.cmd[0])
  137. def OnOverwrite(self, event):
  138. self.overwrite = event.IsChecked()