In the good ould days of QGIS 2 I created a processing script, that takes as input a table
and a table field
(table has only one record) and returns the string attribute value of the table field
:
##mygroup=group
##myname=name
##input=table
##a=field input
##text=output string
formeln=processing.getObject(input)
for fo in formeln.getFeatures():
text = fo[a]
Embedding this script in graphical modeler in QGIS 2 and using the output e.g. in a Field calculator algorithm lets me chose its output string as input for (here) the formula:
So far so good, now on to QGIS 3. At least I succeeded (?) in rewriting this script, my result:
from PyQt5.QtCore import QCoreApplication
from qgis.core import (QgsProcessing,
QgsFeatureSink,
QgsProcessingException,
QgsProcessingAlgorithm,
QgsProcessingParameterFeatureSource,
QgsProcessingParameterField,
QgsProcessingParameterString,
QgsProcessingParameterFeatureSink,
)
import processing
class ExampleProcessingAlgorithm(QgsProcessingAlgorithm):
FORMULA_COLLECTION = 'FORMULA_COLLECTION'
FORMULA_ID = 'FORMULA_ID'
OUTPUT_STRING = 'OUTPUT'
def tr(self, string):
return QCoreApplication.translate('Processing', string)
def createInstance(self):
return ExampleProcessingAlgorithm()
def name(self):
return 'output_table_field_value_as_string'
def displayName(self):
return self.tr('Table field value as string')
def group(self):
return self.tr('giswg')
def groupId(self):
return 'giswg'
def shortHelpString(self):
return self.tr("This returns the value of the specified field of a table. Implies, that the table has exacly one record.")
def initAlgorithm(self, config=None):
#input parameter
self.addParameter(QgsProcessingParameterFeatureSource(self.FORMULA_COLLECTION, self.tr('The formula collection'), [QgsProcessing.TypeVector]))
self.addParameter(QgsProcessingParameterField(self.FORMULA_ID, None, self.tr('The formula identificator'), self.FORMULA_COLLECTION, QgsProcessingParameterField.String))
#output parameter
self.addParameter(QgsProcessingParameterString(self.OUTPUT_STRING, self.tr('Output string'), ''))
def processAlgorithm(self, parameters, context, feedback):
formula_collection = self.parameterAsSource(parameters, self.FORMULA_COLLECTION, context)
formula_id = self.parameterAsString(parameters, self.FORMULA_ID, context)
out_string = self.parameterAsString(parameters, self.OUTPUT_STRING, context)
#this portion is taken from the old QGIS 2 script
for fo in formula_collection.getFeatures():
out_string = fo[formula_id]
return {self.OUTPUT_STRING: out_string}
Now I would like to do the same in QGIS 3, but the 'Formula' field refuses to let me chose the output of my script as input:
Any suggestions what might be wrong with my script or what else I'm probably missing?