2 votos

Acceso a la cadena de salida del script de procesamiento de QGIS 3 en el modelador gráfico

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:

enter image description here

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:

enter image description here

¿Alguna sugerencia sobre lo que puede estar mal en mi script o qué más me estoy perdiendo?

3voto

John Feminella Puntos 123

Estás añadiendo tu cadena de salida como parámetro de entrada. Debería ser:

self.addOutput(QgsProcessingOutputString(self.OUTPUT_STRING, self.tr('Output string')))

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X