Widget personalizzati in script di Processing

Tramite Processing si possono aggiungere script che estendono le funzionalità di QGIS.

Se avete dimestichezza con la sintassi degli script di Processing sapete che la tipologia di parametri che si possono aggiungere come input sono moltissimi:

Se volessimo aggiungere noi un parametro ad hoc per la nostra analisi? Per esempio un parametro di tipologia DateTime con un pulsante che apre un calendario?

Processing permette di aggiungere widget personalizzati in modo piuttosto semplice. Nell'esempio che segue lo script non farà niente di straordinario, mi sono limitato a modificare leggermente il template dello script con il parametro aggiuntivo, il resto sta a voi.

Procediamo per step.

  1. Creare un nuovo script da template con il pulsante dedicato (funzionalità sviluppata da noi):

    Processing script template

  2. bisogna importare qualche classe prima di iniziare:

    from processing.gui.wrappers import WidgetWrapper
    from qgis.PyQt.QtWidgets import QDateTimeEdit
    from qgis.PyQt.QtCore import QCoreApplication, QDate
    from qgis.core import (QgsProcessing,
                       QgsFeatureSink,
                       QgsProcessingException,
                       QgsProcessingAlgorithm,
                       QgsProcessingParameterString,
                       QgsProcessingParameterFeatureSource,
                       QgsProcessingParameterFeatureSink)
  3. Creare un altra classe che deve ereditare dalla classe WidgetWrapper. Qui dobbiamo specificare tutte le impostazioni del nostro widget, come la possibilità di aggiungere il pulsante calendario:

    
    class DateTimeWidget(WidgetWrapper):
        """
        QDateTimeEdit widget with calendar pop up
        """
    
        def createWidget(self):
            self._combo = QDateTimeEdit()
            self._combo.setCalendarPopup(True)
    
            today = QDate.currentDate()
            self._combo.setDate(today)
    
            return self._combo
    
        def value(self):
            date_chosen = self._combo.dateTime()
            return date_chosen.toString(Qt.ISODate)

    la classe ha un metodo, createWidget che crea il widget e un altro metodo, value che restituisce il valore del widget, ovvero la data (in questo caso ho deciso di gestirla come stringa).

  4. all'interno del metodo initAlgorithm della classe principale dell'algoritmo, quindi la classe che eredita dalla classe QgsProcessingAlgorithm, dobbiamo specificare come Processing dovrà costruire l'interfaccia del widget:

    
      class myAlgorithm(QgsProcessingAlgorithm):
    
          ....
    
          DATEINI = 'DATEINI'
    
          ....
    
        def initAlgorithm(self, config=None):
    
            param = QgsProcessingParameterString(self.DATEINI, 'Initial Date')
            param.setMetadata({
                'widget_wrapper': {
                    'class': DateTimeWidget}})
    
            self.addParameter(param)
    
  5. ultimo step, all'interno del metodo processAlgorithm dobbiamo prendere il valore del widget e assegnarlo a una variabile per farci successivamente quello che vogliamo:

    
      mydate = self.parameterAsString(
          parameters,
          self.INIDATE,
          context
      )
    

Ed ecco il risultato finale:

Processing script UI

Happy Processing coding!

Articolo precedente Prossimo articolo