diff --git a/python/plugins/processing/core/ProcessingConfig.py b/python/plugins/processing/core/ProcessingConfig.py index a4fdba897ca..72254a87959 100644 --- a/python/plugins/processing/core/ProcessingConfig.py +++ b/python/plugins/processing/core/ProcessingConfig.py @@ -60,6 +60,7 @@ class ProcessingConfig(object): POST_EXECUTION_SCRIPT = 'POST_EXECUTION_SCRIPT' SHOW_CRS_DEF = 'SHOW_CRS_DEF' WARN_UNMATCHING_CRS = 'WARN_UNMATCHING_CRS' + WARN_UNMATCHING_EXTENT_CRS = 'WARN_UNMATCHING_EXTENT_CRS' DEFAULT_OUTPUT_RASTER_LAYER_EXT = 'DEFAULT_OUTPUT_RASTER_LAYER_EXT' DEFAULT_OUTPUT_VECTOR_LAYER_EXT = 'DEFAULT_OUTPUT_VECTOR_LAYER_EXT' SHOW_PROVIDERS_TOOLTIP = "SHOW_PROVIDERS_TOOLTIP" @@ -108,6 +109,10 @@ class ProcessingConfig(object): ProcessingConfig.tr('General'), ProcessingConfig.WARN_UNMATCHING_CRS, ProcessingConfig.tr("Warn before executing if layer CRS's do not match"), True)) + ProcessingConfig.addSetting(Setting( + ProcessingConfig.tr('General'), + ProcessingConfig.WARN_UNMATCHING_EXTENT_CRS, + ProcessingConfig.tr("Warn before executing if extent CRS might not match layers CRS"), True)) ProcessingConfig.addSetting(Setting( ProcessingConfig.tr('General'), ProcessingConfig.RASTER_STYLE, diff --git a/python/plugins/processing/gui/AlgorithmDialog.py b/python/plugins/processing/gui/AlgorithmDialog.py index aa13eca8878..cc7e47b8b77 100644 --- a/python/plugins/processing/gui/AlgorithmDialog.py +++ b/python/plugins/processing/gui/AlgorithmDialog.py @@ -48,6 +48,9 @@ from processing.core.outputs import OutputVector from processing.core.outputs import OutputTable +from qgis.utils import iface + + class AlgorithmDialog(AlgorithmDialogBase): def __init__(self, alg): @@ -100,6 +103,37 @@ class AlgorithmDialog(AlgorithmDialogBase): def setParamValue(self, param, wrapper, alg=None): return param.setValue(wrapper.value()) + def checkExtentCRS(self): + unmatchingCRS = False + hasExtent = False + projectCRS = iface.mapCanvas().mapSettings().destinationCrs() + layers = dataobjects.getAllLayers() + for param in self.alg.parameters: + if isinstance(param, (ParameterRaster, ParameterVector, ParameterMultipleInput)): + if param.value: + if isinstance(param, ParameterMultipleInput): + inputlayers = param.value.split(';') + else: + inputlayers = [param.value] + for inputlayer in inputlayers: + for layer in layers: + if layer.source() == inputlayer: + if layer.crs() != projectCRS: + unmatchingCRS = True + + p = dataobjects.getObjectFromUri(inputlayer) + if p is not None: + if p.crs() != projectCRS: + unmatchingCRS = True + if isinstance(param, ParameterExtent): + value = self.mainWidget.valueItems[param.name].leText.text().strip() + print value + if value: + hasExtent = True + + return hasExtent and unmatchingCRS + + def accept(self): self.settings.setValue("/Processing/dialogBase", self.saveGeometry()) @@ -115,6 +149,17 @@ class AlgorithmDialog(AlgorithmDialogBase): QMessageBox.No) if reply == QMessageBox.No: return + checkExtentCRS = ProcessingConfig.getSetting(ProcessingConfig.WARN_UNMATCHING_EXTENT_CRS) + if checkExtentCRS and self.checkExtentCRS(): + reply = QMessageBox.question(self, self.tr("Extent CRS"), + self.tr('Extent parameters must use the same CRS as the input layers.\n' + 'Your input layers do not have the same extent as the project, ' + 'so the extent might be in a wrong CRS if you have selected it from the canvas.\n' + 'Do you want to continue?'), + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No) + if reply == QMessageBox.No: + return msg = self.alg._checkParameterValuesBeforeExecuting() if msg: QMessageBox.warning(