[processing] Fix batch mode 'fill with parameter values' option for outputs

Fixes #30543
This commit is contained in:
Nyall Dawson 2019-07-08 13:39:50 +10:00
parent 2850683205
commit ec246e3ddb
3 changed files with 43 additions and 44 deletions

View File

@ -45,13 +45,13 @@ class AutofillDialog(BASE, WIDGET):
super(AutofillDialog, self).__init__(None)
self.setupUi(self)
self.mode = None
self.param_index = None
self.param_name = None
self.alg = alg
self.cmbFillType.currentIndexChanged.connect(self.toggleParameters)
for param in self.alg.parameterDefinitions():
self.cmbParameters.addItem(param.description())
self.cmbParameters.addItem(param.description(), param.name())
def toggleParameters(self, index):
if index == self.FILL_WITH_PARAMETER:
@ -63,10 +63,10 @@ class AutofillDialog(BASE, WIDGET):
def accept(self):
self.mode = self.cmbFillType.currentIndex()
self.param_index = self.cmbParameters.currentIndex()
self.param_name = self.cmbParameters.currentData()
QDialog.accept(self)
def reject(self):
self.mode = None
self.param_index = None
self.param_name = None
QDialog.reject(self)

View File

@ -88,47 +88,39 @@ class BatchOutputSelectionPanel(QWidget):
dlg = AutofillDialog(self.alg)
dlg.exec_()
if dlg.mode is not None:
try:
if dlg.mode == AutofillDialog.DO_NOT_AUTOFILL:
self.table.cellWidget(self.row,
self.col).setValue(filename)
elif dlg.mode == AutofillDialog.FILL_WITH_NUMBERS:
n = self.table.rowCount() - self.row
for i in range(n):
name = filename[:filename.rfind('.')] \
+ str(i + 1) + filename[filename.rfind('.'):]
self.table.cellWidget(i + self.row,
self.col).setValue(name)
elif dlg.mode == AutofillDialog.FILL_WITH_PARAMETER:
n = self.table.rowCount() - self.row
for i in range(n):
widget = self.table.cellWidget(i + self.row,
dlg.param_index)
param = self.alg.parameterDefinitions()[dlg.param_index]
if isinstance(param, (QgsProcessingParameterRasterLayer,
QgsProcessingParameterFeatureSource,
QgsProcessingParameterVectorLayer,
QgsProcessingParameterMultipleLayers)):
v = widget.value()
if isinstance(v, QgsMapLayer):
s = v.name()
else:
s = os.path.basename(v)
s = os.path.splitext(s)[0]
elif isinstance(param, QgsProcessingParameterBoolean):
s = str(widget.currentIndex() == 0)
elif isinstance(param, QgsProcessingParameterEnum):
s = str(widget.currentText())
elif isinstance(param, QgsProcessingParameterMatrix):
s = str(widget.table)
if dlg.mode == AutofillDialog.DO_NOT_AUTOFILL:
self.table.cellWidget(self.row,
self.col).setValue(filename)
elif dlg.mode == AutofillDialog.FILL_WITH_NUMBERS:
n = self.table.rowCount() - self.row
for i in range(n):
name = filename[:filename.rfind('.')] \
+ str(i + 1) + filename[filename.rfind('.'):]
self.table.cellWidget(i + self.row,
self.col).setValue(name)
elif dlg.mode == AutofillDialog.FILL_WITH_PARAMETER:
for row in range(self.row, self.table.rowCount()):
v = self.panel.valueForParameter(row - 1, dlg.param_name)
param = self.alg.parameterDefinition(dlg.param_name)
if isinstance(param, (QgsProcessingParameterRasterLayer,
QgsProcessingParameterFeatureSource,
QgsProcessingParameterVectorLayer,
QgsProcessingParameterMultipleLayers)):
if isinstance(v, QgsMapLayer):
s = v.name()
else:
s = str(widget.text())
name = filename[:filename.rfind('.')] + s \
+ filename[filename.rfind('.'):]
self.table.cellWidget(i + self.row,
self.col).setValue(name)
except:
pass
s = os.path.basename(v)
s = os.path.splitext(s)[0]
elif isinstance(param, QgsProcessingParameterBoolean):
s = 'true' if v else 'false'
elif isinstance(param, QgsProcessingParameterEnum):
s = param.options()[v]
else:
s = str(v)
name = filename[:filename.rfind('.')] + s \
+ filename[filename.rfind('.'):]
self.table.cellWidget(row,
self.col).setValue(name)
def selectDirectory(self):

View File

@ -567,6 +567,13 @@ class BatchPanel(BASE, WIDGET):
if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced:
self.tblParameters.setColumnHidden(self.parameter_to_column[param.name()], not checked)
def valueForParameter(self, row, parameter_name):
"""
Returns the current value for a parameter in a row
"""
wrapper = self.wrappers[row][self.parameter_to_column[parameter_name]]
return wrapper.parameterValue()
def parametersForRow(self, row, destinationProject=None, warnOnInvalid=True):
"""
Returns the parameters dictionary corresponding to a row in the batch table