mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-15 00:04:00 -04:00
[processing] Handle context in processing.run
Fix #15985 (Concave hull)
This commit is contained in:
parent
6e38c1d692
commit
e232a0809c
@ -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()
|
||||
|
@ -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)):
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user