Skip to content

Commit

Permalink
[processing] better expression context building
Browse files Browse the repository at this point in the history
  • Loading branch information
volaya committed Apr 26, 2016
1 parent e9a3089 commit 2535c0a
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 35 deletions.
1 change: 1 addition & 0 deletions python/plugins/processing/gui/AlgorithmDialog.py
Expand Up @@ -123,6 +123,7 @@ def setParamValues(self):

def evaluateExpression(self, text):
context = QgsExpressionContext()
context.appendScope(QgsExpressionContextUtils.globalScope())
context.appendScope(QgsExpressionContextUtils.projectScope())
exp = QgsExpression(text)
if exp.hasParserError():
Expand Down
52 changes: 27 additions & 25 deletions python/plugins/processing/gui/NumberInputPanel.py
Expand Up @@ -33,7 +33,8 @@

from math import log10, floor
from qgis.core import (QgsDataSourceURI, QgsCredentials, QgsExpressionContext,
QgsExpressionContextUtils, QgsExpression, QgsRasterLayer)
QgsExpressionContextUtils, QgsExpression, QgsRasterLayer,
QgsExpressionContextScope)
from qgis.gui import QgsEncodingFileDialog, QgsExpressionBuilderDialog
from qgis.utils import iface
from processing.tools import dataobjects
Expand Down Expand Up @@ -87,11 +88,7 @@ def __init__(self, number, minimum, maximum, isInteger):
self.spnValue.valueChanged.connect(lambda: self.hasChanged.emit())

def showExpressionsBuilder(self):
context = QgsExpressionContext()
context.appendScope(QgsExpressionContextUtils.globalScope())
scope = QgsExpressionContextUtils.projectScope()
self.addVariablesToScope(scope)
context.appendScope(scope)
context = self.expressionContext()
dlg = QgsExpressionBuilderDialog(None, self.spnValue.text(), self, "generic", context)
dlg.setWindowTitle(self.tr("Expression based input"));
if dlg.exec_() == QDialog.Accepted:
Expand All @@ -104,40 +101,45 @@ def showExpressionsBuilder(self):
except:
pass

def addVariablesToScope(self, scope):
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()
scope.setVariable("%s_minx" % name, layer.extent().xMinimum())
scope.setVariable("%s_miny" % name, layer.extent().yMinimum())
scope.setVariable("%s_maxx" % name, layer.extent().xMaximum())
scope.setVariable("%s_maxy" % name, layer.extent().yMaximum())
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()
scope.setVariable("%s_cellsize" % name, cellsize)
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)
scope.setVariable("%s_band%i_avg" % (name, i + 1), stats.mean)
scope.setVariable("%s_band%i_stddev" % (name, i + 1), stats.stdDev)
scope.setVariable("%s_band%i_min" % (name, i + 1), stats.minimumValue)
scope.setVariable("%s_band%i_max" % (name, i + 1), stats.maximumValue)
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()
scope.setVariable("canvasextent_minx", extent.xMinimum())
scope.setVariable("canvasextent_miny", extent.yMinimum())
scope.setVariable("canvasextent_maxx", extent.xMaximum())
scope.setVariable("canvasextent_maxy", extent.yMaximum())
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()
scope.setVariable("fullextent_minx", extent.xMinimum())
scope.setVariable("fullextent_miny", extent.yMinimum())
scope.setVariable("fullextent_maxx", extent.xMaximum())
scope.setVariable("fullextent_maxy", extent.yMaximum())

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()
Expand Down
21 changes: 11 additions & 10 deletions python/plugins/processing/gui/OutputSelectionPanel.py
Expand Up @@ -34,7 +34,7 @@
from PyQt.QtGui import QCursor
from qgis.gui import QgsEncodingFileDialog, QgsExpressionBuilderDialog
from qgis.core import QgsDataSourceURI, QgsCredentials, QgsExpressionContext,\
QgsExpressionContextUtils, QgsExpression
QgsExpressionContextUtils, QgsExpression, QgsExpressionContextScope

from processing.core.ProcessingConfig import ProcessingConfig
from processing.core.outputs import OutputVector
Expand Down Expand Up @@ -107,18 +107,20 @@ def selectOutput(self):
popupMenu.exec_(QCursor.pos())

def showExpressionsBuilder(self):
context = QgsExpressionContext()
context.appendScope(QgsExpressionContextUtils.globalScope())
scope = QgsExpressionContextUtils.projectScope()
self.addVariablesToScope(scope)
dlg = QgsExpressionBuilderDialog(None, self.leText.text(), self, "generic", context)
dlg = QgsExpressionBuilderDialog(None, self.leText.text(), self, "generic", self.expressionContext())
dlg.setWindowTitle(self.tr("Expression based output"));
if dlg.exec_() == QDialog.Accepted:
self.leText.setText(dlg.expressionText())

def addVariablesToScope(self, scope):
def expressionContext(self):
context = QgsExpressionContext()
context.appendScope(QgsExpressionContextUtils.globalScope())
context.appendScope(QgsExpressionContextUtils.projectScope())
processingScope = QgsExpressionContextScope()
for param in self.ag.parameters:
scope.setVariable("%s_value" % param.name, "")
processingScope.setVariable("%s_value" % param.name, "")
context.appendScope(processingScope)
return context

def saveToTemporaryFile(self):
self.leText.setText('')
Expand Down Expand Up @@ -222,8 +224,7 @@ def selectDirectory(self):

def getValue(self):
fileName = unicode(self.leText.text())
context = QgsExpressionContext()
context.appendScope(QgsExpressionContextUtils.projectScope())
context = self.expressionContext()
exp = QgsExpression(fileName)
if not exp.hasParserError():
result = exp.evaluate(context)
Expand Down

0 comments on commit 2535c0a

Please sign in to comment.