2012-10-04 19:33:47 +02:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
"""
|
|
|
|
***************************************************************************
|
|
|
|
ModelerParametersDialog.py
|
|
|
|
---------------------
|
|
|
|
Date : August 2012
|
|
|
|
Copyright : (C) 2012 by Victor Olaya
|
|
|
|
Email : volayaf at gmail dot com
|
|
|
|
***************************************************************************
|
|
|
|
* *
|
|
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
|
|
* it under the terms of the GNU General Public License as published by *
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
|
|
* (at your option) any later version. *
|
|
|
|
* *
|
|
|
|
***************************************************************************
|
|
|
|
"""
|
2016-09-21 18:24:26 +02:00
|
|
|
from builtins import str
|
|
|
|
from builtins import range
|
2013-02-23 16:18:22 +01:00
|
|
|
|
2016-05-31 12:35:56 +02:00
|
|
|
|
2012-10-04 19:33:47 +02:00
|
|
|
__author__ = 'Victor Olaya'
|
|
|
|
__date__ = 'August 2012'
|
|
|
|
__copyright__ = '(C) 2012, Victor Olaya'
|
2013-10-01 20:52:22 +03:00
|
|
|
|
2012-10-04 19:33:47 +02:00
|
|
|
# This will get replaced with a git SHA1 when you do a git archive
|
2013-10-01 20:52:22 +03:00
|
|
|
|
2012-10-04 19:33:47 +02:00
|
|
|
__revision__ = '$Format:%H$'
|
|
|
|
|
2016-04-22 10:38:48 +02:00
|
|
|
from qgis.PyQt.QtCore import Qt, QUrl, QMetaObject
|
2016-05-27 19:04:25 +03:00
|
|
|
from qgis.PyQt.QtWidgets import (QDialog, QDialogButtonBox, QLabel, QLineEdit,
|
|
|
|
QFrame, QPushButton, QSizePolicy, QVBoxLayout,
|
|
|
|
QHBoxLayout, QTabWidget, QWidget, QScrollArea,
|
2016-05-31 12:35:56 +02:00
|
|
|
QComboBox, QTableWidgetItem, QMessageBox,
|
|
|
|
QTextBrowser)
|
2016-05-27 19:04:25 +03:00
|
|
|
from qgis.PyQt.QtNetwork import QNetworkRequest, QNetworkReply
|
|
|
|
|
|
|
|
from qgis.core import QgsNetworkAccessManager
|
2014-09-12 12:33:06 +03:00
|
|
|
|
2016-05-31 12:35:56 +02:00
|
|
|
from qgis.gui import QgsMessageBar
|
|
|
|
|
2016-08-23 14:48:11 +02:00
|
|
|
from processing.gui.wrappers import (
|
|
|
|
DIALOG_MODELER,
|
|
|
|
wrapper_from_param,
|
|
|
|
NotYetImplementedWidgetWrapper,
|
|
|
|
)
|
|
|
|
|
2013-08-12 20:44:27 +02:00
|
|
|
from processing.gui.CrsSelectionPanel import CrsSelectionPanel
|
2013-10-01 20:52:22 +03:00
|
|
|
from processing.gui.MultipleInputPanel import MultipleInputPanel
|
|
|
|
from processing.gui.FixedTablePanel import FixedTablePanel
|
|
|
|
from processing.gui.RangePanel import RangePanel
|
2015-01-09 17:23:49 +01:00
|
|
|
from processing.gui.GeometryPredicateSelectionPanel import \
|
|
|
|
GeometryPredicateSelectionPanel
|
2016-02-23 14:38:54 +02:00
|
|
|
from processing.core.parameters import (ParameterExtent,
|
|
|
|
ParameterRaster,
|
|
|
|
ParameterVector,
|
|
|
|
ParameterTable,
|
|
|
|
ParameterFixedTable,
|
|
|
|
ParameterMultipleInput,
|
|
|
|
ParameterSelection,
|
|
|
|
ParameterRange,
|
|
|
|
ParameterNumber,
|
|
|
|
ParameterString,
|
|
|
|
ParameterCrs,
|
|
|
|
ParameterTableField,
|
2016-06-02 12:14:59 +02:00
|
|
|
ParameterTableMultipleField,
|
2016-02-23 14:38:54 +02:00
|
|
|
ParameterFile,
|
|
|
|
ParameterPoint,
|
|
|
|
ParameterGeometryPredicate)
|
|
|
|
from processing.core.outputs import (OutputRaster,
|
|
|
|
OutputVector,
|
|
|
|
OutputTable,
|
|
|
|
OutputHTML,
|
|
|
|
OutputFile,
|
|
|
|
OutputDirectory,
|
|
|
|
OutputNumber,
|
|
|
|
OutputString,
|
2016-08-05 12:12:39 +03:00
|
|
|
OutputExtent,
|
|
|
|
OutputCrs)
|
2016-02-23 14:38:54 +02:00
|
|
|
|
|
|
|
from processing.modeler.ModelerAlgorithm import (ValueFromInput,
|
|
|
|
ValueFromOutput,
|
|
|
|
Algorithm,
|
|
|
|
ModelerOutput)
|
2013-10-01 20:52:22 +03:00
|
|
|
from processing.modeler.MultilineTextPanel import MultilineTextPanel
|
2016-08-23 19:33:42 +03:00
|
|
|
from processing.tools import dataobjects
|
2013-10-01 20:52:22 +03:00
|
|
|
|
2016-09-03 02:25:30 +02:00
|
|
|
from qgis.core import QgsApplication
|
|
|
|
from qgis.PyQt.QtGui import QToolButton, QMenu, QAction
|
|
|
|
|
|
|
|
|
|
|
|
class ModelerWidgetWrapper(QWidget):
|
|
|
|
|
|
|
|
def __init__(self, wrapper, model_values):
|
|
|
|
super(ModelerWidgetWrapper, self).__init__()
|
|
|
|
|
|
|
|
self.wrapper = wrapper
|
|
|
|
self.widget = wrapper.widget
|
|
|
|
self.implemented = wrapper.implemented
|
|
|
|
self.model_values = model_values
|
|
|
|
|
|
|
|
menu = QMenu()
|
|
|
|
fixed_value_action = QAction(self.tr('Fixed value'), menu)
|
|
|
|
fixed_value_action.triggered.connect(self.on_fixedValue)
|
|
|
|
menu.addAction(fixed_value_action)
|
|
|
|
menu.addSeparator()
|
|
|
|
for text, value in model_values:
|
|
|
|
model_value_action = QAction(text, menu)
|
|
|
|
model_value_action.setData(value)
|
|
|
|
model_value_action.triggered.connect(self.on_modelValue)
|
|
|
|
menu.addAction(model_value_action)
|
|
|
|
|
|
|
|
self.mIconDataDefine = QgsApplication.getThemeIcon("/mIconDataDefine.svg")
|
|
|
|
self.mIconDataDefineOn = QgsApplication.getThemeIcon("/mIconDataDefineOn.svg")
|
|
|
|
|
|
|
|
button = QToolButton()
|
|
|
|
button.setIcon(self.mIconDataDefine)
|
|
|
|
button.setPopupMode(QToolButton.InstantPopup)
|
|
|
|
button.setMenu(menu)
|
|
|
|
self.button = button
|
|
|
|
|
|
|
|
label = QLabel()
|
|
|
|
label.hide()
|
|
|
|
self.label = label
|
|
|
|
|
|
|
|
layout = QHBoxLayout()
|
|
|
|
layout.addWidget(button, 0)
|
|
|
|
layout.addWidget(label, 1)
|
|
|
|
layout.addWidget(wrapper.widget, 1)
|
|
|
|
self.setLayout(layout)
|
|
|
|
|
|
|
|
def on_fixedValue(self):
|
|
|
|
self.button.setIcon(self.mIconDataDefine)
|
|
|
|
self.label.hide()
|
|
|
|
self.wrapper.widget.show()
|
|
|
|
|
|
|
|
def on_modelValue(self):
|
|
|
|
action = self.sender()
|
|
|
|
self.setValue(action.data())
|
|
|
|
|
|
|
|
def setValue(self, value):
|
|
|
|
for text, val in self.model_values:
|
|
|
|
if val == value:
|
|
|
|
self.model_value = value
|
|
|
|
self.button.setIcon(self.mIconDataDefineOn)
|
|
|
|
self.label.setText(text)
|
|
|
|
self.label.show()
|
|
|
|
self.wrapper.widget.hide()
|
|
|
|
return
|
|
|
|
self.wrapper.setValue(value)
|
|
|
|
self.on_fixedValue()
|
|
|
|
|
|
|
|
def value(self):
|
|
|
|
if self.label.isVisible():
|
|
|
|
return self.model_value
|
|
|
|
else:
|
|
|
|
return self.wrapper.value()
|
|
|
|
|
2012-09-15 18:25:25 +03:00
|
|
|
|
2014-09-12 12:33:06 +03:00
|
|
|
class ModelerParametersDialog(QDialog):
|
2012-09-15 18:25:25 +03:00
|
|
|
|
2013-10-01 20:52:22 +03:00
|
|
|
ENTER_NAME = '[Enter name if this is a final result]'
|
|
|
|
NOT_SELECTED = '[Not selected]'
|
|
|
|
USE_MIN_COVERING_EXTENT = '[Use min covering extent]'
|
2012-09-15 18:25:25 +03:00
|
|
|
|
2014-06-08 00:21:12 +02:00
|
|
|
def __init__(self, alg, model, algName=None):
|
2014-09-12 12:33:06 +03:00
|
|
|
QDialog.__init__(self)
|
2012-09-15 18:25:25 +03:00
|
|
|
self.setModal(True)
|
2016-05-31 12:35:56 +02:00
|
|
|
# The algorithm to define in this dialog. It is an instance of GeoAlgorithm
|
2014-06-08 00:21:12 +02:00
|
|
|
self._alg = alg
|
2016-05-31 12:35:56 +02:00
|
|
|
# The resulting algorithm after the user clicks on OK. it is an instance of the container Algorithm class
|
2014-06-08 00:21:12 +02:00
|
|
|
self.alg = None
|
2016-05-31 12:35:56 +02:00
|
|
|
# The model this algorithm is going to be added to
|
2012-09-15 18:25:25 +03:00
|
|
|
self.model = model
|
2016-05-31 12:35:56 +02:00
|
|
|
# The name of the algorithm in the model, in case we are editing it and not defining it for the first time
|
2014-06-08 00:21:12 +02:00
|
|
|
self._algName = algName
|
2012-09-15 18:25:25 +03:00
|
|
|
self.setupUi()
|
|
|
|
self.params = None
|
|
|
|
|
|
|
|
def setupUi(self):
|
2012-10-12 19:14:39 +02:00
|
|
|
self.labels = {}
|
|
|
|
self.widgets = {}
|
|
|
|
self.checkBoxes = {}
|
|
|
|
self.showAdvanced = False
|
2016-08-23 14:48:11 +02:00
|
|
|
self.widget_wrappers = {}
|
2012-09-15 18:25:25 +03:00
|
|
|
self.valueItems = {}
|
|
|
|
self.dependentItems = {}
|
|
|
|
self.resize(650, 450)
|
2014-09-12 12:33:06 +03:00
|
|
|
self.buttonBox = QDialogButtonBox()
|
|
|
|
self.buttonBox.setOrientation(Qt.Horizontal)
|
|
|
|
self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel
|
2015-08-22 14:29:41 +02:00
|
|
|
| QDialogButtonBox.Ok)
|
2014-06-08 00:21:12 +02:00
|
|
|
tooltips = self._alg.getParameterDescriptions()
|
2014-09-12 12:33:06 +03:00
|
|
|
self.setSizePolicy(QSizePolicy.Expanding,
|
|
|
|
QSizePolicy.Expanding)
|
|
|
|
self.verticalLayout = QVBoxLayout()
|
2012-10-12 19:14:39 +02:00
|
|
|
self.verticalLayout.setSpacing(5)
|
|
|
|
self.verticalLayout.setMargin(20)
|
2014-07-02 07:46:03 +02:00
|
|
|
|
2016-05-31 12:35:56 +02:00
|
|
|
self.bar = QgsMessageBar()
|
|
|
|
self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
|
|
|
|
self.verticalLayout.addWidget(self.bar)
|
|
|
|
|
2014-09-12 12:33:06 +03:00
|
|
|
hLayout = QHBoxLayout()
|
2014-06-08 00:21:12 +02:00
|
|
|
hLayout.setSpacing(5)
|
|
|
|
hLayout.setMargin(0)
|
2014-10-03 21:56:24 +03:00
|
|
|
descriptionLabel = QLabel(self.tr("Description"))
|
2014-09-12 12:33:06 +03:00
|
|
|
self.descriptionBox = QLineEdit()
|
2014-06-08 00:21:12 +02:00
|
|
|
self.descriptionBox.setText(self._alg.name)
|
|
|
|
hLayout.addWidget(descriptionLabel)
|
|
|
|
hLayout.addWidget(self.descriptionBox)
|
|
|
|
self.verticalLayout.addLayout(hLayout)
|
2014-09-12 12:33:06 +03:00
|
|
|
line = QFrame()
|
|
|
|
line.setFrameShape(QFrame.HLine)
|
|
|
|
line.setFrameShadow(QFrame.Sunken)
|
2014-06-08 00:21:12 +02:00
|
|
|
self.verticalLayout.addWidget(line)
|
2014-07-02 07:46:03 +02:00
|
|
|
|
2014-06-08 00:21:12 +02:00
|
|
|
for param in self._alg.parameters:
|
2012-10-12 19:14:39 +02:00
|
|
|
if param.isAdvanced:
|
2014-09-12 12:33:06 +03:00
|
|
|
self.advancedButton = QPushButton()
|
2014-10-03 21:56:24 +03:00
|
|
|
self.advancedButton.setText(self.tr('Show advanced parameters'))
|
2014-09-12 12:33:06 +03:00
|
|
|
self.advancedButton.clicked.connect(
|
|
|
|
self.showAdvancedParametersClicked)
|
2016-03-25 01:51:20 +03:00
|
|
|
advancedButtonHLayout = QHBoxLayout()
|
|
|
|
advancedButtonHLayout.addWidget(self.advancedButton)
|
|
|
|
advancedButtonHLayout.addStretch()
|
|
|
|
self.verticalLayout.addLayout(advancedButtonHLayout)
|
2012-10-12 19:14:39 +02:00
|
|
|
break
|
2014-06-08 00:21:12 +02:00
|
|
|
for param in self._alg.parameters:
|
2012-10-12 19:14:39 +02:00
|
|
|
if param.hidden:
|
|
|
|
continue
|
|
|
|
desc = param.description
|
|
|
|
if isinstance(param, ParameterExtent):
|
2016-02-23 14:38:54 +02:00
|
|
|
desc += self.tr('(xmin, xmax, ymin, ymax)')
|
|
|
|
if isinstance(param, ParameterPoint):
|
|
|
|
desc += self.tr('(x, y)')
|
2014-09-12 12:33:06 +03:00
|
|
|
label = QLabel(desc)
|
2012-10-12 19:14:39 +02:00
|
|
|
self.labels[param.name] = label
|
2016-09-03 02:25:30 +02:00
|
|
|
|
2016-08-23 14:48:11 +02:00
|
|
|
wrapper = self.getWidgetWrapperFromParameter(param)
|
|
|
|
self.widget_wrappers[param.name] = wrapper
|
2016-09-03 02:25:30 +02:00
|
|
|
|
2016-08-23 14:48:11 +02:00
|
|
|
widget = wrapper.widget
|
2012-10-12 19:14:39 +02:00
|
|
|
self.valueItems[param.name] = widget
|
2016-09-21 18:24:26 +02:00
|
|
|
if param.name in list(tooltips.keys()):
|
2012-10-12 19:14:39 +02:00
|
|
|
tooltip = tooltips[param.name]
|
|
|
|
else:
|
|
|
|
tooltip = param.description
|
|
|
|
label.setToolTip(tooltip)
|
|
|
|
widget.setToolTip(tooltip)
|
|
|
|
if param.isAdvanced:
|
|
|
|
label.setVisible(self.showAdvanced)
|
2016-09-03 02:25:30 +02:00
|
|
|
wrapper.setVisible(self.showAdvanced)
|
2012-10-12 19:14:39 +02:00
|
|
|
self.widgets[param.name] = widget
|
2016-09-03 02:25:30 +02:00
|
|
|
|
2012-10-12 19:14:39 +02:00
|
|
|
self.verticalLayout.addWidget(label)
|
2016-09-03 02:25:30 +02:00
|
|
|
self.verticalLayout.addWidget(wrapper)
|
2012-10-12 19:14:39 +02:00
|
|
|
|
2014-06-08 00:21:12 +02:00
|
|
|
for output in self._alg.outputs:
|
2012-10-12 19:14:39 +02:00
|
|
|
if output.hidden:
|
|
|
|
continue
|
2013-10-01 20:52:22 +03:00
|
|
|
if isinstance(output, (OutputRaster, OutputVector, OutputTable,
|
2015-12-20 10:12:18 +01:00
|
|
|
OutputHTML, OutputFile, OutputDirectory)):
|
2014-09-12 12:33:06 +03:00
|
|
|
label = QLabel(output.description + '<'
|
fix python pep8 warnings and fix some revealed errors
pep8 --ignore=E111,E128,E201,E202,E203,E211,E221,E222,E225,E226,E227,E231,E241,E261,E265,E272,E302,E303,E501,E701 \
--exclude="ui_*.py,debian/*,python/ext-libs/*" \
.
2015-02-01 14:15:42 +01:00
|
|
|
+ output.__class__.__name__ + '>')
|
2012-10-12 19:14:39 +02:00
|
|
|
item = QLineEdit()
|
|
|
|
if hasattr(item, 'setPlaceholderText'):
|
|
|
|
item.setPlaceholderText(ModelerParametersDialog.ENTER_NAME)
|
|
|
|
self.verticalLayout.addWidget(label)
|
|
|
|
self.verticalLayout.addWidget(item)
|
|
|
|
self.valueItems[output.name] = item
|
2013-02-07 01:09:39 +01:00
|
|
|
|
2014-09-12 12:33:06 +03:00
|
|
|
label = QLabel(' ')
|
2013-02-03 10:26:43 +01:00
|
|
|
self.verticalLayout.addWidget(label)
|
2014-10-03 21:56:24 +03:00
|
|
|
label = QLabel(self.tr('Parent algorithms'))
|
2013-02-07 01:09:39 +01:00
|
|
|
self.dependenciesPanel = self.getDependenciesPanel()
|
2013-02-03 10:26:43 +01:00
|
|
|
self.verticalLayout.addWidget(label)
|
|
|
|
self.verticalLayout.addWidget(self.dependenciesPanel)
|
2013-02-07 01:09:39 +01:00
|
|
|
|
2012-10-12 19:14:39 +02:00
|
|
|
self.verticalLayout.addStretch(1000)
|
|
|
|
self.setLayout(self.verticalLayout)
|
|
|
|
|
2012-09-15 18:25:25 +03:00
|
|
|
self.setPreviousValues()
|
2014-06-08 00:21:12 +02:00
|
|
|
self.setWindowTitle(self._alg.name)
|
2014-09-12 12:33:06 +03:00
|
|
|
self.verticalLayout2 = QVBoxLayout()
|
2012-10-12 19:14:39 +02:00
|
|
|
self.verticalLayout2.setSpacing(2)
|
|
|
|
self.verticalLayout2.setMargin(0)
|
2014-09-12 12:33:06 +03:00
|
|
|
self.tabWidget = QTabWidget()
|
2012-12-10 00:12:07 +01:00
|
|
|
self.tabWidget.setMinimumWidth(300)
|
2014-09-12 12:33:06 +03:00
|
|
|
self.paramPanel = QWidget()
|
2012-10-12 19:14:39 +02:00
|
|
|
self.paramPanel.setLayout(self.verticalLayout)
|
2014-09-12 12:33:06 +03:00
|
|
|
self.scrollArea = QScrollArea()
|
2012-10-16 00:01:13 +02:00
|
|
|
self.scrollArea.setWidget(self.paramPanel)
|
|
|
|
self.scrollArea.setWidgetResizable(True)
|
2014-10-03 21:56:24 +03:00
|
|
|
self.tabWidget.addTab(self.scrollArea, self.tr('Parameters'))
|
2016-05-27 19:04:25 +03:00
|
|
|
|
|
|
|
self.txtHelp = QTextBrowser()
|
2014-04-19 22:04:24 +02:00
|
|
|
|
2012-09-15 18:25:25 +03:00
|
|
|
html = None
|
2016-05-27 19:04:25 +03:00
|
|
|
isText, algHelp = self._alg.help()
|
|
|
|
if algHelp is not None:
|
|
|
|
algHelp = algHelp if isText else QUrl(algHelp)
|
|
|
|
try:
|
|
|
|
if isText:
|
|
|
|
self.txtHelp.setHtml(algHelp)
|
|
|
|
else:
|
|
|
|
html = self.tr('<p>Downloading algorithm help... Please wait.</p>')
|
|
|
|
self.txtHelp.setHtml(html)
|
|
|
|
self.reply = QgsNetworkAccessManager.instance().get(QNetworkRequest(algHelp))
|
|
|
|
self.reply.finished.connect(self.requestFinished)
|
|
|
|
except:
|
|
|
|
self.txtHelp.setHtml(self.tr('<h2>No help available for this algorithm</h2>'))
|
|
|
|
|
|
|
|
self.tabWidget.addTab(self.txtHelp, 'Help')
|
|
|
|
|
2012-10-12 19:14:39 +02:00
|
|
|
self.verticalLayout2.addWidget(self.tabWidget)
|
|
|
|
self.verticalLayout2.addWidget(self.buttonBox)
|
|
|
|
self.setLayout(self.verticalLayout2)
|
2014-09-12 12:33:06 +03:00
|
|
|
self.buttonBox.accepted.connect(self.okPressed)
|
|
|
|
self.buttonBox.rejected.connect(self.cancelPressed)
|
|
|
|
QMetaObject.connectSlotsByName(self)
|
2012-09-15 18:25:25 +03:00
|
|
|
|
2016-05-27 19:04:25 +03:00
|
|
|
def requestFinished(self):
|
|
|
|
"""Change the webview HTML content"""
|
|
|
|
reply = self.sender()
|
|
|
|
if reply.error() != QNetworkReply.NoError:
|
|
|
|
html = self.tr('<h2>No help available for this algorithm</h2><p>{}</p>'.format(reply.errorString()))
|
|
|
|
else:
|
2016-09-21 18:24:26 +02:00
|
|
|
html = str(reply.readAll())
|
2016-05-27 19:04:25 +03:00
|
|
|
reply.deleteLater()
|
|
|
|
self.txtHelp.setHtml(html)
|
|
|
|
|
2013-02-07 01:09:39 +01:00
|
|
|
def getAvailableDependencies(self):
|
2014-06-08 00:21:12 +02:00
|
|
|
if self._algName is None:
|
2013-02-03 10:26:43 +01:00
|
|
|
dependent = []
|
|
|
|
else:
|
2014-06-08 00:21:12 +02:00
|
|
|
dependent = self.model.getDependentAlgorithms(self._algName)
|
2013-02-07 01:09:39 +01:00
|
|
|
opts = []
|
2016-09-21 18:24:26 +02:00
|
|
|
for alg in list(self.model.algs.values()):
|
2014-06-08 00:21:12 +02:00
|
|
|
if alg.name not in dependent:
|
2014-11-28 14:20:16 +01:00
|
|
|
opts.append(alg)
|
2013-02-03 10:26:43 +01:00
|
|
|
return opts
|
|
|
|
|
|
|
|
def getDependenciesPanel(self):
|
2014-11-28 14:20:16 +01:00
|
|
|
return MultipleInputPanel([alg.algorithm.name for alg in self.getAvailableDependencies()])
|
2013-02-07 01:09:39 +01:00
|
|
|
|
2012-10-17 22:03:40 +02:00
|
|
|
def showAdvancedParametersClicked(self):
|
|
|
|
self.showAdvanced = not self.showAdvanced
|
|
|
|
if self.showAdvanced:
|
2014-10-03 21:56:24 +03:00
|
|
|
self.advancedButton.setText(self.tr('Hide advanced parameters'))
|
2012-10-17 22:03:40 +02:00
|
|
|
else:
|
2014-10-03 21:56:24 +03:00
|
|
|
self.advancedButton.setText(self.tr('Show advanced parameters'))
|
2014-06-08 00:21:12 +02:00
|
|
|
for param in self._alg.parameters:
|
2012-10-17 22:03:40 +02:00
|
|
|
if param.isAdvanced:
|
|
|
|
self.labels[param.name].setVisible(self.showAdvanced)
|
|
|
|
self.widgets[param.name].setVisible(self.showAdvanced)
|
2012-12-10 00:12:07 +01:00
|
|
|
|
2016-09-03 02:25:30 +02:00
|
|
|
def getAvailableValuesForParam(self, param):
|
|
|
|
outputType = None
|
|
|
|
if isinstance(param, ParameterCrs):
|
|
|
|
outputType = OutputCrs
|
|
|
|
return self.getAvailableValuesOfType(param.__class__, outputType)
|
|
|
|
|
2016-08-08 15:37:33 +03:00
|
|
|
def getAvailableValuesOfType(self, paramType, outType=None, dataType=None):
|
2014-06-08 00:21:12 +02:00
|
|
|
values = []
|
|
|
|
inputs = self.model.inputs
|
2016-09-21 18:24:26 +02:00
|
|
|
for i in list(inputs.values()):
|
2014-06-08 00:21:12 +02:00
|
|
|
param = i.param
|
|
|
|
if isinstance(param, paramType):
|
2016-08-08 16:45:40 +03:00
|
|
|
if dataType is not None and param.datatype in dataType:
|
2016-08-08 15:37:33 +03:00
|
|
|
values.append(ValueFromInput(param.name))
|
|
|
|
else:
|
|
|
|
values.append(ValueFromInput(param.name))
|
2014-06-08 00:21:12 +02:00
|
|
|
if outType is None:
|
|
|
|
return values
|
|
|
|
if self._algName is None:
|
2012-09-15 18:25:25 +03:00
|
|
|
dependent = []
|
|
|
|
else:
|
2014-06-08 00:21:12 +02:00
|
|
|
dependent = self.model.getDependentAlgorithms(self._algName)
|
2016-09-21 18:24:26 +02:00
|
|
|
for alg in list(self.model.algs.values()):
|
2014-06-08 00:21:12 +02:00
|
|
|
if alg.name not in dependent:
|
|
|
|
for out in alg.algorithm.outputs:
|
|
|
|
if isinstance(out, outType):
|
2016-08-08 16:45:40 +03:00
|
|
|
if dataType is not None and out.datatype in dataType:
|
2016-08-08 15:38:28 +03:00
|
|
|
values.append(ValueFromOutput(alg.name, out.name))
|
|
|
|
else:
|
|
|
|
values.append(ValueFromOutput(alg.name, out.name))
|
2014-06-08 00:21:12 +02:00
|
|
|
|
|
|
|
return values
|
2014-07-02 07:46:03 +02:00
|
|
|
|
2014-06-08 00:21:12 +02:00
|
|
|
def resolveValueDescription(self, value):
|
|
|
|
if isinstance(value, ValueFromInput):
|
|
|
|
return self.model.inputs[value.name].param.description
|
2012-09-15 18:25:25 +03:00
|
|
|
else:
|
2014-06-08 00:21:12 +02:00
|
|
|
alg = self.model.algs[value.alg]
|
2014-10-03 21:56:24 +03:00
|
|
|
return self.tr("'%s' from algorithm '%s'") % (alg.algorithm.getOutputFromName(value.output).description, alg.description)
|
2012-09-15 18:25:25 +03:00
|
|
|
|
2016-08-23 14:48:11 +02:00
|
|
|
def getWidgetWrapperFromParameter(self, param):
|
2016-09-03 02:25:30 +02:00
|
|
|
wrapper = wrapper_from_param(param, DIALOG_MODELER)
|
|
|
|
if wrapper is None:
|
|
|
|
widget = self.getWidgetFromParameter(param)
|
|
|
|
wrapper = NotYetImplementedWidgetWrapper(param, widget)
|
|
|
|
|
|
|
|
model_values = []
|
|
|
|
values = self.getAvailableValuesForParam(param)
|
2016-08-23 14:48:11 +02:00
|
|
|
for value in values:
|
2016-09-03 02:25:30 +02:00
|
|
|
model_values.append((self.resolveValueDescription(value), value))
|
2016-08-23 14:48:11 +02:00
|
|
|
|
2016-09-03 02:25:30 +02:00
|
|
|
input_wrapper = ModelerWidgetWrapper(wrapper, model_values)
|
|
|
|
return input_wrapper
|
2016-08-23 14:48:11 +02:00
|
|
|
|
|
|
|
|
2012-09-15 18:25:25 +03:00
|
|
|
def getWidgetFromParameter(self, param):
|
|
|
|
if isinstance(param, ParameterRaster):
|
2014-09-12 12:33:06 +03:00
|
|
|
item = QComboBox()
|
2014-06-08 00:21:12 +02:00
|
|
|
layers = self.getAvailableValuesOfType(ParameterRaster, OutputRaster)
|
2013-10-01 20:52:22 +03:00
|
|
|
if param.optional:
|
2012-09-15 18:25:25 +03:00
|
|
|
item.addItem(self.NOT_SELECTED, None)
|
|
|
|
for layer in layers:
|
2014-06-08 00:21:12 +02:00
|
|
|
item.addItem(self.resolveValueDescription(layer), layer)
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterVector):
|
2014-09-12 12:33:06 +03:00
|
|
|
item = QComboBox()
|
2014-06-08 00:21:12 +02:00
|
|
|
layers = self.getAvailableValuesOfType(ParameterVector, OutputVector)
|
2013-10-01 20:52:22 +03:00
|
|
|
if param.optional:
|
2012-09-15 18:25:25 +03:00
|
|
|
item.addItem(self.NOT_SELECTED, None)
|
|
|
|
for layer in layers:
|
2014-06-08 00:21:12 +02:00
|
|
|
item.addItem(self.resolveValueDescription(layer), layer)
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterTable):
|
2014-09-12 12:33:06 +03:00
|
|
|
item = QComboBox()
|
2014-11-21 07:22:39 +01:00
|
|
|
tables = self.getAvailableValuesOfType(ParameterTable, OutputTable)
|
|
|
|
layers = self.getAvailableValuesOfType(ParameterVector, OutputVector)
|
2013-10-01 20:52:22 +03:00
|
|
|
if param.optional:
|
2012-09-15 18:25:25 +03:00
|
|
|
item.addItem(self.NOT_SELECTED, None)
|
2014-11-21 07:22:39 +01:00
|
|
|
for table in tables:
|
|
|
|
item.addItem(self.resolveValueDescription(table), table)
|
2012-09-15 18:25:25 +03:00
|
|
|
for layer in layers:
|
2014-06-08 00:21:12 +02:00
|
|
|
item.addItem(self.resolveValueDescription(layer), layer)
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterSelection):
|
2014-09-12 12:33:06 +03:00
|
|
|
item = QComboBox()
|
2012-09-15 18:25:25 +03:00
|
|
|
item.addItems(param.options)
|
2016-05-23 17:41:53 +03:00
|
|
|
item.setCurrentIndex(param.default or 0)
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterFixedTable):
|
|
|
|
item = FixedTablePanel(param)
|
|
|
|
elif isinstance(param, ParameterRange):
|
|
|
|
item = RangePanel(param)
|
|
|
|
elif isinstance(param, ParameterMultipleInput):
|
2016-08-23 19:33:42 +03:00
|
|
|
if param.datatype == dataobjects.TYPE_VECTOR_ANY:
|
2014-06-08 00:21:12 +02:00
|
|
|
options = self.getAvailableValuesOfType(ParameterVector, OutputVector)
|
2016-08-23 19:33:42 +03:00
|
|
|
elif param.datatype == dataobjects.TYPE_VECTOR_POINT:
|
|
|
|
options = self.getAvailableValuesOfType(ParameterVector, OutputVector, [dataobjects.TYPE_VECTOR_POINT, dataobjects.TYPE_VECTOR_ANY])
|
|
|
|
elif param.datatype == dataobjects.TYPE_VECTOR_LINE:
|
|
|
|
options = self.getAvailableValuesOfType(ParameterVector, OutputVector, [dataobjects.TYPE_VECTOR_LINE, dataobjects.TYPE_VECTOR_ANY])
|
|
|
|
elif param.datatype == dataobjects.TYPE_VECTOR_POLYGON:
|
|
|
|
options = self.getAvailableValuesOfType(ParameterVector, OutputVector, [dataobjects.TYPE_VECTOR_POLYGON, dataobjects.TYPE_VECTOR_ANY])
|
|
|
|
elif param.datatype == dataobjects.TYPE_RASTER:
|
2014-06-08 00:21:12 +02:00
|
|
|
options = self.getAvailableValuesOfType(ParameterRaster, OutputRaster)
|
2016-08-08 13:53:55 +03:00
|
|
|
else:
|
|
|
|
options = self.getAvailableValuesOfType(ParameterFile, OutputFile)
|
2012-09-15 18:25:25 +03:00
|
|
|
opts = []
|
|
|
|
for opt in options:
|
2014-06-08 00:21:12 +02:00
|
|
|
opts.append(self.resolveValueDescription(opt))
|
2012-09-15 18:25:25 +03:00
|
|
|
item = MultipleInputPanel(opts)
|
|
|
|
elif isinstance(param, ParameterString):
|
2014-06-08 00:21:12 +02:00
|
|
|
strings = self.getAvailableValuesOfType(ParameterString, OutputString)
|
2014-07-06 11:56:51 +02:00
|
|
|
options = [(self.resolveValueDescription(s), s) for s in strings]
|
2013-02-03 10:26:43 +01:00
|
|
|
if param.multiline:
|
2014-07-06 11:56:51 +02:00
|
|
|
item = MultilineTextPanel(options)
|
2016-09-21 18:24:26 +02:00
|
|
|
item.setText(str(param.default or ""))
|
2013-02-03 10:26:43 +01:00
|
|
|
else:
|
2014-09-12 12:33:06 +03:00
|
|
|
item = QComboBox()
|
2013-02-07 01:09:39 +01:00
|
|
|
item.setEditable(True)
|
2014-07-06 11:56:51 +02:00
|
|
|
for desc, val in options:
|
|
|
|
item.addItem(desc, val)
|
2016-09-21 18:24:26 +02:00
|
|
|
item.setEditText(str(param.default or ""))
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterTableField):
|
2014-09-12 12:33:06 +03:00
|
|
|
item = QComboBox()
|
2012-09-15 18:25:25 +03:00
|
|
|
item.setEditable(True)
|
2014-06-08 00:21:12 +02:00
|
|
|
fields = self.getAvailableValuesOfType(ParameterTableField, None)
|
2012-09-15 18:25:25 +03:00
|
|
|
for f in fields:
|
2014-06-08 00:21:12 +02:00
|
|
|
item.addItem(self.resolveValueDescription(f), f)
|
2016-06-02 12:14:59 +02:00
|
|
|
elif isinstance(param, ParameterTableMultipleField):
|
|
|
|
item = QComboBox()
|
|
|
|
item.setEditable(True)
|
|
|
|
fields = self.getAvailableValuesOfType(ParameterTableMultipleField, None)
|
|
|
|
for f in fields:
|
|
|
|
item.addItem(self.resolveValueDescription(f), f)
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterNumber):
|
2014-09-12 12:33:06 +03:00
|
|
|
item = QComboBox()
|
2012-09-15 18:25:25 +03:00
|
|
|
item.setEditable(True)
|
2014-06-08 00:21:12 +02:00
|
|
|
numbers = self.getAvailableValuesOfType(ParameterNumber, OutputNumber)
|
2012-09-15 18:25:25 +03:00
|
|
|
for n in numbers:
|
2014-06-08 00:21:12 +02:00
|
|
|
item.addItem(self.resolveValueDescription(n), n)
|
2016-09-21 18:24:26 +02:00
|
|
|
item.setEditText(str(param.default))
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterExtent):
|
2014-09-12 12:33:06 +03:00
|
|
|
item = QComboBox()
|
2012-09-15 18:25:25 +03:00
|
|
|
item.setEditable(True)
|
2014-06-08 00:21:12 +02:00
|
|
|
extents = self.getAvailableValuesOfType(ParameterExtent, OutputExtent)
|
2013-01-12 23:36:00 +01:00
|
|
|
if self.canUseAutoExtent():
|
2012-12-20 00:16:05 +01:00
|
|
|
item.addItem(self.USE_MIN_COVERING_EXTENT, None)
|
2012-09-15 18:25:25 +03:00
|
|
|
for ex in extents:
|
2014-06-08 00:21:12 +02:00
|
|
|
item.addItem(self.resolveValueDescription(ex), ex)
|
2012-12-20 00:16:05 +01:00
|
|
|
if not self.canUseAutoExtent():
|
2016-09-21 18:24:26 +02:00
|
|
|
item.setEditText(str(param.default))
|
2016-02-23 14:38:54 +02:00
|
|
|
elif isinstance(param, ParameterPoint):
|
|
|
|
item = QComboBox()
|
|
|
|
item.setEditable(True)
|
|
|
|
points = self.getAvailableValuesOfType(ParameterPoint)
|
|
|
|
for p in points:
|
|
|
|
item.addItem(self.resolveValueDescription(p), p)
|
2016-09-21 18:24:26 +02:00
|
|
|
item.setEditText(str(param.default))
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterFile):
|
2014-09-12 12:33:06 +03:00
|
|
|
item = QComboBox()
|
2012-09-15 18:25:25 +03:00
|
|
|
item.setEditable(True)
|
2014-07-04 22:35:41 +02:00
|
|
|
files = self.getAvailableValuesOfType(ParameterFile, OutputFile)
|
2012-09-15 18:25:25 +03:00
|
|
|
for f in files:
|
2014-06-08 00:21:12 +02:00
|
|
|
item.addItem(self.resolveValueDescription(f), f)
|
2015-01-09 17:23:49 +01:00
|
|
|
elif isinstance(param, ParameterGeometryPredicate):
|
|
|
|
item = GeometryPredicateSelectionPanel(param.enabledPredicates)
|
2012-09-15 18:25:25 +03:00
|
|
|
else:
|
2014-09-12 12:33:06 +03:00
|
|
|
item = QLineEdit()
|
2012-09-15 18:25:25 +03:00
|
|
|
try:
|
2016-09-21 18:24:26 +02:00
|
|
|
item.setText(str(param.default))
|
2012-09-15 18:25:25 +03:00
|
|
|
except:
|
|
|
|
pass
|
|
|
|
return item
|
|
|
|
|
2012-12-20 00:16:05 +01:00
|
|
|
def canUseAutoExtent(self):
|
2014-06-08 00:21:12 +02:00
|
|
|
for param in self._alg.parameters:
|
|
|
|
if isinstance(param, (ParameterRaster, ParameterVector, ParameterMultipleInput)):
|
2012-12-20 00:16:05 +01:00
|
|
|
return True
|
2014-06-08 00:21:12 +02:00
|
|
|
return False
|
2013-01-12 23:36:00 +01:00
|
|
|
|
2012-09-15 18:25:25 +03:00
|
|
|
def setTableContent(self):
|
2014-06-08 00:21:12 +02:00
|
|
|
params = self._alg.parameters
|
|
|
|
outputs = self._alg.outputs
|
2014-07-02 07:46:03 +02:00
|
|
|
visibleParams = [p for p in params if not p.hidden]
|
|
|
|
visibleOutputs = [p for o in outputs if not o.hidden]
|
2014-06-08 00:21:12 +02:00
|
|
|
self.tableWidget.setRowCount(len(visibleParams) + len(visibleOutputs))
|
2014-07-02 07:46:03 +02:00
|
|
|
|
|
|
|
for i, param in visibleParams:
|
2014-09-12 12:33:06 +03:00
|
|
|
item = QTableWidgetItem(param.description)
|
|
|
|
item.setFlags(Qt.ItemIsEnabled)
|
2014-06-08 00:21:12 +02:00
|
|
|
self.tableWidget.setItem(i, 0, item)
|
|
|
|
item = self.getWidgetFromParameter(param)
|
|
|
|
self.valueItems[param.name] = item
|
|
|
|
self.tableWidget.setCellWidget(i, 1, item)
|
|
|
|
self.tableWidget.setRowHeight(i, 22)
|
|
|
|
|
2014-07-02 07:46:03 +02:00
|
|
|
for i, output in visibleOutputs:
|
2014-09-12 12:33:06 +03:00
|
|
|
item = QTableWidgetItem(output.description + '<'
|
2015-08-22 14:29:41 +02:00
|
|
|
+ output.__module__.split('.')[-1] + '>')
|
2014-09-12 12:33:06 +03:00
|
|
|
item.setFlags(Qt.ItemIsEnabled)
|
2014-06-08 00:21:12 +02:00
|
|
|
self.tableWidget.setItem(i, 0, item)
|
|
|
|
item = QLineEdit()
|
|
|
|
if hasattr(item, 'setPlaceholderText'):
|
|
|
|
item.setPlaceholderText(ModelerParametersDialog.ENTER_NAME)
|
|
|
|
self.valueItems[output.name] = item
|
|
|
|
self.tableWidget.setCellWidget(i, 1, item)
|
|
|
|
self.tableWidget.setRowHeight(i, 22)
|
2012-09-15 18:25:25 +03:00
|
|
|
|
|
|
|
def setComboBoxValue(self, combo, value, param):
|
2014-06-08 00:21:12 +02:00
|
|
|
if isinstance(value, list):
|
|
|
|
value = value[0]
|
2013-06-09 16:04:44 +02:00
|
|
|
items = [combo.itemData(i) for i in range(combo.count())]
|
2014-06-08 00:21:12 +02:00
|
|
|
try:
|
2014-07-02 07:46:03 +02:00
|
|
|
idx = items.index(value)
|
2014-06-08 00:21:12 +02:00
|
|
|
combo.setCurrentIndex(idx)
|
2014-07-02 07:46:03 +02:00
|
|
|
return
|
2014-06-08 00:21:12 +02:00
|
|
|
except ValueError:
|
|
|
|
pass
|
2014-07-02 07:46:03 +02:00
|
|
|
if combo.isEditable():
|
2014-06-08 00:21:12 +02:00
|
|
|
if value is not None:
|
2016-09-21 18:24:26 +02:00
|
|
|
combo.setEditText(str(value))
|
2014-07-02 07:46:03 +02:00
|
|
|
elif isinstance(param, ParameterSelection):
|
2012-09-15 18:25:25 +03:00
|
|
|
combo.setCurrentIndex(int(value))
|
|
|
|
|
2014-07-02 07:46:03 +02:00
|
|
|
def setPreviousValues(self):
|
|
|
|
if self._algName is not None:
|
2014-06-08 00:21:12 +02:00
|
|
|
alg = self.model.algs[self._algName]
|
|
|
|
self.descriptionBox.setText(alg.description)
|
|
|
|
for param in alg.algorithm.parameters:
|
|
|
|
if param.hidden:
|
|
|
|
continue
|
2015-03-25 17:46:30 +01:00
|
|
|
if param.name in alg.params:
|
|
|
|
value = alg.params[param.name]
|
|
|
|
else:
|
2016-04-27 10:10:18 +02:00
|
|
|
value = param.default
|
2016-08-23 14:48:11 +02:00
|
|
|
|
|
|
|
wrapper = self.widget_wrappers[param.name]
|
|
|
|
if wrapper.implemented:
|
|
|
|
wrapper.setValue(value)
|
2016-09-03 02:25:30 +02:00
|
|
|
continue
|
2016-08-23 14:48:11 +02:00
|
|
|
|
|
|
|
widget = wrapper.widget
|
2013-10-01 20:52:22 +03:00
|
|
|
if isinstance(param, (
|
|
|
|
ParameterRaster,
|
|
|
|
ParameterVector,
|
|
|
|
ParameterTable,
|
|
|
|
ParameterTableField,
|
|
|
|
ParameterSelection,
|
|
|
|
ParameterNumber,
|
|
|
|
ParameterExtent,
|
2016-02-23 14:38:54 +02:00
|
|
|
ParameterFile,
|
2016-09-04 16:33:43 +02:00
|
|
|
ParameterPoint,
|
|
|
|
ParameterCrs
|
fix python pep8 warnings and fix some revealed errors
pep8 --ignore=E111,E128,E201,E202,E203,E211,E221,E222,E225,E226,E227,E231,E241,E261,E265,E272,E302,E303,E501,E701 \
--exclude="ui_*.py,debian/*,python/ext-libs/*" \
.
2015-02-01 14:15:42 +01:00
|
|
|
)):
|
2012-09-15 18:25:25 +03:00
|
|
|
self.setComboBoxValue(widget, value, param)
|
2013-02-03 10:26:43 +01:00
|
|
|
elif isinstance(param, ParameterString):
|
|
|
|
if param.multiline:
|
|
|
|
widget.setValue(value)
|
|
|
|
else:
|
2013-02-07 01:09:39 +01:00
|
|
|
self.setComboBoxValue(widget, value, param)
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterFixedTable):
|
fix python pep8 warnings and fix some revealed errors
pep8 --ignore=E111,E128,E201,E202,E203,E211,E221,E222,E225,E226,E227,E231,E241,E261,E265,E272,E302,E303,E501,E701 \
--exclude="ui_*.py,debian/*,python/ext-libs/*" \
.
2015-02-01 14:15:42 +01:00
|
|
|
pass # TODO!
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterMultipleInput):
|
2016-08-23 19:33:42 +03:00
|
|
|
if param.datatype == dataobjects.TYPE_VECTOR_ANY:
|
2014-06-08 00:21:12 +02:00
|
|
|
options = self.getAvailableValuesOfType(ParameterVector, OutputVector)
|
2016-08-23 19:33:42 +03:00
|
|
|
elif param.datatype == dataobjects.TYPE_VECTOR_POINT:
|
|
|
|
options = self.getAvailableValuesOfType(ParameterVector, OutputVector, [dataobjects.TYPE_VECTOR_POINT, dataobjects.TYPE_VECTOR_ANY])
|
|
|
|
elif param.datatype == dataobjects.TYPE_VECTOR_LINE:
|
|
|
|
options = self.getAvailableValuesOfType(ParameterVector, OutputVector, [dataobjects.TYPE_VECTOR_LINE, dataobjects.TYPE_VECTOR_ANY])
|
|
|
|
elif param.datatype == dataobjects.TYPE_VECTOR_POLYGON:
|
|
|
|
options = self.getAvailableValuesOfType(ParameterVector, OutputVector, [dataobjects.TYPE_VECTOR_POLYGON, dataobjects.TYPE_VECTOR_ANY])
|
|
|
|
elif param.datatype == dataobjects.TYPE_RASTER:
|
2014-06-08 00:21:12 +02:00
|
|
|
options = self.getAvailableValuesOfType(ParameterRaster, OutputRaster)
|
2016-08-08 15:38:28 +03:00
|
|
|
else:
|
|
|
|
options = self.getAvailableValuesOfType(ParameterFile, OutputFile)
|
2014-06-08 00:21:12 +02:00
|
|
|
selected = []
|
|
|
|
for i, opt in enumerate(options):
|
|
|
|
if opt in value:
|
|
|
|
selected.append(i)
|
|
|
|
widget.setSelectedItems(selected)
|
2015-01-09 17:23:49 +01:00
|
|
|
elif isinstance(param, ParameterGeometryPredicate):
|
|
|
|
widget.setValue(value)
|
2012-09-15 18:25:25 +03:00
|
|
|
|
2016-09-21 18:24:26 +02:00
|
|
|
for name, out in alg.outputs.items():
|
2014-07-02 07:46:03 +02:00
|
|
|
widget = self.valueItems[name].setText(out.description)
|
2013-02-07 01:09:39 +01:00
|
|
|
|
2013-02-03 10:26:43 +01:00
|
|
|
selected = []
|
|
|
|
dependencies = self.getAvailableDependencies()
|
2014-06-08 00:21:12 +02:00
|
|
|
for idx, dependency in enumerate(dependencies):
|
2015-08-21 10:33:26 +02:00
|
|
|
if dependency.name in alg.dependencies:
|
2014-06-08 00:21:12 +02:00
|
|
|
selected.append(idx)
|
2013-02-07 01:09:39 +01:00
|
|
|
|
2013-02-03 10:26:43 +01:00
|
|
|
self.dependenciesPanel.setSelectedItems(selected)
|
2012-09-15 18:25:25 +03:00
|
|
|
|
2014-06-08 00:21:12 +02:00
|
|
|
def createAlgorithm(self):
|
|
|
|
alg = Algorithm(self._alg.commandLineName())
|
|
|
|
alg.setName(self.model)
|
2014-07-02 07:46:03 +02:00
|
|
|
alg.description = self.descriptionBox.text()
|
2014-06-08 00:21:12 +02:00
|
|
|
params = self._alg.parameters
|
|
|
|
outputs = self._alg.outputs
|
2012-09-15 18:25:25 +03:00
|
|
|
for param in params:
|
|
|
|
if param.hidden:
|
|
|
|
continue
|
2016-08-23 14:48:11 +02:00
|
|
|
if not self.setParamValue(alg, param, self.widget_wrappers[param.name]):
|
2016-05-31 12:35:56 +02:00
|
|
|
self.bar.pushMessage("Error", "Wrong or missing value for parameter '%s'" % param.description,
|
|
|
|
level=QgsMessageBar.WARNING)
|
2014-06-08 00:21:12 +02:00
|
|
|
return None
|
2012-09-15 18:25:25 +03:00
|
|
|
for output in outputs:
|
2014-06-08 00:21:12 +02:00
|
|
|
if not output.hidden:
|
2016-09-21 18:24:26 +02:00
|
|
|
name = str(self.valueItems[output.name].text())
|
2014-06-08 00:21:12 +02:00
|
|
|
if name.strip() != '' and name != ModelerParametersDialog.ENTER_NAME:
|
2014-08-14 10:56:08 +02:00
|
|
|
alg.outputs[output.name] = ModelerOutput(name)
|
2013-02-07 01:09:39 +01:00
|
|
|
|
2013-02-03 10:26:43 +01:00
|
|
|
selectedOptions = self.dependenciesPanel.selectedoptions
|
|
|
|
availableDependencies = self.getAvailableDependencies()
|
|
|
|
for selected in selectedOptions:
|
2014-11-28 14:20:16 +01:00
|
|
|
alg.dependencies.append(availableDependencies[selected].name)
|
2013-02-07 01:09:39 +01:00
|
|
|
|
2014-06-08 00:21:12 +02:00
|
|
|
return alg
|
2012-09-15 18:25:25 +03:00
|
|
|
|
2014-06-08 00:21:12 +02:00
|
|
|
def setParamValueLayerOrTable(self, alg, param, widget):
|
2013-03-10 20:53:24 +01:00
|
|
|
idx = widget.currentIndex()
|
2012-09-15 18:25:25 +03:00
|
|
|
if idx < 0:
|
2013-03-10 20:53:24 +01:00
|
|
|
return False
|
2012-09-15 18:25:25 +03:00
|
|
|
else:
|
2013-06-09 16:04:44 +02:00
|
|
|
value = widget.itemData(widget.currentIndex())
|
2014-06-08 00:21:12 +02:00
|
|
|
alg.params[param.name] = value
|
2013-03-10 20:53:24 +01:00
|
|
|
return True
|
2012-09-15 18:25:25 +03:00
|
|
|
|
2014-06-08 00:21:12 +02:00
|
|
|
def setParamTableFieldValue(self, alg, param, widget):
|
2012-09-15 18:25:25 +03:00
|
|
|
idx = widget.findText(widget.currentText())
|
2014-07-02 07:46:03 +02:00
|
|
|
if idx < 0:
|
2016-09-21 18:24:26 +02:00
|
|
|
s = str(widget.currentText()).strip()
|
2013-10-01 20:52:22 +03:00
|
|
|
if s == '':
|
2013-04-13 09:40:01 +02:00
|
|
|
if param.optional:
|
2014-06-08 00:21:12 +02:00
|
|
|
alg.params[param.name] = None
|
2013-04-13 09:40:01 +02:00
|
|
|
return True
|
|
|
|
else:
|
|
|
|
return False
|
2014-07-02 07:46:03 +02:00
|
|
|
else:
|
2014-10-06 07:13:32 +02:00
|
|
|
alg.params[param.name] = s
|
2012-09-15 18:25:25 +03:00
|
|
|
return True
|
|
|
|
else:
|
2014-06-08 00:21:12 +02:00
|
|
|
alg.params[param.name] = widget.itemData(widget.currentIndex())
|
2012-09-15 18:25:25 +03:00
|
|
|
return True
|
|
|
|
|
2014-06-08 00:21:12 +02:00
|
|
|
def setParamStringValue(self, alg, param, widget):
|
2014-07-02 07:46:03 +02:00
|
|
|
if param.multiline:
|
2013-02-03 10:26:43 +01:00
|
|
|
value = widget.getValue()
|
2013-04-13 09:40:01 +02:00
|
|
|
option = widget.getOption()
|
2013-04-15 07:16:20 +02:00
|
|
|
if option == MultilineTextPanel.USE_TEXT:
|
2013-10-01 20:52:22 +03:00
|
|
|
if value == '':
|
2013-04-13 09:40:01 +02:00
|
|
|
if param.optional:
|
2014-06-08 00:21:12 +02:00
|
|
|
alg.params[param.name] = None
|
2013-04-15 07:16:20 +02:00
|
|
|
return True
|
2013-04-13 09:40:01 +02:00
|
|
|
else:
|
|
|
|
return False
|
2013-04-15 07:16:20 +02:00
|
|
|
else:
|
2014-06-08 00:21:12 +02:00
|
|
|
alg.params[param.name] = value
|
2013-02-07 01:09:39 +01:00
|
|
|
else:
|
2014-06-08 00:21:12 +02:00
|
|
|
alg.params[param.name] = value
|
2014-07-02 07:46:03 +02:00
|
|
|
else:
|
2013-02-03 10:26:43 +01:00
|
|
|
idx = widget.findText(widget.currentText())
|
2014-07-02 07:46:03 +02:00
|
|
|
if idx < 0:
|
2014-06-08 00:21:12 +02:00
|
|
|
value = widget.currentText().strip()
|
2013-10-01 20:52:22 +03:00
|
|
|
if value == '':
|
2013-04-13 09:40:01 +02:00
|
|
|
if param.optional:
|
2014-06-08 00:21:12 +02:00
|
|
|
alg.params[param.name] = None
|
2013-04-13 09:40:01 +02:00
|
|
|
return True
|
|
|
|
else:
|
|
|
|
return False
|
|
|
|
else:
|
2014-06-08 00:21:12 +02:00
|
|
|
alg.params[param.name] = value
|
2013-02-03 10:26:43 +01:00
|
|
|
else:
|
2014-07-02 07:46:03 +02:00
|
|
|
alg.params[param.name] = widget.itemData(widget.currentIndex())
|
2012-09-15 18:25:25 +03:00
|
|
|
return True
|
|
|
|
|
2014-06-08 00:21:12 +02:00
|
|
|
def setParamFileValue(self, alg, param, widget):
|
2012-09-15 18:25:25 +03:00
|
|
|
idx = widget.findText(widget.currentText())
|
2014-07-02 07:46:03 +02:00
|
|
|
if idx < 0:
|
|
|
|
value = widget.currentText()
|
2012-09-15 18:25:25 +03:00
|
|
|
else:
|
2013-06-09 16:04:44 +02:00
|
|
|
value = widget.itemData(widget.currentIndex())
|
2014-06-08 00:21:12 +02:00
|
|
|
alg.params[param.name] = value
|
2012-09-15 18:25:25 +03:00
|
|
|
return True
|
|
|
|
|
2014-06-08 00:21:12 +02:00
|
|
|
def setParamNumberValue(self, alg, param, widget):
|
2012-09-15 18:25:25 +03:00
|
|
|
idx = widget.findText(widget.currentText())
|
2014-07-02 07:46:03 +02:00
|
|
|
if idx < 0:
|
2015-11-04 09:42:22 +01:00
|
|
|
s = widget.currentText().strip()
|
|
|
|
if s:
|
|
|
|
try:
|
|
|
|
value = float(s)
|
|
|
|
except:
|
|
|
|
return False
|
|
|
|
elif param.optional:
|
|
|
|
value = None
|
|
|
|
else:
|
2012-09-15 18:25:25 +03:00
|
|
|
return False
|
|
|
|
else:
|
2013-07-01 01:11:19 +02:00
|
|
|
value = widget.itemData(widget.currentIndex())
|
2014-07-02 07:46:03 +02:00
|
|
|
alg.params[param.name] = value
|
2012-09-15 18:25:25 +03:00
|
|
|
return True
|
|
|
|
|
2014-06-08 00:21:12 +02:00
|
|
|
def setParamExtentValue(self, alg, param, widget):
|
2012-09-15 18:25:25 +03:00
|
|
|
idx = widget.findText(widget.currentText())
|
2014-07-02 07:46:03 +02:00
|
|
|
if idx < 0:
|
2016-09-21 18:24:26 +02:00
|
|
|
s = str(widget.currentText()).strip()
|
2015-11-04 09:42:22 +01:00
|
|
|
if s:
|
|
|
|
try:
|
|
|
|
tokens = s.split(',')
|
|
|
|
if len(tokens) != 4:
|
|
|
|
return False
|
|
|
|
for token in tokens:
|
|
|
|
float(token)
|
|
|
|
except:
|
2012-09-15 18:25:25 +03:00
|
|
|
return False
|
2015-11-04 09:42:22 +01:00
|
|
|
elif param.optional:
|
|
|
|
s = None
|
|
|
|
else:
|
2014-07-02 07:46:03 +02:00
|
|
|
return False
|
2014-06-08 00:21:12 +02:00
|
|
|
alg.params[param.name] = [s]
|
2012-09-15 18:25:25 +03:00
|
|
|
else:
|
2013-07-01 01:11:19 +02:00
|
|
|
value = widget.itemData(widget.currentIndex())
|
2014-06-08 00:21:12 +02:00
|
|
|
alg.params[param.name] = value
|
2012-09-15 18:25:25 +03:00
|
|
|
return True
|
|
|
|
|
2016-02-23 14:38:54 +02:00
|
|
|
def setParamPointValue(self, alg, param, widget):
|
|
|
|
idx = widget.findText(widget.currentText())
|
|
|
|
if idx < 0:
|
2016-09-21 18:24:26 +02:00
|
|
|
s = str(widget.currentText()).strip()
|
2016-02-23 14:38:54 +02:00
|
|
|
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
|
|
|
|
|
2016-08-23 14:48:11 +02:00
|
|
|
def setParamValue(self, alg, param, wrapper):
|
|
|
|
if wrapper.implemented:
|
|
|
|
alg.params[param.name] = wrapper.value()
|
|
|
|
return True
|
|
|
|
|
|
|
|
widget = wrapper.widget
|
2013-10-01 20:52:22 +03:00
|
|
|
if isinstance(param, (ParameterRaster, ParameterVector,
|
2015-12-20 10:12:18 +01:00
|
|
|
ParameterTable)):
|
2014-06-08 00:21:12 +02:00
|
|
|
return self.setParamValueLayerOrTable(alg, param, widget)
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterString):
|
2014-06-08 00:21:12 +02:00
|
|
|
return self.setParamStringValue(alg, param, widget)
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterNumber):
|
2014-06-08 00:21:12 +02:00
|
|
|
return self.setParamNumberValue(alg, param, widget)
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterExtent):
|
2014-06-08 00:21:12 +02:00
|
|
|
return self.setParamExtentValue(alg, param, widget)
|
2016-02-23 14:38:54 +02:00
|
|
|
elif isinstance(param, ParameterPoint):
|
|
|
|
return self.setParamPointValue(alg, param, widget)
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterFile):
|
2014-06-08 00:21:12 +02:00
|
|
|
return self.setParamFileValue(alg, param, widget)
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterSelection):
|
2014-06-08 00:21:12 +02:00
|
|
|
alg.params[param.name] = widget.currentIndex()
|
2014-07-02 07:46:03 +02:00
|
|
|
return True
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterRange):
|
2014-06-08 00:21:12 +02:00
|
|
|
alg.params[param.name] = widget.getValue()
|
2014-07-02 07:46:03 +02:00
|
|
|
return True
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterFixedTable):
|
2015-11-04 09:42:22 +01:00
|
|
|
table = widget.table
|
|
|
|
if not bool(table) and not param.optional:
|
|
|
|
return False
|
|
|
|
alg.params[param.name] = ParameterFixedTable.tableToString(table)
|
2014-07-02 07:46:03 +02:00
|
|
|
return True
|
2016-06-02 12:14:59 +02:00
|
|
|
elif isinstance(param, (ParameterTableField,
|
|
|
|
ParameterTableMultipleField)):
|
2014-06-08 00:21:12 +02:00
|
|
|
return self.setParamTableFieldValue(alg, param, widget)
|
2012-09-15 18:25:25 +03:00
|
|
|
elif isinstance(param, ParameterMultipleInput):
|
2016-08-23 19:33:42 +03:00
|
|
|
if param.datatype == dataobjects.TYPE_VECTOR_ANY:
|
2014-07-02 07:46:03 +02:00
|
|
|
options = self.getAvailableValuesOfType(ParameterVector, OutputVector)
|
2016-08-23 19:33:42 +03:00
|
|
|
elif param.datatype == dataobjects.TYPE_VECTOR_POINT:
|
|
|
|
options = self.getAvailableValuesOfType(ParameterVector, OutputVector, [dataobjects.TYPE_VECTOR_POINT, dataobjects.TYPE_VECTOR_ANY])
|
|
|
|
elif param.datatype == dataobjects.TYPE_VECTOR_LINE:
|
|
|
|
options = self.getAvailableValuesOfType(ParameterVector, OutputVector, [dataobjects.TYPE_VECTOR_LINE, dataobjects.TYPE_VECTOR_ANY])
|
|
|
|
elif param.datatype == dataobjects.TYPE_VECTOR_POLYGON:
|
|
|
|
options = self.getAvailableValuesOfType(ParameterVector, OutputVector, [dataobjects.TYPE_VECTOR_POLYGON, dataobjects.TYPE_VECTOR_ANY])
|
|
|
|
elif param.datatype == dataobjects.TYPE_RASTER:
|
2014-06-08 00:21:12 +02:00
|
|
|
options = self.getAvailableValuesOfType(ParameterRaster, OutputRaster)
|
2016-08-08 15:38:28 +03:00
|
|
|
else:
|
|
|
|
options = self.getAvailableValuesOfType(ParameterFile, OutputFile)
|
2014-07-02 07:46:03 +02:00
|
|
|
values = [options[i] for i in widget.selectedoptions]
|
2012-09-15 18:25:25 +03:00
|
|
|
if len(values) == 0 and not param.optional:
|
2014-07-02 07:46:03 +02:00
|
|
|
return False
|
2014-06-08 00:21:12 +02:00
|
|
|
alg.params[param.name] = values
|
2012-09-15 18:25:25 +03:00
|
|
|
return True
|
2015-01-09 17:23:49 +01:00
|
|
|
elif isinstance(param, ParameterGeometryPredicate):
|
|
|
|
alg.params[param.name] = widget.value()
|
|
|
|
return True
|
2012-09-15 18:25:25 +03:00
|
|
|
else:
|
2016-09-21 18:24:26 +02:00
|
|
|
alg.params[param.name] = str(widget.text())
|
2012-09-15 18:25:25 +03:00
|
|
|
return True
|
|
|
|
|
|
|
|
def okPressed(self):
|
2014-06-08 00:21:12 +02:00
|
|
|
self.alg = self.createAlgorithm()
|
|
|
|
if self.alg is not None:
|
2012-09-15 18:25:25 +03:00
|
|
|
self.close()
|
2016-05-31 12:35:56 +02:00
|
|
|
|
2012-09-15 18:25:25 +03:00
|
|
|
def cancelPressed(self):
|
2014-06-08 00:21:12 +02:00
|
|
|
self.alg = None
|
2012-09-15 18:25:25 +03:00
|
|
|
self.close()
|