Skip to content

Commit

Permalink
[processing] allow to use ParameterPoint in Graphical Modeler
Browse files Browse the repository at this point in the history
  • Loading branch information
alexbruy committed Feb 29, 2016
1 parent dd68c33 commit 317639f
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 10 deletions.
13 changes: 12 additions & 1 deletion python/plugins/processing/modeler/ModelerAlgorithm.py
Expand Up @@ -42,7 +42,18 @@
from processing.modeler.WrongModelException import WrongModelException from processing.modeler.WrongModelException import WrongModelException
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
from processing.modeler.ModelerUtils import ModelerUtils from processing.modeler.ModelerUtils import ModelerUtils
from processing.core.parameters import getParameterFromString, ParameterRaster, ParameterVector, ParameterTable, ParameterTableField, ParameterBoolean, ParameterString, ParameterNumber, ParameterExtent, ParameterDataObject, ParameterMultipleInput from processing.core.parameters import (getParameterFromString,
ParameterRaster,
ParameterVector,
ParameterTable,
ParameterTableField,
ParameterBoolean,
ParameterString,
ParameterNumber,
ParameterExtent,
ParameterDataObject,
ParameterMultipleInput,
ParameterPoint)
from processing.tools import dataobjects from processing.tools import dataobjects
from processing.gui.Help2Html import getHtmlFromDescriptionsDict from processing.gui.Help2Html import getHtmlFromDescriptionsDict


Expand Down
Expand Up @@ -29,9 +29,28 @@
import math import math


from PyQt4.QtCore import Qt from PyQt4.QtCore import Qt
from PyQt4.QtGui import QDialog, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QComboBox, QCheckBox, QDialogButtonBox, QMessageBox from PyQt4.QtGui import (QDialog,
QVBoxLayout,
QHBoxLayout,
QLabel,
QLineEdit,
QComboBox,
QCheckBox,
QDialogButtonBox,
QMessageBox)


from processing.core.parameters import Parameter, ParameterBoolean, ParameterRaster, ParameterTable, ParameterVector, ParameterMultipleInput, ParameterNumber, ParameterString, ParameterTableField, ParameterExtent, ParameterFile from processing.core.parameters import (Parameter,
ParameterBoolean,
ParameterRaster,
ParameterTable,
ParameterVector,
ParameterMultipleInput,
ParameterNumber,
ParameterString,
ParameterTableField,
ParameterExtent,
ParameterFile,
ParameterPoint)




class ModelerParameterDefinitionDialog(QDialog): class ModelerParameterDefinitionDialog(QDialog):
Expand All @@ -45,6 +64,7 @@ class ModelerParameterDefinitionDialog(QDialog):
PARAMETER_TABLE_FIELD = 'Table field' PARAMETER_TABLE_FIELD = 'Table field'
PARAMETER_EXTENT = 'Extent' PARAMETER_EXTENT = 'Extent'
PARAMETER_FILE = 'File' PARAMETER_FILE = 'File'
PARAMETER_POINT = 'Point'


# To add # To add
PARAMETER_MULTIPLE = 'Multiple input' PARAMETER_MULTIPLE = 'Multiple input'
Expand All @@ -60,6 +80,7 @@ class ModelerParameterDefinitionDialog(QDialog):
PARAMETER_TABLE, PARAMETER_TABLE,
PARAMETER_TABLE_FIELD, PARAMETER_TABLE_FIELD,
PARAMETER_VECTOR, PARAMETER_VECTOR,
PARAMETER_POINT
] ]


def __init__(self, alg, paramType=None, param=None): def __init__(self, alg, paramType=None, param=None):
Expand Down Expand Up @@ -188,6 +209,14 @@ def setupUi(self):
1 if self.param.isFolder else 0) 1 if self.param.isFolder else 0)
self.horizontalLayout3.addWidget(self.fileFolderCombo) self.horizontalLayout3.addWidget(self.fileFolderCombo)
self.verticalLayout.addLayout(self.horizontalLayout3) self.verticalLayout.addLayout(self.horizontalLayout3)
elif self.paramType == ModelerParameterDefinitionDialog.PARAMETER_POINT or \
isinstance(self.param, ParameterPoint):
self.horizontalLayout3.addWidget(QLabel(self.tr('Default value')))
self.defaultTextBox = QLineEdit()
if self.param is not None:
self.defaultTextBox.setText(self.param.default)
self.horizontalLayout3.addWidget(self.defaultTextBox)
self.verticalLayout.addLayout(self.horizontalLayout3)


