Skip to content

Commit cd7776c

Browse files
committed
Upgrade ported python algs to be thread ready
1 parent c2621b1 commit cd7776c

36 files changed

+924
-588
lines changed

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

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -74,28 +74,38 @@ def __init__(self):
7474
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT_LAYER, self.tr('Added')))
7575
self.addOutput(QgsProcessingOutputVectorLayer(self.OUTPUT_LAYER, self.tr('Added')))
7676

77+
self.source = None
78+
self.fieldType = None
79+
self.fieldLength = None
80+
self.fieldName = None
81+
self.fieldPrecision = None
82+
self.sink = None
83+
self.dest_id = None
84+
7785
def name(self):
7886
return 'addfieldtoattributestable'
7987

8088
def displayName(self):
8189
return self.tr('Add field to attributes table')
8290

83-
def processAlgorithm(self, parameters, context, feedback):
84-
source = self.parameterAsSource(parameters, self.INPUT_LAYER, context)
91+
def prepareAlgorithm(self, parameters, context, feedback):
92+
self.source = self.parameterAsSource(parameters, self.INPUT_LAYER, context)
8593

86-
fieldType = self.parameterAsEnum(parameters, self.FIELD_TYPE, context)
87-
fieldName = self.parameterAsString(parameters, self.FIELD_NAME, context)
88-
fieldLength = self.parameterAsInt(parameters, self.FIELD_LENGTH, context)
89-
fieldPrecision = self.parameterAsInt(parameters, self.FIELD_PRECISION, context)
94+
self.fieldType = self.parameterAsEnum(parameters, self.FIELD_TYPE, context)
95+
self.fieldName = self.parameterAsString(parameters, self.FIELD_NAME, context)
96+
self.fieldLength = self.parameterAsInt(parameters, self.FIELD_LENGTH, context)
97+
self.fieldPrecision = self.parameterAsInt(parameters, self.FIELD_PRECISION, context)
9098

91-
fields = source.fields()
92-
fields.append(QgsField(fieldName, self.TYPES[fieldType], '',
93-
fieldLength, fieldPrecision))
94-
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT_LAYER, context,
95-
fields, source.wkbType(), source.sourceCrs())
99+
fields = self.source.fields()
100+
fields.append(QgsField(self.fieldName, self.TYPES[self.fieldType], '',
101+
self.fieldLength, self.fieldPrecision))
102+
(self.sink, self.dest_id) = self.parameterAsSink(parameters, self.OUTPUT_LAYER, context,
103+
fields, self.source.wkbType(), self.source.sourceCrs())
104+
return True
96105

97-
features = source.getFeatures()
98-
total = 100.0 / source.featureCount() if source.featureCount() else 0
106+
def processAlgorithm(self, context, feedback):
107+
features = self.source.getFeatures()
108+
total = 100.0 / self.source.featureCount() if self.source.featureCount() else 0
99109

100110
for current, input_feature in enumerate(features):
101111
if feedback.isCanceled():
@@ -106,7 +116,10 @@ def processAlgorithm(self, parameters, context, feedback):
106116
attributes.append(None)
107117
output_feature.setAttributes(attributes)
108118

109-
sink.addFeature(output_feature, QgsFeatureSink.FastInsert)
119+
self.sink.addFeature(output_feature, QgsFeatureSink.FastInsert)
110120
feedback.setProgress(int(current * total))
111121

112-
return {self.OUTPUT_LAYER: dest_id}
122+
return True
123+
124+
def postProcessAlgorithm(self, context, feedback):
125+
return {self.OUTPUT_LAYER: self.dest_id}

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

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747

4848
class Aspect(QgisAlgorithm):
4949

50-
INPUT_LAYER = 'INPUT_LAYER'
50+
INPUT = 'INPUT'
5151
Z_FACTOR = 'Z_FACTOR'
5252
OUTPUT_LAYER = 'OUTPUT_LAYER'
5353

@@ -60,30 +60,38 @@ def group(self):
6060
def __init__(self):
6161
super().__init__()
6262

