En los buenos tiempos de QGIS 2 creé un script de procesamiento, que toma como entrada un table
y un table field
(la tabla sólo tiene un registro) y devuelve el valor del atributo de cadena del 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]
Incorporar este script en el modelador gráfico de QGIS 2 y utilizar el resultado, por ejemplo, en un Calculadora de campo me permite elegir su cadena de salida como entrada para (aquí) la fórmula:
Hasta aquí todo bien, ahora a QGIS 3. Al menos he conseguido (?) reescribir este script, mi resultado:
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}
Ahora me gustaría hacer lo mismo en QGIS 3, pero el campo 'Fórmula' se niega a dejarme elegir la salida de mi script como entrada:
¿Alguna sugerencia sobre lo que puede estar mal en mi script o qué más me estoy perdiendo?