self.horizontalLayout2.addWidget(QLabel(self.tr('Required'))) self.horizontalLayout2.addWidget(QLabel(self.tr('Required')))
self.yesNoCombo = QComboBox() self.yesNoCombo = QComboBox()
Expand Down Expand Up @@ -292,6 +321,10 @@ def okPressed(self):
isinstance(self.param, ParameterFile): isinstance(self.param, ParameterFile):
isFolder = self.fileFolderCombo.currentIndex() == 1 isFolder = self.fileFolderCombo.currentIndex() == 1
self.param = ParameterFile(name, description, isFolder=isFolder) self.param = ParameterFile(name, description, isFolder=isFolder)
elif self.paramType == ModelerParameterDefinitionDialog.PARAMETER_POINT or \
isinstance(self.param, ParameterPoint):
self.param = ParameterPoint(name, description,
unicode(self.defaultTextBox.text()))
self.param.optional = self.yesNoCombo.currentIndex() == 1 self.param.optional = self.yesNoCombo.currentIndex() == 1
self.close() self.close()


Expand Down
89 changes: 82 additions & 7 deletions python/plugins/processing/modeler/ModelerParametersDialog.py
Expand Up @@ -26,20 +26,60 @@
__revision__ = '$Format:%H$' __revision__ = '$Format:%H$'


from PyQt4.QtCore import Qt, QUrl, QMetaObject from PyQt4.QtCore import Qt, QUrl, QMetaObject
from PyQt4.QtGui import QDialog, QDialogButtonBox, QLabel, QLineEdit, QFrame, QPushButton, QSizePolicy, QVBoxLayout, QHBoxLayout, QTabWidget, QWidget, QScrollArea, QComboBox, QTableWidgetItem, QMessageBox from PyQt4.QtGui import (QDialog,
QDialogButtonBox,
QLabel,
QLineEdit,
QFrame,
QPushButton,
QSizePolicy,
QVBoxLayout,
QHBoxLayout,
QTabWidget,
QWidget,
QScrollArea,
QComboBox,
QTableWidgetItem,
QMessageBox)
from PyQt4.QtWebKit import QWebView from PyQt4.QtWebKit import QWebView


from processing.modeler.ModelerAlgorithm import ValueFromInput, \
ValueFromOutput, Algorithm, ModelerOutput
from processing.gui.CrsSelectionPanel import CrsSelectionPanel from processing.gui.CrsSelectionPanel import CrsSelectionPanel
from processing.gui.MultipleInputPanel import MultipleInputPanel from processing.gui.MultipleInputPanel import MultipleInputPanel
from processing.gui.FixedTablePanel import FixedTablePanel from processing.gui.FixedTablePanel import FixedTablePanel
from processing.gui.RangePanel import RangePanel from processing.gui.RangePanel import RangePanel
from processing.gui.GeometryPredicateSelectionPanel import \ from processing.gui.GeometryPredicateSelectionPanel import \
GeometryPredicateSelectionPanel GeometryPredicateSelectionPanel
from processing.core.parameters import (ParameterExtent,
ParameterRaster,
ParameterVector,
ParameterBoolean,
ParameterTable,
ParameterFixedTable,
ParameterMultipleInput,
ParameterSelection,
ParameterRange,
ParameterNumber,
ParameterString,
ParameterCrs,
ParameterTableField,
ParameterFile,
ParameterPoint,
ParameterGeometryPredicate)
from processing.core.outputs import (OutputRaster,
OutputVector,
OutputTable,
OutputHTML,
OutputFile,
OutputDirectory,
OutputNumber,
OutputString,
OutputExtent)