63-
self.addParameter(QgsProcessingParameterRasterLayer(self.INPUT_LAYER,
63+
self.addParameter(QgsProcessingParameterRasterLayer(self.INPUT,
6464
self.tr('Elevation layer')))
6565
self.addParameter(QgsProcessingParameterNumber(self.Z_FACTOR,
6666
self.tr('Z factor'), QgsProcessingParameterNumber.Double,
6767
1, False, 1, 999999.99))
68-
self.addParameter(QgsProcessingParameterRasterOutput(self.OUTPUT_LAYER, self.tr('Aspect')))
69-
self.addOutput(QgsProcessingOutputRasterLayer(self.OUTPUT_LAYER, self.tr('Aspect')))
68+
self.addParameter(QgsProcessingParameterRasterOutput(self.OUTPUT, self.tr('Aspect')))
69+
self.addOutput(QgsProcessingOutputRasterLayer(self.OUTPUT, self.tr('Aspect')))
70+
71+
self.inputFile = None
72+
self.outputFile = None
73+
self.outputFormat = None
74+
self.zFactor = None
7075

7176
def name(self):
7277
return 'aspect'
7378

7479
def displayName(self):
7580
return self.tr('Aspect')
7681

77-
def processAlgorithm(self, parameters, context, feedback):
78-
inputFile = exportRasterLayer(self.parameterAsRasterLayer(parameters, self.INPUT_LAYER, context))
79-
zFactor = self.parameterAsDouble(parameters, self.Z_FACTOR, context)
82+
def prepareAlgorithm(self, parameters, context, feedback):
83+
self.inputFile = exportRasterLayer(self.parameterAsRasterLayer(parameters, self.INPUT, context))
84+
self.zFactor = self.parameterAsDouble(parameters, self.Z_FACTOR, context)
8085

81-
outputFile = self.parameterAsRasterOutputLayer(parameters, self.OUTPUT_LAYER, context)
86+
self.outputFile = self.parameterAsRasterOutputLayer(parameters, self.OUTPUT, context)
8287

83-
outputFormat = raster.formatShortNameFromFileName(outputFile)
88+
self.outputFormat = raster.formatShortNameFromFileName(self.outputFile)
89+
return True
8490

85-
aspect = QgsAspectFilter(inputFile, outputFile, outputFormat)
86-
aspect.setZFactor(zFactor)
87-
aspect.processRaster(feedback)
91+
def processAlgorithm(self, context, feedback):
92+
aspect = QgsAspectFilter(self.inputFile, self.outputFile, self.outputFormat)
93+
aspect.setZFactor(self.zFactor)
94+
return aspect.processRaster(feedback) == 0
8895

89-
return {self.OUTPUT_LAYER: outputFile}
96+
def postProcessAlgorithm(self, context, feedback):
97+
return {self.OUTPUT: self.outputFile}

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

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ def __init__(self):
5151
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Incremented')))
5252
self.addOutput(QgsProcessingOutputVectorLayer(self.OUTPUT, self.tr('Incremented')))
5353

54+
self.source = None
55+
self.sink = None
56+
self.dest_id = None
57+
5458
def group(self):
5559
return self.tr('Vector table tools')
5660

@@ -60,16 +64,18 @@ def name(self):
6064
def displayName(self):
6165
return self.tr('Add autoincremental field')
6266

63-
def processAlgorithm(self, parameters, context, feedback):
64-
source = self.parameterAsSource(parameters, self.INPUT, context)
65-
fields = source.fields()
67+
def prepareAlgorithm(self, parameters, context, feedback):
68+
self.source = self.parameterAsSource(parameters, self.INPUT, context)
69+
fields = self.source.fields()
6670
fields.append(QgsField('AUTO', QVariant.Int))
6771

68-
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
69-
fields, source.wkbType(), source.sourceCrs())
72+
(self.sink, self.dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
73+
fields, self.source.wkbType(), self.source.sourceCrs())
74+
return True
7075

71-
features = source.getFeatures()
72-
total = 100.0 / source.featureCount() if source.featureCount() else 0
76+
def processAlgorithm(self, context, feedback):
77+
features = self.source.getFeatures()
78+
total = 100.0 / self.source.featureCount() if self.source.featureCount() else 0
7379
for current, input_feature in enumerate(features):
7480
if feedback.isCanceled():
7581
break
@@ -79,7 +85,9 @@ def processAlgorithm(self, parameters, context, feedback):
7985
attributes.append(current)
8086
output_feature.setAttributes(attributes)
8187

82-
sink.addFeature(output_feature, QgsFeatureSink.FastInsert)
88+
self.sink.addFeature(output_feature, QgsFeatureSink.FastInsert)
8389
feedback.setProgress(int(current * total))
90+
return True
8491

85-
return {self.OUTPUT: dest_id}
92+
def postProcessAlgorithm(self, context, feedback):
93+
return {self.OUTPUT: self.dest_id}

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

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -119,42 +119,52 @@ def __init__(self):
119119
self.addOutput(QgsProcessingOutputNumber(self.THIRDQUARTILE, self.tr('Third quartile')))
120120
self.addOutput(QgsProcessingOutputNumber(self.IQR, self.tr('Interquartile Range (IQR)')))
121121

122+
self.source = None
123+
self.field = None
124+
self.field_name = None
125+
self.output_file = None
126+
self.results = {}
127+
122128
def name(self):
123129
return 'basicstatisticsforfields'
124130

125131
def displayName(self):
126132
return self.tr('Basic statistics for fields')
127133

128-
def processAlgorithm(self, parameters, context, feedback):
129-
source = self.parameterAsSource(parameters, self.INPUT_LAYER, context)
130-
field_name = self.parameterAsString(parameters, self.FIELD_NAME, context)
131-
field = source.fields().at(source.fields().lookupField(field_name))
134+
def prepareAlgorithm(self, parameters, context, feedback):
135+
self.source = self.parameterAsSource(parameters, self.INPUT_LAYER, context)
136+
self.field_name = self.parameterAsString(parameters, self.FIELD_NAME, context)
137+
self.field = self.source.fields().at(self.source.fields().lookupField(self.field_name))
132138

133-
output_file = self.parameterAsFileOutput(parameters, self.OUTPUT_HTML_FILE, context)
139+
self.output_file = self.parameterAsFileOutput(parameters, self.OUTPUT_HTML_FILE, context)
140+
return True
134141

135-
request = QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry).setSubsetOfAttributes([field_name], source.fields())
136-
features = source.getFeatures(request)
137-
count = source.featureCount()
142+
def processAlgorithm(self, context, feedback):
143+
request = QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry).setSubsetOfAttributes([self.field_name], self.source.fields())
144+
features = self.source.getFeatures(request)
145+
count = self.source.featureCount()
138146

