Skip to content

Commit 0035c97

Browse files
authoredDec 13, 2016
Merge pull request #3725 from arnaud-morvan/processing_geometry_predicate
[processing] Remove parameter geometry predicate
2 parents 9f26574 + 322a565 commit 0035c97

File tree

11 files changed

+103
-246
lines changed

11 files changed

+103
-246
lines changed
 

‎python/plugins/processing/algs/grass7/Grass7Algorithm.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ def processCommand(self):
426426
command += ' ' + param.name
427427
elif isinstance(param, ParameterSelection):
428428
idx = int(param.value)
429-
command += ' ' + param.name + '=' + str(param.options[idx])
429+
command += ' ' + param.name + '=' + str(param.options[idx][1])
430430
elif isinstance(param, ParameterString):
431431
command += ' ' + param.name + '="' + str(param.value) + '"'
432432
elif isinstance(param, ParameterPoint):

‎python/plugins/processing/algs/otb/OTBAlgorithm.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ def processAlgorithm(self, progress):
276276
elif isinstance(param, ParameterSelection):
277277
commands.append(param.name)
278278
idx = int(param.value)
279-
commands.append(str(param.options[idx]))
279+
commands.append(str(param.options[idx][1]))
280280
elif isinstance(param, ParameterBoolean):
281281
if param.value:
282282
commands.append(param.name)

‎python/plugins/processing/algs/qgis/ExtractByLocation.py

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from qgis.core import QgsFeatureRequest
3030
from processing.core.GeoAlgorithm import GeoAlgorithm
3131
from processing.core.parameters import ParameterVector
32-
from processing.core.parameters import ParameterGeometryPredicate
32+
from processing.core.parameters import ParameterSelection
3333
from processing.core.parameters import ParameterNumber
3434
from processing.core.outputs import OutputVector
3535
from processing.tools import dataobjects, vector
@@ -48,13 +48,24 @@ def defineCharacteristics(self):
4848
self.group, self.i18n_group = self.trAlgorithm('Vector selection tools')
4949
self.tags = self.tr('extract,filter,location,intersects,contains,within')
5050

51+
self.predicates = (
52+
('intersects', self.tr('intersects')),
53+
('contains', self.tr('contains')),
54+
('disjoint', self.tr('disjoint')),
55+
('equals', self.tr('equals')),
56+
('touches', self.tr('touches')),
57+
('overlaps', self.tr('overlaps')),
58+
('within', self.tr('within')),
59+
('crosses', self.tr('crosses')))
60+
5161
self.addParameter(ParameterVector(self.INPUT,
5262
self.tr('Layer to select from')))
5363
self.addParameter(ParameterVector(self.INTERSECT,
5464
self.tr('Additional layer (intersection layer)')))
55-
self.addParameter(ParameterGeometryPredicate(self.PREDICATE,
56-
self.tr('Geometric predicate'),
57-
left=self.INPUT, right=self.INTERSECT))
65+
self.addParameter(ParameterSelection(self.PREDICATE,
66+
self.tr('Geometric predicate'),
67+
self.predicates,
68+
multiple=True))
5869
self.addParameter(ParameterNumber(self.PRECISION,
5970
self.tr('Precision'),
6071
0.0, None, 0.0))
@@ -98,20 +109,7 @@ def processAlgorithm(self, progress):
98109
except:
99110
pass # already removed
100111
else:
101-
if predicate == 'intersects':
102-
res = tmpGeom.intersects(geom)
103-
elif predicate == 'contains':
104-
res = tmpGeom.contains(geom)
105-
elif predicate == 'equals':
106-
res = tmpGeom.equals(geom)
107-
elif predicate == 'touches':
108-
res = tmpGeom.touches(geom)
109-
elif predicate == 'overlaps':
110-
res = tmpGeom.overlaps(geom)
111-
elif predicate == 'within':
112-
res = tmpGeom.within(geom)
113-
elif predicate == 'crosses':
114-
res = tmpGeom.crosses(geom)
112+
res = getattr(tmpGeom, predicate)(geom)
115113
if res:
116114
selectedSet.append(feat.id())
117115
break

‎python/plugins/processing/algs/qgis/SelectByLocation.py

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
from processing.core.GeoAlgorithm import GeoAlgorithm
3636
from processing.core.parameters import ParameterSelection
3737
from processing.core.parameters import ParameterVector
38-
from processing.core.parameters import ParameterGeometryPredicate
3938
from processing.core.parameters import ParameterNumber
4039
from processing.core.outputs import OutputVector
4140
from processing.tools import dataobjects, vector
@@ -59,6 +58,16 @@ def defineCharacteristics(self):
5958
self.name, self.i18n_name = self.trAlgorithm('Select by location')
6059
self.group, self.i18n_group = self.trAlgorithm('Vector selection tools')
6160