from processing.modeler.ModelerAlgorithm import (ValueFromInput,
ValueFromOutput,
Algorithm,
ModelerOutput)
from processing.modeler.MultilineTextPanel import MultilineTextPanel from processing.modeler.MultilineTextPanel import MultilineTextPanel
from processing.core.parameters import ParameterExtent, ParameterRaster, ParameterVector, ParameterBoolean, ParameterTable, ParameterFixedTable, ParameterMultipleInput, ParameterSelection, ParameterRange, ParameterNumber, ParameterString, ParameterCrs, ParameterTableField, ParameterFile, ParameterGeometryPredicate
from processing.core.outputs import OutputRaster, OutputVector, OutputTable, OutputHTML, OutputFile, OutputDirectory, OutputNumber, OutputString, OutputExtent




class ModelerParametersDialog(QDialog): class ModelerParametersDialog(QDialog):
Expand Down Expand Up @@ -109,7 +149,9 @@ def setupUi(self):
continue continue
desc = param.description desc = param.description
if isinstance(param, ParameterExtent): if isinstance(param, ParameterExtent):
desc += '(xmin, xmax, ymin, ymax)' desc += self.tr('(xmin, xmax, ymin, ymax)')
if isinstance(param, ParameterPoint):
desc += self.tr('(x, y)')
label = QLabel(desc) label = QLabel(desc)
self.labels[param.name] = label self.labels[param.name] = label
widget = self.getWidgetFromParameter(param) widget = self.getWidgetFromParameter(param)
Expand Down Expand Up @@ -335,6 +377,13 @@ def getWidgetFromParameter(self, param):
item.addItem(self.resolveValueDescription(ex), ex) item.addItem(self.resolveValueDescription(ex), ex)
if not self.canUseAutoExtent(): if not self.canUseAutoExtent():
item.setEditText(unicode(param.default)) item.setEditText(unicode(param.default))
elif isinstance(param, ParameterPoint):
item = QComboBox()
item.setEditable(True)
points = self.getAvailableValuesOfType(ParameterPoint)
for p in points:
item.addItem(self.resolveValueDescription(p), p)
item.setEditText(unicode(param.default))
elif isinstance(param, ParameterFile): elif isinstance(param, ParameterFile):
item = QComboBox() item = QComboBox()
item.setEditable(True) item.setEditable(True)
Expand Down Expand Up @@ -427,7 +476,8 @@ def setPreviousValues(self):
ParameterNumber, ParameterNumber,
ParameterBoolean, ParameterBoolean,
ParameterExtent, ParameterExtent,
ParameterFile ParameterFile,
ParameterPoint
)): )):
self.setComboBoxValue(widget, value, param) self.setComboBoxValue(widget, value, param)
elif isinstance(param, ParameterString): elif isinstance(param, ParameterString):
Expand Down Expand Up @@ -594,6 +644,29 @@ def setParamExtentValue(self, alg, param, widget):
alg.params[param.name] = value alg.params[param.name] = value
return True return True


def setParamPointValue(self, alg, param, widget):
idx = widget.findText(widget.currentText())
if idx < 0:
s = unicode(widget.currentText()).strip()
if s:
try:
tokens = s.split(',')
if len(tokens) != 2:
return False
for token in tokens:
float(token)
except:
return False
elif param.optional:
s = None
else:
return False
alg.params[param.name] = [s]
else:
value = widget.itemData(widget.currentIndex())
alg.params[param.name] = value
return True

def setParamValue(self, alg, param, widget): def setParamValue(self, alg, param, widget):
if isinstance(param, (ParameterRaster, ParameterVector, if isinstance(param, (ParameterRaster, ParameterVector,
ParameterTable)): ParameterTable)):
Expand All @@ -611,6 +684,8 @@ def setParamValue(self, alg, param, widget):
return self.setParamNumberValue(alg, param, widget) return self.setParamNumberValue(alg, param, widget)
elif isinstance(param, ParameterExtent): elif isinstance(param, ParameterExtent):
return self.setParamExtentValue(alg, param, widget) return self.setParamExtentValue(alg, param, widget)
elif isinstance(param, ParameterPoint):
return self.setParamPointValue(alg, param, widget)
elif isinstance(param, ParameterFile): elif isinstance(param, ParameterFile):
return self.setParamFileValue(alg, param, widget) return self.setParamFileValue(alg, param, widget)
elif isinstance(param, ParameterSelection): elif isinstance(param, ParameterSelection):
Expand Down

0 comments on commit 317639f

Please sign in to comment.