17.28. Script de interceptare a pre- și post-execuției

Notă

Această lecție vă arată cum se utilizează script-urile de interceptare a pre- și post-execuției, permițând astfel efectuarea unor operații adiționale înainte și după procesarea efectivă.

Script-urile Processing de interceptare a pre și post-execuției se execută înainte și după prelucrarea datelor efective. Ele pot fi folosite pentru a automatiza sarcinile care ar trebui să fie efectuate, ori de câte ori un algoritm este executat.

The syntax of the hooks is identical to the syntax of Processing scripts, see the corresponding chapter in the QGIS User Guide for more details.

În plus față de toate caracteristicile scripturilor, în codurile de interceptare puteți utiliza o variabilă globală specială dnumită alg, care reprezintă algoritmul care tocmai a fost (sau urmează să fie) executat.

Here is an example post-execution script. By default, Processing stores analysis results in temporary files. This script will copy outputs to a specific directory, so they won’t be deleted after closing 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 the first two lines we import the required Python packages: os — for path manipulations, e.g. extracting file name, and shutil — for various filesystem operations like copying files. In the third line we import Processing outputs. This will be explained in more detail later in this lesson.

Then we define a MY_DIRECTORY constant, which is the path to the directory where we want to copy analysis results.

La sfârșitul scriptului, avem codul principal de interceptare. În cadrul unei bucle vom itera toate ieșirile algoritmilor și vom verifica dacă ele reprezintă fișiere și dacă pot fi copiate. Dacă da, determinăm directorul de nivel superior în care sunt localizate fișierele de ieșire, apoi le copiem în directorul nostru.

To activate this hook we need to open the Processing options, find the entry named Post-execution script file in the General group, and specify the filename of the hook script there. the specified hook will be executed after each Processing algorithm.

In a similar way, we can implement pre-execution hooks. For example, let’s create a hook to check input vectors for geometry errors.

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

As in the previous example, first we import required QGIS and Processing packages.

Then we iterate over all the algorithm parameters and if a ParameterVector parameter is found, we get the corresponding vector layer object from it. We loop over all the features of the layer and check them for geometry errors. If at least one feature contains an invalid geometry, we print a warning message.

To activate this hook we need enter its filename in the Pre-execution script file option in the Processing configuration dialog. The hook will be executed before running any Processing algorithm.