17.28. Haken voor vóór en na uitvoering van scripts

Notitie

Deze les laat u zien hoe hooks te gebruiken vóór en na uitvoering, die het mogelijk maken aanvullende bewerkingen uit te voeren vóór en na de feitelijke verwerking.

Hooks vóór en na uitvoering zijn scripts voor Processing die worden uitgevoerd vóór en nadat de feitelijke verwerking van de gegevens wordt uitgevoerd. Dit kan worden gebruikt om taken te automatiseren die altijd zouden moeten worden uitgevoerd wanneer een algoritme wordt uitgevoerd.

De syntaxis van de hooks is identiek aan de syntaxis van scripts voor Processing, bekijk het betreffende hoofdstuk in de QGIS Gebruikersgids voor meer details.

In aanvulling op alle mogelijkheden voor scripts, kunt u in hooks een speciale globale variabele genaamd alg gebruiken, die staat voor het algoritme dat zojuist is (of zal worden) uitgevoerd.

Hier is een voorbeeld voor een script voor na uitvoering. Standaard slaat Processing resultaten van analyses op in tijdelijke bestanden. Dit script zal de uitvoer kopiëren naar een specifieke map, dus zullen zij niet worden verwijderd bij het sluiten van 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)

In de eerste twee regels importeren we de vereiste pakketten van Python: os — voor manipulaties aan het pad, bijv. het uitnemen van de bestandsnaam, en shutil — voor verscheidene bewerkingen voor het bestandssysteem zoals het kopiëren van bestanden. In de derde regel importeren we uitvoer van Processing. Dit zal later meer in detail in deze les worden uitgelegd.

Daarna definiëren we een constante MY_DIRECTORY, die het pad is naar de map waar we de resultaten van de analyses naartoe willen kopiëren.

Aan het einde van het script staat de hoofdcode voor de hook. In de loop gaan we door alle uitvoer van het algoritme en controleren of deze uitvoer een uitvoer is die op een bestand is gebaseerd en of die kan worden gekopieerd. Als dat zo is bepalen we de map op het hoogste niveau waarin de bestanden zijn opgeslagen en kopiëren dan alle bestanden naar onze map.

We moeten, om deze hook te activeren, de opties van Processing te openen, het item Na-uitvoering script in de groep Algemeen, en daar de naam specificeren van het script van de hook. de gespecificeerde hook zal na elk algoritme van Processing worden uitgevoerd.

Op dezelfde manier kunnen we hooks vóór uitvoering implementeren. Laten we bijvoorbeeld een hook maken om invoervectoren voor fouten in geometrieën te controleren.

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

Net als in het vorige voorbeeld importeren we eerst de vereiste pakketten voor QGIS en Processing.

Daarna gaan we door alle parameters van het algoritme en als een parameter ParameterVector wordt gevonden, halen we we het daarbij behorende object van de vectorlaag op. We lopen door alle objecten van de laag en controleren ze op fouten in de geometrie. Als tenminste één object een ongeldige geometrie bevat, drukken we een waarschuwing af.

We moeten, om deze hook te activeren, de optie Vóór-uitvoering script te openen in het dialoogvenster voor configuratie van Processing. De hook zal vóór het uitvoeren van elk algoritme van Processing worden uitgevoerd.