Skip to content

Commit

Permalink
[processing] Handle context in processing.run
Browse files Browse the repository at this point in the history
Fix #15985 (Concave hull)
  • Loading branch information
arnaud-morvan committed May 2, 2017
1 parent 6e38c1d commit e232a08
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 17 deletions.
16 changes: 9 additions & 7 deletions python/plugins/processing/algs/qgis/ConcaveHull.py
Expand Up @@ -87,16 +87,18 @@ def processAlgorithm(self, context, feedback):

# 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:
Expand Down Expand Up @@ -126,14 +128,14 @@ def processAlgorithm(self, context, feedback):

# 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()
Expand Down
10 changes: 6 additions & 4 deletions python/plugins/processing/core/GeoAlgorithm.py
Expand Up @@ -212,8 +212,9 @@ def execute(self, context=None, feedback=None, model=None):
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)):
Expand Down Expand Up @@ -380,11 +381,12 @@ def resolveDataObjects(self):
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)):
Expand Down
11 changes: 8 additions & 3 deletions python/plugins/processing/core/Processing.py
Expand Up @@ -199,15 +199,21 @@ def runAlgorithm(algOrName, onFinish, *args, **kwargs):
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))
QgsMessageLog.logMessage(Processing.tr('Unable to execute algorithm\n{0}').format(msg),
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(
Expand All @@ -231,7 +237,6 @@ def runAlgorithm(algOrName, onFinish, *args, **kwargs):
feedback = kwargs["feedback"]
elif iface is not None:
feedback = MessageBarProgress(alg.displayName())
context = dataobjects.createContext()

ret = execute(alg, context, feedback)
if ret:
Expand Down
6 changes: 3 additions & 3 deletions python/plugins/processing/gui/AlgorithmDialog.py
Expand Up @@ -146,6 +146,8 @@ def checkExtentCRS(self):
def accept(self):
self.settings.setValue("/Processing/dialogBase", self.saveGeometry())

context = dataobjects.createContext()

checkCRS = ProcessingConfig.getSetting(ProcessingConfig.WARN_UNMATCHING_CRS)
try:
self.setParamValues()
Expand All @@ -169,7 +171,7 @@ def accept(self):
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)
Expand Down Expand Up @@ -199,8 +201,6 @@ def accept(self):
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)
Expand Down

0 comments on commit e232a08

Please sign in to comment.