[processing] Handle context in processing.run

Fix #15985 (Concave hull)
This commit is contained in:
arnaud.morvan@camptocamp.com 2017-04-29 12:14:53 +02:00
parent 6e38c1d692
commit e232a0809c
4 changed files with 26 additions and 17 deletions

View File

@ -87,16 +87,18 @@ class ConcaveHull(GeoAlgorithm):
# Delaunay triangulation from input point layer
feedback.setProgressText(self.tr('Creating Delaunay triangles...'))
delone_triangles = processing.run("qgis:delaunaytriangulation", layer, None)['OUTPUT']
delone_triangles = processing.run("qgis:delaunaytriangulation", layer, None, context=context)['OUTPUT']
delaunay_layer = QgsProcessingUtils.mapLayerFromString(delone_triangles, context)
# Get max edge length from Delaunay triangles
feedback.setProgressText(self.tr('Computing edges max length...'))
features = delaunay_layer.getFeatures()
if len(features) == 0:
features = QgsProcessingUtils.getFeatures(delaunay_layer, context)
count = QgsProcessingUtils.featureCount(delaunay_layer, context)
if count == 0:
raise GeoAlgorithmExecutionException(self.tr('No Delaunay triangles created.'))
counter = 50. / len(features)
counter = 50. / count
lengths = []
edges = {}
for feat in features:
@ -126,14 +128,14 @@ class ConcaveHull(GeoAlgorithm):
# Dissolve all Delaunay triangles
feedback.setProgressText(self.tr('Dissolving Delaunay triangles...'))
dissolved = processing.run("qgis:dissolve", delaunay_layer,
True, None, None)['OUTPUT']
dissolved = processing.run("qgis:dissolve", delaunay_layer.id(),
True, None, None, context=context)['OUTPUT']
dissolved_layer = QgsProcessingUtils.mapLayerFromString(dissolved, context)
# Save result
feedback.setProgressText(self.tr('Saving data...'))
feat = QgsFeature()
dissolved_layer.getFeatures(QgsFeatureRequest().setFilterFid(0)).nextFeature(feat)
QgsProcessingUtils.getFeatures(dissolved_layer, context).nextFeature(feat)
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields().toList(), QgsWkbTypes.Polygon,
layer.crs(), context)
geom = feat.geometry()

View File

@ -212,8 +212,9 @@ class GeoAlgorithm(QgsProcessingAlgorithm):
QgsMessageLog.logMessage('\n'.join(lines), self.tr('Processing'), QgsMessageLog.CRITICAL)
raise GeoAlgorithmExecutionException(str(e) + self.tr('\nSee log for more details'), lines, e)
def _checkParameterValuesBeforeExecuting(self):
context = dataobjects.createContext()
def _checkParameterValuesBeforeExecuting(self, context=None):
if context is None:
context = dataobjects.createContext()
for param in self.parameters:
if isinstance(param, (ParameterRaster, ParameterVector,
ParameterMultipleInput)):
@ -380,11 +381,12 @@ class GeoAlgorithm(QgsProcessingAlgorithm):
break
param.setValue(";".join(inputlayers))
def checkInputCRS(self):
def checkInputCRS(self, context=None):
"""It checks that all input layers use the same CRS. If so,
returns True. False otherwise.
"""
context = dataobjects.createContext()
if context is None:
context = dataobjects.createContext()
crsList = []
for param in self.parameters:
if isinstance(param, (ParameterRaster, ParameterVector, ParameterMultipleInput)):

View File

@ -199,7 +199,13 @@ class Processing(object):
return
i = i + 1
msg = alg._checkParameterValuesBeforeExecuting()
context = None
if kwargs is not None and 'context' in list(kwargs.keys()):
context = kwargs["context"]
else:
context = dataobjects.createContext()
msg = alg._checkParameterValuesBeforeExecuting(context)
if msg:
# fix_print_with_import
print('Unable to execute algorithm\n' + str(msg))
@ -207,7 +213,7 @@ class Processing(object):
Processing.tr("Processing"))
return
if not alg.checkInputCRS():
if not alg.checkInputCRS(context):
print('Warning: Not all input layers use the same CRS.\n' +
'This can cause unexpected results.')
QgsMessageLog.logMessage(
@ -231,7 +237,6 @@ class Processing(object):
feedback = kwargs["feedback"]
elif iface is not None:
feedback = MessageBarProgress(alg.displayName())
context = dataobjects.createContext()
ret = execute(alg, context, feedback)
if ret:

View File

@ -146,6 +146,8 @@ class AlgorithmDialog(AlgorithmDialogBase):
def accept(self):
self.settings.setValue("/Processing/dialogBase", self.saveGeometry())
context = dataobjects.createContext()
checkCRS = ProcessingConfig.getSetting(ProcessingConfig.WARN_UNMATCHING_CRS)
try:
self.setParamValues()
@ -169,7 +171,7 @@ class AlgorithmDialog(AlgorithmDialogBase):
QMessageBox.No)
if reply == QMessageBox.No:
return
msg = self.alg._checkParameterValuesBeforeExecuting()
msg = self.alg._checkParameterValuesBeforeExecuting(context)
if msg:
QMessageBox.warning(
self, self.tr('Unable to execute algorithm'), msg)
@ -199,8 +201,6 @@ class AlgorithmDialog(AlgorithmDialogBase):
self.setInfo(
self.tr('<b>Algorithm {0} starting...</b>').format(self.alg.displayName()))
context = dataobjects.createContext()
if self.iterateParam:
if executeIterating(self.alg, self.iterateParam, context, self.feedback):
self.finish(context)