def testScriptCode(self): parameter = ParameterPoint('myName', 'myDescription') code = parameter.getAsScriptCode() result = getParameterFromString(code) self.assertIsInstance(result, ParameterPoint) parameter.optional = True code = parameter.getAsScriptCode() result = getParameterFromString(code) self.assertIsInstance(result, ParameterPoint) self.assertTrue(result.optional)
def testOptional(self): optionalParameter = ParameterPoint("myName", "myDesc", default="0,1", optional=True) self.assertEqual(optionalParameter.value, "0,1") optionalParameter.setValue("1,2") self.assertEqual(optionalParameter.value, "1,2") self.assertTrue(optionalParameter.setValue(None)) # Extent is unique in that it will let you set `None`, whereas other # optional parameters become "default" when assigning None. self.assertEqual(optionalParameter.value, None) requiredParameter = ParameterPoint("myName", "myDesc", default="0,1", optional=False) self.assertEqual(requiredParameter.value, "0,1") requiredParameter.setValue("1,2") self.assertEqual(requiredParameter.value, "1,2") self.assertFalse(requiredParameter.setValue(None)) self.assertEqual(requiredParameter.value, "1,2")
def testOptional(self): optionalParameter = ParameterPoint('myName', 'myDesc', default='0,1', optional=True) self.assertEqual(optionalParameter.value, '0,1') optionalParameter.setValue('1,2') self.assertEqual(optionalParameter.value, '1,2') self.assertTrue(optionalParameter.setValue(None)) # Point like Extent is unique in that it will let you set `None`, whereas other # optional parameters become "default" when assigning None. self.assertEqual(optionalParameter.value, None) requiredParameter = ParameterPoint('myName', 'myDesc', default='0,1', optional=False) self.assertEqual(requiredParameter.value, '0,1') requiredParameter.setValue('1,2') self.assertEqual(requiredParameter.value, '1,2') self.assertFalse(requiredParameter.setValue(None)) self.assertEqual(requiredParameter.value, '1,2')
def testSetInvalidValue(self): parameter = ParameterPoint("myName", "myDesc") self.assertFalse(parameter.setValue("0")) self.assertFalse(parameter.setValue("0,a"))
def testSetValue(self): parameter = ParameterPoint("myName", "myDesc") self.assertTrue(parameter.setValue("0,2")) self.assertEqual(parameter.value, "0,2")
def testSetInvalidValue(self): parameter = ParameterPoint('myName', 'myDesc') self.assertFalse(parameter.setValue('0')) self.assertFalse(parameter.setValue('0,a'))
def testSetValue(self): parameter = ParameterPoint('myName', 'myDesc') self.assertTrue(parameter.setValue('0,2')) self.assertEqual(parameter.value, '0,2')
def defineCharacteristics(self): self.DIRECTIONS = OrderedDict([ (self.tr('Forward direction'), QgsVectorLayerDirector.DirectionForward), (self.tr('Backward direction'), QgsVectorLayerDirector.DirectionForward), (self.tr('Both directions'), QgsVectorLayerDirector.DirectionForward) ]) self.STRATEGIES = [self.tr('Shortest'), self.tr('Fastest')] self.addParameter( ParameterVector(self.INPUT_VECTOR, self.tr('Vector layer representing network'), [dataobjects.TYPE_VECTOR_LINE])) self.addParameter( ParameterVector(self.START_POINTS, self.tr('Vector layer with start points'), [dataobjects.TYPE_VECTOR_POINT])) self.addParameter(ParameterPoint(self.END_POINT, self.tr('End point'))) self.addParameter( ParameterSelection(self.STRATEGY, self.tr('Path type to calculate'), self.STRATEGIES, default=0)) params = [] params.append( ParameterTableField(self.DIRECTION_FIELD, self.tr('Direction field'), self.INPUT_VECTOR, optional=True)) params.append( ParameterString(self.VALUE_FORWARD, self.tr('Value for forward direction'), '', optional=True)) params.append( ParameterString(self.VALUE_BACKWARD, self.tr('Value for backward direction'), '', optional=True)) params.append( ParameterString(self.VALUE_BOTH, self.tr('Value for both directions'), '', optional=True)) params.append( ParameterSelection(self.DEFAULT_DIRECTION, self.tr('Default direction'), list(self.DIRECTIONS.keys()), default=2)) params.append( ParameterTableField(self.SPEED_FIELD, self.tr('Speed field'), self.INPUT_VECTOR, optional=True)) params.append( ParameterNumber(self.DEFAULT_SPEED, self.tr('Default speed (km/h)'), 0.0, 99999999.999999, 5.0)) params.append( ParameterNumber(self.TOLERANCE, self.tr('Topology tolerance'), 0.0, 99999999.999999, 0.0)) for p in params: p.isAdvanced = True self.addParameter(p) self.addOutput( OutputVector(self.OUTPUT_LAYER, self.tr('Shortest path'), datatype=[dataobjects.TYPE_VECTOR_LINE]))
def processInputParameterToken(self, token, name): param = None desc = self.createDescriptiveName(name) if token.lower().strip().startswith('raster'): param = ParameterRaster(name, desc, False) elif token.lower().strip() == 'vector': param = ParameterVector(name, desc, [ParameterVector.VECTOR_TYPE_ANY]) elif token.lower().strip() == 'vector point': param = ParameterVector(name, desc, [ParameterVector.VECTOR_TYPE_POINT]) elif token.lower().strip() == 'vector line': param = ParameterVector(name, desc, [ParameterVector.VECTOR_TYPE_LINE]) elif token.lower().strip() == 'vector polygon': param = ParameterVector(name, desc, [ParameterVector.VECTOR_TYPE_POLYGON]) elif token.lower().strip() == 'table': param = ParameterTable(name, desc, False) elif token.lower().strip().startswith('multiple raster'): param = ParameterMultipleInput(name, desc, ParameterMultipleInput.TYPE_RASTER) param.optional = False elif token.lower().strip() == 'multiple vector': param = ParameterMultipleInput( name, desc, ParameterMultipleInput.TYPE_VECTOR_ANY) param.optional = False elif token.lower().strip().startswith('selection'): options = token.strip()[len('selection'):].split(';') param = ParameterSelection(name, desc, options) elif token.lower().strip().startswith('boolean'): default = token.strip()[len('boolean') + 1:] if default: param = ParameterBoolean(name, desc, default) else: param = ParameterBoolean(name, desc) elif token.lower().strip().startswith('number'): default = token.strip()[len('number') + 1:] if default: param = ParameterNumber(name, desc, default=default) else: param = ParameterNumber(name, desc) elif token.lower().strip().startswith('field'): field = token.strip()[len('field') + 1:] found = False for p in self.parameters: if p.name == field: found = True break if found: param = ParameterTableField(name, desc, field) elif token.lower().strip().startswith('multiple field'): field = token.strip()[len('multiple field') + 1:] found = False for p in self.parameters: if p.name == field: found = True break if found: param = ParameterTableMultipleField(token, desc, field) elif token.lower().strip() == 'extent': param = ParameterExtent(name, desc) elif token.lower().strip() == 'point': param = ParameterPoint(name, desc) elif token.lower().strip() == 'file': param = ParameterFile(name, desc, False) elif token.lower().strip() == 'folder': param = ParameterFile(name, desc, True) elif token.lower().strip().startswith('string'): default = token.strip()[len('string') + 1:] if default: param = ParameterString(name, desc, default) else: param = ParameterString(name, desc) elif token.lower().strip().startswith('longstring'): default = token.strip()[len('longstring') + 1:] if default: param = ParameterString(name, desc, default, multiline=True) else: param = ParameterString(name, desc, multiline=True) elif token.lower().strip() == 'crs': default = token.strip()[len('crs') + 1:] if default: param = ParameterCrs(name, desc, default) else: param = ParameterCrs(name, desc) return param
def defineCharacteristics(self): self.DIRECTIONS = OrderedDict([ (self.tr('Forward direction'), QgsVectorLayerDirector.DirectionForward), (self.tr('Backward direction'), QgsVectorLayerDirector.DirectionForward), (self.tr('Both directions'), QgsVectorLayerDirector.DirectionForward) ]) self.STRATEGIES = [self.tr('Shortest'), self.tr('Fastest')] self.name, self.i18n_name = self.trAlgorithm( 'Service area (from point)') self.group, self.i18n_group = self.trAlgorithm('Network analysis') self.addParameter( ParameterVector(self.INPUT_VECTOR, self.tr('Vector layer representing network'), [dataobjects.TYPE_VECTOR_LINE])) self.addParameter( ParameterPoint(self.START_POINT, self.tr('Start point'))) self.addParameter( ParameterSelection(self.STRATEGY, self.tr('Path type to calculate'), self.STRATEGIES, default=0)) self.addParameter( ParameterNumber( self.TRAVEL_COST, self.tr( 'Travel cost (distance for "Shortest", time for "Fastest")' ), 0.0, 99999999.999999, 0.0)) params = [] params.append( ParameterTableField(self.DIRECTION_FIELD, self.tr('Direction field'), self.INPUT_VECTOR, optional=True)) params.append( ParameterString(self.VALUE_FORWARD, self.tr('Value for forward direction'), '', optional=True)) params.append( ParameterString(self.VALUE_BACKWARD, self.tr('Value for backward direction'), '', optional=True)) params.append( ParameterString(self.VALUE_BOTH, self.tr('Value for both directions'), '', optional=True)) params.append( ParameterSelection(self.DEFAULT_DIRECTION, self.tr('Default direction'), list(self.DIRECTIONS.keys()), default=2)) params.append( ParameterTableField(self.SPEED_FIELD, self.tr('Speed field'), self.INPUT_VECTOR, optional=True)) params.append( ParameterNumber(self.DEFAULT_SPEED, self.tr('Default speed (km/h)'), 0.0, 99999999.999999, 5.0)) params.append( ParameterNumber(self.TOLERANCE, self.tr('Topology tolerance'), 0.0, 99999999.999999, 0.0)) for p in params: p.isAdvanced = True self.addParameter(p) self.addOutput( OutputVector(self.OUTPUT_POINTS, self.tr('Service area (boundary nodes)'), datatype=[dataobjects.TYPE_VECTOR_POINT])) self.addOutput( OutputVector(self.OUTPUT_POLYGON, self.tr('Service area (convex hull)'), datatype=[dataobjects.TYPE_VECTOR_POLYGON]))
def okPressed(self): description = str(self.nameTextBox.text()) if description.strip() == '': QMessageBox.warning(self, self.tr('Unable to define parameter'), self.tr('Invalid parameter name')) return if self.param is None: validChars = \ 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' safeName = ''.join(c for c in description if c in validChars) name = safeName.lower() i = 2 while name in self.alg.inputs: name = safeName.lower() + str(i) else: name = self.param.name if (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_BOOLEAN or isinstance(self.param, ParameterBoolean)): self.param = ParameterBoolean(name, description, self.state.isChecked()) elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_TABLE_FIELD or isinstance(self.param, ParameterTableField)): if self.parentCombo.currentIndex() < 0: QMessageBox.warning( self, self.tr('Unable to define parameter'), self.tr('Wrong or missing parameter values')) return parent = self.parentCombo.currentData() datatype = self.datatypeCombo.currentData() self.param = ParameterTableField( name, description, parent, datatype, multiple=self.multipleCheck.isChecked()) elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_RASTER or isinstance(self.param, ParameterRaster)): self.param = ParameterRaster(name, description) elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_TABLE or isinstance(self.param, ParameterTable)): self.param = ParameterTable(name, description) elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_VECTOR or isinstance(self.param, ParameterVector)): self.param = ParameterVector( name, description, [self.shapetypeCombo.currentIndex() - 1]) elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_MULTIPLE or isinstance(self.param, ParameterMultipleInput)): self.param = ParameterMultipleInput( name, description, self.datatypeCombo.currentIndex() - 1) elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_NUMBER or isinstance(self.param, ParameterNumber)): try: vmin = self.minTextBox.text().strip() if vmin == '': vmin = None else: vmin = float(vmin) vmax = self.maxTextBox.text().strip() if vmax == '': vmax = None else: vmax = float(vmax) self.param = ParameterNumber(name, description, vmin, vmax, str(self.defaultTextBox.text())) except: QMessageBox.warning( self, self.tr('Unable to define parameter'), self.tr('Wrong or missing parameter values')) return elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_EXPRESSION or isinstance(self.param, ParameterExpression)): parent = self.parentCombo.currentData() self.param = ParameterExpression( name, description, default=str(self.defaultEdit.expression()), parent_layer=parent) elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_STRING or isinstance(self.param, ParameterString)): self.param = ParameterString(name, description, str(self.defaultTextBox.text())) elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_EXTENT or isinstance(self.param, ParameterExtent)): self.param = ParameterExtent(name, description) elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_FILE or isinstance(self.param, ParameterFile)): isFolder = self.fileFolderCombo.currentIndex() == 1 self.param = ParameterFile(name, description, isFolder=isFolder) elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_POINT or isinstance(self.param, ParameterPoint)): self.param = ParameterPoint(name, description, str(self.defaultTextBox.text())) elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_CRS or isinstance(self.param, ParameterCrs)): self.param = ParameterCrs(name, description, default=self.selector.crs().authid()) self.param.optional = not self.requiredCheck.isChecked() self.close()
def processParameterLine(self, line): param = None out = None line = line.replace('#', '') if line.lower().strip().startswith('showplots'): self.showPlots = True self.addOutput(OutputHTML(RAlgorithm.RPLOTS, 'R Plots')) return if line.lower().strip().startswith('dontuserasterpackage'): self.useRasterPackage = False return if line.lower().strip().startswith('passfilenames'): self.passFileNames = True return tokens = line.split('=') desc = self.createDescriptiveName(tokens[0]) if tokens[1].lower().strip() == 'group': self.group = tokens[0] return if tokens[1].lower().strip().startswith('raster'): param = ParameterRaster(tokens[0], desc, False) elif tokens[1].lower().strip() == 'vector': param = ParameterVector(tokens[0], desc, [ParameterVector.VECTOR_TYPE_ANY]) elif tokens[1].lower().strip() == 'vector point': param = ParameterVector(tokens[0], desc, [ParameterVector.VECTOR_TYPE_POINT]) elif tokens[1].lower().strip() == 'vector line': param = ParameterVector(tokens[0], desc, [ParameterVector.VECTOR_TYPE_LINE]) elif tokens[1].lower().strip() == 'vector polygon': param = ParameterVector(tokens[0], desc, [ParameterVector.VECTOR_TYPE_POLYGON]) elif tokens[1].lower().strip() == 'table': param = ParameterTable(tokens[0], desc, False) elif tokens[1].lower().strip().startswith('multiple raster'): param = ParameterMultipleInput(tokens[0], desc, ParameterMultipleInput.TYPE_RASTER) param.optional = False elif tokens[1].lower().strip() == 'multiple vector': param = ParameterMultipleInput( tokens[0], desc, ParameterMultipleInput.TYPE_VECTOR_ANY) param.optional = False elif tokens[1].lower().strip().startswith('selection'): options = tokens[1].strip()[len('selection'):].split(';') param = ParameterSelection(tokens[0], desc, options) elif tokens[1].lower().strip().startswith('boolean'): default = tokens[1].strip()[len('boolean') + 1:] param = ParameterBoolean(tokens[0], desc, default) elif tokens[1].lower().strip().startswith('number'): try: default = float(tokens[1].strip()[len('number') + 1:]) param = ParameterNumber(tokens[0], desc, default=default) except: raise WrongScriptException( self.tr( 'Could not load R script: %s.\n Problem with line %s' % (self.descriptionFile, line))) elif tokens[1].lower().strip().startswith('field'): field = tokens[1].strip()[len('field') + 1:] found = False for p in self.parameters: if p.name == field: found = True break if found: param = ParameterTableField(tokens[0], tokens[0], field) elif tokens[1].lower().strip() == 'extent': param = ParameterExtent(tokens[0], desc) elif tokens[1].lower().strip() == 'point': param = ParameterPoint(tokens[0], desc) elif tokens[1].lower().strip() == 'file': param = ParameterFile(tokens[0], desc, False) elif tokens[1].lower().strip() == 'folder': param = ParameterFile(tokens[0], desc, True) elif tokens[1].lower().strip().startswith('string'): default = tokens[1].strip()[len('string') + 1:] param = ParameterString(tokens[0], desc, default) elif tokens[1].lower().strip().startswith('longstring'): default = tokens[1].strip()[len('longstring') + 1:] param = ParameterString(tokens[0], desc, default, multiline=True) elif tokens[1].lower().strip().startswith('output raster'): out = OutputRaster() elif tokens[1].lower().strip().startswith('output vector'): out = OutputVector() elif tokens[1].lower().strip().startswith('output table'): out = OutputTable() elif tokens[1].lower().strip().startswith('output file'): out = OutputFile() if param is not None: self.addParameter(param) elif out is not None: out.name = tokens[0] out.description = tokens[0] self.addOutput(out) else: raise WrongScriptException( self.tr('Could not load R script: %s.\n Problem with line %s' % (self.descriptionFile, line)))
def processInputParameterToken(self, token, name): param = None descName = self.createDescriptiveName(name) if token.lower().strip() == 'raster': param = ParameterRaster(name, descName, False) elif token.lower().strip() == 'vector': param = ParameterVector(name, descName, [dataobjects.TYPE_VECTOR_ANY]) elif token.lower().strip() == 'vector point': param = ParameterVector(name, descName, [dataobjects.TYPE_VECTOR_POINT]) elif token.lower().strip() == 'vector line': param = ParameterVector(name, descName, [dataobjects.TYPE_VECTOR_LINE]) elif token.lower().strip() == 'vector polygon': param = ParameterVector(name, descName, [dataobjects.TYPE_VECTOR_POLYGON]) elif token.lower().strip() == 'table': param = ParameterTable(name, descName, False) elif token.lower().strip() == 'multiple raster': param = ParameterMultipleInput(name, descName, dataobjects.TYPE_RASTER) param.optional = False elif token.lower().strip() == 'multiple vector': param = ParameterMultipleInput(name, descName, dataobjects.TYPE_VECTOR_ANY) param.optional = False elif token.lower().strip().startswith('selectionfromfile'): options = token.strip()[len('selectionfromfile '):].split(';') param = ParameterSelection(name, descName, options, isSource=True) elif token.lower().strip().startswith('selection'): options = token.strip()[len('selection '):].split(';') param = ParameterSelection(name, descName, options) elif token.lower().strip().startswith('boolean'): default = token.strip()[len('boolean') + 1:] if default: param = ParameterBoolean(name, descName, default) else: param = ParameterBoolean(name, descName) elif token.lower().strip() == 'extent': param = ParameterExtent(name, descName) elif token.lower().strip() == 'point': param = ParameterPoint(name, descName) elif token.lower().strip() == 'file': param = ParameterFile(name, descName, False) elif token.lower().strip() == 'folder': param = ParameterFile(name, descName, True) elif token.lower().strip().startswith('number'): default = token.strip()[len('number') + 1:] if default: param = ParameterNumber(name, descName, default=default) else: param = ParameterNumber(name, descName) elif token.lower().strip().startswith('field'): if token.lower().strip().startswith('field number'): field = token.strip()[len('field number') + 1:] datatype = ParameterTableField.DATA_TYPE_NUMBER elif token.lower().strip().startswith('field string'): field = token.strip()[len('field string') + 1:] datatype = ParameterTableField.DATA_TYPE_STRING else: field = token.strip()[len('field') + 1:] datatype = ParameterTableField.DATA_TYPE_ANY found = False for p in self.parameters: if p.name == field: found = True break if found: param = ParameterTableField(name=name, description=descName, parent=field, datatype=datatype) elif token.lower().strip().startswith('multiple field'): if token.lower().strip().startswith('multiple field number'): field = token.strip()[len('multiple field number') + 1:] datatype = ParameterTableMultipleField.DATA_TYPE_NUMBER elif token.lower().strip().startswith('multiple field string'): field = token.strip()[len('multiple field string') + 1:] datatype = ParameterTableMultipleField.DATA_TYPE_STRING else: field = token.strip()[len('multiple field') + 1:] datatype = ParameterTableMultipleField.DATA_TYPE_ANY found = False for p in self.parameters: if p.name == field: found = True break if found: param = ParameterTableMultipleField(name=name, description=descName, parent=field, datatype=datatype) elif token.lower().strip().startswith('string'): default = token.strip()[len('string') + 1:] if default: param = ParameterString(name, descName, default) else: param = ParameterString(name, descName) elif token.lower().strip().startswith('longstring'): default = token.strip()[len('longstring') + 1:] if default: param = ParameterString(name, descName, default, multiline=True) else: param = ParameterString(name, descName, multiline=True) elif token.lower().strip().startswith('crs'): default = token.strip()[len('crs') + 1:] if default: param = ParameterCrs(name, descName, default) else: param = ParameterCrs(name, descName) return param