61+
self.predicates = (
62+
('intersects', self.tr('intersects')),
63+
('contains', self.tr('contains')),
64+
('disjoint', self.tr('disjoint')),
65+
('equals', self.tr('equals')),
66+
('touches', self.tr('touches')),
67+
('overlaps', self.tr('overlaps')),
68+
('within', self.tr('within')),
69+
('crosses', self.tr('crosses')))
70+
6271
self.methods = [self.tr('creating new selection'),
6372
self.tr('adding to current selection'),
6473
self.tr('removing from current selection')]
@@ -67,9 +76,10 @@ def defineCharacteristics(self):
6776
self.tr('Layer to select from')))
6877
self.addParameter(ParameterVector(self.INTERSECT,
6978
self.tr('Additional layer (intersection layer)')))
70-
self.addParameter(ParameterGeometryPredicate(self.PREDICATE,
71-
self.tr('Geometric predicate'),
72-
left=self.INPUT, right=self.INTERSECT))
79+
self.addParameter(ParameterSelection(self.PREDICATE,
80+
self.tr('Geometric predicate'),
81+
self.predicates,
82+
multiple=True))
7383
self.addParameter(ParameterNumber(self.PRECISION,
7484
self.tr('Precision'),
7585
0.0, None, 0.0))
@@ -118,20 +128,7 @@ def processAlgorithm(self, progress):
118128
except:
119129
pass # already removed
120130
else:
121-
if predicate == 'intersects':
122-
res = tmpGeom.intersects(geom)
123-
elif predicate == 'contains':
124-
res = tmpGeom.contains(geom)
125-
elif predicate == 'equals':
126-
res = tmpGeom.equals(geom)
127-
elif predicate == 'touches':
128-
res = tmpGeom.touches(geom)
129-
elif predicate == 'overlaps':
130-
res = tmpGeom.overlaps(geom)
131-
elif predicate == 'within':
132-
res = tmpGeom.within(geom)
133-
elif predicate == 'crosses':
134-
res = tmpGeom.crosses(geom)
131+
res = getattr(tmpGeom, predicate)(geom)
135132
if res:
136133
selectedSet.append(feat.id())
137134
break

‎python/plugins/processing/algs/qgis/SpatialJoin.py

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737

3838
from processing.core.GeoAlgorithm import GeoAlgorithm
3939
from processing.core.parameters import ParameterVector
40-
from processing.core.parameters import ParameterGeometryPredicate
4140
from processing.core.parameters import ParameterNumber
4241
from processing.core.parameters import ParameterSelection
4342
from processing.core.parameters import ParameterString
@@ -64,6 +63,15 @@ def defineCharacteristics(self):
6463
self.name, self.i18n_name = self.trAlgorithm('Join attributes by location')
6564
self.group, self.i18n_group = self.trAlgorithm('Vector general tools')
6665

66+
self.predicates = (
67+
('intersects', self.tr('intersects')),
68+
('contains', self.tr('contains')),
69+
('equals', self.tr('equals')),
70+
('touches', self.tr('touches')),
71+
('overlaps', self.tr('overlaps')),
72+
('within', self.tr('within')),
73+
('crosses', self.tr('crosses')))
74+
6775
self.summarys = [
6876
self.tr('Take attributes of the first located feature'),
6977
self.tr('Take summary of intersecting features')
@@ -78,12 +86,10 @@ def defineCharacteristics(self):
7886
self.tr('Target vector layer')))
7987
self.addParameter(ParameterVector(self.JOIN,
8088
self.tr('Join vector layer')))
81-
predicates = list(ParameterGeometryPredicate.predicates)
82-
predicates.remove('disjoint')
83-
self.addParameter(ParameterGeometryPredicate(self.PREDICATE,
84-
self.tr('Geometric predicate'),
85-
left=self.TARGET, right=self.JOIN,
86-
enabledPredicates=predicates))
89+
self.addParameter(ParameterSelection(self.PREDICATE,
90+
self.tr('Geometric predicate'),
91+
self.predicates,
92+
multiple=True))
8793
self.addParameter(ParameterNumber(self.PRECISION,
8894
self.tr('Precision'),
8995
0.0, None, 0.0))
@@ -174,20 +180,7 @@ def processAlgorithm(self, progress):
174180

175181
res = False
176182
for predicate in predicates:
177-
if predicate == 'intersects':
178-
res = inGeom.intersects(inGeomB)
179-
elif predicate == 'contains':
180-
res = inGeom.contains(inGeomB)
181-
elif predicate == 'equals':
182-
res = inGeom.equals(inGeomB)
183-
elif predicate == 'touches':
184-
res = inGeom.touches(inGeomB)
185-
elif predicate == 'overlaps':
186-
res = inGeom.overlaps(inGeomB)
187-
elif predicate == 'within':
188-
res = inGeom.within(inGeomB)
189-
elif predicate == 'crosses':
190-
res = inGeom.crosses(inGeomB)
183+
res= getattr(inGeom, predicate)(inGeomB)
191184
if res:
192185
break
193186

