Skip to content

Commit 7f7842a

Browse files
authored
Merge pull request #4783 from nyalldawson/script
processing: restore script algorithm provider and tests
2 parents 1468eef + 4f096a6 commit 7f7842a

15 files changed

+205
-242
lines changed

python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py

+8-6
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@
6363
from .RandomExtract import RandomExtract
6464
from .RandomExtractWithinSubsets import RandomExtractWithinSubsets
6565
from .RegularPoints import RegularPoints
66+
from .SaveSelectedFeatures import SaveSelectedFeatures
67+
from .SelectByAttribute import SelectByAttribute
68+
from .SelectByExpression import SelectByExpression
6669
from .SimplifyGeometries import SimplifyGeometries
6770
from .Smooth import Smooth
6871
from .SpatialiteExecuteSQL import SpatialiteExecuteSQL
@@ -98,7 +101,6 @@
98101
# from .SpatialJoin import SpatialJoin
99102
# from .DeleteDuplicateGeometries import DeleteDuplicateGeometries
100103
# from .TextToFloat import TextToFloat
101-
# from .SelectByAttribute import SelectByAttribute
102104
# from .GridLine import GridLine
103105
# from .Gridify import Gridify
104106
# from .HubDistancePoints import HubDistancePoints
@@ -110,7 +112,6 @@
110112
# from .StatisticsByCategories import StatisticsByCategories
111113
# from .EquivalentNumField import EquivalentNumField
112114
# from .FieldsCalculator import FieldsCalculator
113-
# from .SaveSelectedFeatures import SaveSelectedFeatures
114115
# from .Explode import Explode
115116
# from .FieldPyculator import FieldsPyculator
116117
# from .JoinAttributes import JoinAttributes
@@ -128,7 +129,6 @@
128129
# from .PointsToPaths import PointsToPaths
129130
# from .SetVectorStyle import SetVectorStyle
130131
# from .SetRasterStyle import SetRasterStyle
131-
# from .SelectByExpression import SelectByExpression
132132
# from .SelectByAttributeSum import SelectByAttributeSum
133133
# from .HypsometricCurves import HypsometricCurves
134134
# from .SplitWithLines import SplitWithLines
@@ -202,11 +202,10 @@ def getAlgs(self):
202202
# ExtractByLocation(),
203203
# SpatialJoin(),
204204
# DeleteDuplicateGeometries(), TextToFloat(),
205-
# SelectByAttribute(),
206205
# GridLine(), Gridify(), HubDistancePoints(),
207206
# HubDistanceLines(), HubLines(),
208207
# GeometryConvert(), FieldsCalculator(),
209-
# SaveSelectedFeatures(), JoinAttributes(),
208+
# JoinAttributes(),
210209
# Explode(), FieldsPyculator(),
211210
# EquivalentNumField(), PointsLayerFromTable(),
212211
# StatisticsByCategories(), ConcaveHull(),
@@ -217,7 +216,7 @@ def getAlgs(self):
217216
# RandomPointsPolygonsVariable(),
218217
# RandomPointsAlongLines(), PointsToPaths(),
219218
# SetVectorStyle(), SetRasterStyle(),
220-
# SelectByExpression(), HypsometricCurves(),
219+
# HypsometricCurves(),
221220
# SplitWithLines(), CreateConstantRaster(),
222221
# FieldsMapper(), SelectByAttributeSum(), Datasources2Vrt(),
223222
# OrientedMinimumBoundingBox(),
@@ -265,6 +264,9 @@ def getAlgs(self):
265264
RandomExtract(),
266265
RandomExtractWithinSubsets(),
267266
RegularPoints(),
267+
SaveSelectedFeatures(),
268+
SelectByAttribute(),
269+
SelectByExpression(),
268270
SimplifyGeometries(),
269271
Smooth(),
270272
SpatialiteExecuteSQL(),

python/plugins/processing/algs/qgis/SaveSelectedFeatures.py

+19-20
Original file line numberDiff line numberDiff line change
@@ -25,30 +25,29 @@
2525

2626
__revision__ = '$Format:%H$'
2727

28-
from qgis.core import (QgsApplication,
29-
QgsFeatureSink,
30-
QgsProcessingUtils)
28+
from qgis.core import (QgsFeatureSink,
29+
QgsProcessingUtils,
30+
QgsProcessingParameterVectorLayer,
31+
QgsProcessingParameterFeatureSink,
32+
QgsProcessingOutputVectorLayer)
3133
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
3234
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
33-
from processing.core.parameters import ParameterVector
34-
from processing.core.outputs import OutputVector
3535

3636

3737
class SaveSelectedFeatures(QgisAlgorithm):
3838

39-
OUTPUT_LAYER = 'OUTPUT_LAYER'
40-
INPUT_LAYER = 'INPUT_LAYER'
39+
OUTPUT = 'OUTPUT'
40+
INPUT = 'INPUT'
4141

