17.28. Pre y post-ejecución de la secuencia de comandos hooks

Nota

Esta lección muestra cómo usar hooks previos y posteriores a la ejecución, que permiten realizar operaciones adicionales antes y después del procesamiento real.

Los hooks previos y posteriores a la ejecución son scripts de procesamiento que se ejecutan antes y después de realizar el procesamiento de datos real. Esto se puede utilizar para automatizar tareas que deben realizarse cada vez que se ejecuta un algoritmo.

La sintaxis de los ganchos es idéntica a la sintaxis de los scripts de procesamiento, consulte el correspondiente capítulo en la Guía del usuario de QGIS para obtener más detalles.

Además de todas las características de los scripts, en los hooks puede usar una variable global especial llamada alg, que representa el algoritmo que acaba de ejecutarse (o está a punto de ejecutarse).

A continuación se muestra un ejemplo de secuencia de comandos posterior a la ejecución. De forma predeterminada, Processing almacena los resultados del análisis en archivos temporales. Este script copiará los resultados a un directorio específico, por lo que no se eliminarán después de cerrar 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)

En las dos primeras líneas importamos los paquetes de Python requeridos: os — para manipulaciones de ruta, p. ej. extraer el nombre del archivo y shutil — para varias operaciones del sistema de archivos, como copiar archivos. En la tercera línea importamos salidas de procesamiento. Esto se explicará con más detalle más adelante en esta lección.

Luego definimos una constante `` MY_DIRECTORY “”, que es la ruta al directorio donde queremos copiar los resultados del análisis.

Al final del script, tenemos el código del hook principal. En el ciclo, iteramos sobre todas las salidas del algoritmo y verificamos si esta salida es una salida basada en un archivo y se puede copiar. Si es así, determinamos el directorio de nivel superior en el que se encuentran los archivos de salida y luego copiamos todos los archivos a nuestro directorio.

Para activar este hook, necesitamos abrir las opciones de Procesamiento, encontrar la entrada llamada Archivo de script posterior a la ejecución en el grupo General y especificar allí el nombre de archivo del script del hook. el hook especificado se ejecutará después de cada algoritmo de procesamiento.

De manera similar, podemos implementar ganchos de ejecución previa. Por ejemplo, creemos un hook para verificar los vectores de entrada en busca de errores de geometría.

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!')

Como en el ejemplo anterior, primero importamos los paquetes de procesamiento y QGIS requeridos.

Luego, iteramos sobre todos los parámetros del algoritmo y, si se encuentra un parámetro ParameterVector, obtenemos el objeto de capa vectorial correspondiente. Repasamos todas las entidades de la capa y las comprobamos en busca de errores de geometría. Si al menos una entidad contiene una geometría no válida, imprimimos un mensaje de advertencia.

Para activar este gancho necesitamos ingresar su nombre de archivo en la opción Archivo de script de ejecución previa en el diálogo de configuración de Procesamiento. El hook se ejecutará antes de ejecutar cualquier algoritmo de procesamiento.