Skip to content

Commit 8187ad5

Browse files
committedNov 4, 2015
[processing] some fixes for supporting optional parameters
1 parent 0cc92ff commit 8187ad5

File tree

2 files changed

+55
-49
lines changed

2 files changed

+55
-49
lines changed
 

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

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class Parameter:
5757
take as input.
5858
"""
5959

60-
def __init__(self, name='', description=''):
60+
def __init__(self, name='', description='', optional=False):
6161
self.name = name
6262
self.description = description
6363
self.value = None
@@ -68,6 +68,7 @@ def __init__(self, name='', description=''):
6868
# It can be used as any other parameter, but it will not be
6969
# shown to the user
7070
self.hidden = False
71+
self.optional = optional
7172

7273
def setValue(self, obj):
7374
"""
@@ -109,8 +110,8 @@ def tr(self, string, context=''):
109110

110111
class ParameterBoolean(Parameter):
111112

112-
def __init__(self, name='', description='', default=True):
113-
Parameter.__init__(self, name, description)
113+
def __init__(self, name='', description='', default=True, optional=False):
114+
Parameter.__init__(self, name, description, optional)
114115
self.default = parseBool(default)
115116
self.value = None
116117

@@ -129,12 +130,12 @@ def setValue(self, value):
129130

130131
class ParameterCrs(Parameter):
131132

132-
def __init__(self, name='', description='', default='EPSG:4326'):
133+
def __init__(self, name='', description='', default='EPSG:4326', optional=False):
133134
'''The value is a string that uniquely identifies the
134135
coordinate reference system. Typically it is the auth id of the CRS
135136
(if the authority is EPSG) or proj4 string of the CRS (in case
136137
of other authorities or user defined projections).'''
137-
Parameter.__init__(self, name, description)
138+
Parameter.__init__(self, name, description, optional)
138139
self.value = None
139140
self.default = default
140141

@@ -168,8 +169,8 @@ class ParameterExtent(Parameter):
168169

169170
USE_MIN_COVERING_EXTENT = 'USE_MIN_COVERING_EXTENT'
170171

171-
def __init__(self, name='', description='', default='0,1,0,1'):
172-
Parameter.__init__(self, name, description)
172+
def __init__(self, name='', description='', default='0,1,0,1', optional=False):
173+
Parameter.__init__(self, name, description, optional)
173174
self.default = default
174175
# The value is a string in the form "xmin, xmax, ymin, ymax"
175176
self.value = None
@@ -200,11 +201,10 @@ def getValueAsCommandLineParameter(self):
200201
class ParameterFile(Parameter):
201202

202203
def __init__(self, name='', description='', isFolder=False, optional=True, ext=None):
203-
Parameter.__init__(self, name, description)
204+
Parameter.__init__(self, name, description, parseBool(optional))
204205
self.value = None
205206
self.ext = ext
206207
self.isFolder = parseBool(isFolder)
207-
self.optional = parseBool(optional)
208208

209209
def getValueAsCommandLineParameter(self):
210210
return '"' + unicode(self.value) + '"'
@@ -229,8 +229,8 @@ def typeName(self):
229229
class ParameterFixedTable(Parameter):
230230

231231
def __init__(self, name='', description='', numRows=3,
232-
cols=['value'], fixedNumOfRows=False):
233-
Parameter.__init__(self, name, description)
232+
cols=['value'], fixedNumOfRows=False, optional=False):
233+
Parameter.__init__(self, name, description, optional)
234234
self.cols = cols
235235
if isinstance(cols, basestring):
236236
self.cols = self.cols.split(";")
@@ -282,9 +282,8 @@ class ParameterMultipleInput(ParameterDataObject):
282282
TYPE_FILE = 4
283283

284284
def __init__(self, name='', description='', datatype=-1, optional=False):
285-
ParameterDataObject.__init__(self, name, description)
285+
ParameterDataObject.__init__(self, name, description, optional)
286286
self.datatype = int(float(datatype))
287-
self.optional = parseBool(optional)
288287
self.value = None
289288
self.exported = None
290289

@@ -411,8 +410,8 @@ def dataType(self):
411410
class ParameterNumber(Parameter):
412411

413412
def __init__(self, name='', description='', minValue=None, maxValue=None,
414-
default=0.0):
415-
Parameter.__init__(self, name, description)
413+
default=0.0, optional=False):
414+
Parameter.__init__(self, name, description, optional)
416415
try:
417416
self.default = int(unicode(default))
418417
self.isInteger = True
@@ -433,7 +432,7 @@ def setValue(self, n):
433432
if n is None:
434433
if not self.optional:
435434
return False
436-
self.value = None
435+
self.value = self.default
437436
return True
438437
try:
439438
if float(n) - int(float(n)) == 0:
@@ -454,8 +453,8 @@ def setValue(self, n):
454453

455454
class ParameterRange(Parameter):
456455

457-
def __init__(self, name='', description='', default='0,1'):
458-
Parameter.__init__(self, name, description)
456+
def __init__(self, name='', description='', default='0,1', optional=False):
457+
Parameter.__init__(self, name, description, optional)
459458
self.default = default
460459
self.value = None
461460

@@ -491,9 +490,8 @@ def getValueAsCommandLineParameter(self):
491490
class ParameterRaster(ParameterDataObject):
492491

493492
def __init__(self, name='', description='', optional=False, showSublayersDialog=True):
494-
ParameterDataObject.__init__(self, name, description)
493+
ParameterDataObject.__init__(self, name, description, optional)
495494
self.showSublayersDialog = parseBool(showSublayersDialog)
496-
self.optional = parseBool(optional)
497495
self.value = None
498496
self.exported = None
499497

