カスタム(モデルまたはスクリプト)ツールのバックグラウンド実行
ツールをバックグラウンドで実行することによって、そのツールを実行しながら、引き続きアプリケーション(例: ArcMap)を対話的に操作したり、他のタスクを実行したりすることが可能になります。
デフォルトでは、モデルまたはスクリプト ツールはフォアグラウンドで実行されます。ツールをバックグラウンドで実行したい場合は、後述の問題を解決する必要があります。モデルとスクリプトの問題が解決されたら、次の手順でツールをバックグラウンドで実行することができます。
- [カタログ] ウィンドウまたは ArcToolbox ウィンドウで、ツールを右クリックし、[プロパティ] をクリックします。[一般] タブで、[常にフォアグラウンドで実行] をオフにして、[OK] をクリックします。
- ArcMap メニューで、[ジオプロセシング] → [ジオプロセシング オプション] の順にクリックします。[バックグラウンド プロセス] パネルで [有効] をオンにします。
解決しなければならない問題としては、以下のものが挙げられます。
- マップ ドキュメント レイヤの使用 - これは、モデルおよびスクリプト ツールの両方に起因する問題です。
- スクリプト ツールでの現在のマップ ドキュメントの使用 - これは、スクリプト ツールのみに起因する問題です。
問題 1 - マップ ドキュメント レイヤの使用
モデルの例
モデル ツールをバックグラウンドで実行した場合、モデル パラメータとして関与するレイヤだけがバックグラウンド プロセスに利用可能になります。たとえば、次のモデルを使用して対象エリア、ベース コンター、およびコンター間隔を入力し、コンター フィーチャクラスを生成することができます。このモデルには、4 つのパラメータ(入力 3 つと、出力 1 つ)があります。[標高ラスタ] 変数は ArcMap コンテンツ ウィンドウ内のレイヤになりますが、モデル パラメータとしては設定されません。このモデルをツール ダイアログ ボックスを使用して実行する際には、[埋立候補地(Potential Landfill Site)] レイヤを [対象地域] パラメータとして入力します。ただし、[標高ラスタ] レイヤはパラメータでないため、入力不要です。
上のモデルは期待どおりフォアグラウンドで実行されます。ただし、このモデルがバックグラウンドで実行するように設定されている場合、モデルは実行に失敗し、「実行できる処理がありません。」という警告が表示されます(次の図を参照)。モデルが実行に失敗した原因は、バックグラウンドで実行中のプロセスがツール パラメータ以外のレイヤを使用できないためです。この例で、[標高ラスタ] モデル変数はパラメータではないことからバックグラウンド プロセスに検出されないため、実行に失敗して警告が表示されます。
解決策
モデルをバックグラウンドで実行されるように変更するには、いくつかの方法があります。
- レイヤ変数をモデル パラメータにする方法。そうすることによって、レイヤがバックグラウンド プロセスに渡され、ツールがバックグラウンドで実行されるようになります。これは最も簡単な解決策です。
- レイヤを使用するかわりに、ディスク上のデータセットを使用する方法。この例では、Extract by Mask ツールをダブルクリックし、([標高ラスタ] 変数で表される)[入力ラスタ] パラメータを変更して、コンテンツ ウィンドウからのレイヤでなくラスタ データセットを使用します。この解決策の唯一の問題は、レイヤは選択が可能であるのに対して、ディスク上のデータセットはそうではないことです。レイヤの選択が必要なためにレイヤ変数を使用した場合は、ディスク上のデータセットを使用できません。このような場合の代替方法には(変数をモデル パラメータにする方法以外に)、次の 2 通りの方法があります。
- モデル内で、[フィーチャ レイヤの作成(Make Feature Layer)] ツールを追加し、データセット変数からレイヤ変数を作成して、レイヤ変数を次のモデル プロセスへの入力として使用する方法。([フィーチャ レイヤの作成(Make Feature Layer)] ツールを使用して、選択式を入力することができます。)
- レイヤ ファイル(*.lyr)を作成し、その *.lyr ファイルをモデル内で使用する方法。つまり、上のモデル内で [標高ラスタ] 変数の参照先となるのは、*.lyr ファイルです。*.lyr ファイルを作成するには、[レイヤ ファイルの保存(Save To Layer File)] ツールを使用します。
入力レイヤのモデル パラメータを設定したうえで、モデルで作成または更新された他のすべてのレイヤをモデル パラメータとして設定することも必要です。
スクリプト ツールの例
スクリプト ツールでは、レイヤを入力として使用したときにモデル ツールと同じ問題が生じます。各レイヤは、パラメータとしても渡される必要があります。また、適切なジオプロセシング データ タイプを使用していなければなりません。スクリプト ツールには柔軟性があり、別の対処法が用意されています。たとえば、スクリプト ツールは、コンテンツ ウィンドウ内のレイヤ名に一致する文字列データ タイプを使用すると、レイヤとは異なる振舞いをすることができます。この方法はフォアグラウンドでは機能しても、バックグラウンドでは機能しません。理由は、マップ レイヤ参照からバックグラウンド プロセスへの接続が存在しないためです。次の図は、文字列として渡されるパラメータ レイヤと、レイヤを入力として使用するように変更されたスクリプト プロパティを示しています。
解決策
スクリプト ツール パラメータが適切なデータ タイプ(たとえば、フィーチャ レイヤ、ラスタ レイヤ、テーブル ビュー)を使用しているか確認します。
スクリプト ツールに使用されているレイヤがパラメータでない場合は、次の操作が必要です。
- レイヤ変数をモデル パラメータに設定します。
- レイヤを使用するかわりに、ディスク上のデータセット、またはディスク上の *.lyr ファイルを使用します。
問題 2 - スクリプト ツールでの現在のマップ ドキュメントの使用
現在のマップ ドキュメントに対する操作を実行するスクリプト ツールは、フォアグラウンドで実行する必要があります。arcpy.MapDocument クラスは、スクリプト ツールを介して現在のマップ ドキュメントを利用するための強力な手段です。たとえば、スクリプトを介して、選択したフィーチャに自動的にズームすることが可能です。次のスクリプトを実行すると、「Object: CreateObject はマップ ドキュメントを開けません」というエラーが発生します。
サンプル スクリプトはフィーチャを選択し、ArcPy Mapping を使用してそのフィーチャにズームします。
idvalue = arcpy.GetParameterAsText(0)
SelectLayerByAttribute_management("Parcels","NEW_SELECTION","ID' = " + idvalue)
mxd = arcpy.mapping.MapDocument("CURRENT")
df = arcpy.mapping.ListDataFrames(mxd)[0]
df.zoomToSelectedFeatures()
解決策
現在のマップ ドキュメントを使用するスクリプト ツールは、常にフォアグラウンドで実行する必要があります。[カタログ] ウィンドウでスクリプト ツールを右クリックし、[プロパティ] をクリックします。[一般] タブで、[常にフォアグラウンドで実行] をオンにします。
ツールを実行するためのツール
先に述べたような、現在のマップ ドキュメントを使用するスクリプト ツールがあるとします。このツールは常にフォアグラウンドで実行する必要があります。このスクリプト ツールをモデル ツール内で使用している場合に、モデル ツールをバックグラウンドで実行すると、どのようなことが起こるでしょうか?その答えは、モデルによってフォアグラウンドで実行する必要のあるモデル内のツールが検出されるということです。フォアグラウンドで実行する必要のあるツールは、モデルによって自動的にフォアグラウンドで実行されます。