Skip to content

Commit 03eaad5

Browse files
committedJan 12, 2017
[processing] fix handling of the "selection" type settings
1 parent b823874 commit 03eaad5

File tree

2 files changed

+76
-30
lines changed

2 files changed

+76
-30
lines changed
 

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

Lines changed: 53 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,9 @@
3131

3232
from qgis.PyQt.QtCore import QCoreApplication, QSettings, QObject, pyqtSignal
3333
from qgis.PyQt.QtGui import QIcon
34-
from qgis.core import (NULL,
35-
QgsApplication)
34+
from qgis.core import NULL, QgsApplication
3635
from processing.tools.system import defaultOutputFolder
37-
import processing.tools.dataobjects
36+
from processing.tools import dataobjects
3837

3938

4039
class SettingsWatcher(QObject):
@@ -87,14 +86,6 @@ def initialize():
8786
ProcessingConfig.tr('General'),
8887
ProcessingConfig.USE_SELECTED,
8988
ProcessingConfig.tr('Use only selected features'), True))
90-
invalidFeaturesOptions = [ProcessingConfig.tr('Do not filter (better performance'),
91-
ProcessingConfig.tr('Ignore features with invalid geometries'),
92-
ProcessingConfig.tr('Stop algorithm execution when a geometry is invalid')]
93-
ProcessingConfig.addSetting(Setting(
94-
ProcessingConfig.tr('General'),
95-
ProcessingConfig.FILTER_INVALID_GEOMETRIES,
96-
ProcessingConfig.tr('Invalid features filtering'), invalidFeaturesOptions[2],
97-
valuetype=Setting.SELECTION, options=invalidFeaturesOptions))
9889
ProcessingConfig.addSetting(Setting(
9990
ProcessingConfig.tr('General'),
10091
ProcessingConfig.USE_FILENAME_AS_LAYER_NAME,
@@ -163,18 +154,35 @@ def initialize():
163154
ProcessingConfig.MODELS_SCRIPTS_REPO,
164155
ProcessingConfig.tr('Scripts and models repository'),
165156
'https://raw.githubusercontent.com/qgis/QGIS-Processing/master'))
166-
extensions = processing.tools.dataobjects.getSupportedOutputVectorLayerExtensions()
157+
158+
invalidFeaturesOptions = [ProcessingConfig.tr('Do not filter (better performance'),
159+
ProcessingConfig.tr('Ignore features with invalid geometries'),
160+
ProcessingConfig.tr('Stop algorithm execution when a geometry is invalid')]
161+
ProcessingConfig.addSetting(Setting(
162+
ProcessingConfig.tr('General'),
163+
ProcessingConfig.FILTER_INVALID_GEOMETRIES,
164+
ProcessingConfig.tr('Invalid features filtering'),
165+
invalidFeaturesOptions[2],
166+
valuetype=Setting.SELECTION,
167+
options=invalidFeaturesOptions))
168+
169+
extensions = dataobjects.getSupportedOutputVectorLayerExtensions()
167170
ProcessingConfig.addSetting(Setting(
168171
ProcessingConfig.tr('General'),
169172
ProcessingConfig.DEFAULT_OUTPUT_VECTOR_LAYER_EXT,
170-
ProcessingConfig.tr('Default output vector layer extension'), extensions[0],
171-
valuetype=Setting.SELECTION, options=extensions))
172-
extensions = processing.tools.dataobjects.getSupportedOutputRasterLayerExtensions()
173+
ProcessingConfig.tr('Default output vector layer extension'),
174+
extensions[0],
175+
valuetype=Setting.SELECTION,
176+
options=extensions))
177+
178+
extensions = dataobjects.getSupportedOutputRasterLayerExtensions()
173179
ProcessingConfig.addSetting(Setting(
174180
ProcessingConfig.tr('General'),
175181
ProcessingConfig.DEFAULT_OUTPUT_RASTER_LAYER_EXT,
176-
ProcessingConfig.tr('Default output raster layer extension'), extensions[0],
177-
valuetype=Setting.SELECTION, options=extensions))
182+
ProcessingConfig.tr('Default output raster layer extension'),
183+
extensions[0],
184+
valuetype=Setting.SELECTION,
185+
options=extensions))
178186