4242
def group(self):
4343
return self.tr('Vector general tools')
4444

4545
def __init__(self):
4646
super().__init__()
47-
self.addParameter(ParameterVector(self.INPUT_LAYER,
48-
self.tr('Input layer')))
4947

50-
self.addOutput(OutputVector(self.OUTPUT_LAYER,
51-
self.tr('Selection')))
48+
self.addParameter(QgsProcessingParameterVectorLayer(self.INPUT, self.tr('Input layer')))
49+
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Selection')))
50+
self.addOutput(QgsProcessingOutputVectorLayer(self.OUTPUT, self.tr("Selection")))
5251

5352
def name(self):
5453
return 'saveselectedfeatures'
@@ -57,20 +56,20 @@ def displayName(self):
5756
return self.tr('Save selected features')
5857

5958
def processAlgorithm(self, parameters, context, feedback):
60-
inputFilename = self.getParameterValue(self.INPUT_LAYER)
61-
output = self.getOutputFromName(self.OUTPUT_LAYER)
59+
vectorLayer = self.parameterAsVectorLayer(parameters, self.INPUT, context)
6260

63-
vectorLayer = QgsProcessingUtils.mapLayerFromString(inputFilename, context)
64-
65-
writer = output.getVectorWriter(vectorLayer.fields(), vectorLayer.wkbType(), vectorLayer.crs(), context)
61+
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
62+
vectorLayer.fields(), vectorLayer.wkbType(), vectorLayer.sourceCrs())
6663

6764
features = vectorLayer.getSelectedFeatures()
6865
count = int(vectorLayer.selectedFeatureCount())
69-
if count == 0:
70-
raise GeoAlgorithmExecutionException(self.tr('There are no selected features in the input layer.'))
7166

7267
total = 100.0 / count if count else 1
7368
for current, feat in enumerate(features):
74-
writer.addFeature(feat, QgsFeatureSink.FastInsert)
69+
if feedback.isCanceled():
70+
break
71+
72+
sink.addFeature(feat, QgsFeatureSink.FastInsert)
7573
feedback.setProgress(int(current * total))
76-
del writer
74+
75+
return {self.OUTPUT: dest_id}

python/plugins/processing/algs/qgis/SelectByAttribute.py

+20-20
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@
2828
from qgis.core import (QgsApplication)
2929
from qgis.PyQt.QtCore import QVariant
3030
from qgis.core import (QgsExpression,
31-
QgsProcessingUtils)
31+
QgsProcessingUtils,
32+
QgsProcessingParameterVectorLayer,
33+
QgsProcessingParameterField,
34+
QgsProcessingParameterEnum,
35+
QgsProcessingParameterString,
36+
QgsProcessingOutputVectorLayer)
3237
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
3338
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
34-
from processing.core.parameters import ParameterVector
35-
from processing.core.parameters import ParameterTableField
36-
from processing.core.parameters import ParameterSelection
37-
from processing.core.parameters import ParameterString
38-
from processing.core.outputs import OutputVector
3939

4040

4141
class SelectByAttribute(QgisAlgorithm):
@@ -82,15 +82,15 @@ def __init__(self):
8282
self.tr('does not contain')
8383
]
8484

85-
self.addParameter(ParameterVector(self.INPUT,
86-
self.tr('Input Layer')))
87-
self.addParameter(ParameterTableField(self.FIELD,
88-
self.tr('Selection attribute'), self.INPUT))
89-
self.addParameter(ParameterSelection(self.OPERATOR,
90-
self.tr('Operator'), self.i18n_operators))
91-
self.addParameter(ParameterString(self.VALUE, self.tr('Value')))
85+
self.addParameter(QgsProcessingParameterVectorLayer(self.INPUT, self.tr('Input layer')))
9286

93-
self.addOutput(OutputVector(self.OUTPUT, self.tr('Selected (attribute)'), True))
87+
self.addParameter(QgsProcessingParameterField(self.FIELD,
88+
self.tr('Selection attribute'), parentLayerParameterName=self.INPUT))
89+
self.addParameter(QgsProcessingParameterEnum(self.OPERATOR,
90+
self.tr('Operator'), self.i18n_operators))
91+
self.addParameter(QgsProcessingParameterString(self.VALUE, self.tr('Value')))
92+
93+
self.addOutput(QgsProcessingOutputVectorLayer(self.OUTPUT, self.tr('Selected (attribute)')))
9494

9595
def name(self):
9696
return 'selectbyattribute'
@@ -99,11 +99,11 @@ def displayName(self):
9999
return self.tr('Select by attribute')
100100

