Skip to content

Commit e232a08

Browse files
committed
[processing] Handle context in processing.run
Fix #15985 (Concave hull)
1 parent 6e38c1d commit e232a08

File tree

4 files changed

+26
-17
lines changed

4 files changed

+26
-17
lines changed

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

+9-7
Original file line numberDiff line numberDiff line change
@@ -87,16 +87,18 @@ def processAlgorithm(self, context, feedback):
8787

8888
# Delaunay triangulation from input point layer
8989
feedback.setProgressText(self.tr('Creating Delaunay triangles...'))
90-
delone_triangles = processing.run("qgis:delaunaytriangulation", layer, None)['OUTPUT']
90+
delone_triangles = processing.run("qgis:delaunaytriangulation", layer, None, context=context)['OUTPUT']
9191
delaunay_layer = QgsProcessingUtils.mapLayerFromString(delone_triangles, context)
9292

9393
# Get max edge length from Delaunay triangles
9494
feedback.setProgressText(self.tr('Computing edges max length...'))
95-
features = delaunay_layer.getFeatures()
96-
if len(features) == 0:
95+
96+
features = QgsProcessingUtils.getFeatures(delaunay_layer, context)
97+
count = QgsProcessingUtils.featureCount(delaunay_layer, context)
98+
if count == 0:
9799
raise GeoAlgorithmExecutionException(self.tr('No Delaunay triangles created.'))
98100

99-
counter = 50. / len(features)
101+
counter = 50. / count
100102
lengths = []
101103
edges = {}
102104
for feat in features:
@@ -126,14 +128,14 @@ def processAlgorithm(self, context, feedback):
126128

127129
# Dissolve all Delaunay triangles
128130
feedback.setProgressText(self.tr('Dissolving Delaunay triangles...'))
129-
dissolved = processing.run("qgis:dissolve", delaunay_layer,
130-
True, None, None)['OUTPUT']
131+
dissolved = processing.run("qgis:dissolve", delaunay_layer.id(),
132+
True, None, None, context=context)['OUTPUT']
131133
dissolved_layer = QgsProcessingUtils.mapLayerFromString(dissolved, context)
132134

133135
# Save result
134136
feedback.setProgressText(self.tr('Saving data...'))
135137
feat = QgsFeature()
136-
dissolved_layer.getFeatures(QgsFeatureRequest().setFilterFid(0)).nextFeature(feat)
138+
QgsProcessingUtils.getFeatures(dissolved_layer, context).nextFeature(feat)
137139
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields().toList(), QgsWkbTypes.Polygon,
138140
layer.crs(), context)
139141
geom = feat.geometry()

python/plugins/processing/core/GeoAlgorithm.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,9 @@ def execute(self, context=None, feedback=None, model=None):
212212
QgsMessageLog.logMessage('\n'.join(lines), self.tr('Processing'), QgsMessageLog.CRITICAL)
213213
raise GeoAlgorithmExecutionException(str(e) + self.tr('\nSee log for more details'), lines, e)
214214

215-
def _checkParameterValuesBeforeExecuting(self):
216-
context = dataobjects.createContext()
215+
def _checkParameterValuesBeforeExecuting(self, context=None):
216+
if context is None:
217+
context = dataobjects.createContext()
217218
for param in self.parameters:
218219
if isinstance(param, (ParameterRaster, ParameterVector,
219220
ParameterMultipleInput)):
@@ -380,11 +381,12 @@ def resolveDataObjects(self):
380381
break
381382
param.setValue(";".join(inputlayers))
382383

383-
def checkInputCRS(self):
384+
def checkInputCRS(self, context=None):
384385
"""It checks that all input layers use the same CRS. If so,
385386
returns True. False otherwise.
386387
"""
387-
context = dataobjects.createContext()
388+
if context is None:
389+
context = dataobjects.createContext()
388390
crsList = []
389391
for param in self.parameters:
390392
if isinstance(param, (ParameterRaster, ParameterVector, ParameterMultipleInput)):

python/plugins/processing/core/Processing.py

+8-3
Original file line numberDiff line numberDiff line change
@@ -199,15 +199,21 @@ def runAlgorithm(algOrName, onFinish, *args, **kwargs):
199199
return
200200
i = i + 1
201201

202-
msg = alg._checkParameterValuesBeforeExecuting()
202+
context = None
203+
if kwargs is not None and 'context' in list(kwargs.keys()):
204+
context = kwargs["context"]
205+
else:
206+
context = dataobjects.createContext()
207+
208+
msg = alg._checkParameterValuesBeforeExecuting(context)
203209
if msg:
204210
# fix_print_with_import
205211
print('Unable to execute algorithm\n' + str(msg))
206212
QgsMessageLog.logMessage(Processing.tr('Unable to execute algorithm\n{0}').format(msg),
207213
Processing.tr("Processing"))
208214
return
209215

210-
if not alg.checkInputCRS():
216+
if not alg.checkInputCRS(context):
211217
print('Warning: Not all input layers use the same CRS.\n' +
212218
'This can cause unexpected results.')
213219
QgsMessageLog.logMessage(
@@ -231,7 +237,6 @@ def runAlgorithm(algOrName, onFinish, *args, **kwargs):
231237
feedback = kwargs["feedback"]
232238
elif iface is not None:
233239
feedback = MessageBarProgress(alg.displayName())
234-
context = dataobjects.createContext()
235240

236241
ret = execute(alg, context, feedback)
237242
if ret:

python/plugins/processing/gui/AlgorithmDialog.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,8 @@ def checkExtentCRS(self):
146146
def accept(self):
147147
self.settings.setValue("/Processing/dialogBase", self.saveGeometry())
148148

149+
context = dataobjects.createContext()
150+
149151
checkCRS = ProcessingConfig.getSetting(ProcessingConfig.WARN_UNMATCHING_CRS)
150152
try:
151153
self.setParamValues()
@@ -169,7 +171,7 @@ def accept(self):
169171
QMessageBox.No)
170172
if reply == QMessageBox.No:
171173
return
172-
msg = self.alg._checkParameterValuesBeforeExecuting()
174+
msg = self.alg._checkParameterValuesBeforeExecuting(context)
173175
if msg:
174176
QMessageBox.warning(
175177
self, self.tr('Unable to execute algorithm'), msg)
@@ -199,8 +201,6 @@ def accept(self):
199201
self.setInfo(
200202
self.tr('<b>Algorithm {0} starting...</b>').format(self.alg.displayName()))
201203

202-
context = dataobjects.createContext()
203-
204204
if self.iterateParam:
205205
if executeIterating(self.alg, self.iterateParam, context, self.feedback):
206206
self.finish(context)

0 commit comments

Comments
 (0)