139147
data = []
140-
data.append(self.tr('Analyzed field: {}').format(field_name))
141-
results = {}
148+
data.append(self.tr('Analyzed field: {}').format(self.field_name))
142149

143-
if field.isNumeric():
144-
d, results = self.calcNumericStats(features, feedback, field, count)
150+
if self.field.isNumeric():
151+
d, self.results = self.calcNumericStats(features, feedback, self.field, count)
145152
data.extend(d)
146-
elif field.type() in (QVariant.Date, QVariant.Time, QVariant.DateTime):
147-
d, results = self.calcDateTimeStats(features, feedback, field, count)
153+
elif self.field.type() in (QVariant.Date, QVariant.Time, QVariant.DateTime):
154+
d, self.results = self.calcDateTimeStats(features, feedback, self.field, count)
148155
data.extend(d)
149156
else:
150-
d, results = self.calcStringStats(features, feedback, field, count)
157+
d, self.results = self.calcStringStats(features, feedback, self.field, count)
151158
data.extend(d)
152159

153-
if output_file:
154-
self.createHTML(output_file, data)
155-
results[self.OUTPUT_HTML_FILE] = output_file
160+
if self.output_file:
161+
self.createHTML(self.output_file, data)
162+
self.results[self.OUTPUT_HTML_FILE] = self.output_file
163+
164+
return True
156165

157-
return results
166+
def postProcessAlgorithm(self, context, feedback):
167+
return self.results
158168

159169
def calcNumericStats(self, features, feedback, field, count):
160170
total = 100.0 / count if count else 0

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

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ def __init__(self):
5858
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT_LAYER, self.tr('Boundary')))
5959
self.addOutput(QgsProcessingOutputVectorLayer(self.OUTPUT_LAYER, self.tr("Boundaries")))
6060

61+
self.source = None
62+
self.sink = None
63+
self.dest_id = None
64+
6165
def icon(self):
6266
return QIcon(os.path.join(pluginPath, 'images', 'ftools', 'convex_hull.png'))
6367

@@ -70,10 +74,11 @@ def name(self):
7074
def displayName(self):
7175
return self.tr('Boundary')
7276