101101
def processAlgorithm(self, parameters, context, feedback):
102-
fileName = self.getParameterValue(self.INPUT)
103-
layer = QgsProcessingUtils.mapLayerFromString(fileName, context)
104-
fieldName = self.getParameterValue(self.FIELD)
105-
operator = self.OPERATORS[self.getParameterValue(self.OPERATOR)]
106-
value = self.getParameterValue(self.VALUE)
102+
layer = self.parameterAsVectorLayer(parameters, self.INPUT, context)
103+
104+
fieldName = self.parameterAsString(parameters, self.FIELD, context)
105+
operator = self.OPERATORS[self.parameterAsEnum(parameters, self.OPERATOR, context)]
106+
value = self.parameterAsString(parameters, self.VALUE, context)
107107

108108
fields = layer.fields()
109109

@@ -135,4 +135,4 @@ def processAlgorithm(self, parameters, context, feedback):
135135
raise GeoAlgorithmExecutionException(expression.parserErrorString())
136136

137137
layer.selectByExpression(expression_string)
138-
self.setOutputValue(self.OUTPUT, fileName)
138+
return {self.OUTPUT: parameters[self.INPUT]}

python/plugins/processing/algs/qgis/SelectByExpression.py

+20-21
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,21 @@
2424

2525
__revision__ = '$Format:%H$'
2626

27-
from qgis.core import (QgsApplication,
28-
QgsExpression,
27+
from qgis.core import (QgsExpression,
2928
QgsVectorLayer,
30-
QgsProcessingUtils)
29+
QgsProcessingParameterVectorLayer,
30+
QgsProcessingParameterExpression,
31+
QgsProcessingParameterEnum,
32+
QgsProcessingOutputVectorLayer)
3133
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
32-
from processing.core.parameters import ParameterVector
33-
from processing.core.parameters import ParameterSelection
34-
from processing.core.outputs import OutputVector
3534
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
36-
from processing.core.parameters import ParameterExpression
3735

3836

3937
class SelectByExpression(QgisAlgorithm):
4038

41-
LAYERNAME = 'LAYERNAME'
39+
INPUT = 'INPUT'
4240
EXPRESSION = 'EXPRESSION'
43-
RESULT = 'RESULT'
41+
OUTPUT = 'OUTPUT'
4442
METHOD = 'METHOD'
4543

4644
def group(self):
@@ -53,13 +51,14 @@ def __init__(self):
5351
self.tr('removing from current selection'),
5452
self.tr('selecting within current selection')]
5553

56-
self.addParameter(ParameterVector(self.LAYERNAME,
57-
self.tr('Input Layer')))
58-
self.addParameter(ParameterExpression(self.EXPRESSION,
59-
self.tr("Expression"), parent_layer=self.LAYERNAME))
60-
self.addParameter(ParameterSelection(self.METHOD,
61-
self.tr('Modify current selection by'), self.methods, 0))
62-
self.addOutput(OutputVector(self.RESULT, self.tr('Selected (expression)'), True))
54+
self.addParameter(QgsProcessingParameterVectorLayer(self.INPUT, self.tr('Input layer')))
55+
56+
self.addParameter(QgsProcessingParameterExpression(self.EXPRESSION,
57+
self.tr('Expression'), parentLayerParameterName=self.INPUT))
58+
self.addParameter(QgsProcessingParameterEnum(self.METHOD,
59+
self.tr('Modify current selection by'), self.methods, 0))
60+
61+
self.addOutput(QgsProcessingOutputVectorLayer(self.OUTPUT, self.tr('Selected (attribute)')))
6362

6463
def name(self):
6564
return 'selectbyexpression'
@@ -68,9 +67,9 @@ def displayName(self):
6867
return self.tr('Select by expression')
6968

7069
def processAlgorithm(self, parameters, context, feedback):
71-
filename = self.getParameterValue(self.LAYERNAME)
72-
layer = QgsProcessingUtils.mapLayerFromString(filename, context)
73-
method = self.getParameterValue(self.METHOD)
70+
layer = self.parameterAsVectorLayer(parameters, self.INPUT, context)
71+
72+
method = self.parameterAsEnum(parameters, self.METHOD, context)
7473

7574
if method == 0:
7675
behavior = QgsVectorLayer.SetSelection
@@ -81,10 +80,10 @@ def processAlgorithm(self, parameters, context, feedback):
8180
elif method == 3:
8281
behavior = QgsVectorLayer.IntersectSelection
8382

84-
expression = self.getParameterValue(self.EXPRESSION)
83+
expression = self.parameterAsString(parameters, self.EXPRESSION, context)
8584
qExp = QgsExpression(expression)
8685
if qExp.hasParserError():
8786
raise GeoAlgorithmExecutionException(qExp.parserErrorString())
8887

8988
layer.selectByExpression(expression, behavior)
90-
self.setOutputValue(self.RESULT, filename)
89+
return {self.OUTPUT: parameters[self.INPUT]}

0 commit comments

Comments
 (0)