179187
@staticmethod
180188
def setGroupIcon(group, icon):
@@ -224,14 +232,20 @@ def getSetting(name):
224232
v = None
225233
except:
226234
pass
227-
return v
235+
if ProcessingConfig.settings[name].valuetype == Setting.SELECTION:
236+
return ProcessingConfig.settings[name].options.index(v)
237+
else:
238+
return v
228239
else:
229240
return None
230241

231242
@staticmethod
232243
def setSettingValue(name, value):
233244
if name in list(ProcessingConfig.settings.keys()):
234-
ProcessingConfig.settings[name].setValue(value)
245+
if ProcessingConfig.settings[name].valuetype == Setting.SELECTION:
246+
ProcessingConfig.settings[name].setValue(ProcessingConfig.settings[name].options[value])
247+
else:
248+
ProcessingConfig.settings[name].setValue(value)
235249
ProcessingConfig.settings[name].save()
236250

237251
@staticmethod
@@ -261,34 +275,36 @@ def __init__(self, group, name, description, default, hidden=False, valuetype=No
261275
self.description = description
262276
self.default = default
263277
self.hidden = hidden
264-
if valuetype is None:
265-
if isinstance(default, int):
266-
valuetype = self.INT
267-
elif isinstance(default, float):
268-
valuetype = self.FLOAT
269278
self.valuetype = valuetype
270279
self.options = options
280+
281+
if self.valuetype is None:
282+
if isinstance(default, int):
283+
self.valuetype = self.INT
284+
elif isinstance(default, float):
285+
self.valuetype = self.FLOAT
286+
271287
if validator is None:
272-
if valuetype == self.FLOAT:
288+
if self.valuetype == self.FLOAT:
273289
def checkFloat(v):
274290
try:
275291
float(v)
276292
except ValueError:
277293
raise ValueError(self.tr('Wrong parameter value:\n%s') % str(v))
278294
validator = checkFloat
279-
elif valuetype == self.INT:
295+
elif self.valuetype == self.INT:
280296
def checkInt(v):
281297
try:
282298
int(v)
283299
except ValueError:
284300
raise ValueError(self.tr('Wrong parameter value:\n%s') % str(v))
285301
validator = checkInt
286-
elif valuetype in [self.FILE, self.FOLDER]:
302+
elif self.valuetype in [self.FILE, self.FOLDER]:
287303
def checkFileOrFolder(v):
288304
if v and not os.path.exists(v):
289305
raise ValueError(self.tr('Specified path does not exist:\n%s') % str(v))
290306
validator = checkFileOrFolder
291-
elif valuetype == self.MULTIPLE_FOLDERS:
307+
elif self.valuetype == self.MULTIPLE_FOLDERS:
292308
def checkMultipleFolders(v):
293309
folders = v.split(';')
294310
for f in folders:
@@ -310,10 +326,17 @@ def read(self, qsettings=QSettings()):
310326
if value is not None:
311327
if isinstance(self.value, bool):
312328
value = str(value).lower() == str(True).lower()
313-
self.value = value
329+
330+
if self.valuetype == self.SELECTION:
331+
self.value = self.options[int(value)]
332+
else:
333+
self.value = value
314334

315335
def save(self, qsettings=QSettings()):
316-
qsettings.setValue(self.qname, self.value)
336+
if self.valuetype == self.SELECTION:
337+
qsettings.setValue(self.qname, self.options.index(self.value))
338+
else:
339+
qsettings.setValue(self.qname, self.value)
317340

318341
def __str__(self):
319342
return self.name + '=' + str(self.value)

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ def testFeatures(self):
5959
test_data = points()
6060
test_layer = QgsVectorLayer(test_data, 'test', 'ogr')
6161

62+
# disable check for geometry validity
63+
prevInvalidGeoms = ProcessingConfig.getSetting(ProcessingConfig.FILTER_INVALID_GEOMETRIES)
64+
ProcessingConfig.setSettingValue(ProcessingConfig.FILTER_INVALID_GEOMETRIES, 0)
65+
6266
# test with all features
6367
features = vector.features(test_layer)
6468
self.assertEqual(len(features), 9)
@@ -101,9 +105,22 @@ def testFeatures(self):
101105

102106
ProcessingConfig.setSettingValue(ProcessingConfig.USE_SELECTED, previous_value)
103107

108+
# test exception is raised when filtering invalid geoms
109+
#ProcessingConfig.setSettingValue(ProcessingConfig.FILTER_INVALID_GEOMETRIES, 2)
110+
#test_layer_invalid_geoms = QgsVectorLayer(invalid_geometries(), 'test', 'ogr')
111+
#with self.assertRaises(GeoAlgorithmExecutionException):
112+
# features = vector.features(test_layer_invalid_geoms)
113+
# feats = [f for f in features]
114+
115+
ProcessingConfig.setSettingValue(ProcessingConfig.FILTER_INVALID_GEOMETRIES, prevInvalidGeoms)
116+
104117
def testValues(self):
105118
ProcessingConfig.initialize()
106119

120+
# disable check for geometry validity
121+
prevInvalidGeoms = ProcessingConfig.getSetting(ProcessingConfig.FILTER_INVALID_GEOMETRIES)
122+
ProcessingConfig.setSettingValue(ProcessingConfig.FILTER_INVALID_GEOMETRIES, 0)
123+
107124
test_data = points()
108125
test_layer = QgsVectorLayer(test_data, 'test', 'ogr')
109126

@@ -138,10 +155,15 @@ def testValues(self):
138155
self.assertEqual(set(res[1]), set([5, 7, 3]))
139156

140157
ProcessingConfig.setSettingValue(ProcessingConfig.USE_SELECTED, previous_value)
158+
ProcessingConfig.setSettingValue(ProcessingConfig.FILTER_INVALID_GEOMETRIES, prevInvalidGeoms)
141159

142160
def testUniqueValues(self):
143161
ProcessingConfig.initialize()
144162

163+
# disable check for geometry validity
164+
prevInvalidGeoms = ProcessingConfig.getSetting(ProcessingConfig.FILTER_INVALID_GEOMETRIES)
165+
ProcessingConfig.setSettingValue(ProcessingConfig.FILTER_INVALID_GEOMETRIES, 0)
166+
145167
test_data = points()
146168
test_layer = QgsVectorLayer(test_data, 'test', 'ogr')
147169

@@ -164,6 +186,7 @@ def testUniqueValues(self):
164186
self.assertEqual(set(v), set([5, 7, 3]))
165187

166188
ProcessingConfig.setSettingValue(ProcessingConfig.USE_SELECTED, previous_value)
189+
ProcessingConfig.setSettingValue(ProcessingConfig.FILTER_INVALID_GEOMETRIES, prevInvalidGeoms)
167190

168191
def testOgrLayerNameExtraction(self):
169192
outdir = tempfile.mkdtemp()

3 commit comments

Comments
 (3)

m-kuhn commented on Jan 13, 2017

@m-kuhn
Member

This fails for me with

ValueError: invalid literal for int() with base 10: 'tif'

alexbruy commented on Jan 13, 2017

@alexbruy
ContributorAuthor

Probably you have settings file from previous installation. I will add code to handle this.

nirvn commented on Jan 17, 2017

@nirvn
Contributor

@alexbruy , I'm pretty sure that has broken getDefaultFileExtension() -- try gdal's build virtual raster (and leave the output as temporary file). It'll fail (while it used to work OK >1 week ago).

Please sign in to comment.