Viktigt
Översättning är en gemenskapsinsats du kan gå med i. Den här sidan är för närvarande översatt till 100.00%.
17.28. Skript-hooks före och efter utförandet
Observera
Den här lektionen visar hur man använder pre- och post-execution hooks, som gör det möjligt att utföra ytterligare operationer före och efter själva bearbetningen.
Pre- och post-execution hooks är bearbetningsskript som körs före och efter att den faktiska databehandlingen utförs. Detta kan användas för att automatisera uppgifter som ska utföras när en algoritm exekveras.
Syntaxen för krokarna är identisk med syntaxen för Processing-skript, se motsvarande kapitel <https://docs.qgis.org/testing/en/docs/user_manual/processing/console.html>`_ i QGIS User Guide för mer information.
Förutom alla skriptfunktioner kan du i hooks använda en speciell global variabel som heter alg
, som representerar den algoritm som just har körts (eller håller på att köras).
Här är ett exempel på ett skript efter utförandet. Som standard lagrar Processing analysresultat i tillfälliga filer. Detta skript kopierar utdata till en specifik katalog, så att de inte raderas efter att QGIS har stängts.
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)
I de två första raderna importerar vi de Python-paket som krävs: os
— för sökvägsmanipulationer, t.ex. extrahering av filnamn, och shutil
— för olika filsystemoperationer som kopiering av filer. På den tredje raden importerar vi Processing outputs. Detta kommer att förklaras mer i detalj senare i den här lektionen.
Sedan definierar vi en MY_DIRECTORY
-konstant, som är sökvägen till den katalog där vi vill kopiera analysresultaten.
I slutet av skriptet har vi den huvudsakliga krokkoden. I loopen itererar vi över alla algoritmutgångar och kontrollerar om denna utgång är en filbaserad utgång och kan kopieras. Om så är fallet bestämmer vi den katalog på högsta nivån där utdatafilerna finns och kopierar sedan alla filer till vår katalog.
För att aktivera den här hooken måste vi öppna bearbetningsalternativen, hitta posten Post-execution script file i gruppen General och ange filnamnet på krokskriptet där. den angivna hooken kommer att köras efter varje bearbetningsalgoritm.
På ett liknande sätt kan vi implementera krokar före körning. Låt oss till exempel skapa en hook för att kontrollera ingångsvektorer för geometriska fel.
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!')
Precis som i det föregående exemplet importerar vi först de nödvändiga QGIS- och Processing-paketen.
Sedan itererar vi över alla algoritmparametrar och om en ParameterVector-parameter hittas, hämtar vi motsvarande vektorlagerobjekt från den. Vi loopar över alla funktioner i skiktet och kontrollerar dem för geometrifel. Om minst en funktion innehåller en ogiltig geometri skriver vi ut ett varningsmeddelande.
För att aktivera den här hooken måste vi ange dess filnamn i alternativet Pre-execution script file i Processing-konfigurationsdialogen. Kroken kommer att exekveras innan någon Processing-algoritm körs.