Python ツールボックスのツール動作のカスタマイズ

ツールの [OK] ボタンを押す前に、整合チェックを必ず実行します。独自のカスタム ツールを作成する場合、整合チェックによって、パラメータの値に対する動作とパラメータ同士の動作をカスタマイズすることができます。整合チェックは、ツールの動作を制御するために使用される Python コードのブロックを使用して実行されます。

整合チェックの詳細については、「スクリプト ツールの整合チェックの概要」をご参照ください。

Python ツールボックスでは、個々のツール パラメータは、ツールの整合チェックに便利なプロパティとメソッドを備えた Parameter オブジェクトと関連付けられています。Python ツールボックスでは、パラメータの定義はツール クラスの getParameterInfo メソッドで行われます。これらのパラメータの動作と、他のパラメータや入力とやり取りを行う方法は、ツール クラスの updateParameters メソッドに従って整合チェックされます。

Python ツールボックスのスキーマの更新Python ツールボックスのライセンスの動作

ツール パラメータへのアクセス

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 を返します。

パラメータ オブジェクトのメソッド

プロパティ

プロパティ名

Read/Write

説明

name

Read-only

文字列

パラメータ名。

direction

Read-only

文字列:"Input"、"Output"

パラメータの入力または出力の方向。

datatype

Read-only

文字列

パラメータのデータ タイプのリストについては、「Python ツールボックスにあるパラメータのデータ タイプの定義」をご参照ください。

parameterType

Read-only

文字列:"Required"、"Optional"、"Derived"

パラメータ タイプ。

parameterDependencies

Read/write

Python リスト

各従属パラメータのインデックスのリスト。

value

Read/write

Value オブジェクト

パラメータの値。

defaultEnvironmentName

Read-only

文字列

デフォルトの環境設定。

enabled

Read/write

ブール演算

パラメータが使用不可の場合は false。

altered

Read-only

ブール演算

ユーザが値を変更した場合は true。

hasBeenValidated

Read-only

ブール演算

内部整合チェック ルーチンがパラメータをチェック済みの場合は true。

category

Read/write

文字列

パラメータのカテゴリ。

schema

Read-only

Schema オブジェクト

出力データセットのスキーマ。

filter

Read-only

Filter オブジェクト

パラメータ内の値に適用するフィルタ。

symbology

Read/write

文字列

出力の描画に使用するレイヤ ファイル(*.lyr)のパス。

message

Read-only

文字列

ユーザに表示するメッセージ。上記の SetErrorMessage および SetWarningMessage をご参照ください。

パラメータ オブジェクトのプロパティ

parameterDependencies

パラメータの依存性は、通常、Schema オブジェクトで使用するために設定します。ツールの getParameterInfo メソッドで、依存性がすでに設定されている場合が 2 つあります。

  • タイプが Derived の出力データセット パラメータの場合、依存性は出力の派生元となるパラメータのインデックスです。
  • 特定の入力データ タイプの場合、次の表に示したように、依存性はコントロールが使用する情報を含むパラメータのインデックスです。

入力データ タイプ

従属データ タイプ

説明

フィールドまたは SQL 文

テーブル

そのフィールドを持つテーブル。

INFO アイテムまたは INFO 条件式

INFO テーブル

そのアイテムを持つ INFO テーブル。

カバレッジ フィーチャクラス

カバレッジ

フィーチャを含むカバレッジ。

面積単位または距離単位

ジオデータセット

デフォルト単位を決定するジオグラフィック データセット。

座標系

ワークスペース

デフォルトの座標系を決定するワークスペース。

Network Analyst 階層設定

ネットワーク データセット

階層情報を持つネットワーク データセット。

Geostatistical 値テーブル

Geostatistical レイヤ

テーブルを含む解析レイヤ。

取得元のデータ タイプ
注意注意:

[parameterDependencies] は、スクリプト ツール ウィザードの [取得元] の設定に相当します。

通常、依存性は 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

パラメータの value プロパティはオブジェクトを返します。ただし、パラメータが設定されていない場合、valueNone を返します。パラメータが設定されない場合を避けるには、その値を使用する前に if チェックを使用します。

次のコード部では、値が文字列「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:  # check that parameter has a value
    if parameters[3].value == "Get Spatial Weights From File":
        parameters[8].enabled = True
    else:
        parameters[8].enabled = False

値オブジェクトは文字列の操作をサポートしていないため、文字列を操作または解析するときは、必ず値オブジェクトの値プロパティを使用します。次のサンプル コードは os.path.dirname メソッドを使用して、データセットからディレクトリを返しています。

if parameters[0].value:
    workspace = os.path.dirname(parameters[0].value.value)
注意注意:

With the exception of Describe, don't use methods that take a catalog path, such as ListFields, in validation. The dataset may not exist when your tool is validated in ModelBuilder, and the method may fail or give unexpected results.

In the specific case of ListFields, the Describe object's fields property will provide the equivalent information.

注意注意:

Don't set a parameter value in updateMessages() since the value will not be validated by the internal validation routine.

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

関連トピック

5/10/2014