‎python/plugins/processing/core/parameters.py

Lines changed: 28 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,41 +1063,58 @@ def __init__(self, name='', description='', options=[], default=None, isSource=F
10631063
elif isinstance(self.options, str):
10641064
self.options = self.options.split(";")
10651065

1066+
# compute options as (value, text)
1067+
options = []
1068+
for i, option in enumerate(self.options):
1069+
if option is None or isinstance(option, basestring):
1070+
options.append((i, option))
1071+
else:
1072+
options.append((option[0], option[1]))
1073+
self.options = options
1074+
self.values = [option[0] for option in options]
1075+
1076+
self.value = None
10661077
if default is not None:
1067-
try:
1068-
self.default = int(default)
1069-
except:
1070-
self.default = 0
1071-
self.value = self.default
1078+
self.setValue(self.default)
10721079

10731080
def setValue(self, value):
10741081
if value is None:
10751082
if not self.optional:
10761083
return False
1077-
self.value = 0
1084+
self.value = None
10781085
return True
10791086

10801087
if isinstance(value, list):
10811088
if not self.multiple:
10821089
return False
10831090
values = []
10841091
for v in value:
1092+
if v in self.values:
1093+
values.append(v)
1094+
continue
10851095
try:
1086-
n = int(v)
1087-
values.append(n)
1096+
v = int(v)
10881097
except:
1098+
pass
1099+
if not v in self.values:
10891100
return False
1101+
values.append(v)
10901102
if not self.optional and len(values) == 0:
10911103
return False
10921104
self.value = values
10931105
return True
10941106
else:
1095-
try:
1096-
n = int(value)
1097-
self.value = n
1107+
if value in self.values:
1108+
self.value = value
10981109
return True
1110+
try:
1111+
value = int(value)
10991112
except:
1113+
pass
1114+
if not value in self.values:
11001115
return False
1116+
self.value = value
1117+
return True
11011118

11021119
@classmethod
11031120
def fromScriptCode(self, line):
@@ -1510,46 +1527,6 @@ def fromScriptCode(self, line):
15101527
[dataobjects.TYPE_VECTOR_POLYGON], isOptional)
15111528

15121529

1513-
class ParameterGeometryPredicate(Parameter):
1514-
1515-
predicates = ('intersects',
1516-
'contains',
1517-
'disjoint',
1518-
'equals',
1519-
'touches',
1520-
'overlaps',
1521-
'within',
1522-
'crosses')
1523-
1524-
def __init__(self, name='', description='', left=None, right=None,
1525-
optional=False, enabledPredicates=None):
1526-
Parameter.__init__(self, name, description, None, optional)
1527-
self.left = left
1528-
self.right = right
1529-
self.value = None
1530-
self.enabledPredicates = enabledPredicates
1531-
if self.enabledPredicates is None:
1532-
self.enabledPredicates = self.predicates
1533-
1534-
def getValueAsCommandLineParameter(self):
1535-
return str(self.value)
1536-
1537-
def setValue(self, value):
1538-
if value is None:
1539-
if not self.optional:
1540-
return False
1541-
self.value = None
1542-
return True
1543-
elif len(value) == 0 and not self.optional:
1544-
return False
1545-
1546-
if isinstance(value, str):
1547-
self.value = value.split(';') # relates to ModelerAlgorithm.resolveValue
1548-
else:
1549-
self.value = value
1550-
return True
1551-
1552-
15531530
paramClasses = [c for c in list(sys.modules[__name__].__dict__.values()) if isclass(c) and issubclass(c, Parameter)]
15541531

15551532

‎python/plugins/processing/gui/BatchPanel.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
from qgis.gui import QgsMessageBar
3939

4040
from processing.gui.BatchOutputSelectionPanel import BatchOutputSelectionPanel
41-
from processing.gui.GeometryPredicateSelectionPanel import GeometryPredicateSelectionPanel
4241

4342
from processing.core.parameters import ParameterFile
4443
from processing.core.parameters import ParameterRaster
@@ -50,7 +49,6 @@
5049
from processing.core.parameters import ParameterSelection
5150
from processing.core.parameters import ParameterFixedTable
5251
from processing.core.parameters import ParameterMultipleInput
53-
from processing.core.parameters import ParameterGeometryPredicate
5452

