diff --git a/python/plugins/processing/algs/qgis/ui/HeatmapWidgets.py b/python/plugins/processing/algs/qgis/ui/HeatmapWidgets.py index e0b2a069f76d..9fdee8587466 100644 --- a/python/plugins/processing/algs/qgis/ui/HeatmapWidgets.py +++ b/python/plugins/processing/algs/qgis/ui/HeatmapWidgets.py @@ -23,6 +23,8 @@ from processing.tools import dataobjects import os +from typing import Optional + from qgis.PyQt import uic from qgis.gui import QgsDoubleSpinBox from qgis.core import (QgsRectangle, @@ -39,11 +41,11 @@ def __init__(self): super().__init__(None) self.setupUi(self) - self.layer_bounds = QgsRectangle() + self.layer_bounds: QgsRectangle = QgsRectangle() self.source = None - self.raster_bounds = QgsRectangle() - self.radius = 100 - self.radius_field = None + self.raster_bounds: QgsRectangle = QgsRectangle() + self.radius: float = 100 + self.radius_field: Optional[str] = None self.mCellXSpinBox.setShowClearButton(False) self.mCellYSpinBox.setShowClearButton(False) @@ -55,11 +57,11 @@ def __init__(self): self.mRowsSpinBox.valueChanged.connect(self.rowsChanged) self.mColumnsSpinBox.valueChanged.connect(self.columnsChanged) - def setRadius(self, radius): + def setRadius(self, radius: float): self.radius = radius self.recalculate_bounds() - def setRadiusField(self, radius_field): + def setRadiusField(self, radius_field: Optional[str]): self.radius_field = radius_field self.recalculate_bounds() @@ -97,8 +99,9 @@ def recalculate_bounds(self): def pixelSizeChanged(self): cell_size = self.mCellXSpinBox.value() - if cell_size <= 0: + if cell_size <= 0 or self.raster_bounds.isNull(): return + self.mCellYSpinBox.blockSignals(True) self.mCellYSpinBox.setValue(cell_size) self.mCellYSpinBox.blockSignals(False) @@ -113,9 +116,13 @@ def pixelSizeChanged(self): def rowsChanged(self): rows = self.mRowsSpinBox.value() - if rows <= 0: + if rows <= 0 or self.raster_bounds.isNull(): return + cell_size = self.raster_bounds.height() / rows + if cell_size == 0: + return + cols = max(round(self.raster_bounds.width() / cell_size) + 1, 1) self.mColumnsSpinBox.blockSignals(True) self.mColumnsSpinBox.setValue(cols) @@ -127,9 +134,13 @@ def rowsChanged(self): def columnsChanged(self): cols = self.mColumnsSpinBox.value() - if cols < 2: + if cols < 2 or self.raster_bounds.isNull(): return + cell_size = self.raster_bounds.width() / (cols - 1) + if cell_size == 0: + return + rows = max(round(self.raster_bounds.height() / cell_size), 1) self.mRowsSpinBox.blockSignals(True) self.mRowsSpinBox.setValue(rows) @@ -199,13 +210,13 @@ def setSource(self, source): def radiusChanged(self, wrapper): self.setRadius(wrapper.parameterValue()) - def setRadius(self, radius): + def setRadius(self, radius: float): self.widget.setRadius(radius) def radiusFieldChanged(self, wrapper): self.setRadiusField(wrapper.parameterValue()) - def setRadiusField(self, radius_field): + def setRadiusField(self, radius_field: Optional[str]): self.widget.setRadiusField(radius_field) def setValue(self, value): diff --git a/python/plugins/processing/algs/qgis/ui/InterpolationWidgets.py b/python/plugins/processing/algs/qgis/ui/InterpolationWidgets.py index 0782a08d4452..92483cc63f9d 100644 --- a/python/plugins/processing/algs/qgis/ui/InterpolationWidgets.py +++ b/python/plugins/processing/algs/qgis/ui/InterpolationWidgets.py @@ -20,6 +20,10 @@ __copyright__ = '(C) 2016, Alexander Bruy' import os +from typing import ( + Optional, + Union +) from qgis.PyQt import uic from qgis.PyQt.QtCore import pyqtSignal @@ -28,7 +32,6 @@ from qgis.core import ( Qgis, QgsApplication, - QgsMapLayerProxyModel, QgsWkbTypes, QgsRectangle, QgsReferencedRectangle, @@ -36,7 +39,8 @@ QgsProcessingUtils, QgsProcessingParameterNumber, QgsProcessingParameterDefinition, - QgsFieldProxyModel + QgsFieldProxyModel, + QgsVectorLayer ) from qgis.gui import QgsDoubleSpinBox from qgis.analysis import QgsInterpolator @@ -125,7 +129,7 @@ def removeLayer(self): self.layersTree.invisibleRootItem().removeChild(item) self.hasChanged.emit() - def layerChanged(self, layer): + def layerChanged(self, layer: Optional[QgsVectorLayer]): self.chkUseZCoordinate.setEnabled(False) self.chkUseZCoordinate.setChecked(False) @@ -141,7 +145,7 @@ def layerChanged(self, layer): self.cmbFields.setLayer(layer) - def _addLayerData(self, layerName, attribute): + def _addLayerData(self, layerName: str, attribute: str): item = QTreeWidgetItem() item.setText(0, layerName) item.setText(1, attribute) @@ -154,7 +158,7 @@ def _addLayerData(self, layerName, attribute): comboBox.setCurrentIndex(0) self.layersTree.setItemWidget(item, 2, comboBox) - def setValue(self, value): + def setValue(self, value: str): self.layersTree.clear() rows = value.split('::|::') for i, r in enumerate(rows): @@ -174,7 +178,7 @@ def setValue(self, value): self.hasChanged.emit() - def value(self): + def value(self) -> str: layers = '' context = dataobjects.createContext() for i in range(self.layersTree.topLevelItemCount()): @@ -254,7 +258,7 @@ def __init__(self): self.setupUi(self) self.context = dataobjects.createContext() - self.extent = QgsRectangle() + self.extent: Optional[Union[QgsReferencedRectangle, QgsRectangle]] = QgsRectangle() self.layers = [] self.mCellXSpinBox.setShowClearButton(False) @@ -267,7 +271,7 @@ def __init__(self): self.mRowsSpinBox.valueChanged.connect(self.rowsChanged) self.mColumnsSpinBox.valueChanged.connect(self.columnsChanged) - def setLayers(self, layersData): + def setLayers(self, layersData: str): self.extent = QgsRectangle() self.layers = [] for row in layersData.split(';'): @@ -276,27 +280,30 @@ def setLayers(self, layersData): layer = QgsProcessingUtils.variantToSource(v[0], self.context) if layer: self.layers.append(layer) - bbox = layer.sourceExtent() - if self.extent.isEmpty(): - self.extent = bbox - else: - self.extent.combineExtentWith(bbox) + self.extent.combineExtentWith(layer.sourceExtent()) self.pixelSizeChanged() - def setExtent(self, extent): + def setExtent(self, extent: Optional[str]): if extent is not None: tokens = extent.split(' ')[0].split(',') - ext = QgsRectangle(float(tokens[0]), float(tokens[2]), float(tokens[1]), float(tokens[3])) + ext = QgsRectangle( + float(tokens[0]), + float(tokens[2]), + float(tokens[1]), + float(tokens[3])) + if len(tokens) > 1: - self.extent = QgsReferencedRectangle(ext, QgsCoordinateReferenceSystem(tokens[1][1:-1])) + self.extent = QgsReferencedRectangle( + ext, QgsCoordinateReferenceSystem(tokens[1][1:-1])) else: self.extent = ext + self.pixelSizeChanged() def pixelSizeChanged(self): cell_size = self.mCellXSpinBox.value() - if cell_size <= 0: + if cell_size <= 0 or self.extent.isNull(): return self.mCellYSpinBox.blockSignals(True) @@ -313,9 +320,13 @@ def pixelSizeChanged(self): def rowsChanged(self): rows = self.mRowsSpinBox.value() - if rows <= 0: + if rows <= 0 or self.extent.isNull(): return + cell_size = self.extent.height() / rows + if cell_size == 0: + return + cols = max(round(self.extent.width() / cell_size) + 1, 1) self.mColumnsSpinBox.blockSignals(True) self.mColumnsSpinBox.setValue(cols) @@ -327,9 +338,13 @@ def rowsChanged(self): def columnsChanged(self): cols = self.mColumnsSpinBox.value() - if cols < 2: + if cols < 2 or self.extent.isNull(): return + cell_size = self.extent.width() / (cols - 1) + if cell_size == 0: + return + rows = max(round(self.extent.height() / cell_size), 1) self.mRowsSpinBox.blockSignals(True) self.mRowsSpinBox.setValue(rows) @@ -389,13 +404,13 @@ def postInitialize(self, wrappers): def layersChanged(self, wrapper): self.setLayers(wrapper.parameterValue()) - def setLayers(self, layersData): + def setLayers(self, layersData: str): self.widget.setLayers(layersData) def extentChanged(self, wrapper): self.setExtent(wrapper.parameterValue()) - def setExtent(self, extent): + def setExtent(self, extent: Optional[str]): self.widget.setExtent(extent) def setValue(self, value):