Adapt more code to c++ API

This commit is contained in:
Nyall Dawson 2017-05-16 16:36:00 +10:00
parent ef59d0c454
commit 189f804714
41 changed files with 306 additions and 332 deletions

View File

@ -26,6 +26,8 @@ __copyright__ = '(C) 2016, Médéric Ribreux'
__revision__ = '$Format:%H$' __revision__ = '$Format:%H$'
from qgis.core import QgsProcessingParameterDefinition
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
from processing.core.parameters import ParameterRaster from processing.core.parameters import ParameterRaster
from processing.core.parameters import ParameterString from processing.core.parameters import ParameterString
@ -111,7 +113,7 @@ class gdal2tiles(GdalAlgorithm):
None, False, True)) None, False, True))
for param in params: for param in params:
param.isAdvanced = True param.setFlags(param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(param) self.addParameter(param)
self.addOutput(OutputDirectory(self.OUTPUTDIR, self.addOutput(OutputDirectory(self.OUTPUTDIR,

View File

@ -26,6 +26,8 @@ __copyright__ = '(C) 2016, Médéric Ribreux'
__revision__ = '$Format:%H$' __revision__ = '$Format:%H$'
from qgis.core import QgsProcessingParameterDefinition
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
from processing.core.parameters import ParameterString from processing.core.parameters import ParameterString
from processing.core.parameters import ParameterSelection from processing.core.parameters import ParameterSelection
@ -107,7 +109,7 @@ class retile(GdalAlgorithm):
None, False, True)) None, False, True))
for param in params: for param in params:
param.isAdvanced = True param.setFlags(param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(param) self.addParameter(param)
self.addOutput(OutputDirectory(self.TARGETDIR, self.addOutput(OutputDirectory(self.TARGETDIR,

View File

@ -37,7 +37,8 @@ from qgis.core import (QgsRasterLayer,
QgsApplication, QgsApplication,
QgsProcessingUtils, QgsProcessingUtils,
QgsMessageLog, QgsMessageLog,
QgsProcessingAlgorithm) QgsProcessingAlgorithm,
QgsProcessingParameterDefinition)
from qgis.utils import iface from qgis.utils import iface
from processing.core.GeoAlgorithm import GeoAlgorithm from processing.core.GeoAlgorithm import GeoAlgorithm
@ -183,7 +184,7 @@ class Grass7Algorithm(GeoAlgorithm):
vectorOutputs += 1 vectorOutputs += 1
if isinstance(output, OutputHTML): if isinstance(output, OutputHTML):
self.addOutput(OutputFile("rawoutput", self.addOutput(OutputFile("rawoutput",
self.tr("{0} (raw output)").format(output.description), self.tr("{0} (raw output)").format(output.description()),
"txt")) "txt"))
line = lines.readline().strip('\n').strip() line = lines.readline().strip('\n').strip()
except Exception as e: except Exception as e:
@ -203,17 +204,17 @@ class Grass7Algorithm(GeoAlgorithm):
param = ParameterNumber(self.GRASS_SNAP_TOLERANCE_PARAMETER, param = ParameterNumber(self.GRASS_SNAP_TOLERANCE_PARAMETER,
'v.in.ogr snap tolerance (-1 = no snap)', 'v.in.ogr snap tolerance (-1 = no snap)',
-1, None, -1.0) -1, None, -1.0)
param.isAdvanced = True param.setFlags(param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(param) self.addParameter(param)
param = ParameterNumber(self.GRASS_MIN_AREA_PARAMETER, param = ParameterNumber(self.GRASS_MIN_AREA_PARAMETER,
'v.in.ogr min area', 0, None, 0.0001) 'v.in.ogr min area', 0, None, 0.0001)
param.isAdvanced = True param.setFlags(param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(param) self.addParameter(param)
if vectorOutputs == 1: if vectorOutputs == 1:
param = ParameterSelection(self.GRASS_OUTPUT_TYPE_PARAMETER, param = ParameterSelection(self.GRASS_OUTPUT_TYPE_PARAMETER,
'v.out.ogr output type', 'v.out.ogr output type',
self.OUTPUT_TYPES) self.OUTPUT_TYPES)
param.isAdvanced = True param.setFlags(param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(param) self.addParameter(param)
def getDefaultCellsize(self): def getDefaultCellsize(self):
@ -395,7 +396,7 @@ class Grass7Algorithm(GeoAlgorithm):
command += ' ' + ' '.join(self.hardcodedStrings) command += ' ' + ' '.join(self.hardcodedStrings)
# Add algorithm command # Add algorithm command
for param in self.parameters: for param in self.parameterDefinitions():
if param.value is None or param.value == '': if param.value is None or param.value == '':
continue continue
if param.name in [self.GRASS_REGION_CELLSIZE_PARAMETER, self.GRASS_REGION_EXTENT_PARAMETER, self.GRASS_MIN_AREA_PARAMETER, self.GRASS_SNAP_TOLERANCE_PARAMETER, self.GRASS_OUTPUT_TYPE_PARAMETER, self.GRASS_REGION_ALIGN_TO_RESOLUTION]: if param.name in [self.GRASS_REGION_CELLSIZE_PARAMETER, self.GRASS_REGION_EXTENT_PARAMETER, self.GRASS_MIN_AREA_PARAMETER, self.GRASS_SNAP_TOLERANCE_PARAMETER, self.GRASS_OUTPUT_TYPE_PARAMETER, self.GRASS_REGION_ALIGN_TO_RESOLUTION]:
@ -403,28 +404,28 @@ class Grass7Algorithm(GeoAlgorithm):
if isinstance(param, (ParameterRaster, ParameterVector)): if isinstance(param, (ParameterRaster, ParameterVector)):
value = param.value value = param.value
if value in list(self.exportedLayers.keys()): if value in list(self.exportedLayers.keys()):
command += ' ' + param.name + '=' \ command += ' ' + param.name() + '=' \
+ self.exportedLayers[value] + self.exportedLayers[value]
else: else:
command += ' ' + param.name + '=' + value command += ' ' + param.name() + '=' + value
elif isinstance(param, ParameterMultipleInput): elif isinstance(param, ParameterMultipleInput):
s = param.value s = param.value
for layer in list(self.exportedLayers.keys()): for layer in list(self.exportedLayers.keys()):
s = s.replace(layer, self.exportedLayers[layer]) s = s.replace(layer, self.exportedLayers[layer])
s = s.replace(';', ',') s = s.replace(';', ',')
command += ' ' + param.name + '=' + s command += ' ' + param.name() + '=' + s
elif isinstance(param, ParameterBoolean): elif isinstance(param, ParameterBoolean):
if param.value: if param.value:
command += ' ' + param.name command += ' ' + param.name()
elif isinstance(param, ParameterSelection): elif isinstance(param, ParameterSelection):
idx = int(param.value) idx = int(param.value)
command += ' ' + param.name + '=' + str(param.options[idx][1]) command += ' ' + param.name() + '=' + str(param.options[idx][1])
elif isinstance(param, ParameterString): elif isinstance(param, ParameterString):
command += ' ' + param.name + '="' + str(param.value) + '"' command += ' ' + param.name() + '="' + str(param.value) + '"'
elif isinstance(param, ParameterPoint): elif isinstance(param, ParameterPoint):
command += ' ' + param.name + '=' + str(param.value) command += ' ' + param.name() + '=' + str(param.value)
else: else:
command += ' ' + param.name + '="' + str(param.value) + '"' command += ' ' + param.name() + '="' + str(param.value) + '"'
for out in self.outputs: for out in self.outputs:
if isinstance(out, OutputFile): if isinstance(out, OutputFile):

View File

@ -81,7 +81,7 @@ def processCommand(alg, parameters):
for param in paramsToDelete: for param in paramsToDelete:
alg.parameters.remove(param) alg.parameters.remove(param)
alg.processCommand() alg.processCommand(parameters, context)
# Bring back the parameters: # Bring back the parameters:
for param in paramsToDelete: for param in paramsToDelete:

View File

@ -31,7 +31,8 @@ from qgis.PyQt.QtGui import QIcon
from qgis.core import (QgsFeatureRequest, from qgis.core import (QgsFeatureRequest,
QgsMessageLog, QgsMessageLog,
QgsProcessingUtils) QgsProcessingUtils,
QgsProcessingParameterDefinition)
from qgis.analysis import QgsKernelDensityEstimation from qgis.analysis import QgsKernelDensityEstimation
from processing.algs.qgis import QgisAlgorithm from processing.algs.qgis import QgisAlgorithm
@ -88,7 +89,7 @@ class Heatmap(QgisAlgorithm):
radius_field_param = ParameterTableField(self.RADIUS_FIELD, radius_field_param = ParameterTableField(self.RADIUS_FIELD,
self.tr('Radius from field'), self.INPUT_LAYER, optional=True, datatype=ParameterTableField.DATA_TYPE_NUMBER) self.tr('Radius from field'), self.INPUT_LAYER, optional=True, datatype=ParameterTableField.DATA_TYPE_NUMBER)
radius_field_param.isAdvanced = True radius_field_param.setFlags(radius_field_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(radius_field_param) self.addParameter(radius_field_param)
class ParameterHeatmapPixelSize(ParameterNumber): class ParameterHeatmapPixelSize(ParameterNumber):
@ -108,20 +109,20 @@ class Heatmap(QgisAlgorithm):
weight_field_param = ParameterTableField(self.WEIGHT_FIELD, weight_field_param = ParameterTableField(self.WEIGHT_FIELD,
self.tr('Weight from field'), self.INPUT_LAYER, optional=True, datatype=ParameterTableField.DATA_TYPE_NUMBER) self.tr('Weight from field'), self.INPUT_LAYER, optional=True, datatype=ParameterTableField.DATA_TYPE_NUMBER)
weight_field_param.isAdvanced = True weight_field_param.setFlags(weight_field_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(weight_field_param) self.addParameter(weight_field_param)
kernel_shape_param = ParameterSelection(self.KERNEL, kernel_shape_param = ParameterSelection(self.KERNEL,
self.tr('Kernel shape'), self.KERNELS) self.tr('Kernel shape'), self.KERNELS)
kernel_shape_param.isAdvanced = True kernel_shape_param.setFlags(kernel_shape_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(kernel_shape_param) self.addParameter(kernel_shape_param)
decay_ratio = ParameterNumber(self.DECAY, decay_ratio = ParameterNumber(self.DECAY,
self.tr('Decay ratio (Triangular kernels only)'), self.tr('Decay ratio (Triangular kernels only)'),
-100.0, 100.0, 0.0) -100.0, 100.0, 0.0)
decay_ratio.isAdvanced = True decay_ratio.setFlags(decay_ratio.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(decay_ratio) self.addParameter(decay_ratio)
output_scaling = ParameterSelection(self.OUTPUT_VALUE, output_scaling = ParameterSelection(self.OUTPUT_VALUE,
self.tr('Output value scaling'), self.OUTPUT_VALUES) self.tr('Output value scaling'), self.OUTPUT_VALUES)
output_scaling.isAdvanced = True output_scaling.setFlags(output_scaling.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(output_scaling) self.addParameter(output_scaling)
self.addOutput(OutputRaster(self.OUTPUT_LAYER, self.addOutput(OutputRaster(self.OUTPUT_LAYER,
self.tr('Heatmap'))) self.tr('Heatmap')))

View File

@ -30,7 +30,8 @@ import os
from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtGui import QIcon
from qgis.core import (QgsRectangle, from qgis.core import (QgsRectangle,
QgsProcessingUtils) QgsProcessingUtils,
QgsProcessingParameterDefinition)
from qgis.analysis import (QgsInterpolator, from qgis.analysis import (QgsInterpolator,
QgsIDWInterpolator, QgsIDWInterpolator,
QgsGridFileWriter QgsGridFileWriter
@ -78,13 +79,13 @@ class IdwInterpolation(QgisAlgorithm):
def setValue(self, value): def setValue(self, value):
if value is None: if value is None:
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
if value == '': if value == '':
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
if isinstance(value, str): if isinstance(value, str):

View File

@ -26,7 +26,8 @@ __copyright__ = '(C) 2016, Nyall Dawson'
__revision__ = '$Format:%H$' __revision__ = '$Format:%H$'
from qgis.core import (QgsApplication, from qgis.core import (QgsApplication,
QgsProcessingUtils) QgsProcessingUtils,
QgsProcessingParameterDefinition)
from processing.algs.qgis import QgisAlgorithm from processing.algs.qgis import QgisAlgorithm
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
from processing.core.parameters import ParameterVector, ParameterNumber from processing.core.parameters import ParameterVector, ParameterNumber
@ -66,7 +67,7 @@ class Orthogonalize(QgisAlgorithm):
max_iterations = ParameterNumber(self.MAX_ITERATIONS, max_iterations = ParameterNumber(self.MAX_ITERATIONS,
self.tr('Maximum algorithm iterations'), self.tr('Maximum algorithm iterations'),
1, 10000, 1000) 1, 10000, 1000)
max_iterations.isAdvanced = True max_iterations.setFlags(max_iterations.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(max_iterations) self.addParameter(max_iterations)
self.addOutput(OutputVector(self.OUTPUT_LAYER, self.tr('Orthogonalized'))) self.addOutput(OutputVector(self.OUTPUT_LAYER, self.tr('Orthogonalized')))

View File

@ -74,7 +74,7 @@ class RasterCalculator(QgisAlgorithm):
param = i.param param = i.param
if isinstance(param, ParameterRaster): if isinstance(param, ParameterRaster):
new = "{}@".format(os.path.basename(param.value)) new = "{}@".format(os.path.basename(param.value))
old = "{}@".format(param.name) old = "{}@".format(param.name())
value = value.replace(old, new) value = value.replace(old, new)
for alg in list(model.algs.values()): for alg in list(model.algs.values()):
@ -164,7 +164,7 @@ class RasterCalculator(QgisAlgorithm):
for i in list(model.inputs.values()): for i in list(model.inputs.values()):
param = i.param param = i.param
if isinstance(param, ParameterRaster) and "{}@".format(param.name) in expression: if isinstance(param, ParameterRaster) and "{}@".format(param.name) in expression:
values.append(ValueFromInput(param.name)) values.append(ValueFromInput(param.name()))
if algorithm.name: if algorithm.name:
dependent = model.getDependentAlgorithms(algorithm.name) dependent = model.getDependentAlgorithms(algorithm.name)

View File

@ -30,7 +30,7 @@ import os
from qgis.PyQt.QtGui import QIcon, QColor from qgis.PyQt.QtGui import QIcon, QColor
from qgis.analysis import QgsRelief from qgis.analysis import QgsRelief
from qgis.core import QgsProcessingParameterDefinition
from processing.algs.qgis import QgisAlgorithm from processing.algs.qgis import QgisAlgorithm
from processing.core.parameters import (Parameter, from processing.core.parameters import (Parameter,
ParameterRaster, ParameterRaster,
@ -74,13 +74,13 @@ class Relief(QgisAlgorithm):
def setValue(self, value): def setValue(self, value):
if value is None: if value is None:
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
if value == '': if value == '':
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
if isinstance(value, str): if isinstance(value, str):

View File

@ -31,7 +31,15 @@ from collections import OrderedDict
from qgis.PyQt.QtCore import QVariant from qgis.PyQt.QtCore import QVariant
from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtGui import QIcon
from qgis.core import QgsWkbTypes, QgsUnitTypes, QgsFeature, QgsGeometry, QgsField, QgsFields, QgsFeatureRequest, QgsProcessingUtils from qgis.core import (QgsWkbTypes,
QgsUnitTypes,
QgsFeature,
QgsGeometry,
QgsField,
QgsFields,
QgsFeatureRequest,
QgsProcessingUtils,
QgsProcessingParameterDefinition)
from qgis.analysis import (QgsVectorLayerDirector, from qgis.analysis import (QgsVectorLayerDirector,
QgsNetworkDistanceStrategy, QgsNetworkDistanceStrategy,
QgsNetworkSpeedStrategy, QgsNetworkSpeedStrategy,
@ -134,7 +142,7 @@ class ServiceAreaFromLayer(QgisAlgorithm):
0.0, 99999999.999999, 0.0)) 0.0, 99999999.999999, 0.0))
for p in params: for p in params:
p.isAdvanced = True p.setFlags(p.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(p) self.addParameter(p)
self.addOutput(OutputVector(self.OUTPUT_POINTS, self.addOutput(OutputVector(self.OUTPUT_POINTS,

View File

@ -38,6 +38,7 @@ from qgis.core import (QgsWkbTypes,
QgsPointXY, QgsPointXY,
QgsField, QgsField,
QgsFields, QgsFields,
QgsProcessingParameterDefinition,
QgsProcessingUtils) QgsProcessingUtils)
from qgis.analysis import (QgsVectorLayerDirector, from qgis.analysis import (QgsVectorLayerDirector,
QgsNetworkDistanceStrategy, QgsNetworkDistanceStrategy,
@ -141,7 +142,7 @@ class ServiceAreaFromPoint(QgisAlgorithm):
0.0, 99999999.999999, 0.0)) 0.0, 99999999.999999, 0.0))
for p in params: for p in params:
p.isAdvanced = True p.setFlags(p.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(p) self.addParameter(p)
self.addOutput(OutputVector(self.OUTPUT_POINTS, self.addOutput(OutputVector(self.OUTPUT_POINTS,

View File

@ -40,6 +40,7 @@ from qgis.core import (QgsWkbTypes,
QgsField, QgsField,
QgsFeatureRequest, QgsFeatureRequest,
QgsMessageLog, QgsMessageLog,
QgsProcessingParameterDefinition,
QgsProcessingUtils) QgsProcessingUtils)
from qgis.analysis import (QgsVectorLayerDirector, from qgis.analysis import (QgsVectorLayerDirector,
QgsNetworkDistanceStrategy, QgsNetworkDistanceStrategy,
@ -142,7 +143,7 @@ class ShortestPathLayerToPoint(QgisAlgorithm):
0.0, 99999999.999999, 0.0)) 0.0, 99999999.999999, 0.0))
for p in params: for p in params:
p.isAdvanced = True p.setFlags(p.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(p) self.addParameter(p)
self.addOutput(OutputVector(self.OUTPUT_LAYER, self.addOutput(OutputVector(self.OUTPUT_LAYER,

View File

@ -33,6 +33,7 @@ from qgis.PyQt.QtGui import QIcon
from qgis.core import (QgsWkbTypes, QgsUnitTypes, QgsFeature, QgsGeometry, QgsPointXY, QgsFields, QgsField, QgsFeatureRequest, from qgis.core import (QgsWkbTypes, QgsUnitTypes, QgsFeature, QgsGeometry, QgsPointXY, QgsFields, QgsField, QgsFeatureRequest,
QgsMessageLog, QgsMessageLog,
QgsProcessingParameterDefinition,
QgsProcessingUtils) QgsProcessingUtils)
from qgis.analysis import (QgsVectorLayerDirector, from qgis.analysis import (QgsVectorLayerDirector,
QgsNetworkDistanceStrategy, QgsNetworkDistanceStrategy,
@ -135,7 +136,7 @@ class ShortestPathPointToLayer(QgisAlgorithm):
0.0, 99999999.999999, 0.0)) 0.0, 99999999.999999, 0.0))
for p in params: for p in params:
p.isAdvanced = True p.setFlags(p.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(p) self.addParameter(p)
self.addOutput(OutputVector(self.OUTPUT_LAYER, self.addOutput(OutputVector(self.OUTPUT_LAYER,

View File

@ -38,6 +38,7 @@ from qgis.core import (QgsWkbTypes,
QgsPointXY, QgsPointXY,
QgsFields, QgsFields,
QgsField, QgsField,
QgsProcessingParameterDefinition,
QgsProcessingUtils) QgsProcessingUtils)
from qgis.analysis import (QgsVectorLayerDirector, from qgis.analysis import (QgsVectorLayerDirector,
QgsNetworkDistanceStrategy, QgsNetworkDistanceStrategy,
@ -143,7 +144,7 @@ class ShortestPathPointToPoint(QgisAlgorithm):
0.0, 99999999.999999, 0.0)) 0.0, 99999999.999999, 0.0))
for p in params: for p in params:
p.isAdvanced = True p.setFlags(p.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(p) self.addParameter(p)
self.addOutput(OutputNumber(self.TRAVEL_COST, self.addOutput(OutputNumber(self.TRAVEL_COST,

View File

@ -30,7 +30,8 @@ import os
from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtGui import QIcon
from qgis.core import (QgsRectangle, from qgis.core import (QgsRectangle,
QgsProcessingUtils) QgsProcessingUtils,
QgsProcessingParameterDefinition)
from qgis.analysis import (QgsInterpolator, from qgis.analysis import (QgsInterpolator,
QgsTINInterpolator, QgsTINInterpolator,
QgsGridFileWriter QgsGridFileWriter
@ -86,13 +87,13 @@ class TinInterpolation(QgisAlgorithm):
def setValue(self, value): def setValue(self, value):
if value is None: if value is None:
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
if value == '': if value == '':
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
if isinstance(value, str): if isinstance(value, str):

View File

@ -1,4 +1,5 @@
from qgis.core import (QgsProcessingUtils, from qgis.core import (QgsProcessingUtils,
QgsProcessingParameterDefinition,
QgsProject) QgsProject)
from processing.gui.wrappers import WidgetWrapper, DIALOG_STANDARD, DIALOG_BATCH from processing.gui.wrappers import WidgetWrapper, DIALOG_STANDARD, DIALOG_BATCH
from processing.tools import dataobjects from processing.tools import dataobjects
@ -242,6 +243,6 @@ class LayersListWidgetWrapper(WidgetWrapper):
else: else:
options = self._getOptions() options = self._getOptions()
values = [options[i] for i in self.widget.selectedoptions] values = [options[i] for i in self.widget.selectedoptions]
if len(values) == 0 and not self.param.optional: if len(values) == 0 and not self.param.flags() & QgsProcessingParameterDefinition.FlagOptional:
raise InvalidParameterValue() raise InvalidParameterValue()
return values return values

View File

@ -214,20 +214,20 @@ class SagaAlgorithm(GeoAlgorithm):
if isinstance(param, (ParameterRaster, ParameterVector, ParameterTable)): if isinstance(param, (ParameterRaster, ParameterVector, ParameterTable)):
value = param.value value = param.value
if value in list(self.exportedLayers.keys()): if value in list(self.exportedLayers.keys()):
command += ' -' + param.name + ' "' \ command += ' -' + param.name() + ' "' \
+ self.exportedLayers[value] + '"' + self.exportedLayers[value] + '"'
else: else:
command += ' -' + param.name + ' "' + value + '"' command += ' -' + param.name() + ' "' + value + '"'
elif isinstance(param, ParameterMultipleInput): elif isinstance(param, ParameterMultipleInput):
s = param.value s = param.value
for layer in list(self.exportedLayers.keys()): for layer in list(self.exportedLayers.keys()):
s = s.replace(layer, self.exportedLayers[layer]) s = s.replace(layer, self.exportedLayers[layer])
command += ' -' + param.name + ' "' + s + '"' command += ' -' + param.name() + ' "' + s + '"'
elif isinstance(param, ParameterBoolean): elif isinstance(param, ParameterBoolean):
if param.value: if param.value:
command += ' -' + param.name.strip() + " true" command += ' -' + param.name().strip() + " true"
else: else:
command += ' -' + param.name.strip() + " false" command += ' -' + param.name().strip() + " false"
elif isinstance(param, ParameterFixedTable): elif isinstance(param, ParameterFixedTable):
tempTableFile = getTempFilename('txt') tempTableFile = getTempFilename('txt')
with open(tempTableFile, 'w') as f: with open(tempTableFile, 'w') as f:
@ -236,7 +236,7 @@ class SagaAlgorithm(GeoAlgorithm):
for i in range(0, len(values), 3): for i in range(0, len(values), 3):
s = values[i] + '\t' + values[i + 1] + '\t' + values[i + 2] + '\n' s = values[i] + '\t' + values[i + 1] + '\t' + values[i + 2] + '\n'
f.write(s) f.write(s)
command += ' -' + param.name + ' "' + tempTableFile + '"' command += ' -' + param.name() + ' "' + tempTableFile + '"'
elif isinstance(param, ParameterExtent): elif isinstance(param, ParameterExtent):
# 'We have to substract/add half cell size, since SAGA is # 'We have to substract/add half cell size, since SAGA is
# center based, not corner based # center based, not corner based
@ -247,9 +247,9 @@ class SagaAlgorithm(GeoAlgorithm):
command += ' -' + self.extentParamNames[i] + ' ' \ command += ' -' + self.extentParamNames[i] + ' ' \
+ str(float(values[i]) + offset[i]) + str(float(values[i]) + offset[i])
elif isinstance(param, (ParameterNumber, ParameterSelection)): elif isinstance(param, (ParameterNumber, ParameterSelection)):
command += ' -' + param.name + ' ' + str(param.value) command += ' -' + param.name() + ' ' + str(param.value)
else: else:
command += ' -' + param.name + ' "' + str(param.value) + '"' command += ' -' + param.name() + ' "' + str(param.value) + '"'
for out in self.outputs: for out in self.outputs:
command += ' -' + out.name + ' "' + out.getCompatibleFileName(self) + '"' command += ' -' + out.name + ' "' + out.getCompatibleFileName(self) + '"'

View File

@ -37,6 +37,7 @@ from qgis.core import (QgsProcessingFeedback,
QgsProcessingAlgorithm, QgsProcessingAlgorithm,
QgsProject, QgsProject,
QgsProcessingUtils, QgsProcessingUtils,
QgsProcessingParameterDefinition,
QgsMessageLog) QgsMessageLog)
from builtins import str from builtins import str
@ -350,7 +351,7 @@ class GeoAlgorithm(QgsProcessingAlgorithm):
for param in self.parameters: for param in self.parameters:
s += '\t' + str(param) + '\n' s += '\t' + str(param) + '\n'
for out in self.outputs: for out in self.outputs:
if not out.hidden: if not out.flags() & QgsProcessingParameterDefinition.FlagHidden:
s += '\t' + str(out) + '\n' s += '\t' + str(out) + '\n'
s += '\n' s += '\n'
return s return s
@ -394,7 +395,7 @@ class GeoAlgorithm(QgsProcessingAlgorithm):
for param in self.parameters: for param in self.parameters:
s += param.getValueAsCommandLineParameter() + ',' s += param.getValueAsCommandLineParameter() + ','
for out in self.outputs: for out in self.outputs:
if not out.hidden: if not out.flags() & QgsProcessingParameterDefinition.FlagHidden:
s += out.getValueAsCommandLineParameter() + ',' s += out.getValueAsCommandLineParameter() + ','
s = s[:-1] + ')' s = s[:-1] + ')'
return s return s

View File

@ -189,7 +189,7 @@ class Processing(object):
i = i + 1 i = i + 1
for output in alg.outputs: for output in alg.outputs:
if not output.hidden: if not output.flags() & QgsProcessingParameterDefinition.FlagHidden:
if not output.setValue(args[i]): if not output.setValue(args[i]):
# fix_print_with_import # fix_print_with_import
print('Error: Wrong output value: ' + str(args[i])) print('Error: Wrong output value: ' + str(args[i]))

View File

@ -45,7 +45,8 @@ from qgis.core import (QgsExpressionContext,
QgsProject, QgsProject,
QgsSettings, QgsSettings,
QgsVectorFileWriter, QgsVectorFileWriter,
QgsProcessingUtils) QgsProcessingUtils,
QgsProcessingParameterDefinition)
def _expressionContext(alg): def _expressionContext(alg):
@ -63,21 +64,12 @@ class Output(object):
def __init__(self, name='', description='', hidden=False): def __init__(self, name='', description='', hidden=False):
self.name = name self.name = name
self.description = description
# The value of an output is a string representing the location # The value of an output is a string representing the location
# of the output. For a file based output, it should be the # of the output. For a file based output, it should be the
# filepath to it. # filepath to it.
self.value = None self.value = None
# A hidden output will not be shown to the user, who will not
# be able to select where to store it. Use this to generate
# outputs that are modified version of inputs (like a selection
# in a vector layer). In the case of layers, hidden outputs are
# not loaded into QGIS after the algorithm is executed. Other
# outputs not representing layers or tables should always be hidden.
self.hidden = str(hidden).lower() == str(True).lower()
def __str__(self): def __str__(self):
return u'{} <{}>'.format(self.name, self.__class__.__name__) return u'{} <{}>'.format(self.name, self.__class__.__name__)
@ -107,7 +99,7 @@ class Output(object):
return [] return []
def resolveValue(self, alg): def resolveValue(self, alg):
if self.hidden: if self.flags() & QgsProcessingParameterDefinition.FlagHidden:
return return
if not bool(self.value): if not bool(self.value):
self.value = self._resolveTemporary(alg) self.value = self._resolveTemporary(alg)
@ -135,9 +127,6 @@ class Output(object):
def expressionContext(self, alg): def expressionContext(self, alg):
return _expressionContext(alg) return _expressionContext(alg)
def typeName(self):
return self.__class__.__name__.replace('Output', '').lower()
def tr(self, string, context=''): def tr(self, string, context=''):
if context == '': if context == '':
context = 'Output' context = 'Output'
@ -154,9 +143,8 @@ class OutputExtent(Output):
def __init__(self, name='', description=''): def __init__(self, name='', description=''):
self.name = name self.name = name
self.description = description
self.value = None self.value = None
self.hidden = True self.setFlags(self.flags() | QgsProcessingParameterDefinition.FlagHidden)
def setValue(self, value): def setValue(self, value):
try: try:

View File

@ -42,7 +42,8 @@ from qgis.PyQt.QtCore import QCoreApplication
from qgis.core import (QgsRasterLayer, QgsVectorLayer, QgsMapLayer, QgsCoordinateReferenceSystem, from qgis.core import (QgsRasterLayer, QgsVectorLayer, QgsMapLayer, QgsCoordinateReferenceSystem,
QgsExpressionContext, QgsExpressionContextUtils, QgsExpression, QgsExpressionContextScope, QgsExpressionContext, QgsExpressionContextUtils, QgsExpression, QgsExpressionContextScope,
QgsProject, QgsProject,
QgsVectorFileWriter) QgsVectorFileWriter,
QgsProcessingParameterDefinition)
from processing.tools.vector import resolveFieldIndex from processing.tools.vector import resolveFieldIndex
from processing.tools import dataobjects from processing.tools import dataobjects
@ -108,27 +109,10 @@ class Parameter(object):
take as input. take as input.
""" """
default_metadata = {}
def __init__(self, name='', description='', default=None, optional=False, def __init__(self, name='', description='', default=None, optional=False,
metadata={}): metadata={}):
self.name = name
self.description = description
self.default = default
self.value = default self.value = default
self.isAdvanced = False
# A hidden parameter can be used to set a hard-coded value.
# It can be used as any other parameter, but it will not be
# shown to the user
self.hidden = False
self.optional = parseBool(optional)
self.metadata = deepcopy(self.default_metadata)
self.metadata.update(deepcopy(metadata))
def setValue(self, obj): def setValue(self, obj):
""" """
Sets the value of the parameter. Sets the value of the parameter.
@ -137,7 +121,7 @@ class Parameter(object):
of parameter. of parameter.
""" """
if obj is None: if obj is None:
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
@ -145,17 +129,8 @@ class Parameter(object):
self.value = str(obj) self.value = str(obj)
return True return True
def setDefaultValue(self):
"""
Sets the value of the parameter to the default one
Returns true if the default value is correct for the type
of parameter.
"""
return self.setValue(self.default)
def __str__(self): def __str__(self):
return u'{} <{}>'.format(self.name, self.__class__.__name__) return u'{} <{}>'.format(self.name(), self.__class__.__name__)
def getValueAsCommandLineParameter(self): def getValueAsCommandLineParameter(self):
""" """
@ -165,9 +140,6 @@ class Parameter(object):
""" """
return str(self.value) return str(self.value)
def typeName(self):
return self.__class__.__name__.replace('Parameter', '').lower()
def todict(self): def todict(self):
o = deepcopy(self.__dict__) o = deepcopy(self.__dict__)
del o['metadata'] del o['metadata']
@ -178,24 +150,6 @@ class Parameter(object):
context = 'Parameter' context = 'Parameter'
return QCoreApplication.translate(context, string) return QCoreApplication.translate(context, string)
def wrapper(self, dialog, row=0, col=0):
wrapper = self.metadata.get('widget_wrapper', None)
params = {}
# wrapper metadata should be a dict with class key
if isinstance(wrapper, dict):
params = deepcopy(wrapper)
wrapper = params.pop('class')
# wrapper metadata should be a class path
if isinstance(wrapper, str):
tokens = wrapper.split('.')
mod = __import__('.'.join(tokens[:-1]), fromlist=[tokens[-1]])
wrapper = getattr(mod, tokens[-1])
# or directly a class object
if isclass(wrapper):
wrapper = wrapper(self, dialog, row, col, **params)
# or a wrapper instance
return wrapper
def evaluate(self, alg): def evaluate(self, alg):
pass pass
@ -214,7 +168,7 @@ class ParameterBoolean(Parameter):
def setValue(self, value): def setValue(self, value):
if value is None: if value is None:
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
@ -227,10 +181,10 @@ class ParameterBoolean(Parameter):
def getAsScriptCode(self): def getAsScriptCode(self):
param_type = '' param_type = ''
if self.optional: if self.flags() & QgsProcessingParameterDefinition.FlagOptional:
param_type += 'optional ' param_type += 'optional '
param_type += 'boolean ' param_type += 'boolean '
return '##' + self.name + '=' + param_type + str(self.default) return '##' + self.name() + '=' + param_type + str(self.defaultValue())
@classmethod @classmethod
def fromScriptCode(self, line): def fromScriptCode(self, line):
@ -245,6 +199,7 @@ class ParameterBoolean(Parameter):
else: else:
param = ParameterBoolean(name, descName) param = ParameterBoolean(name, descName)
param.optional = isOptional param.optional = isOptional
param.setFlags(param.flags() | QgsProcessingParameterDefinition.FlagOptional)
return param return param
@ -266,7 +221,7 @@ class ParameterCrs(Parameter):
def setValue(self, value): def setValue(self, value):
context = dataobjects.createContext() context = dataobjects.createContext()
if not bool(value): if not bool(value):
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
@ -297,10 +252,10 @@ class ParameterCrs(Parameter):
def getAsScriptCode(self): def getAsScriptCode(self):
param_type = '' param_type = ''
if self.optional: if self.flags() & QgsProcessingParameterDefinition.FlagOptional:
param_type += 'optional ' param_type += 'optional '
param_type += 'crs ' param_type += 'crs '
return '##' + self.name + '=' + param_type + str(self.default) return '##' + self.name() + '=' + param_type + str(self.defaultValue())
@classmethod @classmethod
def fromScriptCode(self, line): def fromScriptCode(self, line):
@ -346,7 +301,7 @@ class ParameterExtent(Parameter):
def setValue(self, value): def setValue(self, value):
context = dataobjects.createContext() context = dataobjects.createContext()
if not value: if not value:
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
@ -388,10 +343,10 @@ class ParameterExtent(Parameter):
def getAsScriptCode(self): def getAsScriptCode(self):
param_type = '' param_type = ''
if self.optional: if self.flags() & QgsProcessingParameterDefinition.FlagOptional:
param_type += 'optional ' param_type += 'optional '
param_type += 'extent' param_type += 'extent'
return '##' + self.name + '=' + param_type return '##' + self.name() + '=' + param_type
@classmethod @classmethod
def fromScriptCode(self, line): def fromScriptCode(self, line):
@ -402,7 +357,7 @@ class ParameterExtent(Parameter):
return ParameterExtent(name, descName, default, isOptional) return ParameterExtent(name, descName, default, isOptional)
def evaluate(self, alg): def evaluate(self, alg):
if self.optional and not bool(self.value): if self.flags() & QgsProcessingParameterDefinition.FlagOptional and not bool(self.value):
self.value = self.getMinCoveringExtent(alg) self.value = self.getMinCoveringExtent(alg)
def getMinCoveringExtent(self, alg): def getMinCoveringExtent(self, alg):
@ -460,7 +415,7 @@ class ParameterPoint(Parameter):
def setValue(self, text): def setValue(self, text):
if text is None: if text is None:
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
@ -481,10 +436,10 @@ class ParameterPoint(Parameter):
def getAsScriptCode(self): def getAsScriptCode(self):
param_type = '' param_type = ''
if self.optional: if self.flags() & QgsProcessingParameterDefinition.FlagOptional:
param_type += 'optional ' param_type += 'optional '
param_type += 'point' param_type += 'point'
return '##' + self.name + '=' + param_type return '##' + self.name() + '=' + param_type
@classmethod @classmethod
def fromScriptCode(self, line): def fromScriptCode(self, line):
@ -511,7 +466,7 @@ class ParameterFile(Parameter):
def setValue(self, obj): def setValue(self, obj):
if obj is None or obj.strip() == '': if obj is None or obj.strip() == '':
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None if obj is None else obj.strip() self.value = None if obj is None else obj.strip()
return True return True
@ -521,21 +476,15 @@ class ParameterFile(Parameter):
self.value = str(obj) self.value = str(obj)
return True return True
def typeName(self):
if self.isFolder:
return 'directory'
else:
return 'file'
def getAsScriptCode(self): def getAsScriptCode(self):
param_type = '' param_type = ''
if self.optional: if self.flags() & QgsProcessingParameterDefinition.FlagOptional:
param_type += 'optional ' param_type += 'optional '
if self.isFolder: if self.isFolder:
param_type += 'folder' param_type += 'folder'
else: else:
param_type += 'file' param_type += 'file'
return '##' + self.name + '=' + param_type return '##' + self.name() + '=' + param_type
@classmethod @classmethod
def fromScriptCode(self, line): def fromScriptCode(self, line):
@ -558,7 +507,7 @@ class ParameterFixedTable(Parameter):
def setValue(self, obj): def setValue(self, obj):
if obj is None: if obj is None:
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
@ -584,10 +533,10 @@ class ParameterFixedTable(Parameter):
def getAsScriptCode(self): def getAsScriptCode(self):
param_type = '' param_type = ''
if self.optional: if self.flags() & QgsProcessingParameterDefinition.FlagOptional:
param_type += 'optional ' param_type += 'optional '
param_type += 'fixedtable' param_type += 'fixedtable'
return '##' + self.name + '=' + param_type return '##' + self.name() + '=' + param_type
@classmethod @classmethod
def fromScriptCode(self, line): def fromScriptCode(self, line):
@ -632,7 +581,7 @@ class ParameterMultipleInput(ParameterDataObject):
self.minNumInputs = 0 self.minNumInputs = 0
return True return True
if _minNumInputs < 1 and not self.optional: if _minNumInputs < 1 and not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
# don't allow to set negative or null number of inputs if parameter isn't optional # don't allow to set negative or null number of inputs if parameter isn't optional
return False return False
@ -651,14 +600,14 @@ class ParameterMultipleInput(ParameterDataObject):
def setValue(self, obj): def setValue(self, obj):
self.exported = None self.exported = None
if obj is None: if obj is None:
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
if isinstance(obj, list): if isinstance(obj, list):
if len(obj) == 0: if len(obj) == 0:
if self.optional: if self.flags() & QgsProcessingParameterDefinition.FlagOptional:
self.value = None self.value = None
return True return True
else: else:
@ -779,7 +728,7 @@ class ParameterMultipleInput(ParameterDataObject):
def getAsScriptCode(self): def getAsScriptCode(self):
param_type = '' param_type = ''
if self.optional: if self.flags() & QgsProcessingParameterDefinition.FlagOptional:
param_type += 'optional ' param_type += 'optional '
if self.datatype == dataobjects.TYPE_RASTER: if self.datatype == dataobjects.TYPE_RASTER:
param_type += 'multiple raster' param_type += 'multiple raster'
@ -787,7 +736,7 @@ class ParameterMultipleInput(ParameterDataObject):
param_type += 'multiple file' param_type += 'multiple file'
else: else:
param_type += 'multiple vector' param_type += 'multiple vector'
return '##' + self.name + '=' + param_type return '##' + self.name() + '=' + param_type
@classmethod @classmethod
def fromScriptCode(self, line): def fromScriptCode(self, line):
@ -836,7 +785,7 @@ class ParameterNumber(Parameter):
def setValue(self, n): def setValue(self, n):
if n is None: if n is None:
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
@ -870,10 +819,10 @@ class ParameterNumber(Parameter):
def getAsScriptCode(self): def getAsScriptCode(self):
param_type = '' param_type = ''
if self.optional: if self.flags() & QgsProcessingParameterDefinition.FlagOptional:
param_type += 'optional ' param_type += 'optional '
param_type += 'number' param_type += 'number'
code = '##' + self.name + '=' + param_type code = '##' + self.name() + '=' + param_type
if self.default: if self.default:
code += str(self.default) code += str(self.default)
return code return code
@ -929,7 +878,7 @@ class ParameterNumber(Parameter):
variables = {} variables = {}
for param in model.parameters: for param in model.parameters:
if isinstance(param, ParameterNumber): if isinstance(param, ParameterNumber):
variables["@" + param.name] = param.value variables["@" + param.name()] = param.value
if isinstance(param, (ParameterRaster, ParameterVector)): if isinstance(param, (ParameterRaster, ParameterVector)):
variables.update(self._layerVariables(param)) variables.update(self._layerVariables(param))
@ -973,7 +922,7 @@ class ParameterRange(Parameter):
def setValue(self, text): def setValue(self, text):
if text is None: if text is None:
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
@ -1036,7 +985,7 @@ class ParameterRaster(ParameterDataObject):
def setValue(self, obj): def setValue(self, obj):
self.exported = None self.exported = None
if obj is None: if obj is None:
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
@ -1056,10 +1005,10 @@ class ParameterRaster(ParameterDataObject):
def getAsScriptCode(self): def getAsScriptCode(self):
param_type = '' param_type = ''
if self.optional: if self.flags() & QgsProcessingParameterDefinition.FlagOptional:
param_type += 'optional ' param_type += 'optional '
param_type += 'raster' param_type += 'raster'
return '##' + self.name + '=' + param_type return '##' + self.name() + '=' + param_type
@classmethod @classmethod
def fromScriptCode(self, line): def fromScriptCode(self, line):
@ -1107,11 +1056,11 @@ class ParameterSelection(Parameter):
self.value = None self.value = None
if default is not None: if default is not None:
self.setValue(self.default) self.setValue(self.defaultValue())
def setValue(self, value): def setValue(self, value):
if value is None: if value is None:
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
@ -1131,7 +1080,7 @@ class ParameterSelection(Parameter):
if v not in self.values: if v not in self.values:
return False return False
values.append(v) values.append(v)
if not self.optional and len(values) == 0: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional and len(values) == 0:
return False return False
self.value = values self.value = values
return True return True
@ -1191,7 +1140,7 @@ class ParameterString(Parameter):
def setValue(self, obj): def setValue(self, obj):
if not bool(obj): if not bool(obj):
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
@ -1209,10 +1158,10 @@ class ParameterString(Parameter):
def getAsScriptCode(self): def getAsScriptCode(self):
param_type = '' param_type = ''
if self.optional: if self.flags() & QgsProcessingParameterDefinition.FlagOptional:
param_type += 'optional ' param_type += 'optional '
param_type += 'string ' param_type += 'string '
return '##' + self.name + '=' + param_type + repr(self.default) return '##' + self.name() + '=' + param_type + repr(self.defaultValue())
@classmethod @classmethod
def fromScriptCode(self, line): def fromScriptCode(self, line):
@ -1264,7 +1213,7 @@ class ParameterExpression(Parameter):
def setValue(self, obj): def setValue(self, obj):
if not bool(obj): if not bool(obj):
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
@ -1282,10 +1231,10 @@ class ParameterExpression(Parameter):
def getAsScriptCode(self): def getAsScriptCode(self):
param_type = '' param_type = ''
if self.optional: if self.flags() & QgsProcessingParameterDefinition.FlagOptional:
param_type += 'optional ' param_type += 'optional '
param_type += 'expression ' param_type += 'expression '
return '##' + self.name + '=' + param_type + str(self.default) return '##' + self.name() + '=' + param_type + str(self.defaultValue())
@classmethod @classmethod
def fromScriptCode(self, line): def fromScriptCode(self, line):
@ -1314,7 +1263,7 @@ class ParameterTable(ParameterDataObject):
def setValue(self, obj): def setValue(self, obj):
self.exported = None self.exported = None
if obj is None: if obj is None:
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
@ -1371,10 +1320,10 @@ class ParameterTable(ParameterDataObject):
def getAsScriptCode(self): def getAsScriptCode(self):
param_type = '' param_type = ''
if self.optional: if self.flags() & QgsProcessingParameterDefinition.FlagOptional:
param_type += 'optional ' param_type += 'optional '
param_type += 'table' param_type += 'table'
return '##' + self.name + '=' + param_type return '##' + self.name() + '=' + param_type
@classmethod @classmethod
def fromScriptCode(self, line): def fromScriptCode(self, line):
@ -1411,7 +1360,7 @@ class ParameterTableField(Parameter):
def setValue(self, value): def setValue(self, value):
if not bool(value): if not bool(value):
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
@ -1426,7 +1375,7 @@ class ParameterTableField(Parameter):
return True return True
def __str__(self): def __str__(self):
return self.name + ' <' + self.__module__.split('.')[-1] + ' from ' \ return self.name() + ' <' + self.__module__.split('.')[-1] + ' from ' \
+ self.parent + '>' + self.parent + '>'
def dataType(self): def dataType(self):
@ -1441,10 +1390,10 @@ class ParameterTableField(Parameter):
def getAsScriptCode(self): def getAsScriptCode(self):
param_type = '' param_type = ''
if self.optional: if self.flags() & QgsProcessingParameterDefinition.FlagOptional:
param_type += 'optional ' param_type += 'optional '
param_type += 'field' param_type += 'field'
return '##' + self.name + '=' + param_type + str(self.parent) return '##' + self.name() + '=' + param_type + str(self.parent)
@classmethod @classmethod
def fromScriptCode(self, line): def fromScriptCode(self, line):
@ -1487,7 +1436,7 @@ class ParameterVector(ParameterDataObject):
def setValue(self, obj): def setValue(self, obj):
self.exported = None self.exported = None
if obj is None: if obj is None:
if not self.optional: if not self.flags() & QgsProcessingParameterDefinition.FlagOptional:
return False return False
self.value = None self.value = None
return True return True
@ -1543,10 +1492,10 @@ class ParameterVector(ParameterDataObject):
def getAsScriptCode(self): def getAsScriptCode(self):
param_type = '' param_type = ''
if self.optional: if self.flags() & QgsProcessingParameterDefinition.FlagOptional:
param_type += 'optional ' param_type += 'optional '
param_type += 'vector' param_type += 'vector'
return '##' + self.name + '=' + param_type return '##' + self.name() + '=' + param_type
@classmethod @classmethod
def fromScriptCode(self, line): def fromScriptCode(self, line):
@ -1581,7 +1530,8 @@ def getParameterFromString(s):
try: try:
clazz = getattr(sys.modules[__name__], tokens[0]) clazz = getattr(sys.modules[__name__], tokens[0])
param = clazz(*params) param = clazz(*params)
param.isAdvanced = isAdvanced if isAdvanced:
param.setFlags(param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
return param return param
except: except:
return None return None

View File

@ -130,7 +130,7 @@ class AlgorithmDialog(AlgorithmDialogBase):
context = dataobjects.createContext() context = dataobjects.createContext()
projectCRS = iface.mapCanvas().mapSettings().destinationCrs() projectCRS = iface.mapCanvas().mapSettings().destinationCrs()
layers = QgsProcessingUtils.compatibleLayers(QgsProject.instance()) layers = QgsProcessingUtils.compatibleLayers(QgsProject.instance())
for param in self.alg.parameters: for param in self.alg.parameterDefinitions():
if isinstance(param, (ParameterRaster, ParameterVector, ParameterMultipleInput)): if isinstance(param, (ParameterRaster, ParameterVector, ParameterMultipleInput)):
if param.value: if param.value:
if isinstance(param, ParameterMultipleInput): if isinstance(param, ParameterMultipleInput):
@ -151,7 +151,7 @@ class AlgorithmDialog(AlgorithmDialogBase):
if param.skip_crs_check: if param.skip_crs_check:
continue continue
value = self.mainWidget.wrappers[param.name].widget.leText.text().strip() value = self.mainWidget.wrappers[param.name()].widget.leText.text().strip()
if value: if value:
hasExtent = True hasExtent = True

View File

@ -47,8 +47,8 @@ class AutofillDialog(BASE, WIDGET):
self.cmbFillType.currentIndexChanged.connect(self.toggleParameters) self.cmbFillType.currentIndexChanged.connect(self.toggleParameters)
for param in alg.parameters: for param in alg.parameterDefinitions():
self.cmbParameters.addItem(param.description) self.cmbParameters.addItem(param.description())
def toggleParameters(self, index): def toggleParameters(self, index):
if index == self.FILL_WITH_PARAMETER: if index == self.FILL_WITH_PARAMETER:

View File

@ -91,7 +91,7 @@ class BatchAlgorithmDialog(AlgorithmDialogBase):
return return
col += 1 col += 1
for out in alg.destinationParameterDefinitions(): for out in alg.destinationParameterDefinitions():
if out.hidden: if out.flags() & QgsProcessingParameterDefinition.FlagHidden:
continue continue
widget = self.mainWidget.tblParameters.cellWidget(row, col) widget = self.mainWidget.tblParameters.cellWidget(row, col)
@ -101,7 +101,7 @@ class BatchAlgorithmDialog(AlgorithmDialogBase):
col += 1 col += 1
else: else:
self.bar.pushMessage("", self.tr('Wrong or missing output value: {0} (row {1})').format( self.bar.pushMessage("", self.tr('Wrong or missing output value: {0} (row {1})').format(
out.description, row + 1), out.description(), row + 1),
level=QgsMessageBar.WARNING, duration=5) level=QgsMessageBar.WARNING, duration=5)
self.algs = None self.algs = None
return return
@ -150,12 +150,12 @@ class BatchAlgorithmDialog(AlgorithmDialogBase):
def loadHTMLResults(self, alg, num): def loadHTMLResults(self, alg, num):
for out in alg.outputs: for out in alg.outputs:
if out.hidden or not out.open: if out.flags() & QgsProcessingParameterDefinition.FlagHidden or not out.open:
continue continue
if isinstance(out, OutputHTML): if isinstance(out, OutputHTML):
ProcessingResults.addResult( ProcessingResults.addResult(
'{} [{}]'.format(out.description, num), out.value) '{} [{}]'.format(out.description(), num), out.value)
def createSummaryTable(self): def createSummaryTable(self):
createTable = False createTable = False
@ -174,7 +174,7 @@ class BatchAlgorithmDialog(AlgorithmDialogBase):
f.write('<hr>\n') f.write('<hr>\n')
for out in alg.outputs: for out in alg.outputs:
if isinstance(out, (OutputNumber, OutputString)): if isinstance(out, (OutputNumber, OutputString)):
f.write('<p>{}: {}</p>\n'.format(out.description, out.value)) f.write('<p>{}: {}</p>\n'.format(out.description(), out.value))
f.write('<hr>\n') f.write('<hr>\n')
ProcessingResults.addResult( ProcessingResults.addResult(

View File

@ -35,6 +35,7 @@ from qgis.PyQt.QtWidgets import QTableWidgetItem, QComboBox, QHeaderView, QFileD
from qgis.core import (QgsApplication, from qgis.core import (QgsApplication,
QgsProcessingParameterDefinition) QgsProcessingParameterDefinition)
from qgis.gui import QgsMessageBar from qgis.gui import QgsMessageBar
from processing.gui.wrappers import WidgetWrapperFactory
from processing.gui.BatchOutputSelectionPanel import BatchOutputSelectionPanel from processing.gui.BatchOutputSelectionPanel import BatchOutputSelectionPanel
@ -94,7 +95,7 @@ class BatchPanel(BASE, WIDGET):
def initWidgets(self): def initWidgets(self):
# If there are advanced parameters — show corresponding button # If there are advanced parameters — show corresponding button
for param in self.alg.parameters: for param in self.alg.parameters:
if param.isAdvanced: if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced:
self.btnAdvanced.show() self.btnAdvanced.show()
break break
@ -112,15 +113,15 @@ class BatchPanel(BASE, WIDGET):
if param.isDestination(): if param.isDestination():
continue continue
self.tblParameters.setHorizontalHeaderItem( self.tblParameters.setHorizontalHeaderItem(
column, QTableWidgetItem(param.description)) column, QTableWidgetItem(param.description()))
if param.isAdvanced: if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced:
self.tblParameters.setColumnHidden(column, True) self.tblParameters.setColumnHidden(column, True)
column += 1 column += 1
for out in self.alg.destinationParameterDefinitions(): for out in self.alg.destinationParameterDefinitions():
if not out.hidden: if not out.flags() & QgsProcessingParameterDefinition.FlagHidden:
self.tblParameters.setHorizontalHeaderItem( self.tblParameters.setHorizontalHeaderItem(
column, QTableWidgetItem(out.description)) column, QTableWidgetItem(out.description()))
column += 1 column += 1
# Last column for indicating if output will be added to canvas # Last column for indicating if output will be added to canvas
@ -157,20 +158,20 @@ class BatchPanel(BASE, WIDGET):
params = alg[self.PARAMETERS] params = alg[self.PARAMETERS]
outputs = alg[self.OUTPUTS] outputs = alg[self.OUTPUTS]
column = 0 column = 0
for param in self.alg.parameters: for param in self.alg.parameterDefinitions():
if param.hidden: if param.flags() & QgsProcessingParameterDefinition.FlagHidden:
continue continue
if param.name in params: if param.name() in params:
value = params[param.name].strip('"') value = params[param.name()].strip('"')
wrapper = self.wrappers[row][column] wrapper = self.wrappers[row][column]
wrapper.setValue(value) wrapper.setValue(value)
column += 1 column += 1
for out in self.alg.outputs: for out in self.alg.outputs:
if out.hidden: if out.flags() & QgsProcessingParameterDefinition.FlagHidden:
continue continue
if out.name in outputs: if out.name() in outputs:
value = outputs[out.name].strip('"') value = outputs[out.name()].strip('"')
widget = self.tblParameters.cellWidget(row, column) widget = self.tblParameters.cellWidget(row, column)
widget.setValue(value) widget.setValue(value)
column += 1 column += 1
@ -200,7 +201,7 @@ class BatchPanel(BASE, WIDGET):
algParams[param.name()] = param.getValueAsCommandLineParameter() algParams[param.name()] = param.getValueAsCommandLineParameter()
col += 1 col += 1
for out in alg.outputs: for out in alg.outputs:
if out.hidden: if out.flags() & QgsProcessingParameterDefinition.FlagHidden:
continue continue
widget = self.tblParameters.cellWidget(row, col) widget = self.tblParameters.cellWidget(row, col)
text = widget.getValue() text = widget.getValue()
@ -209,7 +210,7 @@ class BatchPanel(BASE, WIDGET):
col += 1 col += 1
else: else:
self.parent.bar.pushMessage("", self.tr('Wrong or missing output value: {0} (row {1})').format( self.parent.bar.pushMessage("", self.tr('Wrong or missing output value: {0} (row {1})').format(
out.description, row + 1), out.description(), row + 1),
level=QgsMessageBar.WARNING, duration=5) level=QgsMessageBar.WARNING, duration=5)
return return
toSave.append({self.PARAMETERS: algParams, self.OUTPUTS: algOutputs}) toSave.append({self.PARAMETERS: algParams, self.OUTPUTS: algOutputs})
@ -236,16 +237,16 @@ class BatchPanel(BASE, WIDGET):
row = self.tblParameters.rowCount() - 1 row = self.tblParameters.rowCount() - 1
column = 0 column = 0
for param in self.alg.parameterDefinitions(): for param in self.alg.parameterDefinitions():
if param.hidden or param.isDestination(): if param.flags() & QgsProcessingParameterDefinition.FlagHidden or param.isDestination():
continue continue
wrapper = param.wrapper(self.parent, row, column) wrapper = WidgetWrapperFactory.create_wrapper(param, self.parent, row, column)
wrappers[param.name] = wrapper wrappers[param.name()] = wrapper
self.setCellWrapper(row, column, wrapper) self.setCellWrapper(row, column, wrapper)
column += 1 column += 1
for out in self.alg.destinationParameterDefinitions(): for out in self.alg.destinationParameterDefinitions():
if out.hidden: if out.flags() & QgsProcessingParameterDefinition.FlagHidden:
continue continue
self.tblParameters.setCellWidget( self.tblParameters.setCellWidget(
@ -275,5 +276,5 @@ class BatchPanel(BASE, WIDGET):
def toggleAdvancedMode(self, checked): def toggleAdvancedMode(self, checked):
for column, param in enumerate(self.alg.parameters): for column, param in enumerate(self.alg.parameters):
if param.isAdvanced: if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced:
self.tblParameters.setColumnHidden(column, not checked) self.tblParameters.setColumnHidden(column, not checked)

View File

@ -32,6 +32,8 @@ from qgis.PyQt import uic
from qgis.PyQt.QtCore import Qt from qgis.PyQt.QtCore import Qt
from qgis.PyQt.QtWidgets import QDialog, QHeaderView, QTableWidgetItem from qgis.PyQt.QtWidgets import QDialog, QHeaderView, QTableWidgetItem
from qgis.core import QgsProcessingParameterDefinition
from processing.gui.RenderingStyles import RenderingStyles from processing.gui.RenderingStyles import RenderingStyles
from processing.gui.RenderingStyleFilePanel import RenderingStyleFilePanel from processing.gui.RenderingStyleFilePanel import RenderingStyleFilePanel
from processing.core.outputs import OutputRaster from processing.core.outputs import OutputRaster
@ -61,25 +63,25 @@ class EditRenderingStylesDialog(BASE, WIDGET):
numOutputs = 0 numOutputs = 0
for output in self.alg.outputs: for output in self.alg.outputs:
if isinstance(output, (OutputVector, OutputRaster)): if isinstance(output, (OutputVector, OutputRaster)):
if not output.hidden: if not output.flags() & QgsProcessingParameterDefinition.FlagHidden:
numOutputs += 1 numOutputs += 1
self.tblStyles.setRowCount(numOutputs) self.tblStyles.setRowCount(numOutputs)
i = 0 i = 0
for output in self.alg.outputs: for output in self.alg.outputs:
if isinstance(output, (OutputVector, OutputRaster)): if isinstance(output, (OutputVector, OutputRaster)):
if not output.hidden: if not output.flags() & QgsProcessingParameterDefinition.FlagHidden:
item = QTableWidgetItem(output.description + '<' + item = QTableWidgetItem(output.description() + '<' +
output.__class__.__name__ + '>') output.__class__.__name__ + '>')
item.setFlags(Qt.ItemIsEnabled) item.setFlags(Qt.ItemIsEnabled)
self.tblStyles.setItem(i, 0, item) self.tblStyles.setItem(i, 0, item)
item = RenderingStyleFilePanel() item = RenderingStyleFilePanel()
style = \ style = \
RenderingStyles.getStyle(self.alg.id(), RenderingStyles.getStyle(self.alg.id(),
output.name) output.name())
if style: if style:
item.setText(str(style)) item.setText(str(style))
self.valueItems[output.name] = item self.valueItems[output.name()] = item
self.tblStyles.setCellWidget(i, 1, item) self.tblStyles.setCellWidget(i, 1, item)
self.tblStyles.setRowHeight(i, 22) self.tblStyles.setRowHeight(i, 22)
i += 1 i += 1

View File

@ -35,6 +35,7 @@ from qgis.PyQt.QtGui import QCursor
from qgis.gui import QgsMessageBar from qgis.gui import QgsMessageBar
from qgis.utils import iface from qgis.utils import iface
from qgis.core import (QgsProcessingUtils, from qgis.core import (QgsProcessingUtils,
QgsProcessingParameterDefinition,
QgsProject) QgsProject)
from processing.gui.RectangleMapTool import RectangleMapTool from processing.gui.RectangleMapTool import RectangleMapTool
from processing.core.ProcessingConfig import ProcessingConfig from processing.core.ProcessingConfig import ProcessingConfig
@ -52,7 +53,7 @@ class ExtentSelectionPanel(BASE, WIDGET):
self.dialog = dialog self.dialog = dialog
self.param = param self.param = param
if self.param.optional: if self.param.flags() & QgsProcessingParameterDefinition.FlagOptional:
if hasattr(self.leText, 'setPlaceholderText'): if hasattr(self.leText, 'setPlaceholderText'):
self.leText.setPlaceholderText( self.leText.setPlaceholderText(
self.tr('[Leave blank to use min covering extent]')) self.tr('[Leave blank to use min covering extent]'))
@ -89,7 +90,7 @@ class ExtentSelectionPanel(BASE, WIDGET):
selectOnCanvasAction.triggered.connect(self.selectOnCanvas) selectOnCanvasAction.triggered.connect(self.selectOnCanvas)
useLayerExtentAction.triggered.connect(self.useLayerExtent) useLayerExtentAction.triggered.connect(self.useLayerExtent)
if self.param.optional: if self.param.flags() & QgsProcessingParameterDefinition.FlagOptional:
useMincoveringExtentAction = QAction( useMincoveringExtentAction = QAction(
self.tr('Use min covering extent from input layers'), self.tr('Use min covering extent from input layers'),
self.btnSelect) self.btnSelect)

View File

@ -72,13 +72,13 @@ def getHtmlFromDescriptionsDict(alg, descriptions):
s = tr('<html><body><h2>Algorithm description</h2>\n') s = tr('<html><body><h2>Algorithm description</h2>\n')
s += '<p>' + getDescription(ALG_DESC, descriptions) + '</p>\n' s += '<p>' + getDescription(ALG_DESC, descriptions) + '</p>\n'
s += tr('<h2>Input parameters</h2>\n') s += tr('<h2>Input parameters</h2>\n')
for param in alg.parameters: for param in alg.parameterDefinitions():
s += '<h3>' + param.description + '</h3>\n' s += '<h3>' + param.description() + '</h3>\n'
s += '<p>' + getDescription(param.name, descriptions) + '</p>\n' s += '<p>' + getDescription(param.name(), descriptions) + '</p>\n'
s += tr('<h2>Outputs</h2>\n') s += tr('<h2>Outputs</h2>\n')
for out in alg.outputs: for out in alg.outputs:
s += '<h3>' + out.description + '</h3>\n' s += '<h3>' + out.description() + '</h3>\n'
s += '<p>' + getDescription(out.name, descriptions) + '</p>\n' s += '<p>' + getDescription(out.name(), descriptions) + '</p>\n'
s += '<br>' s += '<br>'
s += tr('<p align="right">Algorithm author: {0}</p>').format(getDescription(ALG_CREATOR, descriptions)) s += tr('<p align="right">Algorithm author: {0}</p>').format(getDescription(ALG_CREATOR, descriptions))
s += tr('<p align="right">Help author: {0}</p>').format(getDescription(ALG_HELP_CREATOR, descriptions)) s += tr('<p align="right">Help author: {0}</p>').format(getDescription(ALG_HELP_CREATOR, descriptions))

View File

@ -86,13 +86,13 @@ class HelpEditionDialog(BASE, WIDGET):
s = self.tr('<h2>Algorithm description</h2>\n') s = self.tr('<h2>Algorithm description</h2>\n')
s += '<p>' + self.getDescription(self.ALG_DESC) + '</p>\n' s += '<p>' + self.getDescription(self.ALG_DESC) + '</p>\n'
s += self.tr('<h2>Input parameters</h2>\n') s += self.tr('<h2>Input parameters</h2>\n')
for param in self.alg.parameters: for param in self.alg.parameterDefinitions():
s += '<h3>' + param.description + '</h3>\n' s += '<h3>' + param.description() + '</h3>\n'
s += '<p>' + self.getDescription(param.name) + '</p>\n' s += '<p>' + self.getDescription(param.name()) + '</p>\n'
s += self.tr('<h2>Outputs</h2>\n') s += self.tr('<h2>Outputs</h2>\n')
for out in self.alg.outputs: for out in self.alg.outputs:
s += '<h3>' + out.description + '</h3>\n' s += '<h3>' + out.description() + '</h3>\n'
s += '<p>' + self.getDescription(out.name) + '</p>\n' s += '<p>' + self.getDescription(out.name()) + '</p>\n'
return s return s
def fillTree(self): def fillTree(self):
@ -100,13 +100,13 @@ class HelpEditionDialog(BASE, WIDGET):
self.tree.addTopLevelItem(item) self.tree.addTopLevelItem(item)
parametersItem = TreeDescriptionItem(self.tr('Input parameters'), None) parametersItem = TreeDescriptionItem(self.tr('Input parameters'), None)
self.tree.addTopLevelItem(parametersItem) self.tree.addTopLevelItem(parametersItem)
for param in self.alg.parameters: for param in self.alg.parameterDefinitions():
item = TreeDescriptionItem(param.description, param.name) item = TreeDescriptionItem(param.description(), param.name())
parametersItem.addChild(item) parametersItem.addChild(item)
outputsItem = TreeDescriptionItem(self.tr('Outputs'), None) outputsItem = TreeDescriptionItem(self.tr('Outputs'), None)
self.tree.addTopLevelItem(outputsItem) self.tree.addTopLevelItem(outputsItem)
for out in self.alg.outputs: for out in self.alg.outputs:
item = TreeDescriptionItem(out.description, out.name) item = TreeDescriptionItem(out.description(), out.name())
outputsItem.addChild(item) outputsItem.addChild(item)
item = TreeDescriptionItem(self.tr('Algorithm created by'), self.ALG_CREATOR) item = TreeDescriptionItem(self.tr('Algorithm created by'), self.ALG_CREATOR)
self.tree.addTopLevelItem(item) self.tree.addTopLevelItem(item)

View File

@ -85,7 +85,7 @@ class ModellerNumberInputPanel(BASE, WIDGET):
name = "%s_%s" % (value.alg, value.output) name = "%s_%s" % (value.alg, value.output)
alg = self.modelParametersDialog.model.algs[value.alg] alg = self.modelParametersDialog.model.algs[value.alg]
out = alg.algorithm.getOutputFromName(value.output) out = alg.algorithm.getOutputFromName(value.output)
desc = self.tr("Output '{0}' from algorithm '{1}'").format(out.description, alg.description) desc = self.tr("Output '{0}' from algorithm '{1}'").format(out.description(), alg.description)
variables[name] = desc variables[name] = desc
values = self.modelParametersDialog.getAvailableValuesOfType(ParameterVector, OutputVector) values = self.modelParametersDialog.getAvailableValuesOfType(ParameterVector, OutputVector)
values.extend(self.modelParametersDialog.getAvailableValuesOfType(ParameterRaster, OutputRaster)) values.extend(self.modelParametersDialog.getAvailableValuesOfType(ParameterRaster, OutputRaster))
@ -98,7 +98,7 @@ class ModellerNumberInputPanel(BASE, WIDGET):
name = "%s_%s" % (value.alg, value.output) name = "%s_%s" % (value.alg, value.output)
alg = self.modelParametersDialog.model.algs[value.alg] alg = self.modelParametersDialog.model.algs[value.alg]
element = alg.algorithm.getOutputFromName(value.output) element = alg.algorithm.getOutputFromName(value.output)
desc = self.tr("Output '{0}' from algorithm '{1}'").format(element.description, alg.description) desc = self.tr("Output '{0}' from algorithm '{1}'").format(element.description(), alg.description)
variables['%s_minx' % name] = self.tr("Minimum X of {0}").format(desc) variables['%s_minx' % name] = self.tr("Minimum X of {0}").format(desc)
variables['%s_miny' % name] = self.tr("Minimum Y of {0}").format(desc) variables['%s_miny' % name] = self.tr("Minimum Y of {0}").format(desc)
variables['%s_maxx' % name] = self.tr("Maximum X of {0}").format(desc) variables['%s_maxx' % name] = self.tr("Maximum X of {0}").format(desc)
@ -122,8 +122,8 @@ class ModellerNumberInputPanel(BASE, WIDGET):
values = [] values = []
for param in self.modelParametersDialog.model.parameters: for param in self.modelParametersDialog.model.parameters:
if isinstance(param, ParameterNumber): if isinstance(param, ParameterNumber):
if "@" + param.name in value: if "@" + param.name() in value:
values.append(ValueFromInput(param.name)) values.append(ValueFromInput(param.name()))
for alg in list(self.modelParametersDialog.model.algs.values()): for alg in list(self.modelParametersDialog.model.algs.values()):
for out in alg.algorithm.outputs: for out in alg.algorithm.outputs:
if isinstance(out, OutputNumber) and "@%s_%s" % (alg.name(), out.name) in value: if isinstance(out, OutputNumber) and "@%s_%s" % (alg.name(), out.name) in value:

View File

@ -57,28 +57,28 @@ def handleAlgorithmResults(alg, context, feedback=None, showResults=True):
i = 0 i = 0
#for out in alg.outputs: #for out in alg.outputs:
# feedback.setProgress(100 * i / float(len(alg.outputs))) # feedback.setProgress(100 * i / float(len(alg.outputs)))
# if out.hidden or not out.open: # if out.flags() & QgsProcessingParameterDefinition.FlagHidden or not out.open:
# continue # continue
# if isinstance(out, (OutputRaster, OutputVector, OutputTable)): # if isinstance(out, (OutputRaster, OutputVector, OutputTable)):
# try: # try:
# layer = QgsProcessingUtils.mapLayerFromString(out.value, context) # layer = QgsProcessingUtils.mapLayerFromString(out.value, context)
# if layer: # if layer:
# layer.setName(out.description) # layer.setName(out.description())
# QgsProject.instance().addMapLayer(context.temporaryLayerStore().takeMapLayer(layer)) # QgsProject.instance().addMapLayer(context.temporaryLayerStore().takeMapLayer(layer))
# else: # else:
# if ProcessingConfig.getSetting( # if ProcessingConfig.getSetting(
# ProcessingConfig.USE_FILENAME_AS_LAYER_NAME): # ProcessingConfig.USE_FILENAME_AS_LAYER_NAME):
# name = os.path.basename(out.value) # name = os.path.basename(out.value)
# else: # else:
# name = out.description # name = out.description()
# dataobjects.load(out.value, name, alg.crs, # dataobjects.load(out.value, name, alg.crs,
# RenderingStyles.getStyle(alg.id(), # RenderingStyles.getStyle(alg.id(),
# out.name)) # out.name))
# except Exception: # except Exception:
# QgsMessageLog.logMessage("Error loading result layer:\n" + traceback.format_exc(), 'Processing', QgsMessageLog.CRITICAL) # QgsMessageLog.logMessage("Error loading result layer:\n" + traceback.format_exc(), 'Processing', QgsMessageLog.CRITICAL)
# wrongLayers.append(out.description) # wrongLayers.append(out.description())
# elif isinstance(out, OutputHTML): # elif isinstance(out, OutputHTML):
# resultsList.addResult(alg.icon(), out.description, out.value) # resultsList.addResult(alg.icon(), out.description(), out.value)
# i += 1 # i += 1
i = 0 i = 0
for l in context.layersToLoadOnCompletion(): for l in context.layersToLoadOnCompletion():
@ -87,7 +87,7 @@ def handleAlgorithmResults(alg, context, feedback=None, showResults=True):
layer = QgsProcessingUtils.mapLayerFromString(l, context) layer = QgsProcessingUtils.mapLayerFromString(l, context)
if layer: if layer:
#TODO #TODO
#layer.setName(out.description) #layer.setName(out.description())
QgsProject.instance().addMapLayer(context.temporaryLayerStore().takeMapLayer(layer)) QgsProject.instance().addMapLayer(context.temporaryLayerStore().takeMapLayer(layer))
else: else:
if ProcessingConfig.getSetting( if ProcessingConfig.getSetting(
@ -101,7 +101,7 @@ def handleAlgorithmResults(alg, context, feedback=None, showResults=True):
#out.name)) #out.name))
except Exception: except Exception:
QgsMessageLog.logMessage("Error loading result layer:\n" + traceback.format_exc(), 'Processing', QgsMessageLog.CRITICAL) QgsMessageLog.logMessage("Error loading result layer:\n" + traceback.format_exc(), 'Processing', QgsMessageLog.CRITICAL)
#wrongLayers.append(out.description) #wrongLayers.append(out.description())
wrongLayers.append(l) wrongLayers.append(l)
for out in alg.outputs: for out in alg.outputs:
feedback.setProgress(100 * i / float(len(alg.outputs))) feedback.setProgress(100 * i / float(len(alg.outputs)))

View File

@ -36,7 +36,8 @@ from osgeo.gdalconst import GA_ReadOnly
from numpy import nan_to_num from numpy import nan_to_num
from qgis.core import QgsApplication from qgis.core import (QgsApplication,
QgsProcessingParameterDefinition)
from qgis.PyQt.QtCore import QCoreApplication, QMetaObject from qgis.PyQt.QtCore import QCoreApplication, QMetaObject
from qgis.PyQt.QtWidgets import QDialog, QVBoxLayout, QTextEdit, QMessageBox from qgis.PyQt.QtWidgets import QDialog, QVBoxLayout, QTextEdit, QMessageBox
@ -146,13 +147,13 @@ def createTest(text):
i = 0 i = 0
for param in alg.parameterDefinitions(): for param in alg.parameterDefinitions():
if param.hidden or param.isDestination(): if param.flags() & QgsProcessingParameterDefinition.FlagHidden or param.isDestination():
continue continue
i += 1 i += 1
token = tokens[i] token = tokens[i]
# Handle empty parameters that are optionals # Handle empty parameters that are optionals
if param.optional and token is None: if param.flags() & QgsProcessingParameterDefinition.FlagOptional and token is None:
continue continue
if isinstance(param, ParameterVector): if isinstance(param, ParameterVector):
@ -164,7 +165,7 @@ def createTest(text):
if not schema: if not schema:
p['location'] = '[The source data is not in the testdata directory. Please use data in the processing/tests/testdata folder.]' p['location'] = '[The source data is not in the testdata directory. Please use data in the processing/tests/testdata folder.]'
params[param.name] = p params[param.name()] = p
elif isinstance(param, ParameterRaster): elif isinstance(param, ParameterRaster):
schema, filepath = extractSchemaPath(token) schema, filepath = extractSchemaPath(token)
p = { p = {
@ -174,7 +175,7 @@ def createTest(text):
if not schema: if not schema:
p['location'] = '[The source data is not in the testdata directory. Please use data in the processing/tests/testdata folder.]' p['location'] = '[The source data is not in the testdata directory. Please use data in the processing/tests/testdata folder.]'
params[param.name] = p params[param.name()] = p
elif isinstance(param, ParameterTable): elif isinstance(param, ParameterTable):
schema, filepath = extractSchemaPath(token) schema, filepath = extractSchemaPath(token)
p = { p = {
@ -184,7 +185,7 @@ def createTest(text):
if not schema: if not schema:
p['location'] = '[The source data is not in the testdata directory. Please use data in the processing/tests/testdata folder.]' p['location'] = '[The source data is not in the testdata directory. Please use data in the processing/tests/testdata folder.]'
params[param.name] = p params[param.name()] = p
elif isinstance(param, ParameterMultipleInput): elif isinstance(param, ParameterMultipleInput):
multiparams = token.split(';') multiparams = token.split(';')
newparam = [] newparam = []
@ -209,7 +210,7 @@ def createTest(text):
if not schema: if not schema:
p['location'] = '[The source data is not in the testdata directory. Please use data in the processing/tests/testdata folder.]' p['location'] = '[The source data is not in the testdata directory. Please use data in the processing/tests/testdata folder.]'
params[param.name] = p params[param.name()] = p
elif isinstance(param, ParameterFile): elif isinstance(param, ParameterFile):
schema, filepath = extractSchemaPath(token) schema, filepath = extractSchemaPath(token)
p = { p = {
@ -219,16 +220,16 @@ def createTest(text):
if not schema: if not schema:
p['location'] = '[The source data is not in the testdata directory. Please use data in the processing/tests/testdata folder.]' p['location'] = '[The source data is not in the testdata directory. Please use data in the processing/tests/testdata folder.]'
params[param.name] = p params[param.name()] = p
elif isinstance(param, ParameterString): elif isinstance(param, ParameterString):
params[param.name] = token params[param.name()] = token
elif isinstance(param, ParameterBoolean): elif isinstance(param, ParameterBoolean):
params[param.name] = token params[param.name()] = token
elif isinstance(param, ParameterNumber): elif isinstance(param, ParameterNumber):
if param.isInteger: if param.isInteger:
params[param.name] = int(token) params[param.name()] = int(token)
else: else:
params[param.name] = float(token) params[param.name()] = float(token)
else: else:
if token[0] == '"': if token[0] == '"':
token = token[1:] token = token[1:]
@ -238,7 +239,7 @@ def createTest(text):
definition['params'] = params definition['params'] = params
for i, out in enumerate([out for out in alg.destinationParameterDefinitions() if not out.hidden]): for i, out in enumerate([out for out in alg.destinationParameterDefinitions() if not out.flags() & QgsProcessingParameterDefinition.FlagHiddenn]):
token = tokens[i - len(alg.destinationParameterDefinitions())] token = tokens[i - len(alg.destinationParameterDefinitions())]
if isinstance(out, (OutputNumber, OutputString)): if isinstance(out, (OutputNumber, OutputString)):

View File

@ -35,7 +35,8 @@ import json
from qgis.PyQt.QtCore import QPointF from qgis.PyQt.QtCore import QPointF
from operator import attrgetter from operator import attrgetter
from qgis.core import QgsApplication from qgis.core import (QgsApplication,
QgsProcessingParameterDefinition)
from qgis.gui import QgsMessageBar from qgis.gui import QgsMessageBar
from qgis.utils import iface from qgis.utils import iface
from processing.core.GeoAlgorithm import GeoAlgorithm from processing.core.GeoAlgorithm import GeoAlgorithm
@ -147,9 +148,9 @@ class Algorithm(object):
return str(value) return str(value)
params.append(_toString(value)) params.append(_toString(value))
for out in self.algorithm.outputs: for out in self.algorithm.outputs:
if not out.hidden: if not out.flags() & QgsProcessingParameterDefinition.FlagHidden:
if out.name in self.outputs: if out.name() in self.outputs:
params.append(safeName(self.outputs[out.name].description).lower()) params.append(safeName(self.outputs[out.name()].description()).lower())
else: else:
params.append(str(None)) params.append(str(None))
s.append("outputs_%s=processing.run('%s', %s)" % (self.name, self.consoleName, ",".join(params))) s.append("outputs_%s=processing.run('%s', %s)" % (self.name, self.consoleName, ",".join(params)))
@ -258,7 +259,7 @@ class ModelerAlgorithm(GeoAlgorithm):
for out in alg.outputs: for out in alg.outputs:
modelOutput = copy.deepcopy(alg.algorithm.getOutputFromName(out)) modelOutput = copy.deepcopy(alg.algorithm.getOutputFromName(out))
modelOutput.name = self.getSafeNameForOutput(alg.modeler_name, out) modelOutput.name = self.getSafeNameForOutput(alg.modeler_name, out)
modelOutput.description = alg.outputs[out].description modelOutput.description = alg.outputs[out].description()
self.outputs.append(modelOutput) self.outputs.append(modelOutput)
self.outputs.sort(key=attrgetter("description")) self.outputs.sort(key=attrgetter("description"))
@ -411,30 +412,30 @@ class ModelerAlgorithm(GeoAlgorithm):
def prepareAlgorithm(self, alg): def prepareAlgorithm(self, alg):
algInstance = alg.algorithm algInstance = alg.algorithm
for param in algInstance.parameters: for param in algInstance.parameterDefinitions():
if not param.hidden: if not param.flags() & QgsProcessingParameterDefinition.FlagHidden:
if param.name in alg.params: if param.name() in alg.params:
value = self.resolveValue(alg.params[param.name], param) value = self.resolveValue(alg.params[param.name()], param)
else: else:
if iface is not None: if iface is not None:
iface.messageBar().pushMessage(self.tr("Warning"), iface.messageBar().pushMessage(self.tr("Warning"),
self.tr("Parameter {0} in algorithm {1} in the model is run with default value! Edit the model to make sure that this is correct.").format(param.name, alg.displayName()), self.tr("Parameter {0} in algorithm {1} in the model is run with default value! Edit the model to make sure that this is correct.").format(param.name(), alg.displayName()),
QgsMessageBar.WARNING, 4) QgsMessageBar.WARNING, 4)
value = param.default value = param.defaultValue()
# We allow unexistent filepaths, since that allows # We allow unexistent filepaths, since that allows
# algorithms to skip some conversion routines # algorithms to skip some conversion routines
if not param.setValue(value) and not isinstance(param, if not param.setValue(value) and not isinstance(param,
ParameterDataObject): ParameterDataObject):
raise GeoAlgorithmExecutionException( raise GeoAlgorithmExecutionException(
self.tr('Wrong value {0} for {1} {2}', 'ModelerAlgorithm').format( self.tr('Wrong value {0} for {1} {2}', 'ModelerAlgorithm').format(
value, param.__class__.__name__, param.name value, param.__class__.__name__, param.name()
) )
) )
for out in algInstance.outputs: for out in algInstance.outputs:
if not out.hidden: if not out.flags() & QgsProcessingParameterDefinition.FlagHidden:
if out.name in alg.outputs: if out.name() in alg.outputs:
name = self.getSafeNameForOutput(alg.modeler_name, out.name) name = self.getSafeNameForOutput(alg.modeler_name, out.name())
modelOut = self.getOutputFromName(name) modelOut = self.getOutputFromName(name)
if modelOut: if modelOut:
out.value = modelOut.value out.value = modelOut.value
@ -501,9 +502,9 @@ class ModelerAlgorithm(GeoAlgorithm):
# copy algorithm output value(s) back to model in case the algorithm modified those # copy algorithm output value(s) back to model in case the algorithm modified those
for out in alg.algorithm.outputs: for out in alg.algorithm.outputs:
if not out.hidden: if not out.flags() & QgsProcessingParameterDefinition.FlagHidden:
if out.name in alg.outputs: if out.name() in alg.outputs:
modelOut = self.getOutputFromName(self.getSafeNameForOutput(alg.modeler_name, out.name)) modelOut = self.getOutputFromName(self.getSafeNameForOutput(alg.modeler_name, out.name()))
if modelOut: if modelOut:
modelOut.value = out.value modelOut.value = out.value
@ -636,7 +637,7 @@ class ModelerAlgorithm(GeoAlgorithm):
s.append(param.param.getAsScriptCode()) s.append(param.param.getAsScriptCode())
for alg in list(self.algs.values()): for alg in list(self.algs.values()):
for name, out in list(alg.outputs.items()): for name, out in list(alg.outputs.items()):
s.append('##%s=%s' % (safeName(out.description).lower(), alg.getOutputType(name))) s.append('##%s=%s' % (safeName(out.description()).lower(), alg.getOutputType(name)))
executed = [] executed = []
toExecute = [alg for alg in list(self.algs.values()) if alg.active] toExecute = [alg for alg in list(self.algs.values()) if alg.active]

View File

@ -33,6 +33,7 @@ from qgis.PyQt.QtCore import Qt, QPointF, QRectF
from qgis.PyQt.QtGui import QFont, QFontMetricsF, QPen, QBrush, QColor, QPolygonF, QPicture, QPainter from qgis.PyQt.QtGui import QFont, QFontMetricsF, QPen, QBrush, QColor, QPolygonF, QPicture, QPainter
from qgis.PyQt.QtWidgets import QGraphicsItem, QMessageBox, QMenu from qgis.PyQt.QtWidgets import QGraphicsItem, QMessageBox, QMenu
from qgis.PyQt.QtSvg import QSvgRenderer from qgis.PyQt.QtSvg import QSvgRenderer
from qgis.core import QgsProcessingParameterDefinition
from processing.modeler.ModelerAlgorithm import ModelerParameter, Algorithm, ModelerOutput from processing.modeler.ModelerAlgorithm import ModelerParameter, Algorithm, ModelerOutput
from processing.modeler.ModelerParameterDefinitionDialog import ModelerParameterDefinitionDialog from processing.modeler.ModelerParameterDefinitionDialog import ModelerParameterDefinitionDialog
from processing.modeler.ModelerParametersDialog import ModelerParametersDialog from processing.modeler.ModelerParametersDialog import ModelerParametersDialog
@ -278,9 +279,9 @@ class ModelerGraphicItem(QGraphicsItem):
painter.drawText(pt, 'In') painter.drawText(pt, 'In')
i = 1 i = 1
if not self.element.paramsFolded: if not self.element.paramsFolded:
for param in self.element.algorithm.parameters: for param in self.element.algorithm.parameterDefinitions():
if not param.hidden: if not param.flags() & QgsProcessingParameterDefinition.FlagHidden:
text = self.getAdjustedText(param.description) text = self.getAdjustedText(param.description())
h = -(fm.height() * 1.2) * (i + 1) h = -(fm.height() * 1.2) * (i + 1)
h = h - ModelerGraphicItem.BOX_HEIGHT / 2.0 + 5 h = h - ModelerGraphicItem.BOX_HEIGHT / 2.0 + 5
pt = QPointF(-ModelerGraphicItem.BOX_WIDTH / 2 + 33, h) pt = QPointF(-ModelerGraphicItem.BOX_WIDTH / 2 + 33, h)
@ -292,7 +293,7 @@ class ModelerGraphicItem(QGraphicsItem):
painter.drawText(pt, 'Out') painter.drawText(pt, 'Out')
if not self.element.outputsFolded: if not self.element.outputsFolded:
for i, out in enumerate(self.element.algorithm.outputs): for i, out in enumerate(self.element.algorithm.outputs):
text = self.getAdjustedText(out.description) text = self.getAdjustedText(out.description())
h = fm.height() * 1.2 * (i + 2) h = fm.height() * 1.2 * (i + 2)
h = h + ModelerGraphicItem.BOX_HEIGHT / 2.0 h = h + ModelerGraphicItem.BOX_HEIGHT / 2.0
pt = QPointF(-ModelerGraphicItem.BOX_WIDTH / 2 + 33, h) pt = QPointF(-ModelerGraphicItem.BOX_WIDTH / 2 + 33, h)
@ -322,7 +323,7 @@ class ModelerGraphicItem(QGraphicsItem):
def getLinkPointForOutput(self, outputIndex): def getLinkPointForOutput(self, outputIndex):
if isinstance(self.element, Algorithm) and self.element.algorithm.outputs: if isinstance(self.element, Algorithm) and self.element.algorithm.outputs:
outputIndex = (outputIndex if not self.element.outputsFolded else -1) outputIndex = (outputIndex if not self.element.outputsFolded else -1)
text = self.getAdjustedText(self.element.algorithm.outputs[outputIndex].description) text = self.getAdjustedText(self.element.algorithm.outputs[outputIndex].description())
font = QFont('Verdana', 8) font = QFont('Verdana', 8)
font.setPixelSize(12) font.setPixelSize(12)
fm = QFontMetricsF(font) fm = QFontMetricsF(font)

View File

@ -29,7 +29,8 @@ __revision__ = '$Format:%H$'
import math import math
from qgis.gui import QgsExpressionLineEdit, QgsProjectionSelectionWidget from qgis.gui import QgsExpressionLineEdit, QgsProjectionSelectionWidget
from qgis.core import QgsCoordinateReferenceSystem from qgis.core import (QgsCoordinateReferenceSystem,
QgsProcessingParameterDefinition)
from qgis.PyQt.QtCore import Qt from qgis.PyQt.QtCore import Qt
from qgis.PyQt.QtWidgets import (QDialog, from qgis.PyQt.QtWidgets import (QDialog,
QVBoxLayout, QVBoxLayout,
@ -108,8 +109,8 @@ class ModelerParameterDefinitionDialog(QDialog):
self.nameTextBox = QLineEdit() self.nameTextBox = QLineEdit()
self.verticalLayout.addWidget(self.nameTextBox) self.verticalLayout.addWidget(self.nameTextBox)
if isinstance(self.param, Parameter): if isinstance(self.param, QgsProcessingParameterDefinition):
self.nameTextBox.setText(self.param.description) self.nameTextBox.setText(self.param.description())
if self.paramType == ModelerParameterDefinitionDialog.PARAMETER_BOOLEAN or \ if self.paramType == ModelerParameterDefinitionDialog.PARAMETER_BOOLEAN or \
isinstance(self.param, ParameterBoolean): isinstance(self.param, ParameterBoolean):
@ -126,9 +127,9 @@ class ModelerParameterDefinitionDialog(QDialog):
idx = 0 idx = 0
for param in list(self.alg.inputs.values()): for param in list(self.alg.inputs.values()):
if isinstance(param.param, (ParameterVector, ParameterTable)): if isinstance(param.param, (ParameterVector, ParameterTable)):
self.parentCombo.addItem(param.param.description, param.param.name) self.parentCombo.addItem(param.param.description(), param.param.name())
if self.param is not None: if self.param is not None:
if self.param.parent == param.param.name: if self.param.parent == param.param.name():
self.parentCombo.setCurrentIndex(idx) self.parentCombo.setCurrentIndex(idx)
idx += 1 idx += 1
self.verticalLayout.addWidget(self.parentCombo) self.verticalLayout.addWidget(self.parentCombo)
@ -205,7 +206,7 @@ class ModelerParameterDefinitionDialog(QDialog):
self.verticalLayout.addWidget(QLabel(self.tr('Default value'))) self.verticalLayout.addWidget(QLabel(self.tr('Default value')))
self.defaultEdit = QgsExpressionLineEdit() self.defaultEdit = QgsExpressionLineEdit()
if self.param is not None: if self.param is not None:
self.defaultEdit.setExpression(self.param.default) self.defaultEdit.setExpression(self.param.defaultValue())
self.verticalLayout.addWidget(self.defaultEdit) self.verticalLayout.addWidget(self.defaultEdit)
self.verticalLayout.addWidget(QLabel(self.tr('Parent layer'))) self.verticalLayout.addWidget(QLabel(self.tr('Parent layer')))
@ -214,9 +215,9 @@ class ModelerParameterDefinitionDialog(QDialog):
idx = 1 idx = 1
for param in list(self.alg.inputs.values()): for param in list(self.alg.inputs.values()):
if isinstance(param.param, (ParameterVector, ParameterTable)): if isinstance(param.param, (ParameterVector, ParameterTable)):
self.parentCombo.addItem(param.param.description, param.param.name) self.parentCombo.addItem(param.param.description(), param.param.name())
if self.param is not None: if self.param is not None:
if self.param.parent_layer == param.param.name: if self.param.parent_layer == param.param.name():
self.parentCombo.setCurrentIndex(idx) self.parentCombo.setCurrentIndex(idx)
idx += 1 idx += 1
self.verticalLayout.addWidget(self.parentCombo) self.verticalLayout.addWidget(self.parentCombo)
@ -225,7 +226,7 @@ class ModelerParameterDefinitionDialog(QDialog):
self.verticalLayout.addWidget(QLabel(self.tr('Default value'))) self.verticalLayout.addWidget(QLabel(self.tr('Default value')))
self.defaultTextBox = QLineEdit() self.defaultTextBox = QLineEdit()
if self.param is not None: if self.param is not None:
self.defaultTextBox.setText(self.param.default) self.defaultTextBox.setText(self.param.defaultValue())
self.verticalLayout.addWidget(self.defaultTextBox) self.verticalLayout.addWidget(self.defaultTextBox)
elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_FILE or elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_FILE or
isinstance(self.param, ParameterFile)): isinstance(self.param, ParameterFile)):
@ -242,14 +243,14 @@ class ModelerParameterDefinitionDialog(QDialog):
self.verticalLayout.addWidget(QLabel(self.tr('Default value'))) self.verticalLayout.addWidget(QLabel(self.tr('Default value')))
self.defaultTextBox = QLineEdit() self.defaultTextBox = QLineEdit()
if self.param is not None: if self.param is not None:
self.defaultTextBox.setText(self.param.default) self.defaultTextBox.setText(self.param.defaultValue())
self.verticalLayout.addWidget(self.defaultTextBox) self.verticalLayout.addWidget(self.defaultTextBox)
elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_CRS or elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_CRS or
isinstance(self.param, ParameterCrs)): isinstance(self.param, ParameterCrs)):
self.verticalLayout.addWidget(QLabel(self.tr('Default value'))) self.verticalLayout.addWidget(QLabel(self.tr('Default value')))
self.selector = QgsProjectionSelectionWidget() self.selector = QgsProjectionSelectionWidget()
if self.param is not None: if self.param is not None:
self.selector.setCrs(QgsCoordinateReferenceSystem(self.param.default)) self.selector.setCrs(QgsCoordinateReferenceSystem(self.param.defaultValue()))
else: else:
self.selector.setCrs(QgsCoordinateReferenceSystem('EPSG:4326')) self.selector.setCrs(QgsCoordinateReferenceSystem('EPSG:4326'))
self.verticalLayout.addWidget(self.selector) self.verticalLayout.addWidget(self.selector)
@ -259,7 +260,7 @@ class ModelerParameterDefinitionDialog(QDialog):
self.requiredCheck.setText(self.tr('Mandatory')) self.requiredCheck.setText(self.tr('Mandatory'))
self.requiredCheck.setChecked(True) self.requiredCheck.setChecked(True)
if self.param is not None: if self.param is not None:
self.requiredCheck.setChecked(not self.param.optional) self.requiredCheck.setChecked(not self.param.flags() & QgsProcessingParameterDefinition.FlagOptional)
self.verticalLayout.addWidget(self.requiredCheck) self.verticalLayout.addWidget(self.requiredCheck)
self.buttonBox = QDialogButtonBox(self) self.buttonBox = QDialogButtonBox(self)
@ -290,7 +291,7 @@ class ModelerParameterDefinitionDialog(QDialog):
while name in self.alg.inputs: while name in self.alg.inputs:
name = safeName.lower() + str(i) name = safeName.lower() + str(i)
else: else:
name = self.param.name name = self.param.name()
if (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_BOOLEAN or if (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_BOOLEAN or
isinstance(self.param, ParameterBoolean)): isinstance(self.param, ParameterBoolean)):
self.param = ParameterBoolean(name, description, self.state.isChecked()) self.param = ParameterBoolean(name, description, self.state.isChecked())
@ -364,7 +365,8 @@ class ModelerParameterDefinitionDialog(QDialog):
elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_CRS or elif (self.paramType == ModelerParameterDefinitionDialog.PARAMETER_CRS or
isinstance(self.param, ParameterCrs)): isinstance(self.param, ParameterCrs)):
self.param = ParameterCrs(name, description, default=self.selector.crs().authid()) self.param = ParameterCrs(name, description, default=self.selector.crs().authid())
self.param.optional = not self.requiredCheck.isChecked() if not self.requiredCheck.isChecked():
self.param.setFlags(self.param.flags() | QgsProcessingParameterDefinition.FlagOptional)
self.close() self.close()
def cancelPressed(self): def cancelPressed(self):

View File

@ -40,6 +40,7 @@ from qgis.core import (QgsNetworkAccessManager,
from qgis.gui import (QgsMessageBar, from qgis.gui import (QgsMessageBar,
QgsScrollArea) QgsScrollArea)
from processing.gui.wrappers import WidgetWrapperFactory
from processing.gui.wrappers import InvalidParameterValue from processing.gui.wrappers import InvalidParameterValue
from processing.gui.MultipleInputPanel import MultipleInputPanel from processing.gui.MultipleInputPanel import MultipleInputPanel
from processing.core.outputs import (OutputRaster, from processing.core.outputs import (OutputRaster,
@ -114,7 +115,7 @@ class ModelerParametersDialog(QDialog):
self.verticalLayout.addWidget(line) self.verticalLayout.addWidget(line)
for param in self._alg.parameters: for param in self._alg.parameters:
if param.isAdvanced: if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced:
self.advancedButton = QPushButton() self.advancedButton = QPushButton()
self.advancedButton.setText(self.tr('Show advanced parameters')) self.advancedButton.setText(self.tr('Show advanced parameters'))
self.advancedButton.clicked.connect( self.advancedButton.clicked.connect(
@ -124,42 +125,42 @@ class ModelerParametersDialog(QDialog):
advancedButtonHLayout.addStretch() advancedButtonHLayout.addStretch()
self.verticalLayout.addLayout(advancedButtonHLayout) self.verticalLayout.addLayout(advancedButtonHLayout)
break break
for param in self._alg.parameters: for param in self._alg.parameterDefinitions():
if param.hidden: if param.flags() & QgsProcessingParameterDefinition.FlagHidden:
continue continue
desc = param.description desc = param.description()
if isinstance(param, ParameterExtent): if isinstance(param, ParameterExtent):
desc += self.tr('(xmin, xmax, ymin, ymax)') desc += self.tr('(xmin, xmax, ymin, ymax)')
if isinstance(param, ParameterPoint): if isinstance(param, ParameterPoint):
desc += self.tr('(x, y)') desc += self.tr('(x, y)')
if param.optional: if param.flags() & QgsProcessingParameterDefinition.FlagOptional:
desc += self.tr(' [optional]') desc += self.tr(' [optional]')
label = QLabel(desc) label = QLabel(desc)
self.labels[param.name] = label self.labels[param.name()] = label
wrapper = param.wrapper(self) wrapper = WidgetWrapperFactory.create_wrapper(param, self)
self.wrappers[param.name] = wrapper self.wrappers[param.name()] = wrapper
widget = wrapper.widget widget = wrapper.widget
if widget is not None: if widget is not None:
self.valueItems[param.name] = widget self.valueItems[param.name()] = widget
tooltip = param.description() tooltip = param.description()
label.setToolTip(tooltip) label.setToolTip(tooltip)
widget.setToolTip(tooltip) widget.setToolTip(tooltip)
if param.isAdvanced: if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced:
label.setVisible(self.showAdvanced) label.setVisible(self.showAdvanced)
widget.setVisible(self.showAdvanced) widget.setVisible(self.showAdvanced)
self.widgets[param.name] = widget self.widgets[param.name()] = widget
self.verticalLayout.addWidget(label) self.verticalLayout.addWidget(label)
self.verticalLayout.addWidget(widget) self.verticalLayout.addWidget(widget)
for output in self._alg.outputs: for output in self._alg.outputs:
if output.hidden: if output.flags() & QgsProcessingParameterDefinition.FlagHidden:
continue continue
if isinstance(output, (OutputRaster, OutputVector, OutputTable, if isinstance(output, (OutputRaster, OutputVector, OutputTable,
OutputHTML, OutputFile, OutputDirectory)): OutputHTML, OutputFile, OutputDirectory)):
label = QLabel(output.description + '<' + label = QLabel(output.description() + '<' +
output.__class__.__name__ + '>') output.__class__.__name__ + '>')
item = QLineEdit() item = QLineEdit()
if hasattr(item, 'setPlaceholderText'): if hasattr(item, 'setPlaceholderText'):
@ -249,7 +250,7 @@ class ModelerParametersDialog(QDialog):
else: else:
self.advancedButton.setText(self.tr('Show advanced parameters')) self.advancedButton.setText(self.tr('Show advanced parameters'))
for param in self._alg.parameters: for param in self._alg.parameters:
if param.isAdvanced: if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced:
self.labels[param.name].setVisible(self.showAdvanced) self.labels[param.name].setVisible(self.showAdvanced)
self.widgets[param.name].setVisible(self.showAdvanced) self.widgets[param.name].setVisible(self.showAdvanced)
@ -289,25 +290,25 @@ class ModelerParametersDialog(QDialog):
def resolveValueDescription(self, value): def resolveValueDescription(self, value):
if isinstance(value, ValueFromInput): if isinstance(value, ValueFromInput):
return self.model.inputs[value.name].param.description return self.model.inputs[value.name].param.description()
else: else:
alg = self.model.algs[value.alg] alg = self.model.algs[value.alg]
return self.tr("'{0}' from algorithm '{1}'").format(alg.algorithm.getOutputFromName(value.output).description, alg.description) return self.tr("'{0}' from algorithm '{1}'").format(alg.algorithm.getOutputFromName(value.output).description(), alg.description)
def setPreviousValues(self): def setPreviousValues(self):
if self._algName is not None: if self._algName is not None:
alg = self.model.algs[self._algName] alg = self.model.algs[self._algName]
self.descriptionBox.setText(alg.description) self.descriptionBox.setText(alg.description)
for param in alg.algorithm.parameters: for param in alg.algorithm.parameterDefinitions():
if param.hidden: if param.flags() & QgsProcessingParameterDefinition.FlagHidden:
continue continue
if param.name in alg.params: if param.name() in alg.params:
value = alg.params[param.name] value = alg.params[param.name()]
else: else:
value = param.default value = param.defaultValue()
self.wrappers[param.name].setValue(value) self.wrappers[param.name()].setValue(value)
for name, out in list(alg.outputs.items()): for name, out in list(alg.outputs.items()):
self.valueItems[name].setText(out.description) self.valueItems[name].setText(out.description())
selected = [] selected = []
dependencies = self.getAvailableDependencies() # spellok dependencies = self.getAvailableDependencies() # spellok
@ -331,10 +332,10 @@ class ModelerParametersDialog(QDialog):
level=QgsMessageBar.WARNING) level=QgsMessageBar.WARNING)
return None return None
for output in outputs: for output in outputs:
if not output.hidden: if not output.flags() & QgsProcessingParameterDefinition.FlagHidden:
name = str(self.valueItems[output.name].text()) name = str(self.valueItems[output.name()].text())
if name.strip() != '' and name != ModelerParametersDialog.ENTER_NAME: if name.strip() != '' and name != ModelerParametersDialog.ENTER_NAME:
alg.outputs[output.name] = ModelerOutput(name) alg.outputs[output.name()] = ModelerOutput(name)
selectedOptions = self.dependenciesPanel.selectedoptions selectedOptions = self.dependenciesPanel.selectedoptions
availableDependencies = self.getAvailableDependencies() # spellok availableDependencies = self.getAvailableDependencies() # spellok

View File

@ -28,6 +28,7 @@ __revision__ = '$Format:%H$'
from qgis.PyQt.QtCore import QPointF, Qt from qgis.PyQt.QtCore import QPointF, Qt
from qgis.PyQt.QtWidgets import QGraphicsItem, QGraphicsScene from qgis.PyQt.QtWidgets import QGraphicsItem, QGraphicsScene
from qgis.core import QgsProcessingParameterDefinition
from processing.modeler.ModelerGraphicItem import ModelerGraphicItem from processing.modeler.ModelerGraphicItem import ModelerGraphicItem
from processing.modeler.ModelerArrowItem import ModelerArrowItem from processing.modeler.ModelerArrowItem import ModelerArrowItem
from processing.modeler.ModelerAlgorithm import ValueFromInput, ValueFromOutput, CompoundValue from processing.modeler.ModelerAlgorithm import ValueFromInput, ValueFromOutput, CompoundValue
@ -102,8 +103,8 @@ class ModelerScene(QGraphicsScene):
# And then the arrows # And then the arrows
for alg in list(model.algs.values()): for alg in list(model.algs.values()):
idx = 0 idx = 0
for parameter in alg.algorithm.parameters: for parameter in alg.algorithm.parameterDefinitions():
if not parameter.hidden: if not parameter.flags() & QgsProcessingParameterDefinition.FlagHidden:
if parameter.name in alg.params: if parameter.name in alg.params:
value = alg.params[parameter.name] value = alg.params[parameter.name]
else: else:

View File

@ -75,7 +75,7 @@ def createContext():
context.setFlags(QgsProcessingContext.UseSelectionIfPresent) context.setFlags(QgsProcessingContext.UseSelectionIfPresent)
invalid_features_method = ProcessingConfig.getSetting(ProcessingConfig.FILTER_INVALID_GEOMETRIES) invalid_features_method = ProcessingConfig.getSetting(ProcessingConfig.FILTER_INVALID_GEOMETRIES)
if not invalid_features_method: if invalid_features_method is None:
invalid_features_method = QgsFeatureRequest.GeometryAbortOnInvalid invalid_features_method = QgsFeatureRequest.GeometryAbortOnInvalid
context.setInvalidGeometryCheck(invalid_features_method) context.setInvalidGeometryCheck(invalid_features_method)

View File

@ -47,9 +47,9 @@ def algorithmOptions(id):
alg = QgsApplication.processingRegistry().algorithmById(id) alg = QgsApplication.processingRegistry().algorithmById(id)
if alg is not None: if alg is not None:
opts = '' opts = ''
for param in alg.parameters: for param in alg.parameterDefinitions():
if isinstance(param, ParameterSelection): if isinstance(param, ParameterSelection):
opts += '{} ({})\n'.format(param.name, param.description) opts += '{} ({})\n'.format(param.name(), param.description())
for option in enumerate(param.options): for option in enumerate(param.options):
opts += '\t{} - {}\n'.format(option[0], option[1]) opts += '\t{} - {}\n'.format(option[0], option[1])
print(opts) print(opts)

View File

@ -26,7 +26,8 @@ __revision__ = '$Format:%H$'
import os import os
import codecs import codecs
from qgis.core import QgsApplication from qgis.core import (QgsApplication,
QgsProcessingParameterDefinition)
from processing.core.Processing import Processing from processing.core.Processing import Processing
from processing.core.parameters import ParameterMultipleInput, ParameterTableField, ParameterVector, ParameterSelection from processing.core.parameters import ParameterMultipleInput, ParameterTableField, ParameterVector, ParameterSelection
from processing.tools.system import mkdir from processing.tools.system import mkdir
@ -58,14 +59,14 @@ def baseHelpForAlgorithm(alg, folder):
# Algorithm parameters # Algorithm parameters
f.write('Parameters\n') f.write('Parameters\n')
f.write('----------\n\n') f.write('----------\n\n')
for p in alg.parameters: for p in alg.parameterDefinitions():
if isinstance(p, (ParameterMultipleInput, ParameterTableField, ParameterVector)): if isinstance(p, (ParameterMultipleInput, ParameterTableField, ParameterVector)):
f.write('``{}`` [{}: {}]\n'.format(p.description, p.typeName(), p.dataType())) f.write('``{}`` [{}: {}]\n'.format(p.description(), p.type(), p.dataType()))
else: else:
f.write('``{}`` [{}]\n'.format(p.description, p.typeName())) f.write('``{}`` [{}]\n'.format(p.description(), p.type()))
if hasattr(p, 'optional'): if hasattr(p, 'optional'):
if p.optional: if p.flags() & QgsProcessingParameterDefinition.FlagOptional:
f.write(' Optional.\n\n') f.write(' Optional.\n\n')
f.write(' <put parameter description here>\n\n') f.write(' <put parameter description here>\n\n')
@ -76,14 +77,14 @@ def baseHelpForAlgorithm(alg, folder):
f.write(' * {} --- {}\n'.format(count, opt)) f.write(' * {} --- {}\n'.format(count, opt))
f.write('\n') f.write('\n')
if hasattr(p, 'default'): if hasattr(p, 'defaultValue'):
f.write(' Default: *{}*\n\n'.format(p.default if p.default != '' else '(not set)')) f.write(' Default: *{}*\n\n'.format(p.defaultValue() if p.defaultValue() else '(not set)'))
# Algorithm outputs # Algorithm outputs
f.write('Outputs\n') f.write('Outputs\n')
f.write('-------\n\n') f.write('-------\n\n')
for o in alg.outputs: for o in alg.outputs:
f.write('``{}`` [{}]\n'.format(o.description, o.typeName())) f.write('``{}`` [{}]\n'.format(o.description(), o.type()))
f.write(' <put output description here>\n\n') f.write(' <put output description here>\n\n')
# Console usage # Console usage
@ -91,12 +92,12 @@ def baseHelpForAlgorithm(alg, folder):
f.write('-------------\n') f.write('-------------\n')
f.write('\n::\n\n') f.write('\n::\n\n')
cmd = " processing.run('{}', ".format(alg.id()) cmd = " processing.run('{}', ".format(alg.id())
for p in alg.parameters: for p in alg.parameterDefinitions():
cmd += '{}, '.format(p.name.lower().strip()) cmd += '{}, '.format(p.name().lower().strip())
for o in alg.outputs: for o in alg.outputs:
if not o.hidden: if not o.flags() & QgsProcessingParameterDefinition.FlagHidden:
cmd += '{}, '.format(o.name.lower().strip()) cmd += '{}, '.format(o.name().lower().strip())
cmd = cmd[:-2] + ')\n\n' cmd = cmd[:-2] + ')\n\n'
f.write(cmd) f.write(cmd)

View File

@ -23,7 +23,8 @@
#include "qgsvectorlayer.h" #include "qgsvectorlayer.h"
QgsProcessingAlgRunnerTask::QgsProcessingAlgRunnerTask( const QgsProcessingAlgorithm *algorithm, const QVariantMap &parameters, QgsProcessingContext &context ) QgsProcessingAlgRunnerTask::QgsProcessingAlgRunnerTask( const QgsProcessingAlgorithm *algorithm, const QVariantMap &parameters, QgsProcessingContext &context )
: mAlgorithm( algorithm ) : QgsTask( tr( "Running %1" ).arg( algorithm->name() ), QgsTask::CanCancel )
, mAlgorithm( algorithm )
, mParameters( parameters ) , mParameters( parameters )
, mContext( context ) , mContext( context )
{ {