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.
Creare un nuovo script da template con il pulsante dedicato (funzionalità sviluppata da noi):
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)
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).
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)
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:
Happy Processing coding!