ノート
このレッスンでは、実行前および実行後のフックを使用して、実際の処理の前と後に追加の操作を実行できるようにする方法を示します。
実行前後のフックは、実際のデータ処理が実行される前と後に実行されるプロセッシングのスクリプトです。これは、アルゴリズムが実行されるたびに実行されるべき作業を自動化するために使用できます。
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.
すべてのスクリプト機能に加えて、フックでは alg という名前の特別なグローバル変数を使用できます、これはちょうど実行された(またはされようとしている)アルゴリズムを表します。
ここに実行後スクリプトの例があります。デフォルトでは、プロセッシングは一時ファイルでの解析結果を格納します。このスクリプトは、特定のディレクトリに出力をコピーしますので、それらは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)
例えば、ファイル名を抽出し、ファイルをコピーするような様々なファイルシステム操作のための shutil —、パス操作のために— os :最初の2行では、必要なPythonパッケージをインポートします。三行目では、処理の出力をインポートします。これは、このレッスンの後半でより詳細に説明します。
それから、分析結果をコピーしたいディレクトリへのパスである MY_DIRECTORY 定数を定義します。
スクリプトの終わりには、メインフックコードを持っています。このループ中では、すべてのアルゴリズムの出力を反復処理し、この出力がファイルベースの出力でありコピーできるかどうかを確認します。そうである場合は、出力ファイルが置かれる最上位ディレクトリを決定し、そのディレクトリにすべてのファイルをコピーします。
このフックを有効にするには、処理オプションを開く 一般 グループ内の 実行後スクリプトファイル という名前のエントリを見つけて、そこにフックスクリプトのファイル名を指定するneeed。指定されたフックは、各処理アルゴリズムの後に実行されます。
同様にして、実行前フックを実装できます。たとえば、幾何学的エラーがないかどうか入力ベクターをチェックするフックを作成してみましょう。
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!')
前の例のように、まず最初に必要なQGISと処理パッケージをインポートします。
その後、すべてのアルゴリズムパラメーターを反復してParameterVectorパラメーターが見つかった場合、それから、対応するベクターレイヤーオブジェクトを取得します。レイヤーのすべての地物をループし、ジオメトリエラーのためにそれらを確認してください。少なくとも1つの地物に無効なジオメトリが含まれている場合、警告メッセージを出力します。
このフックを有効にするには処理の設定ダイアログのオプション 実行前スクリプトファイル にそのファイル名を入力する必要があります。フックは、任意の処理アルゴリズムを実行する前に実行されます。