@@ -548,8 +546,9 @@ def getFileFilter(self):
548546

549547
class ParameterSelection(Parameter):
550548

551-
def __init__(self, name='', description='', options=[], default=0, isSource=False):
552-
Parameter.__init__(self, name, description)
549+
def __init__(self, name='', description='', options=[], default=0, isSource=False,
550+
optional=False):
551+
Parameter.__init__(self, name, description, optional)
553552
self.options = options
554553
if isSource:
555554
self.options = []
@@ -588,16 +587,15 @@ class ParameterString(Parameter):
588587

589588
def __init__(self, name='', description='', default='', multiline=False,
590589
optional=False):
591-
Parameter.__init__(self, name, description)
590+
Parameter.__init__(self, name, description, optional)
592591
self.default = default
593592
self.value = None
594593
self.multiline = parseBool(multiline)
595-
self.optional = parseBool(optional)
596594

597595
def setValue(self, obj):
598596
if obj is None:
599597
if not self.optional:
600-
return false
598+
return False
601599
self.value = ''
602600
return True
603601
self.value = unicode(obj).replace(
@@ -614,8 +612,7 @@ def getValueAsCommandLineParameter(self):
614612
class ParameterTable(ParameterDataObject):
615613

616614
def __init__(self, name='', description='', optional=False):
617-
ParameterDataObject.__init__(self, name, description)
618-
self.optional = parseBool(optional)
615+
ParameterDataObject.__init__(self, name, description, optional)
619616
self.value = None
620617
self.exported = None
621618

@@ -685,11 +682,10 @@ class ParameterTableField(Parameter):
685682

686683
def __init__(self, name='', description='', parent=None, datatype=-1,
687684
optional=False):
688-
Parameter.__init__(self, name, description)
685+
Parameter.__init__(self, name, description, optional)
689686
self.parent = parent
690687
self.value = None
691688
self.datatype = int(datatype)
692-
self.optional = parseBool(optional)
693689

694690
def getValueAsCommandLineParameter(self):
695691
return '"' + unicode(self.value) + '"'
@@ -728,8 +724,7 @@ class ParameterVector(ParameterDataObject):
728724

729725
def __init__(self, name='', description='', shapetype=[-1],
730726
optional=False):
731-
ParameterDataObject.__init__(self, name, description)
732-
self.optional = parseBool(optional)
727+
ParameterDataObject.__init__(self, name, description, optional)
733728
if isinstance(shapetype, int):
734729
shapetype = [shapetype]
735730
elif isinstance(shapetype, basestring):
@@ -818,12 +813,11 @@ class ParameterGeometryPredicate(Parameter):
818813

819814
def __init__(self, name='', description='', left=None, right=None,
820815
optional=False, enabledPredicates=None):
821-
Parameter.__init__(self, name, description)
816+
Parameter.__init__(self, name, description, optional)
822817
self.left = left
823818
self.right = right
824819
self.value = None
825820
self.default = []
826-
self.optional = parseBool(optional)
827821
self.enabledPredicates = enabledPredicates
828822
if self.enabledPredicates is None:
829823
self.enabledPredicates = self.predicates

‎python/plugins/processing/modeler/ModelerParametersDialog.py

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -552,10 +552,15 @@ def setParamFileValue(self, alg, param, widget):
552552
def setParamNumberValue(self, alg, param, widget):
553553
idx = widget.findText(widget.currentText())
554554
if idx < 0:
555-
s = widget.currentText()
556-
try:
557-
value = float(s)
558-
except:
555+
s = widget.currentText().strip()
556+
if s:
557+
try:
558+
value = float(s)
559+
except:
560+
return False
561+
elif param.optional:
562+
value = None
563+
else:
559564
return False
560565
else:
561566
value = widget.itemData(widget.currentIndex())
@@ -565,14 +570,19 @@ def setParamNumberValue(self, alg, param, widget):
565570
def setParamExtentValue(self, alg, param, widget):
566571
idx = widget.findText(widget.currentText())
567572
if idx < 0:
568-
s = unicode(widget.currentText())
569-
try:
570-
tokens = s.split(',')
571-
if len(tokens) != 4:
573+
s = unicode(widget.currentText()).strip()
574+
if s:
575+
try:
576+
tokens = s.split(',')
577+
if len(tokens) != 4:
578+
return False
579+
for token in tokens:
580+
float(token)
581+
except:
572582
return False
573-
for token in tokens:
574-
float(token)
575-
except:
583+
elif param.optional:
584+
s = None
585+
else:
576586
return False
577587
alg.params[param.name] = [s]
578588
else:
@@ -607,13 +617,15 @@ def setParamValue(self, alg, param, widget):
607617
return True
608618
elif isinstance(param, ParameterCrs):
609619
authid = widget.getValue()
610-
if authid is None:
611-
alg.params[param.name] = None
612-
else:
613-
alg.params[param.name] = authid
620+
if authid is None and not param.optional:
621+
return False
622+
alg.params[param.name] = authid
614623
return True
615624
elif isinstance(param, ParameterFixedTable):
616-
alg.params[param.name] = ParameterFixedTable.tableToString(widget.table)
625+
table = widget.table
626+
if not bool(table) and not param.optional:
627+
return False
628+
alg.params[param.name] = ParameterFixedTable.tableToString(table)
617629
return True
618630
elif isinstance(param, ParameterTableField):
619631
return self.setParamTableFieldValue(alg, param, widget)

0 commit comments

Comments
 (0)
Please sign in to comment.