|
@@ -29,9 +29,15 @@ |
|
|
|
|
|
from qgis.PyQt import uic |
|
|
from qgis.PyQt.QtCore import pyqtSignal |
|
|
from PyQt.QtGui import QDialog |
|
|
|
|
|
from math import log10, floor |
|
|
from processing.gui.NumberInputDialog import NumberInputDialog |
|
|
from qgis.core import (QgsDataSourceURI, QgsCredentials, QgsExpressionContext, |
|
|
QgsExpressionContextUtils, QgsExpression, QgsRasterLayer, |
|
|
QgsExpressionContextScope) |
|
|
from qgis.gui import QgsEncodingFileDialog, QgsExpressionBuilderDialog |
|
|
from qgis.utils import iface |
|
|
from processing.tools import dataobjects |
|
|
|
|
|
pluginPath = os.path.split(os.path.dirname(__file__))[0] |
|
|
WIDGET, BASE = uic.loadUiType( |
|
@@ -46,6 +52,7 @@ def __init__(self, number, minimum, maximum, isInteger): |
|
|
super(NumberInputPanel, self).__init__(None) |
|
|
self.setupUi(self) |
|
|
|
|
|
self.spnValue.setExpressionsEnabled(True) |
|
|
self.isInteger = isInteger |
|
|
if self.isInteger: |
|
|
self.spnValue.setDecimals(0) |
|
@@ -74,15 +81,65 @@ def __init__(self, number, minimum, maximum, isInteger): |
|
|
self.spnValue.setValue(0) |
|
|
self.spnValue.setClearValue(0) |
|
|
|
|
|
self.btnCalc.clicked.connect(self.showNumberInputDialog) |
|
|
self.btnCalc.setFixedHeight(self.spnValue.height()) |
|
|
|
|
|
self.btnCalc.clicked.connect(self.showExpressionsBuilder) |
|
|
|
|
|
self.spnValue.valueChanged.connect(lambda: self.hasChanged.emit()) |
|
|
|
|
|
def showNumberInputDialog(self): |
|
|
dlg = NumberInputDialog(self.isInteger) |
|
|
dlg.exec_() |
|
|
if dlg.value is not None: |
|
|
self.spnValue.setValue(dlg.value) |
|
|
def showExpressionsBuilder(self): |
|
|
context = self.expressionContext() |
|
|
dlg = QgsExpressionBuilderDialog(None, self.spnValue.text(), self, "generic", context) |
|
|
dlg.setWindowTitle(self.tr("Expression based input")); |
|
|
if dlg.exec_() == QDialog.Accepted: |
|
|
exp = QgsExpression(dlg.expressionText()) |
|
|
if not exp.hasParserError(): |
|
|
result = exp.evaluate(context) |
|
|
if not exp.hasEvalError(): |
|
|
try: |
|
|
self.spnValue.setValue(float(result)) |
|
|
except: |
|
|
pass |
|
|
|
|
|
def expressionContext(self): |
|
|
context = QgsExpressionContext() |
|
|
context.appendScope(QgsExpressionContextUtils.globalScope()) |
|
|
context.appendScope(QgsExpressionContextUtils.projectScope()) |
|
|
processingScope = QgsExpressionContextScope() |
|
|
layers = dataobjects.getAllLayers() |
|
|
for layer in layers: |
|
|
name = layer.name() |
|
|
processingScope.setVariable("%s_minx" % name, layer.extent().xMinimum()) |
|
|
processingScope.setVariable("%s_miny" % name, layer.extent().yMinimum()) |
|
|
processingScope.setVariable("%s_maxx" % name, layer.extent().xMaximum()) |
|
|
processingScope.setVariable("%s_maxy" % name, layer.extent().yMaximum()) |
|
|
if isinstance(layer, QgsRasterLayer): |
|
|
cellsize = (layer.extent().xMaximum() |
|
|
- layer.extent().xMinimum()) / layer.width() |
|
|
processingScope.setVariable("%s_cellsize" % name, cellsize) |
|
|
|
|
|
layers = dataobjects.getRasterLayers() |
|
|
for layer in layers: |
|
|
for i in range(layer.bandCount()): |
|
|
stats = layer.dataProvider().bandStatistics(i + 1) |
|
|
processingScope.setVariable("%s_band%i_avg" % (name, i + 1), stats.mean) |
|
|
processingScope.setVariable("%s_band%i_stddev" % (name, i + 1), stats.stdDev) |
|
|
processingScope.setVariable("%s_band%i_min" % (name, i + 1), stats.minimumValue) |
|
|
processingScope.setVariable("%s_band%i_max" % (name, i + 1), stats.maximumValue) |
|
|
|
|
|
extent = iface.mapCanvas().extent() |
|
|
processingScope.setVariable("canvasextent_minx", extent.xMinimum()) |
|
|
processingScope.setVariable("canvasextent_miny", extent.yMinimum()) |
|
|
processingScope.setVariable("canvasextent_maxx", extent.xMaximum()) |
|
|
processingScope.setVariable("canvasextent_maxy", extent.yMaximum()) |
|
|
|
|
|
extent = iface.mapCanvas().fullExtent() |
|
|
processingScope.setVariable("fullextent_minx", extent.xMinimum()) |
|
|
processingScope.setVariable("fullextent_miny", extent.yMinimum()) |
|
|
processingScope.setVariable("fullextent_maxx", extent.xMaximum()) |
|
|
processingScope.setVariable("fullextent_maxy", extent.yMaximum()) |
|
|
context.appendScope(processingScope) |
|
|
return context |
|
|
|
|
|
def getValue(self): |
|
|
return self.spnValue.value() |
|
|