5553
pluginPath = os.path.split(os.path.dirname(__file__))[0]
5654
WIDGET, BASE = uic.loadUiType(

‎python/plugins/processing/gui/GeometryPredicateSelectionPanel.py

Lines changed: 0 additions & 123 deletions
This file was deleted.

‎python/plugins/processing/gui/MultipleInputDialog.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,10 @@ def __init__(self, options, selectedoptions=None):
6868

6969
def populateList(self):
7070
model = QStandardItemModel()
71-
for i, option in enumerate(self.options):
72-
item = QStandardItem(option)
73-
item.setCheckState(Qt.Checked if i in self.selectedoptions else Qt.Unchecked)
71+
for value, text in self.options:
72+
item = QStandardItem(text)
73+
item.setData(value, Qt.UserRole)
74+
item.setCheckState(Qt.Checked if value in self.selectedoptions else Qt.Unchecked)
7475
item.setCheckable(True)
7576
model.appendRow(item)
7677

@@ -82,7 +83,7 @@ def accept(self):
8283
for i in range(model.rowCount()):
8384
item = model.item(i)
8485
if item.checkState() == Qt.Checked:
85-
self.selectedoptions.append(i)
86+
self.selectedoptions.append(item.data(Qt.UserRole))
8687
QDialog.accept(self)
8788

8889
def reject(self):

‎python/plugins/processing/gui/wrappers.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@
7373
from processing.gui.FixedTablePanel import FixedTablePanel
7474
from processing.gui.ExtentSelectionPanel import ExtentSelectionPanel
7575
from processing.gui.StringInputPanel import StringInputPanel
76-
from processing.gui.GeometryPredicateSelectionPanel import GeometryPredicateSelectionPanel
7776

7877

7978
DIALOG_STANDARD = 'standard'
@@ -662,22 +661,23 @@ def createWidget(self):
662661
return MultipleInputPanel(options=self.param.options)
663662
else:
664663
widget = QComboBox()
665-
widget.addItems(self.param.options)
664+
for option in self.param.options:
665+
widget.addItem(option[1], option[0])
666666
if self.param.default:
667-
widget.setCurrentIndex(self.param.default)
667+
widget.setCurrentIndex(widget.findData(self.param.default))
668668
return widget
669669

670670
def setValue(self, value):
671671
if self.param.multiple:
672672
self.widget.setSelectedItems(value)
673673
else:
674-
self.widget.setCurrentIndex(int(value))
674+
self.widget.setCurrentIndex(self.widget.findData(value))
675675

676676
def value(self):
677677
if self.param.multiple:
678678
return self.widget.selectedoptions
679679
else:
680-
return self.widget.currentIndex()
680+
return self.widget.currentData()
681681

682682

683683
class VectorWidgetWrapper(WidgetWrapper):

‎python/plugins/processing/tests/ParametersTest.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,15 +272,15 @@ def testDefault(self):
272272
parameter = ParameterSelection('myName', 'myDesc', ['option1', 'option2', 'option3'], default=0.0)
273273
self.assertEqual(parameter.value, 0)
274274
parameter = ParameterSelection('myName', 'myDesc', ['option1', 'option2', 'option3'], default='a')
275-
self.assertEqual(parameter.value, 0)
275+
self.assertEqual(parameter.value, None)
276276

277277
def testOptional(self):
278278
optionalParameter = ParameterSelection('myName', 'myDesc', ['option1', 'option2', 'option3'], default=0, optional=True)
279279
self.assertEqual(optionalParameter.value, 0)
280280
optionalParameter.setValue(1)
281281
self.assertEqual(optionalParameter.value, 1)
282282
self.assertTrue(optionalParameter.setValue(None))
283-
self.assertEqual(optionalParameter.value, 0)
283+
self.assertEqual(optionalParameter.value, None)
284284

285285
requiredParameter = ParameterSelection('myName', 'myDesc', ['option1', 'option2', 'option3'], default=0, optional=False)
286286
self.assertEqual(requiredParameter.value, 0)
@@ -289,6 +289,22 @@ def testOptional(self):
289289
self.assertFalse(requiredParameter.setValue(None))
290290
self.assertEqual(requiredParameter.value, 1)
291291

292+
def testTupleOptions(self):
293+
options = (
294+
('o1', 'option1'),
295+
('o2', 'option2'),
296+
('o3', 'option3'))
297+
298+
optionalParameter = ParameterSelection('myName', 'myDesc', options, default='o1')
299+
self.assertEqual(optionalParameter.value, 'o1')
300+
optionalParameter.setValue('o2')
301+
self.assertEqual(optionalParameter.value, 'o2')
302+
303+
optionalParameter = ParameterSelection('myName', 'myDesc', options, default=['o1', 'o2'], multiple=True)
304+
self.assertEqual(optionalParameter.value, ['o1', 'o2'])
305+
optionalParameter.setValue(['o2'])
306+
self.assertEqual(optionalParameter.value, ['o2'])
307+
292308

293309
class ParameterFileTest(unittest.TestCase):
294310

0 commit comments

Comments
 (0)
Please sign in to comment.