73-
def processAlgorithm(self, parameters, context, feedback):
74-
source = self.parameterAsSource(parameters, self.INPUT_LAYER, context)
77+
def prepareAlgorithm(self, parameters, context, feedback):
78+
self.source = self.parameterAsSource(parameters, self.INPUT_LAYER, context)
7579

76-
input_wkb = source.wkbType()
80+
input_wkb = self.source.wkbType()
81+
output_wkb = None
7782
if QgsWkbTypes.geometryType(input_wkb) == QgsWkbTypes.LineGeometry:
7883
output_wkb = QgsWkbTypes.MultiPoint
7984
elif QgsWkbTypes.geometryType(input_wkb) == QgsWkbTypes.PolygonGeometry:
@@ -83,11 +88,13 @@ def processAlgorithm(self, parameters, context, feedback):
8388
if QgsWkbTypes.hasM(input_wkb):
8489
output_wkb = QgsWkbTypes.addM(output_wkb)
8590

86-
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT_LAYER, context,
87-
source.fields(), output_wkb, source.sourceCrs())
91+
(self.sink, self.dest_id) = self.parameterAsSink(parameters, self.OUTPUT_LAYER, context,
92+
self.source.fields(), output_wkb, self.source.sourceCrs())
93+
return True
8894

89-
features = source.getFeatures()
90-
total = 100.0 / source.featureCount() if source.featureCount() else 0
95+
def processAlgorithm(self, context, feedback):
96+
features = self.source.getFeatures()
97+
total = 100.0 / self.source.featureCount() if self.source.featureCount() else 0
9198

9299
for current, input_feature in enumerate(features):
93100
if feedback.isCanceled():
@@ -102,7 +109,9 @@ def processAlgorithm(self, parameters, context, feedback):
102109

103110
output_feature.setGeometry(output_geometry)
104111

105-
sink.addFeature(output_feature, QgsFeatureSink.FastInsert)
112+
self.sink.addFeature(output_feature, QgsFeatureSink.FastInsert)
106113
feedback.setProgress(int(current * total))
114+
return True
107115

108-
return {self.OUTPUT_LAYER: dest_id}
116+
def postProcessAlgorithm(self, context, feedback):
117+
return {self.OUTPUT_LAYER: self.dest_id}

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

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,20 +66,26 @@ def __init__(self):
6666
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT_LAYER, self.tr('Bounds'), QgsProcessingParameterDefinition.TypeVectorPolygon))
6767
self.addOutput(QgsProcessingOutputVectorLayer(self.OUTPUT_LAYER, self.tr("Bounds")))
6868

69+
self.source = None
70+
self.sink = None
71+
self.dest_id = None
72+
6973
def name(self):
7074
return 'boundingboxes'
7175

7276
def displayName(self):
7377
return self.tr('Bounding boxes')
7478

75-
def processAlgorithm(self, parameters, context, feedback):
76-
source = self.parameterAsSource(parameters, self.INPUT_LAYER, context)
79+
def prepareAlgorithm(self, parameters, context, feedback):
80+
self.source = self.parameterAsSource(parameters, self.INPUT_LAYER, context)
7781

78-
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT_LAYER, context,
79-
source.fields(), QgsWkbTypes.Polygon, source.sourceCrs())
82+
(self.sink, self.dest_id) = self.parameterAsSink(parameters, self.OUTPUT_LAYER, context,
83+
self.source.fields(), QgsWkbTypes.Polygon, self.source.sourceCrs())
84+
return True
8085

81-
features = source.getFeatures()
82-
total = 100.0 / source.featureCount() if source.featureCount() else 0
86+
def processAlgorithm(self, context, feedback):
87+
features = self.source.getFeatures()
88+
total = 100.0 / self.source.featureCount() if self.source.featureCount() else 0
8389

8490
for current, input_feature in enumerate(features):
8591
if feedback.isCanceled():
@@ -94,7 +100,9 @@ def processAlgorithm(self, parameters, context, feedback):
94100

95101
output_feature.setGeometry(output_geometry)
96102

97-
sink.addFeature(output_feature, QgsFeatureSink.FastInsert)
103+
self.sink.addFeature(output_feature, QgsFeatureSink.FastInsert)
98104
feedback.setProgress(int(current * total))
105+
return True
99106

100-
return {self.OUTPUT_LAYER: dest_id}
107+
def postProcessAlgorithm(self, context, feedback):
108+
return {self.OUTPUT_LAYER: self.dest_id}

0 commit comments

Comments
 (0)