Python ツールボックスのツール動作のカスタマイズ
ツールの [OK] ボタンを押す前に、整合チェックを必ず実行します。独自のカスタム ツールを作成する場合、整合チェックによって、パラメータの値に対する動作とパラメータ同士の動作をカスタマイズすることができます。整合チェックは、ツールの動作を制御するために使用される Python コードのブロックを使用して実行されます。
整合チェックの詳細については、「スクリプト ツールの整合チェックの概要」をご参照ください。
Python ツールボックスでは、個々のツール パラメータは、ツールの整合チェックに便利なプロパティとメソッドを備えた Parameter オブジェクトと関連付けられています。Python ツールボックスでは、パラメータの定義はツール クラスの getParameterInfo メソッドで行われます。これらのパラメータの動作と、他のパラメータや入力とやり取りを行う方法は、ツール クラスの updateParameters メソッドに従って整合チェックされます。
ツール パラメータへのアクセス
Parameter オブジェクトは、パラメータの定義方法と Python ツールボックスでのやり取りの方法に関する基礎を構成します。標準的な方法では、次のコードに示すように、ツール クラスの getParameterInfo メソッド内にパラメータのリストを作成します。
def getParameterInfo(self):
#Define parameter definitions
# First parameter
param0 = arcpy.Parameter(
displayName="Input Features",
name="in_features",
datatype="GPFeatureLayer",
parameterType="Required",
direction="Input")
return [param0]
Python ツールボックスのパラメータを定義する詳細については、「Python ツールボックスのパラメータの定義」をご参照ください。
パラメータ オブジェクト
メソッド
メソッド名 |
使用法の説明 |
---|---|
setErrorMessage(message:string) |
パラメータにエラー(赤の X 印)と該当するメッセージがあるとマークします。任意のパラメータにエラーがある場合、ツールは実行できません。 |
setWarningMessage(message:string) |
パラメータに警告(黄色の三角印)と該当するメッセージがあるとマークします。エラーと異なり、警告メッセージがある場合でもツールは実行します。 |
setIDMessage(messageType:string, messageID:string, {AddArgument1}, {AddArgument2}) |
システム メッセージを設定できます。引数は、AddIDMessage 関数と同じです。 |
clearMessage() |
メッセージのテキストを消去し、ステータスを情報(エラーまたは警告なし)に設定します。 |
hasError() |
パラメータにエラーがある場合に true を返します。 |
hasWarning() |
パラメータに警告がある場合に true を返します。 |
isInputValueDerived() |
ツールがモデル内で整合チェック中で入力値がモデル内にある別のツールの出力である場合に、true を返します。 |
プロパティ
プロパティ名 |
読み取り/書き込み |
値 |
説明 |
---|---|---|---|
name |
読み取り専用 |
文字列 |
パラメータ名。 |
direction |
読み取り専用 |
文字列:"Input"、"Output" |
パラメータの入力または出力の方向。 |
datatype |
読み取り専用 |
文字列 |
パラメータのデータ タイプのリストについては、「Python ツールボックスにあるパラメータのデータ タイプの定義」をご参照ください。 |
parameterType |
読み取り専用 |
文字列:"Required"、"Optional"、"Derived" |
パラメータ タイプ。 |
parameterDependencies |
読み取り/書き込み |
Python リスト |
各従属パラメータのインデックスのリスト。 |
value |
読み取り/書き込み |
Value オブジェクト |
パラメータの値。 |
defaultEnvironmentName |
読み取り専用 |
文字列 |
デフォルトの環境設定。 |
enabled |
読み取り/書き込み |
ブール値 |
パラメータが使用不可の場合は false。 |
altered |
読み取り専用 |
ブール値 |
ユーザが値を変更した場合は true。 |
hasBeenValidated |
読み取り専用 |
ブール値 |
内部整合チェック ルーチンがパラメータをチェック済みの場合は true。 |
category |
読み取り/書き込み |
文字列 |
パラメータのカテゴリ。 |
schema |
読み取り専用 |
Schema オブジェクト |
出力データセットのスキーマ。 |
filter |
読み取り専用 |
Filter オブジェクト |
パラメータ内の値に適用するフィルタ。 |
symbology |
読み取り/書き込み |
文字列 |
出力の描画に使用するレイヤ ファイル(*.lyr)のパス。 |
message |
読み取り専用 |
文字列 |
ユーザに表示するメッセージ。上記の SetErrorMessage および SetWarningMessage をご参照ください。 |
parameterDependencies
パラメータの依存性は、通常、Schema オブジェクトで使用するために設定します。ツールの getParameterInfo メソッドで、依存性がすでに設定されている場合が 2 つあります。
- タイプが Derived の出力データセット パラメータの場合、依存性は出力の派生元となるパラメータのインデックスです。
- 特定の入力データ タイプの場合、次の表に示したように、依存性はコントロールが使用する情報を含むパラメータのインデックスです。
入力データ タイプ |
従属データ タイプ |
説明 |
---|---|---|
フィールドまたは SQL 文 |
テーブル |
そのフィールドを持つテーブル。 |
INFO アイテムまたは INFO 条件式 |
INFO テーブル |
そのアイテムを持つ INFO テーブル。 |
カバレッジ フィーチャクラス |
カバレッジ |
フィーチャを含むカバレッジ。 |
面積単位または距離単位 |
ジオデータセット |
デフォルト単位を決定する地理データセット。 |
座標系 |
ワークスペース |
デフォルトの座標系を決定するワークスペース。 |
Network Analyst 階層の設定 |
ネットワーク データセット |
階層情報を持つネットワーク データセット。 |
Geostatistical 値テーブル |
Geostatistical レイヤ |
テーブルを含む解析レイヤ。 |
通常、依存性は getParameterInfo メソッドで設定されます。
def getParameterInfo(self):
#Define parameter definitions
# First parameter
param0 = arcpy.Parameter(
displayName="Input Features",
name="in_features",
datatype="GPFeatureLayer",
parameterType="Required",
direction="Input")
# Second parameter
param1 = arcpy.Parameter(
displayName="Sinuosity Field",
name="sinuosity_field",
datatype="Field",
parameterType="Optional",
direction="Input")
param1.value = "sinuosity"
# Third parameter
param2 = arcpy.Parameter(
displayName="Output Features",
name="out_features",
datatype="GPFeatureLayer",
parameterType="Derived",
direction="Output")
param2.parameterDependencies = [param0.name]
param2.schema.clone = True
params = [param0, param1, param2]
return params
value
これは、ユーザが入力したか、プログラムで設定したパラメータの値です。getParameterInfo メソッドで値を設定すると、パラメータの初期のデフォルト値になります。また、以下に示すように、ユーザ入力に対応して updateParameters で値を設定することもできます。
def updateParameters(self, parameters):
# Set the default distance threshold to 1/100 of the larger of the width
# or height of the extent of the input features. Do not set if there is no
# input dataset yet, or the user has set a specific distance (Altered is true).
#
if parameters[0].value:
if not parameters[6].altered:
extent = arcpy.Describe(parameters[0].value).extent
if extent.width > extent.height:
parameters[6].value = extent.width / 100
else:
parameters[6].value = extent.height / 100
return
パラメータのリストは 0 から始まります。最初のパラメータがリストの 0 の位置になります。3 番目のパラメータにアクセスするには、parameters[2] を使用します。
値が内部整合チェック ルーチンで整合チェックされないため、パラメータ値を updateMessages では設定しないでください。
値は、文字列を表すオブジェクトです。次のコード部では、値が文字列「Get Spatial Weights From File」と等しいかどうかをテストしています。このテストが機能するのは、パラメータのデータ タイプが文字列だからです。
# If the option to use a weights file is selected, enable the
# parameter for specifying the file, otherwise disable it
#
if parameters[3].value == "Get Spatial Weights From File":
parameters[8].enabled = True
else:
parameters[8].enabled = False
上記のテストは、パラメータのデータ タイプがフィーチャクラスやデータセットを表す値の場合は機能しません。値がフィーチャクラスやラスタなど、ディスク上のデータを表す場合は、文字列操作を実行する前に、値を文字列に変換する必要があります。内蔵の Python 関数 str は、次のように、値オブジェクトを文字列に変換します。
if str(parameters[0].value) == "E:/data/example.gdb/roads":
データセットを表すデータ タイプの値に対して必要なのは、str 関数を使用することだけです。これらのタイプの値に対して、str 関数はデータセットへのカタログ パスを返します。この関数を、long や距離単位など、他のデータ タイプに使用する必要はありません。これらのデータ タイプはデータセットを表していないため、文字列に自動的に変換されます。
Describe 関数を updateParameters で使用するときは、値の文字列表現を使用してはなりません。
間違っている例 |
|
正しい例 |
|
データセットに文字列表現を使用しないでください(使用した場合、そのデータセットにカタログ パスが生成されます)。これはそのデータセットがディスク上に存在していない場合があるからです(データセットがモデル変数である場合、そのモデルを先に実行しないと、データセットはディスク上に存在することができません)。データセットに文字列表現を使用した場合、そのデータセットがまだ存在していないために Describe 関数が失敗することがあります。
ListFields などのカタログ パスを使う ArcPy 関数は、整合チェック メソッドで使用しないでください。ModelBuilder でツールが整合チェックされるときにデータセットが存在せず、メソッドが失敗する可能性があります(ListFields の場合、Describe オブジェクトの fields プロパティを代わりに使用できます)。
文字列が等しいかテストする場合は、大文字と小文字を区別しない比較を使用する必要があります。次のコードでは、Python の lower 関数を使用してフィーチャクラスの形状タイプを小文字に変換して、小文字の文字列を比較しています(または、upper 関数を使用して、大文字の文字列を比較することもできます)。
fc = parameters[0].value
shapetype = arcpy.Describe(fc).shapeType.lower()
if shapetype in ["point", "multipoint"]:
altered
altered は、ユーザが出力パスを入力するなど、パラメータの値を変更した場合に true になります。パラメータを変更すると、ユーザが値を空白にするまで変更済みの状態となります。空白にすると、未変更に戻ります。整合チェック コードによって値をプログラムから変更しても、変更済みの状態には変化しません。つまり、パラメータの値を設定しても、パラメータの未変更の状態は変化しません。
altered は、パラメータの値を変更できるかどうかを判別するために使用されます。たとえば、ツールにフィーチャクラスのパラメータとキーワードのパラメータがあるとします。フィーチャクラスにポイントまたはポリゴンが含まれる場合、キーワードは RED、GREEN、BLUE になり、ラインが含まれる場合、キーワードは ORANGE、YELLOW、PURPLE、WHITE になります。
ユーザがポイント フィーチャクラスを入力したとします。キーワードのパラメータが変更されていない場合、値をデフォルト値の RED を設定します。
ライン フィーチャクラスが入力された場合、キーワードのパラメータが変更されていない限り、デフォルト値を ORANGE に設定します。
しかし、キーワードのパラメータがユーザによって変更された場合(キーワードが GREEN に設定された場合)、キーワードを再設定してはなりません。ユーザは GREEN を選択しましたが、その意図がわからないからです。ユーザは、GREEN が有効になるようにフィーチャクラスを変更するかもしれませんし、キーワードを(PURPLE などに)変更するかもしれません。GREEN は、ライン用に作成したキーワード群のメンバーではないため、内部整合チェックは、このパラメータにエラーのフラグを付けます。この時点で、ユーザには、入力フィーチャクラスを変更するかキーワードを変更するかの 2 つの選択肢があります。
if not parameters[2].altered:
parameters[2].value = "POINT"
hasBeenValidated
hasBeenValidated は、updateParameters と内部整合チェックが最後に呼び出されてから、ユーザがパラメータの値を変更した場合に、false になります。内部整合チェックが呼び出されると、ジオプロセシングはすべてのパラメータについて hasBeenValidated を true に自動的に設定します。
hasBeenValidated は、updateParameters を最後に呼び出してから、ユーザが値を変更したかどうかを判別するために使用されます。この情報は、パラメータを独自にチェックするかどうかを決定する際に利用できます。
def updateParameters(self, parameters):
# Set the default distance threshold to 1/100 of the larger of the width
# or height of the extent of the input features. Do not set if there is no
# input dataset yet, or the user has set a specific distance (Altered is true).
#
if parameters[0].value:
if not parameters[6].altered:
extent = arcpy.Describe(parameters[0].value).extent
if extent.width > extent.height:
parameters[6].value = extent.width / 100
else:
parameters[6].value = extent.height / 100
return