diff --git a/python/plugins/processing/core/parameters.py b/python/plugins/processing/core/parameters.py index 55f9aed2a8e..39d90afea99 100644 --- a/python/plugins/processing/core/parameters.py +++ b/python/plugins/processing/core/parameters.py @@ -57,7 +57,7 @@ class Parameter: take as input. """ - def __init__(self, name='', description=''): + def __init__(self, name='', description='', optional=False): self.name = name self.description = description self.value = None @@ -68,6 +68,7 @@ class Parameter: # It can be used as any other parameter, but it will not be # shown to the user self.hidden = False + self.optional = optional def setValue(self, obj): """ @@ -109,8 +110,8 @@ class Parameter: class ParameterBoolean(Parameter): - def __init__(self, name='', description='', default=True): - Parameter.__init__(self, name, description) + def __init__(self, name='', description='', default=True, optional=False): + Parameter.__init__(self, name, description, optional) self.default = parseBool(default) self.value = None @@ -129,12 +130,12 @@ class ParameterBoolean(Parameter): class ParameterCrs(Parameter): - def __init__(self, name='', description='', default='EPSG:4326'): + def __init__(self, name='', description='', default='EPSG:4326', optional=False): '''The value is a string that uniquely identifies the coordinate reference system. Typically it is the auth id of the CRS (if the authority is EPSG) or proj4 string of the CRS (in case of other authorities or user defined projections).''' - Parameter.__init__(self, name, description) + Parameter.__init__(self, name, description, optional) self.value = None self.default = default @@ -168,8 +169,8 @@ class ParameterExtent(Parameter): USE_MIN_COVERING_EXTENT = 'USE_MIN_COVERING_EXTENT' - def __init__(self, name='', description='', default='0,1,0,1'): - Parameter.__init__(self, name, description) + def __init__(self, name='', description='', default='0,1,0,1', optional=False): + Parameter.__init__(self, name, description, optional) self.default = default # The value is a string in the form "xmin, xmax, ymin, ymax" self.value = None @@ -200,11 +201,10 @@ class ParameterExtent(Parameter): class ParameterFile(Parameter): def __init__(self, name='', description='', isFolder=False, optional=True, ext=None): - Parameter.__init__(self, name, description) + Parameter.__init__(self, name, description, parseBool(optional)) self.value = None self.ext = ext self.isFolder = parseBool(isFolder) - self.optional = parseBool(optional) def getValueAsCommandLineParameter(self): return '"' + unicode(self.value) + '"' @@ -229,8 +229,8 @@ class ParameterFile(Parameter): class ParameterFixedTable(Parameter): def __init__(self, name='', description='', numRows=3, - cols=['value'], fixedNumOfRows=False): - Parameter.__init__(self, name, description) + cols=['value'], fixedNumOfRows=False, optional=False): + Parameter.__init__(self, name, description, optional) self.cols = cols if isinstance(cols, basestring): self.cols = self.cols.split(";") @@ -282,9 +282,8 @@ class ParameterMultipleInput(ParameterDataObject): TYPE_FILE = 4 def __init__(self, name='', description='', datatype=-1, optional=False): - ParameterDataObject.__init__(self, name, description) + ParameterDataObject.__init__(self, name, description, optional) self.datatype = int(float(datatype)) - self.optional = parseBool(optional) self.value = None self.exported = None @@ -411,8 +410,8 @@ class ParameterMultipleInput(ParameterDataObject): class ParameterNumber(Parameter): def __init__(self, name='', description='', minValue=None, maxValue=None, - default=0.0): - Parameter.__init__(self, name, description) + default=0.0, optional=False): + Parameter.__init__(self, name, description, optional) try: self.default = int(unicode(default)) self.isInteger = True @@ -433,7 +432,7 @@ class ParameterNumber(Parameter): if n is None: if not self.optional: return False - self.value = None + self.value = self.default return True try: if float(n) - int(float(n)) == 0: @@ -454,8 +453,8 @@ class ParameterNumber(Parameter): class ParameterRange(Parameter): - def __init__(self, name='', description='', default='0,1'): - Parameter.__init__(self, name, description) + def __init__(self, name='', description='', default='0,1', optional=False): + Parameter.__init__(self, name, description, optional) self.default = default self.value = None @@ -491,9 +490,8 @@ class ParameterRange(Parameter): class ParameterRaster(ParameterDataObject): def __init__(self, name='', description='', optional=False, showSublayersDialog=True): - ParameterDataObject.__init__(self, name, description) + ParameterDataObject.__init__(self, name, description, optional) self.showSublayersDialog = parseBool(showSublayersDialog) - self.optional = parseBool(optional) self.value = None self.exported = None @@ -548,8 +546,9 @@ class ParameterRaster(ParameterDataObject): class ParameterSelection(Parameter): - def __init__(self, name='', description='', options=[], default=0, isSource=False): - Parameter.__init__(self, name, description) + def __init__(self, name='', description='', options=[], default=0, isSource=False, + optional=False): + Parameter.__init__(self, name, description, optional) self.options = options if isSource: self.options = [] @@ -588,16 +587,15 @@ class ParameterString(Parameter): def __init__(self, name='', description='', default='', multiline=False, optional=False): - Parameter.__init__(self, name, description) + Parameter.__init__(self, name, description, optional) self.default = default self.value = None self.multiline = parseBool(multiline) - self.optional = parseBool(optional) def setValue(self, obj): if obj is None: if not self.optional: - return false + return False self.value = '' return True self.value = unicode(obj).replace( @@ -614,8 +612,7 @@ class ParameterString(Parameter): class ParameterTable(ParameterDataObject): def __init__(self, name='', description='', optional=False): - ParameterDataObject.__init__(self, name, description) - self.optional = parseBool(optional) + ParameterDataObject.__init__(self, name, description, optional) self.value = None self.exported = None @@ -685,11 +682,10 @@ class ParameterTableField(Parameter): def __init__(self, name='', description='', parent=None, datatype=-1, optional=False): - Parameter.__init__(self, name, description) + Parameter.__init__(self, name, description, optional) self.parent = parent self.value = None self.datatype = int(datatype) - self.optional = parseBool(optional) def getValueAsCommandLineParameter(self): return '"' + unicode(self.value) + '"' @@ -728,8 +724,7 @@ class ParameterVector(ParameterDataObject): def __init__(self, name='', description='', shapetype=[-1], optional=False): - ParameterDataObject.__init__(self, name, description) - self.optional = parseBool(optional) + ParameterDataObject.__init__(self, name, description, optional) if isinstance(shapetype, int): shapetype = [shapetype] elif isinstance(shapetype, basestring): @@ -818,12 +813,11 @@ class ParameterGeometryPredicate(Parameter): def __init__(self, name='', description='', left=None, right=None, optional=False, enabledPredicates=None): - Parameter.__init__(self, name, description) + Parameter.__init__(self, name, description, optional) self.left = left self.right = right self.value = None self.default = [] - self.optional = parseBool(optional) self.enabledPredicates = enabledPredicates if self.enabledPredicates is None: self.enabledPredicates = self.predicates diff --git a/python/plugins/processing/modeler/ModelerParametersDialog.py b/python/plugins/processing/modeler/ModelerParametersDialog.py index 1ab633052e5..2471ae70dc3 100644 --- a/python/plugins/processing/modeler/ModelerParametersDialog.py +++ b/python/plugins/processing/modeler/ModelerParametersDialog.py @@ -552,10 +552,15 @@ class ModelerParametersDialog(QDialog): def setParamNumberValue(self, alg, param, widget): idx = widget.findText(widget.currentText()) if idx < 0: - s = widget.currentText() - try: - value = float(s) - except: + s = widget.currentText().strip() + if s: + try: + value = float(s) + except: + return False + elif param.optional: + value = None + else: return False else: value = widget.itemData(widget.currentIndex()) @@ -565,14 +570,19 @@ class ModelerParametersDialog(QDialog): def setParamExtentValue(self, alg, param, widget): idx = widget.findText(widget.currentText()) if idx < 0: - s = unicode(widget.currentText()) - try: - tokens = s.split(',') - if len(tokens) != 4: + s = unicode(widget.currentText()).strip() + if s: + try: + tokens = s.split(',') + if len(tokens) != 4: + return False + for token in tokens: + float(token) + except: return False - for token in tokens: - float(token) - except: + elif param.optional: + s = None + else: return False alg.params[param.name] = [s] else: @@ -607,13 +617,15 @@ class ModelerParametersDialog(QDialog): return True elif isinstance(param, ParameterCrs): authid = widget.getValue() - if authid is None: - alg.params[param.name] = None - else: - alg.params[param.name] = authid + if authid is None and not param.optional: + return False + alg.params[param.name] = authid return True elif isinstance(param, ParameterFixedTable): - alg.params[param.name] = ParameterFixedTable.tableToString(widget.table) + table = widget.table + if not bool(table) and not param.optional: + return False + alg.params[param.name] = ParameterFixedTable.tableToString(table) return True elif isinstance(param, ParameterTableField): return self.setParamTableFieldValue(alg, param, widget)