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

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

プロパティ

プロパティ名

読み取り/書き込み

説明

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 で使用するときは、値の文字列表現を使用してはなりません。

間違っている例

desc = arcpy.Describe(str(parameters[0].value))

正しい例

desc = arcpy.Describe(parameters[0].value)

データセットに文字列表現を使用しないでください(使用した場合、そのデータセットにカタログ パスが生成されます)。これはそのデータセットがディスク上に存在していない場合があるからです(データセットがモデル変数である場合、そのモデルを先に実行しないと、データセットはディスク上に存在することができません)。データセットに文字列表現を使用した場合、そのデータセットがまだ存在していないために 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

関連トピック

9/14/2013