17.28. Script agganciati pre e post esecuzione

Nota

Questa lezione mostra come utilizzare gli hook di pre- e post-esecuzione, che permettono di eseguire operazioni aggiuntive prima e dopo il corrente processing.

Gli hook di pre- e post-esecuzione sono script di processing che vengono eseguiti prima e dopo l’effettiva elaborazione dei dati. Questo può essere usato per automatizzare i processi che dovrebbero essere eseguiti ogni volta che un algoritmo viene eseguito.

La sintassi degli hook è identica alla sintassi degli script di Processing, vedi il corrispondente capitolo nel QGIS User Guide per maggiori dettagli.

Oltre a tutte le opzioni degli script, negli hook è possibile utilizzare una speciale variabile globale chiamata alg, che rappresenta l’algoritmo che è appena stato (o sta per essere) eseguito.

Ecco un esempio di script post-esecuzione. Per impostazione predefinita, Processing memorizza i risultati delle analisi in file temporanei. Questo script copierà gli output in una cartella specifica, in modo che non vengano cancellati dopo la chiusura di QGIS.

import os
import shutil
from processing.core.outputs import OutputVector, OutputRaster, OutputFile

MY_DIRECTORY = '/home/alex/outputs'

for output in alg.outputs:
    if isinstance(output, (OutputVector, OutputRaster, OutputFile)):
        dirname = os.path.split(output.value)[0]
        shutil.copytree(dirname, MY_DIRECTORY)

Nelle prime due righe importiamo i package Python richiesti: os — per la manipolazione del percorso, ad esempio l’estrazione del nome del file, e shutil — per varie operazioni sul filesystem come la copia dei file. Nella terza riga importiamo gli output di Processing. Questo sarà spiegato più in dettaglio più avanti in questa lezione.

Poi definiamo una costante MY_DIRECTORY, che è il percorso della cartella dove vogliamo copiare i risultati dell’analisi.

Alla fine dello script, abbiamo il codice dell’hook principale. Nel ciclo iteriamo tutti gli output dell’algoritmo e controlliamo se questo output è un output basato su file e può essere copiato. Se è così, individuiamo la cartella di primo livello in cui sono i file di output e poi copiamo tutti i file nella nostra cartella.

Per attivare questo hook dobbiamo aprire le opzioni di Processing, trovare la voce chiamata Post-execution script file nel gruppo General, e specificare lì il nome del file dello script hook. l’hook specificato verrà eseguito al termine di ogni algoritmo di Processing.

In modo simile, possiamo implementare degli hook di pre-esecuzione. Per esempio, creiamo un hook per controllare i vettori in ingresso per gli errori di geometria.

from qgis.core import QgsGeometry, QgsFeatureRequest
from processing.core.parameters import ParameterVector

for param in alg.parameters:
    if isinstance(param, ParameterVector):
        layer = processing.getObject(param.value)
        for f in layer.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([])):
            errors = f.geometry().validateGeometry()
            if len(errors) > 0:
                progress.setInfo('One of the input vectors contains invalid geometries!')

Come nell’esempio precedente, prima importiamo i package QGIS e Processing necessari.

Poi iteriamo su tutti i parametri dell’algoritmo e se viene trovato un parametro ParameterVector, otteniamo l’oggetto layer vettoriale corrispondente. Eseguiamo un ciclo su tutte gli elementi del layer e controlliamo se ci sono errori di geometria. Se almeno un elemento contiene una geometria non valida, stampiamo un messaggio di warning.

Per attivare questo hook dobbiamo inserire il suo nome di file nell’opzione Pre-execution script file nella finestra di configurazione di Processing. L’hook verrà eseguito prima di eseguire qualsiasi algoritmo di Processing.