4 @brief Dialogs for wxGUI vector digitizer
12 - VDigitDuplicatesDialog
15 (C) 2007-2011 by the GRASS Development Team
16 This program is free software under the GNU General Public License
17 (>=v2). Read the file COPYING that comes with GRASS for details.
19 @author Martin Landa <landa.martin gmail.com>
29 from threading
import Thread
32 import wx.lib.colourselect
as csel
33 import wx.lib.mixins.listctrl
as listmix
37 from debug
import Debug
as Debug
40 from units
import Units
41 from preferences
import globalSettings
as UserSettings
43 from wxvdigit
import IVDigit, GV_LINES
46 except (ImportError, NameError), err:
54 class VDigit(IVDigit):
56 """!Base class of vector digitizer
58 @param mapwindow reference to mapwindow (mapdisp_window.BufferedWindow) instance
60 IVDigit.__init__(self, mapwindow)
63 def __init__(self, parent, title, style = wx.DEFAULT_DIALOG_STYLE):
64 """!Standard settings dialog for digitization purposes
66 wx.Dialog.__init__(self, parent = parent, id = wx.ID_ANY, title = title, style = style)
69 self.
digit = self.parent.MapWindow.digit
72 notebook = wx.Notebook(parent = self, id = wx.ID_ANY, style = wx.BK_DEFAULT)
74 self.digit.SetCategory()
80 btnApply = wx.Button(self, wx.ID_APPLY)
81 btnCancel = wx.Button(self, wx.ID_CANCEL)
82 btnSave = wx.Button(self, wx.ID_SAVE)
86 btnApply.Bind(wx.EVT_BUTTON, self.
OnApply)
87 btnApply.SetToolTipString(_(
"Apply changes for this session"))
89 btnSave.Bind(wx.EVT_BUTTON, self.
OnSave)
90 btnSave.SetToolTipString(_(
"Close dialog and save changes to user settings file"))
91 btnCancel.Bind(wx.EVT_BUTTON, self.
OnCancel)
92 btnCancel.SetToolTipString(_(
"Close dialog and ignore changes"))
95 btnSizer = wx.StdDialogButtonSizer()
96 btnSizer.AddButton(btnCancel)
97 btnSizer.AddButton(btnApply)
98 btnSizer.AddButton(btnSave)
101 mainSizer = wx.BoxSizer(wx.VERTICAL)
102 mainSizer.Add(item = notebook, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 5)
103 mainSizer.Add(item = btnSizer, proportion = 0,
104 flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
106 self.Bind(wx.EVT_CLOSE, self.
OnCancel)
108 self.SetSizer(mainSizer)
111 def _createSymbologyPage(self, notebook):
112 """!Create notebook page concerning symbology settings"""
113 panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
114 notebook.AddPage(page = panel, text = _(
"Symbology"))
116 sizer = wx.BoxSizer(wx.VERTICAL)
118 flexSizer = wx.FlexGridSizer (cols = 3, hgap = 5, vgap = 5)
119 flexSizer.AddGrowableCol(0)
123 textLabel = wx.StaticText(panel, wx.ID_ANY, label)
124 color = csel.ColourSelect(panel, id = wx.ID_ANY,
125 colour = UserSettings.Get(group =
'vdigit', key =
'symbol',
126 subkey = [key,
'color']), size = globalvar.DIALOG_COLOR_SIZE)
127 isEnabled = UserSettings.Get(group =
'vdigit', key =
'symbol',
128 subkey = [key,
'enabled'])
129 if isEnabled
is not None:
130 enabled = wx.CheckBox(panel, id = wx.ID_ANY, label =
"")
131 enabled.SetValue(isEnabled)
137 flexSizer.Add(textLabel, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
138 flexSizer.Add(enabled, proportion = 0, flag = wx.ALIGN_CENTER | wx.FIXED_MINSIZE)
139 flexSizer.Add(color, proportion = 0, flag = wx.ALIGN_RIGHT | wx.FIXED_MINSIZE)
140 color.SetName(
"GetColour")
142 sizer.Add(item = flexSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 10)
144 panel.SetSizer(sizer)
148 def _createGeneralPage(self, notebook):
149 """!Create notebook page concerning general settings"""
150 panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
151 notebook.AddPage(page = panel, text = _(
"General"))
153 border = wx.BoxSizer(wx.VERTICAL)
158 box = wx.StaticBox (parent = panel, id = wx.ID_ANY, label =
" %s " % _(
"Display"))
159 sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
160 flexSizer = wx.FlexGridSizer (cols = 3, hgap = 5, vgap = 5)
161 flexSizer.AddGrowableCol(0)
163 text = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _(
"Line width"))
164 self.
lineWidthValue = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (75, -1),
165 initial = UserSettings.Get(group =
'vdigit', key =
"lineWidth", subkey =
'value'),
167 units = wx.StaticText(parent = panel, id = wx.ID_ANY, size = (115, -1),
168 label = UserSettings.Get(group =
'vdigit', key =
"lineWidth", subkey =
'units'),
169 style = wx.ALIGN_LEFT)
170 flexSizer.Add(text, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
171 flexSizer.Add(self.
lineWidthValue, proportion = 0, flag = wx.ALIGN_CENTER | wx.FIXED_MINSIZE)
172 flexSizer.Add(units, proportion = 0, flag = wx.ALIGN_RIGHT | wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL | wx.LEFT,
175 sizer.Add(item = flexSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 1)
176 border.Add(item = sizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 5)
181 box = wx.StaticBox (parent = panel, id = wx.ID_ANY, label =
" %s " % _(
"Snapping"))
182 sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
183 flexSizer = wx.FlexGridSizer(cols = 3, hgap = 5, vgap = 5)
184 flexSizer.AddGrowableCol(0)
187 text = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _(
"Snapping threshold"))
188 self.
snappingValue = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (75, -1),
189 initial = UserSettings.Get(group =
'vdigit', key =
"snapping", subkey =
'value'),
193 self.
snappingUnit = wx.Choice(parent = panel, id = wx.ID_ANY, size = (125, -1),
194 choices = [_(
"screen pixels"), _(
"map units")])
195 self.snappingUnit.SetStringSelection(UserSettings.Get(group =
'vdigit', key =
"snapping", subkey =
'units'))
197 flexSizer.Add(text, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
198 flexSizer.Add(self.
snappingValue, proportion = 0, flag = wx.ALIGN_CENTER | wx.FIXED_MINSIZE)
199 flexSizer.Add(self.
snappingUnit, proportion = 0, flag = wx.ALIGN_RIGHT | wx.FIXED_MINSIZE)
201 vertexSizer = wx.BoxSizer(wx.VERTICAL)
202 self.
snapVertex = wx.CheckBox(parent = panel, id = wx.ID_ANY,
203 label = _(
"Snap also to vertex"))
204 self.snapVertex.SetValue(UserSettings.Get(group =
'vdigit', key =
"snapToVertex", subkey =
'enabled'))
205 vertexSizer.Add(item = self.
snapVertex, proportion = 0, flag = wx.EXPAND)
206 self.
mapUnits = self.parent.MapWindow.Map.GetProjInfo()[
'units']
208 label = _(
"Snapping threshold is %(value).1f %(units)s") % \
209 {
'value' : self.digit.GetDisplay().GetThreshold(),
211 vertexSizer.Add(item = self.
snappingInfo, proportion = 0,
212 flag = wx.ALL | wx.EXPAND, border = 1)
214 sizer.Add(item = flexSizer, proportion = 1, flag = wx.EXPAND)
215 sizer.Add(item = vertexSizer, proportion = 1, flag = wx.EXPAND)
216 border.Add(item = sizer, proportion = 0, flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 5)
221 box = wx.StaticBox (parent = panel, id = wx.ID_ANY, label =
" %s " % _(
"Select vector features"))
223 sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
224 inSizer = wx.BoxSizer(wx.HORIZONTAL)
226 for feature
in (
'point',
'line',
227 'centroid',
'boundary'):
228 chkbox = wx.CheckBox(parent = panel, label = feature)
230 chkbox.SetValue(UserSettings.Get(group =
'vdigit', key =
'selectType',
231 subkey = [feature,
'enabled']))
232 inSizer.Add(item = chkbox, proportion = 0,
233 flag = wx.EXPAND | wx.ALL, border = 5)
234 sizer.Add(item = inSizer, proportion = 0, flag = wx.EXPAND)
236 flexSizer = wx.FlexGridSizer (cols = 3, hgap = 5, vgap = 5)
237 flexSizer.AddGrowableCol(0)
238 text = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _(
"Select threshold"))
240 initial = UserSettings.Get(group =
'vdigit', key =
"selectThresh", subkey =
'value'),
242 units = wx.StaticText(parent = panel, id = wx.ID_ANY, size = (115, -1),
243 label = UserSettings.Get(group =
'vdigit', key =
"lineWidth", subkey =
'units'),
244 style = wx.ALIGN_LEFT)
245 flexSizer.Add(text, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
246 flexSizer.Add(self.
selectThreshValue, proportion = 0, flag = wx.ALIGN_CENTER | wx.FIXED_MINSIZE)
247 flexSizer.Add(units, proportion = 0, flag = wx.ALIGN_RIGHT | wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL | wx.LEFT,
250 self.
selectIn = wx.CheckBox(parent = panel, id = wx.ID_ANY,
251 label = _(
"Select only features inside of selection bounding box"))
252 self.selectIn.SetValue(UserSettings.Get(group =
'vdigit', key =
"selectInside", subkey =
'enabled'))
253 self.selectIn.SetToolTipString(_(
"By default are selected all features overlapping selection bounding box "))
256 label = _(
"Check for duplicates"))
257 self.checkForDupl.SetValue(UserSettings.Get(group =
'vdigit', key =
"checkForDupl", subkey =
'enabled'))
260 sizer.Add(item = flexSizer, proportion = 0, flag = wx.EXPAND)
261 sizer.Add(item = self.
selectIn, proportion = 0, flag = wx.EXPAND | wx.ALL, border = 1)
262 sizer.Add(item = self.
checkForDupl, proportion = 0, flag = wx.EXPAND | wx.ALL, border = 1)
263 border.Add(item = sizer, proportion = 0, flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5)
268 box = wx.StaticBox (parent = panel, id = wx.ID_ANY, label =
" %s " % _(
"Digitize line features"))
269 sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
271 self.
intersect = wx.CheckBox(parent = panel, label = _(
"Break lines at intersection"))
272 self.intersect.SetValue(UserSettings.Get(group =
'vdigit', key =
'breakLines', subkey =
'enabled'))
274 sizer.Add(item = self.
intersect, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 1)
276 border.Add(item = sizer, proportion = 0, flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5)
281 box = wx.StaticBox (parent = panel, id = wx.ID_ANY, label =
" %s " % _(
"Save changes"))
283 sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
284 self.
save = wx.CheckBox(parent = panel, label = _(
"Save changes on exit"))
285 self.save.SetValue(UserSettings.Get(group =
'vdigit', key =
'saveOnExit', subkey =
'enabled'))
286 sizer.Add(item = self.
save, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 1)
287 border.Add(item = sizer, proportion = 0, flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5)
289 panel.SetSizer(border)
293 def _createQueryPage(self, notebook):
294 """!Create notebook page for query tool"""
295 panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
296 notebook.AddPage(page = panel, text = _(
"Query tool"))
298 border = wx.BoxSizer(wx.VERTICAL)
303 box = wx.StaticBox (parent = panel, id = wx.ID_ANY, label =
" %s " % _(
"Choose query tool"))
304 sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
306 LocUnits = self.parent.MapWindow.Map.GetProjInfo()[
'units']
308 self.
queryBox = wx.CheckBox(parent = panel, id = wx.ID_ANY, label = _(
"Select by box"))
309 self.queryBox.SetValue(UserSettings.Get(group =
'vdigit', key =
"query", subkey =
'box'))
311 sizer.Add(item = self.
queryBox, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 1)
317 self.
queryLength = wx.RadioButton(parent = panel, id = wx.ID_ANY, label = _(
"length"))
318 self.queryLength.Bind(wx.EVT_RADIOBUTTON, self.
OnChangeQuery)
319 sizer.Add(item = self.
queryLength, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 1)
320 flexSizer = wx.FlexGridSizer (cols = 4, hgap = 5, vgap = 5)
321 flexSizer.AddGrowableCol(0)
322 txt = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _(
"Select lines"))
324 choices = [_(
"shorter than"), _(
"longer than")])
325 self.queryLengthSL.SetSelection(UserSettings.Get(group =
'vdigit', key =
"queryLength", subkey =
'than-selection'))
329 self.queryLengthValue.SetValue(UserSettings.Get(group =
'vdigit', key =
"queryLength", subkey =
'thresh'))
330 units = wx.StaticText(parent = panel, id = wx.ID_ANY, label =
"%s" % LocUnits)
331 flexSizer.Add(txt, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
332 flexSizer.Add(self.
queryLengthSL, proportion = 0, flag = wx.ALIGN_CENTER | wx.FIXED_MINSIZE)
333 flexSizer.Add(self.
queryLengthValue, proportion = 0, flag = wx.ALIGN_CENTER | wx.FIXED_MINSIZE)
334 flexSizer.Add(units, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
335 sizer.Add(item = flexSizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 1)
340 self.
queryDangle = wx.RadioButton(parent = panel, id = wx.ID_ANY, label = _(
"dangle"))
341 self.queryDangle.Bind(wx.EVT_RADIOBUTTON, self.
OnChangeQuery)
342 sizer.Add(item = self.
queryDangle, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 1)
343 flexSizer = wx.FlexGridSizer (cols = 4, hgap = 5, vgap = 5)
344 flexSizer.AddGrowableCol(0)
345 txt = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _(
"Select dangles"))
347 choices = [_(
"shorter than"), _(
"longer than")])
348 self.queryDangleSL.SetSelection(UserSettings.Get(group =
'vdigit', key =
"queryDangle", subkey =
'than-selection'))
352 self.queryDangleValue.SetValue(UserSettings.Get(group =
'vdigit', key =
"queryDangle", subkey =
'thresh'))
353 units = wx.StaticText(parent = panel, id = wx.ID_ANY, label =
"%s" % LocUnits)
354 flexSizer.Add(txt, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
355 flexSizer.Add(self.
queryDangleSL, proportion = 0, flag = wx.ALIGN_CENTER | wx.FIXED_MINSIZE)
356 flexSizer.Add(self.
queryDangleValue, proportion = 0, flag = wx.ALIGN_CENTER | wx.FIXED_MINSIZE)
357 flexSizer.Add(units, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
358 sizer.Add(item = flexSizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 1)
360 if UserSettings.Get(group =
'vdigit', key =
"query", subkey =
'selection') == 0:
361 self.queryLength.SetValue(
True)
363 self.queryDangle.SetValue(
True)
368 border.Add(item = sizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 5)
370 panel.SetSizer(border)
374 def _createAttributesPage(self, notebook):
375 """!Create notebook page for attributes"""
376 panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
377 notebook.AddPage(page = panel, text = _(
"Attributes"))
379 border = wx.BoxSizer(wx.VERTICAL)
384 box = wx.StaticBox (parent = panel, id = wx.ID_ANY, label =
" %s " % _(
"Digitize new feature"))
385 sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
388 self.
addRecord = wx.CheckBox(parent = panel, id = wx.ID_ANY,
389 label = _(
"Add new record into table"))
390 self.addRecord.SetValue(UserSettings.Get(group =
'vdigit', key =
"addRecord", subkey =
'enabled'))
391 sizer.Add(item = self.
addRecord, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 1)
393 flexSizer = wx.FlexGridSizer(cols = 2, hgap = 3, vgap = 3)
394 flexSizer.AddGrowableCol(0)
395 settings = ((_(
"Layer"), 1), (_(
"Category"), 1), (_(
"Mode"), _(
"Next to use")))
397 text = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _(
"Layer"))
398 self.
layer = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (125, -1),
400 self.layer.SetValue(int(UserSettings.Get(group =
'vdigit', key =
"layer", subkey =
'value')))
401 flexSizer.Add(item = text, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
402 flexSizer.Add(item = self.
layer, proportion = 0,
403 flag = wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL)
405 text = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _(
"Category number"))
406 self.
category = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (125, -1),
407 initial = UserSettings.Get(group =
'vdigit', key =
"category", subkey =
'value'),
408 min = -1e9, max = 1e9)
409 if UserSettings.Get(group =
'vdigit', key =
"categoryMode", subkey =
'selection') != 1:
410 self.category.Enable(
False)
411 flexSizer.Add(item = text, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
412 flexSizer.Add(item = self.
category, proportion = 0,
413 flag = wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL)
415 text = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _(
"Category mode"))
416 self.
categoryMode = wx.Choice(parent = panel, id = wx.ID_ANY, size = (125, -1),
417 choices = [_(
"Next to use"), _(
"Manual entry"), _(
"No category")])
418 self.categoryMode.SetSelection(UserSettings.Get(group =
'vdigit', key =
"categoryMode", subkey =
'selection'))
419 flexSizer.Add(item = text, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
421 flag = wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL)
423 sizer.Add(item = flexSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 1)
424 border.Add(item = sizer, proportion = 0,
425 flag = wx.ALL | wx.EXPAND, border = 5)
430 box = wx.StaticBox (parent = panel, id = wx.ID_ANY, label =
" %s " % _(
"Delete existing feature(s)"))
431 sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
435 label = _(
"Delete record from table"))
436 self.deleteRecord.SetValue(UserSettings.Get(group =
'vdigit', key =
"delRecord", subkey =
'enabled'))
437 sizer.Add(item = self.
deleteRecord, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 1)
438 border.Add(item = sizer, proportion = 0,
439 flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 5)
444 box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
445 label =
" %s " % _(
"Geometry attributes"))
446 sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
447 gridSizer = wx.GridBagSizer(hgap = 3, vgap = 3)
448 gridSizer.AddGrowableCol(0)
449 self.
geomAttrb = {
'length' : {
'label' : _(
'length') },
450 'area' : {
'label' : _(
'area') },
451 'perimeter' : {
'label' : _(
'perimeter') } }
453 digitToolbar = self.parent.toolbars[
'vdigit']
455 vectorName = digitToolbar.GetLayer().GetName()
456 except AttributeError:
458 layer = UserSettings.Get(group =
'vdigit', key =
"layer", subkey =
'value')
459 mapLayer = self.parent.toolbars[
'vdigit'].GetLayer()
460 tree = self.parent.tree
461 item = tree.FindItemByData(
'maplayer', mapLayer)
463 for attrb
in [
'length',
'area',
'perimeter']:
465 check = wx.CheckBox(parent = panel, id = wx.ID_ANY,
471 column.InsertColumns(vector = vectorName,
472 layer = layer, excludeKey =
True,
473 type = [
'integer',
'double precision'])
476 choices = Units.GetUnitsList(
'area')
478 choices = Units.GetUnitsList(
'length')
479 win_units = wx.Choice(parent = panel, id = wx.ID_ANY,
480 choices = choices, size = (120, -1))
483 check.SetValue(
False)
484 if item
and tree.GetPyData(item)[0][
'vdigit']
and \
485 'geomAttr' in tree.GetPyData(item)[0][
'vdigit']
and \
486 attrb
in tree.GetPyData(item)[0][
'vdigit'][
'geomAttr']:
488 column.SetStringSelection(tree.GetPyData(item)[0][
'vdigit'][
'geomAttr'][attrb][
'column'])
493 unitsIdx = Units.GetUnitsIndex(type,
494 tree.GetPyData(item)[0][
'vdigit'][
'geomAttr'][attrb][
'units'])
495 win_units.SetSelection(unitsIdx)
501 if not check.IsChecked():
504 self.
geomAttrb[attrb][
'check'] = check.GetId()
505 self.
geomAttrb[attrb][
'column'] = column.GetId()
506 self.
geomAttrb[attrb][
'units'] = win_units.GetId()
508 gridSizer.Add(item = check,
509 flag = wx.ALIGN_CENTER_VERTICAL,
511 gridSizer.Add(item = column,
513 gridSizer.Add(item = win_units,
517 note =
'\n'.join(textwrap.wrap(_(
"Note: These settings are stored "
518 "in the workspace not in the vector digitizer "
519 "preferences."), 55))
520 gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
522 pos = (3, 0), span = (1, 3))
524 sizer.Add(item = gridSizer, proportion = 1,
525 flag = wx.ALL | wx.EXPAND, border = 1)
526 border.Add(item = sizer, proportion = 0,
527 flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 5)
534 panel.SetSizer(border)
538 def _symbologyData(self):
539 """!Data for _createSymbologyPage()
541 label | checkbox | color
546 (_(
"Highlight"),
"highlight"),
547 (_(
"Highlight (duplicates)"),
"highlightDupl"),
548 (_(
"Point"),
"point"),
550 (_(
"Boundary (no area)"),
"boundaryNo"),
551 (_(
"Boundary (one area)"),
"boundaryOne"),
552 (_(
"Boundary (two areas)"),
"boundaryTwo"),
553 (_(
"Centroid (in area)"),
"centroidIn"),
554 (_(
"Centroid (outside area)"),
"centroidOut"),
555 (_(
"Centroid (duplicate in area)"),
"centroidDup"),
556 (_(
"Node (one line)"),
"nodeOne"),
557 (_(
"Node (two lines)"),
"nodeTwo"),
558 (_(
"Vertex"),
"vertex"),
559 (_(
"Area (closed boundary + centroid)"),
"area"),
560 (_(
"Direction"),
"direction"),)
563 """!Register geometry attributes (enable/disable)
565 checked = event.IsChecked()
568 for attrb, val
in self.geomAttrb.iteritems():
569 if val[
'check'] == id:
573 column = self.FindWindowById(self.
geomAttrb[key][
'column'])
580 """!Change category mode
582 mode = event.GetSelection()
583 UserSettings.Set(group =
'vdigit', key =
"categoryMode", subkey =
'selection', value = mode)
585 self.category.Enable(
True)
586 elif self.category.IsEnabled():
587 self.category.Enable(
False)
589 if mode == 2
and self.addRecord.IsChecked():
590 self.addRecord.SetValue(
False)
592 self.digit.SetCategory()
593 self.category.SetValue(UserSettings.Get(group =
'vdigit', key =
'category', subkey =
'value'))
598 layer = event.GetInt()
600 UserSettings.Set(group =
'vdigit', key =
'layer', subkey =
'value', value = layer)
601 self.digit.SetCategory()
602 self.category.SetValue(UserSettings.Get(group =
'vdigit', key =
'category', subkey =
'value'))
607 """!Checkbox 'Add new record' status changed
609 self.category.SetValue(self.digit.SetCategory())
612 """!Change snapping value - update static text
614 value = self.snappingValue.GetValue()
617 region = self.parent.MapWindow.Map.GetRegion()
618 res = (region[
'nsres'] + region[
'ewres']) / 2.
619 threshold = self.digit.GetDisplay().GetThreshold(value = res)
621 if self.snappingUnit.GetStringSelection() ==
"map units":
624 threshold = self.digit.GetDisplay().GetThreshold(value = value)
627 self.snappingInfo.SetLabel(_(
"Snapping disabled"))
629 self.snappingInfo.SetLabel(_(
"Snapping threshold is %(value).1f %(units)s "
630 "(based on comp. resolution)") %
631 {
'value' : threshold,
632 'units' : self.mapUnits.lower()})
634 self.snappingInfo.SetLabel(_(
"Snapping threshold is %(value).1f %(units)s") %
635 {
'value' : threshold,
636 'units' : self.mapUnits.lower()})
641 """!Snapping units change -> update static text
643 value = self.snappingValue.GetValue()
644 units = self.snappingUnit.GetStringSelection()
645 threshold = self.digit.GetDisplay().GetThreshold(value = value, units = units)
647 if units ==
"map units":
648 self.snappingInfo.SetLabel(_(
"Snapping threshold is %(value).1f %(units)s") %
652 self.snappingInfo.SetLabel(_(
"Snapping threshold is %(value).1f %(units)s") %
653 {
'value' : threshold,
661 if self.queryLength.GetValue():
663 self.queryLengthSL.Enable(
True)
664 self.queryLengthValue.Enable(
True)
665 self.queryDangleSL.Enable(
False)
666 self.queryDangleValue.Enable(
False)
669 self.queryLengthSL.Enable(
False)
670 self.queryLengthValue.Enable(
False)
671 self.queryDangleSL.Enable(
True)
672 self.queryDangleValue.Enable(
True)
675 """!Button 'Save' pressed
678 self.parent.toolbars[
'vdigit'].settingsDialog =
None
681 UserSettings.ReadSettingsFile(settings = fileSettings)
682 fileSettings[
'vdigit'] = UserSettings.Get(group =
'vdigit')
684 file = UserSettings.SaveToFile(fileSettings)
685 self.parent.GetLayerManager().goutput.WriteLog(_(
'Vector digitizer settings saved to file <%s>.') % file)
692 """!Button 'Apply' pressed
697 """!Button 'Cancel' pressed
699 self.parent.toolbars[
'vdigit'].settingsDialog =
None
706 """!Update digitizer settings
708 self.parent.GetLayerManager().WorkspaceChanged()
710 for key, (enabled, color)
in self.symbology.iteritems():
712 UserSettings.Set(group =
'vdigit', key =
'symbol',
713 subkey = [key,
'enabled'],
714 value = enabled.IsChecked())
715 UserSettings.Set(group =
'vdigit', key =
'symbol',
716 subkey = [key,
'color'],
717 value = tuple(color.GetColour()))
719 UserSettings.Set(group =
'vdigit', key =
'symbol',
720 subkey = [key,
'color'],
721 value = tuple(color.GetColour()))
723 UserSettings.Set(group =
'vdigit', key =
"lineWidth", subkey =
'value',
724 value = int(self.lineWidthValue.GetValue()))
727 UserSettings.Set(group =
'vdigit', key =
"snapping", subkey =
'value',
728 value = int(self.snappingValue.GetValue()))
729 UserSettings.Set(group =
'vdigit', key =
"snapping", subkey =
'units',
730 value = self.snappingUnit.GetStringSelection())
731 UserSettings.Set(group =
'vdigit', key =
"snapToVertex", subkey =
'enabled',
732 value = self.snapVertex.IsChecked())
735 UserSettings.Set(group =
'vdigit', key =
"addRecord", subkey =
'enabled',
736 value = self.addRecord.IsChecked())
737 UserSettings.Set(group =
'vdigit', key =
"layer", subkey =
'value',
738 value = int(self.layer.GetValue()))
739 UserSettings.Set(group =
'vdigit', key =
"category", subkey =
'value',
740 value = int(self.category.GetValue()))
741 UserSettings.Set(group =
'vdigit', key =
"categoryMode", subkey =
'selection',
742 value = self.categoryMode.GetSelection())
745 UserSettings.Set(group =
'vdigit', key =
"delRecord", subkey =
'enabled',
746 value = self.deleteRecord.IsChecked())
749 mapLayer = self.parent.toolbars[
'vdigit'].GetLayer()
750 tree = self.parent.tree
751 item = tree.FindItemByData(
'maplayer', mapLayer)
752 for key, val
in self.geomAttrb.iteritems():
753 checked = self.FindWindowById(val[
'check']).IsChecked()
754 column = self.FindWindowById(val[
'column']).GetValue()
755 unitsIdx = self.FindWindowById(val[
'units']).GetSelection()
756 if item
and not tree.GetPyData(item)[0][
'vdigit']:
757 tree.GetPyData(item)[0][
'vdigit'] = {
'geomAttr' : dict() }
764 unitsKey = Units.GetUnitsKey(type, unitsIdx)
765 tree.GetPyData(item)[0][
'vdigit'][
'geomAttr'][key] = {
'column' : column,
768 if item
and tree.GetPyData(item)[0][
'vdigit']
and \
769 key
in tree.GetPyData(item)[0][
'vdigit'][
'geomAttr']:
770 del tree.GetPyData(item)[0][
'vdigit'][
'geomAttr'][key]
773 if self.queryLength.GetValue():
774 UserSettings.Set(group =
'vdigit', key =
"query", subkey =
'selection',
777 UserSettings.Set(group =
'vdigit', key =
"query", subkey =
'type',
779 UserSettings.Set(group =
'vdigit', key =
"query", subkey =
'box',
780 value = self.queryBox.IsChecked())
781 UserSettings.Set(group =
'vdigit', key =
"queryLength", subkey =
'than-selection',
782 value = self.queryLengthSL.GetSelection())
783 UserSettings.Set(group =
'vdigit', key =
"queryLength", subkey =
'thresh',
784 value = int(self.queryLengthValue.GetValue()))
785 UserSettings.Set(group =
'vdigit', key =
"queryDangle", subkey =
'than-selection',
786 value = self.queryDangleSL.GetSelection())
787 UserSettings.Set(group =
'vdigit', key =
"queryDangle", subkey =
'thresh',
788 value = int(self.queryDangleValue.GetValue()))
791 for feature
in (
'point',
'line',
792 'centroid',
'boundary'):
793 UserSettings.Set(group =
'vdigit', key =
'selectType',
794 subkey = [feature,
'enabled'],
795 value = self.FindWindowById(self.
selectFeature[feature]).IsChecked())
796 UserSettings.Set(group =
'vdigit', key =
"selectThresh", subkey =
'value',
797 value = int(self.selectThreshValue.GetValue()))
798 UserSettings.Set(group =
'vdigit', key =
"checkForDupl", subkey =
'enabled',
799 value = self.checkForDupl.IsChecked())
800 UserSettings.Set(group =
'vdigit', key =
"selectInside", subkey =
'enabled',
801 value = self.selectIn.IsChecked())
804 UserSettings.Set(group =
'vdigit', key =
"saveOnExit", subkey =
'enabled',
805 value = self.save.IsChecked())
808 UserSettings.Set(group =
'vdigit', key =
"breakLines", subkey =
'enabled',
809 value = self.intersect.IsChecked())
811 self.digit.UpdateSettings()
814 if self.parent.statusbarWin[
'render'].GetValue():
815 self.parent.OnRender(
None)
819 vectorName, query =
None, cats =
None,
820 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
821 """!Dialog used to display/modify categories of vector objects
824 @param title dialog title
825 @param query {coordinates, qdist} - used by v.edit/v.what
826 @param cats directory of lines (layer/categories) - used by vdigit
827 @param style dialog style
841 Debug.msg(3,
"VDigitCategoryDialog(): nothing found!")
844 for line
in cats.keys():
845 for layer
in cats[line].keys():
846 self.
cats[line][layer] =
list(cats[line][layer])
849 for layer
in self.digit.GetLayers():
850 layers.append(str(layer))
855 wx.Dialog.__init__(self, parent = self.
parent, id = wx.ID_ANY, title = title,
856 style = style, **kwargs)
859 box = wx.StaticBox(parent = self, id = wx.ID_ANY,
860 label =
" %s " % _(
"List of categories - right-click to delete"))
861 listSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
863 style = wx.LC_REPORT |
865 wx.LC_SORT_ASCENDING |
869 self.
fid = self.cats.keys()[0]
871 listmix.ColumnSorterMixin.__init__(self, 2)
872 self.
fidMulti = wx.Choice(parent = self, id = wx.ID_ANY,
874 self.fidMulti.Bind(wx.EVT_CHOICE, self.
OnFeature)
875 self.
fidText = wx.StaticText(parent = self, id = wx.ID_ANY)
876 if len(self.cats.keys()) == 1:
877 self.fidMulti.Show(
False)
878 self.fidText.SetLabel(str(self.
fid))
880 self.fidText.Show(
False)
882 for fid
in self.cats.keys():
883 choices.append(str(fid))
884 self.fidMulti.SetItems(choices)
885 self.fidMulti.SetSelection(0)
887 listSizer.Add(item = self.
list, proportion = 1, flag = wx.EXPAND)
890 box = wx.StaticBox(parent = self, id = wx.ID_ANY,
891 label =
" %s " % _(
"Add new category"))
892 addSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
893 flexSizer = wx.FlexGridSizer (cols = 5, hgap = 5, vgap = 5)
894 flexSizer.AddGrowableCol(3)
896 layerNewTxt = wx.StaticText(parent = self, id = wx.ID_ANY,
897 label =
"%s:" % _(
"Layer"))
898 self.
layerNew = wx.Choice(parent = self, id = wx.ID_ANY, size = (75, -1),
901 self.layerNew.SetSelection(0)
903 catNewTxt = wx.StaticText(parent = self, id = wx.ID_ANY,
904 label =
"%s:" % _(
"Category"))
910 self.
catNew = wx.SpinCtrl(parent = self, id = wx.ID_ANY, size = (75, -1),
911 initial = newCat, min = 0, max = 1e9)
912 btnAddCat = wx.Button(self, wx.ID_ADD)
913 flexSizer.Add(item = layerNewTxt, proportion = 0,
914 flag = wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL)
915 flexSizer.Add(item = self.
layerNew, proportion = 0,
916 flag = wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL)
917 flexSizer.Add(item = catNewTxt, proportion = 0,
918 flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.LEFT,
920 flexSizer.Add(item = self.
catNew, proportion = 0,
921 flag = wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL)
922 flexSizer.Add(item = btnAddCat, proportion = 0,
923 flag = wx.EXPAND | wx.ALIGN_RIGHT | wx.FIXED_MINSIZE)
924 addSizer.Add(item = flexSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
927 btnApply = wx.Button(self, wx.ID_APPLY)
928 btnApply.SetToolTipString(_(
"Apply changes"))
929 btnCancel = wx.Button(self, wx.ID_CANCEL)
930 btnCancel.SetToolTipString(_(
"Ignore changes and close dialog"))
931 btnOk = wx.Button(self, wx.ID_OK)
932 btnOk.SetToolTipString(_(
"Apply changes and close dialog"))
936 btnSizer = wx.StdDialogButtonSizer()
937 btnSizer.AddButton(btnCancel)
940 btnSizer.AddButton(btnApply)
941 btnSizer.AddButton(btnOk)
944 mainSizer = wx.BoxSizer(wx.VERTICAL)
945 mainSizer.Add(item = listSizer, proportion = 1,
946 flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
947 mainSizer.Add(item = addSizer, proportion = 0,
948 flag = wx.EXPAND | wx.ALIGN_CENTER |
949 wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5)
950 fidSizer = wx.BoxSizer(wx.HORIZONTAL)
951 fidSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
952 label = _(
"Feature id:")),
953 proportion = 0, border = 5,
954 flag = wx.ALIGN_CENTER_VERTICAL)
955 fidSizer.Add(item = self.
fidMulti, proportion = 0,
956 flag = wx.EXPAND | wx.ALL, border = 5)
957 fidSizer.Add(item = self.
fidText, proportion = 0,
958 flag = wx.EXPAND | wx.ALL, border = 5)
959 mainSizer.Add(item = fidSizer, proportion = 0,
960 flag = wx.EXPAND | wx.ALL, border = 5)
961 mainSizer.Add(item = btnSizer, proportion = 0,
962 flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
964 self.SetSizer(mainSizer)
966 self.SetAutoLayout(
True)
969 self.SetMinSize(self.GetBestSize())
972 btnApply.Bind(wx.EVT_BUTTON, self.
OnApply)
973 btnOk.Bind(wx.EVT_BUTTON, self.
OnOK)
974 btnAddCat.Bind(wx.EVT_BUTTON, self.
OnAddCat)
975 btnCancel.Bind(wx.EVT_BUTTON, self.
OnCancel)
978 self.list.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.
OnRightUp)
979 self.list.Bind(wx.EVT_RIGHT_UP, self.
OnRightUp)
981 self.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.
OnEndEdit, self.
list)
985 """!Used by ColumnSorterMixin
990 """!Click on column header (order by)
995 """!Editing of item started
1000 """!Finish editing of item
1002 itemIndex = event.GetIndex()
1003 layerOld = int (self.list.GetItem(itemIndex, 0).GetText())
1004 catOld = int (self.list.GetItem(itemIndex, 1).GetText())
1006 if event.GetColumn() == 0:
1007 layerNew = int(event.GetLabel())
1011 catNew = int(event.GetLabel())
1014 if layerNew
not in self.
cats[self.
fid].keys():
1015 self.
cats[self.
fid][layerNew] = []
1016 self.
cats[self.
fid][layerNew].append(catNew)
1017 self.
cats[self.
fid][layerOld].remove(catOld)
1020 self.list.SetStringItem(itemIndex, 0, str(layerNew))
1021 self.list.SetStringItem(itemIndex, 1, str(catNew))
1022 dlg = wx.MessageDialog(self, _(
"Unable to add new layer/category <%(layer)s/%(category)s>.\n"
1023 "Layer and category number must be integer.\n"
1024 "Layer number must be greater than zero.") %
1025 {
'layer': self.layerNew.GetStringSelection(),
1026 'category' : str(self.catNew.GetValue()) },
1027 _(
"Error"), wx.OK | wx.ICON_ERROR)
1033 """!Mouse right button down
1037 item, flags = self.list.HitTest((x, y))
1039 if item != wx.NOT_FOUND
and \
1040 flags & wx.LIST_HITTEST_ONITEM:
1041 self.list.Select(item)
1046 """!Mouse right button up
1048 if not hasattr(self,
"popupID1"):
1058 menu.Append(self.
popupID1, _(
"Delete selected"))
1059 if self.list.GetFirstSelected() == -1:
1062 menu.Append(self.
popupID2, _(
"Delete all"))
1063 menu.AppendSeparator()
1064 menu.Append(self.
popupID3, _(
"Reload"))
1066 self.PopupMenu(menu)
1075 """!Delete selected item(s) from the list (layer/category pair)
1077 item = self.list.GetFirstSelected()
1079 layer = int (self.list.GetItem(item, 0).GetText())
1080 cat = int (self.list.GetItem(item, 1).GetText())
1081 self.list.DeleteItem(item)
1082 self.
cats[self.
fid][layer].remove(cat)
1084 item = self.list.GetFirstSelected()
1089 """!Delete all items from the list
1091 self.list.DeleteAllItems()
1097 """!Feature id changed (on duplicates)
1099 self.
fid = int(event.GetString())
1109 self.catNew.SetValue(newCat)
1113 def _getCategories(self, coords, qdist):
1114 """!Get layer/category pairs for all available
1117 Return True line found or False if not found
1119 ret = gcmd.RunCommand(
'v.what',
1123 east_north =
'%f,%f' % \
1124 (float(coords[0]), float(coords[1])),
1130 for item
in ret.splitlines():
1131 litem = item.lower()
1133 self.
line = int(item.split(
':')[1].strip())
1134 elif "layer:" in litem:
1135 layer = int(item.split(
':')[1].strip())
1136 if layer
not in self.cats.keys():
1137 self.
cats[layer] = []
1138 elif "category:" in litem:
1139 self.
cats[layer].append(int(item.split(
':')[1].strip()))
1144 """!Reload button pressed
1156 """!Cancel button pressed
1158 self.parent.parent.dialogs[
'category'] =
None
1160 self.digit.GetDisplay().SetSelected([])
1161 self.parent.UpdateMap(render =
False)
1163 self.parent.parent.OnRender(
None)
1168 """!Apply button pressed
1170 for fid
in self.cats.keys():
1172 if fid == self.
fid and newfid > 0:
1178 @param fid feature id
1180 cats = self.
cats[fid]
1184 check = {
'catadd': (cats, cats_orig),
1185 'catdel': (cats_orig, cats)}
1190 for action, catsCurr
in check.iteritems():
1191 for layer
in catsCurr[0].keys():
1193 for cat
in catsCurr[0][layer]:
1194 if layer
not in catsCurr[1].keys()
or \
1195 cat
not in catsCurr[1][layer]:
1198 if action ==
'catadd':
1203 newfid = self.digit.SetLineCats(fid, layer,
1205 if len(self.cats.keys()) == 1:
1206 self.fidText.SetLabel(
"%d" % newfid)
1208 choices = self.fidMulti.GetItems()
1209 choices[choices.index(str(fid))] = str(newfid)
1210 self.fidMulti.SetItems(choices)
1211 self.fidMulti.SetStringSelection(str(newfid))
1218 wx.MessageBox(parent = self, message = _(
"Unable to update vector map."),
1219 caption = _(
"Error"), style = wx.OK | wx.ICON_ERROR)
1221 self.
cats_orig[fid] = copy.deepcopy(cats)
1226 """!OK button pressed
1232 """!Button 'Add' new category pressed
1235 layer = int(self.layerNew.GetStringSelection())
1236 cat = int(self.catNew.GetValue())
1241 message = _(
"Unable to add new layer/category <%(layer)s/%(category)s>.\n"
1242 "Layer and category number must be integer.\n"
1243 "Layer number must be greater then zero.") %
1244 {
'layer' : str(self.layerNew.GetValue()),
1245 'category' : str(self.catNew.GetValue())})
1248 if layer
not in self.
cats[self.
fid].keys():
1249 self.
cats[self.
fid][layer] = []
1251 self.
cats[self.
fid][layer].append(cat)
1258 self.catNew.SetValue(cat + 1)
1265 """!Get id of selected line of 'None' if no line is selected
1267 return self.cats.keys()
1272 @param query {coordinates, distance} - v.what
1273 @param cats directory layer/cats - vdigit
1274 Return True if updated otherwise False
1283 for line
in cats.keys():
1284 for layer
in cats[line].keys():
1285 self.
cats[line][layer] =
list(cats[line][layer])
1287 if ret == 0
or len(self.cats.keys()) < 1:
1288 Debug.msg(3,
"VDigitCategoryDialog(): nothing found!")
1295 self.
fid = self.cats.keys()[0]
1303 self.catNew.SetValue(newCat)
1305 if len(self.cats.keys()) == 1:
1306 self.fidText.Show(
True)
1307 self.fidMulti.Show(
False)
1308 self.fidText.SetLabel(
"%d" % self.
fid)
1310 self.fidText.Show(
False)
1311 self.fidMulti.Show(
True)
1313 for fid
in self.cats.keys():
1314 choices.append(str(fid))
1315 self.fidMulti.SetItems(choices)
1316 self.fidMulti.SetSelection(0)
1323 listmix.ListCtrlAutoWidthMixin,
1324 listmix.TextEditMixin):
1325 def __init__(self, parent, id, pos = wx.DefaultPosition,
1326 size = wx.DefaultSize, style = 0):
1327 """!List of layers/categories"""
1330 wx.ListCtrl.__init__(self, parent, id, pos, size, style)
1332 listmix.ListCtrlAutoWidthMixin.__init__(self)
1333 listmix.TextEditMixin.__init__(self)
1336 """!Populate the list
1341 self.InsertColumn(0, _(
"Layer"))
1342 self.InsertColumn(1, _(
"Category"))
1344 self.DeleteAllItems()
1347 for layer
in cats.keys():
1348 catsList = cats[layer]
1349 for cat
in catsList:
1350 index = self.InsertStringItem(sys.maxint, str(catsList[0]))
1351 self.SetStringItem(index, 0, str(layer))
1352 self.SetStringItem(index, 1, str(cat))
1353 self.SetItemData(index, i)
1354 itemData[i] = (str(layer), str(cat))
1358 self.SetColumnWidth(0, 100)
1359 self.SetColumnWidth(1, wx.LIST_AUTOSIZE)
1366 def __init__(self, parent, title, nselected, style = wx.DEFAULT_DIALOG_STYLE):
1367 """!Dialog used for Z bulk-labeling tool
1369 wx.Dialog.__init__(self, parent = parent, id = wx.ID_ANY, title = title, style = style)
1375 border = wx.BoxSizer(wx.VERTICAL)
1377 txt = wx.StaticText(parent = self,
1378 label = _(
"%d lines selected for z bulk-labeling") % nselected);
1379 border.Add(item = txt, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 5)
1381 box = wx.StaticBox (parent = self, id = wx.ID_ANY, label =
" %s " % _(
"Set value"))
1382 sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
1383 flexSizer = wx.FlexGridSizer (cols = 2, hgap = 5, vgap = 5)
1384 flexSizer.AddGrowableCol(0)
1387 txt = wx.StaticText(parent = self,
1388 label = _(
"Starting value"));
1389 self.
value = wx.SpinCtrl(parent = self, id = wx.ID_ANY, size = (150, -1),
1391 min = -1e6, max = 1e6)
1392 flexSizer.Add(txt, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
1393 flexSizer.Add(self.
value, proportion = 0, flag = wx.ALIGN_CENTER | wx.FIXED_MINSIZE)
1396 txt = wx.StaticText(parent = self,
1398 self.
step = wx.SpinCtrl(parent = self, id = wx.ID_ANY, size = (150, -1),
1401 flexSizer.Add(txt, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
1402 flexSizer.Add(self.
step, proportion = 0, flag = wx.ALIGN_CENTER | wx.FIXED_MINSIZE)
1404 sizer.Add(item = flexSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 1)
1405 border.Add(item = sizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 0)
1408 btnCancel = wx.Button(self, wx.ID_CANCEL)
1409 btnOk = wx.Button(self, wx.ID_OK)
1413 btnSizer = wx.StdDialogButtonSizer()
1414 btnSizer.AddButton(btnCancel)
1415 btnSizer.AddButton(btnOk)
1418 mainSizer = wx.BoxSizer(wx.VERTICAL)
1419 mainSizer.Add(item = border, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 5)
1420 mainSizer.Add(item = btnSizer, proportion = 0,
1421 flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
1423 self.SetSizer(mainSizer)
1427 def __init__(self, parent, data, title = _(
"List of duplicates"),
1428 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER,
1429 pos = wx.DefaultPosition):
1430 """!Show duplicated feature ids
1432 wx.Dialog.__init__(self, parent = parent, id = wx.ID_ANY, title = title, style = style,
1442 self.
notebook = wx.Notebook(parent = self, id = wx.ID_ANY, style = wx.BK_DEFAULT)
1445 for key
in self.data.keys():
1446 panel = wx.Panel(parent = self.
notebook, id = wx.ID_ANY)
1447 self.notebook.AddPage(page = panel, text =
" %d " % (id))
1450 border = wx.BoxSizer(wx.VERTICAL)
1453 self.winList.append(win.GetId())
1455 border.Add(item = win, proportion = 1,
1456 flag = wx.ALL | wx.EXPAND, border = 5)
1458 panel.SetSizer(border)
1463 btnCancel = wx.Button(self, wx.ID_CANCEL)
1464 btnOk = wx.Button(self, wx.ID_OK)
1468 btnSizer = wx.StdDialogButtonSizer()
1469 btnSizer.AddButton(btnCancel)
1470 btnSizer.AddButton(btnOk)
1473 mainSizer = wx.BoxSizer(wx.VERTICAL)
1474 mainSizer.Add(item = self.
notebook, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 5)
1475 mainSizer.Add(item = btnSizer, proportion = 0,
1476 flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
1478 self.SetSizer(mainSizer)
1480 self.SetAutoLayout(
True)
1483 self.SetMinSize((250, 180))
1486 """!Get unselected items (feature id)
1492 wlist = self.FindWindowById(id)
1494 for item
in range(wlist.GetItemCount()):
1495 if not wlist.IsChecked(item):
1496 ids.append(int(wlist.GetItem(item, 0).GetText()))
1500 class CheckListFeature(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.CheckListCtrlMixin):
1502 pos = wx.DefaultPosition, log =
None):
1503 """!List of mapset/owner/group
1508 wx.ListCtrl.__init__(self, parent, wx.ID_ANY,
1509 style = wx.LC_REPORT)
1511 listmix.CheckListCtrlMixin.__init__(self)
1516 listmix.ListCtrlAutoWidthMixin.__init__(self)
1521 """!Load data into list
1523 self.InsertColumn(0, _(
'Feature id'))
1524 self.InsertColumn(1, _(
'Layer (Categories)'))
1527 index = self.InsertStringItem(sys.maxint, str(item[0]))
1528 self.SetStringItem(index, 1, str(item[1]))
1531 for item
in range(self.GetItemCount()):
1532 self.CheckItem(item,
True)
1534 self.SetColumnWidth(col = 0, width = wx.LIST_AUTOSIZE_USEHEADER)
1535 self.SetColumnWidth(col = 1, width = wx.LIST_AUTOSIZE_USEHEADER)
1538 """!Mapset checked/unchecked