ArcGIS Desktop

  • ArcGIS Pro
  • ArcMap

  • My Profile
  • ヘルプ
  • Sign Out
ArcGIS Desktop

ArcGIS Online

組織のマッピング プラットフォーム

ArcGIS Desktop

完全なプロ仕様の GIS

ArcGIS Enterprise

エンタープライズ GIS

ArcGIS for Developers

位置情報利用アプリの開発ツール

ArcGIS Solutions

各種業界向けの無料のテンプレート マップおよびテンプレート アプリケーション

ArcGIS Marketplace

組織で使えるアプリとデータを取得

  • ドキュメント
  • サポート
Esri
  • サイン イン
user
  • マイ プロフィール
  • サイン アウト

ArcMap

  • ホーム
  • はじめに
  • マップ
  • 解析
  • データ管理
  • ツール
  • エクステンション

ToolValidator クラスのプログラミング

  • パラメーター オブジェクト
  • schema オブジェクト
  • filter オブジェクト

ToolValidator クラスの概要とパラメーター メソッドの使用法については、「スクリプト ツールの動作のカスタマイズ」をご参照ください。

パラメーター オブジェクト

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

すべてのツール パラメーターは、ツールの整合チェックに便利なプロパティとメソッドを備えたパラメーター オブジェクトと関連付けられています。パラメーターは、Python リスト内に含まれています。標準的な方法では、次のコードに示すように、ツール クラスの ToolValidator クラスの __init__ メソッド内にパラメーターのリストを作成します。

def __init__(self):
  import arcpy 
  self.params = arcpy.GetParameterInfo()

また、次のように (ToolValidator クラスではなく) スクリプト内でパラメーターにアクセスすることもできます。スクリプト内のパラメーター リストにアクセスする唯一の理由は、symbology プロパティにアクセスすることです。

import arcpy
params = arcpy.GetParameterInfo()

スクリプトにおけるシンボル設定の詳細

パラメーターの順序

ツールのパラメーターとその順序は、次のように、ツールのプロパティの [パラメーター] タブで定義されています。

パラメーターとその順序
注意:

パラメーターのリストは 0 から始まります。最初のパラメーターがリストの 0 の位置になります。3 番目のパラメーターにアクセスするには、「p3 = self.params[2]」と入力します。

メソッド

メソッド名使用法の説明

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

読み取り専用

文字列

ツールのプロパティの [パラメーター] タブで定義されているデータ タイプ。

parameterType

読み取り専用

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

ツールのプロパティの [パラメーター] タブで定義されているタイプ。

parameterDependencies

読み取り/書き込み

Python リスト

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

value

読み取り/書き込み

Value オブジェクト

パラメーターの値。

defaultEnvironmentName

読み取り専用

文字列

ツールのプロパティの [パラメーター] タブで定義されているデフォルトの環境設定。

enabled

読み取り/書き込み

ブール型

パラメーターがグレー表示 (使用不可) の場合は false。

altered

読み取り専用

ブール型

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

hasBeenValidated

読み取り専用

ブール型

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

category

読み取り/書き込み

文字列

パラメーターのカテゴリ。

schema

読み取り専用

GP Schema オブジェクト

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

filter

読み取り専用

GP Filter オブジェクト

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

symbology

読み取り/書き込み

文字列

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

message

読み取り専用

文字列

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

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

いくつかのコード例を以下に示します。その他のコード例については、「スクリプト ツールの動作のカスタマイズ」をご参照ください。

ToolValidator のプロパティ対スクリプト ツールのプロパティ

パラメーターのデフォルト値、フィルター、シンボル、依存性は、スクリプト ツールのプロパティ ダイアログ ボックスの [パラメーター] タブと、ToolValidator クラスの両方で設定できます。

ToolValidator で設定したプロパティは、スクリプト ツールのプロパティ ダイアログ ボックスで設定したプロパティを常に上書きします。たとえば、スクリプト ツールのプロパティ ダイアログ ボックスでパラメーターの値を「BLUE」に設定し、それを initializeParameters() で「RED」に再設定した場合、デフォルト値は「RED」になります。initializeParameters() が呼び出された後は、スクリプト ツールのプロパティ ダイアログ ボックスには、デフォルト値として「RED」が表示されます。スクリプトのプロパティ ダイアログ ボックスで、これら 4 つのパラメーターのプロパティを変更したのに保存されない場合は、そのプロパティが ToolValidator クラスで上書きされている可能性があります。

parameterDependencies

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

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

入力データ タイプ従属データ タイプ説明

フィールドまたは SQL 文

テーブル

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

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

INFO テーブル

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

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

カバレッジ

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

面積単位または距離単位

ジオデータセット

デフォルト単位を決定する地理データセット。

座標

ワークスペース

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

Network Analyst 階層の設定

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

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

Geostatistical 値テーブル

Geostatistical レイヤー

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

取得元のデータ タイプ

通常、依存性は initializeParameters() メソッドで設定されます。

def initializeParameters(self):
  # Set the dependencies for the output and its schema properties
  #
  self.params[2].parameterDependencies = [0, 1]

value

これは、ユーザーが入力したか、プログラムで設定したパラメーターの値です。initializeParameters() で値を設定すると、パラメーターの初期のデフォルト値になります。また、以下に示すように、ユーザー入力に対応して updateParameters() で値を設定することもできます。

def updateParameters(self):
    # 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 self.params[0].value:
        if not self.params[6].altered:
            extent = arcpy.Describe(self.params[0].value).extent
        if extent.width > extent.height:
            self.params[6].value = extent.width / 100
        else:
            self.params[6].value = extent.height / 100
    return

パラメーターの value プロパティはオブジェクトを返します。ただし、パラメーターが設定されていない場合、value は None を返します。パラメーターが設定されない場合を避けるには、その値を使用する前に 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 self.params[3].value:  # check that parameter has a value
  if self.params[3].value == "Get Spatial Weights From File":
    self.params[8].enabled = True
  else:
    self.params[8].enabled = False

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

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

Describe を除き、整合チェックに ListFields などのカタログ パスを使用するメソッドは使用しないでください。ModelBuilder でツールが整合チェックされるときにデータセットが存在せず、メソッドが失敗したり、予期しない結果が返される可能性があります

特定の ListFields の場合、Describe オブジェクトの fields プロパティは、それに相当する情報を提供します。

注意:

値が内部整合チェック ルーチンで整合チェックされないため、パラメーター値を updateMessages() では設定しないでください。

altered

altered は、出力パスの入力など、パラメーターの値が変更された場合に true になります。パラメーターを変更すると、ユーザーが値を空白にするまで変更済みの状態となります。空白にすると、未変更に戻ります。整合チェック コードによって値をプログラムから変更すると、変更済みの状態に変わります。つまり、パラメーターの値を設定すると、パラメーターの変更済み状態が更新されます。

altered は、パラメーターの値を変更できるかどうかを判別するために使用されます。たとえば、ツールにフィーチャクラスのパラメーターとキーワードのパラメーターがあるとします。フィーチャクラスにポイントまたはポリゴンが含まれる場合、キーワードは RED、GREEN、BLUE になり、ラインが含まれる場合、キーワードは ORANGE、YELLOW、PURPLE、WHITE になります。

ユーザーがポイント フィーチャクラスを入力したとします。キーワードのパラメーターが変更されていない場合、値をデフォルト値の RED を設定します。

ライン フィーチャクラスが入力された場合、キーワードのパラメーターが変更されていない限り、デフォルト値を ORANGE に設定します。

しかし、キーワードのパラメーターがユーザーによって変更された場合 (キーワードが GREEN に設定された場合)、キーワードを再設定してはなりません。ユーザーは GREEN を選択しましたが、その意図がわからないからです。ユーザーは、GREEN が有効になるようにフィーチャクラスを変更するかもしれませんし、キーワードを (PURPLE などに) 変更するかもしれません。GREEN は、ライン用に作成したキーワード群のメンバーではないため、内部整合チェックは、このパラメーターにエラーのフラグを付けます。この時点で、ユーザーには、入力フィーチャクラスを変更するかキーワードを変更するかの 2 つの選択肢があります。

if not self.params[2].altered:
      self.params[2].value = "POINT"

hasBeenValidated

hasBeenValidated は、updateParameters() と内部整合チェックが最後に呼び出されてから、ユーザーがパラメーターの値を変更した場合に、false になります。内部整合チェックが呼び出されると、ジオプロセシングはすべてのパラメーターについて hasBeenValidated を true に自動的に設定します。

hasBeenValidated は、updateParameters() を最後に呼び出してから、ユーザーが値を変更したかどうかを判別するために使用されます。この情報は、パラメーターを独自にチェックするかどうかを決定する際に利用できます。

# 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 if the input features have already been validated,
#  or the user has set a specific distance (Altered is true).
# 
import string
if self.params[0].value and not self.params[0].hasBeenValidated:
  if not self.params[6].altered: 
    extent = arcpy.Describe(self.params[0].value).extent
    width = extent.width
    height = extent.height
    if width > height:
      self.params[6].value = width / 100
    else:
      self.params[6].value = height / 100

category

ツール ダイアログ ボックスのサイズを最小限に抑えるために、パラメーターをさまざまなカテゴリに配置できます。ArcGIS Network Analyst エクステンション ツールは、次のようにカテゴリを使用しています。

パラメーターのカテゴリ

カテゴリは 1 回だけ設定するので、設定は initializeParameters() で行います。updateParameters() でカテゴリを設定しても効果はありません。次のコードでは、パラメーター 4 および 5 を「Option」カテゴリ、パラメーター 6 および 7 を「Advanced」カテゴリに配置しています。

def initializeParameters(self):
    self.params[4].category = "Options"
    self.params[5].category = "Options"
    self.params[6].category = "Advanced"
    self.params[7].category = "Advanced"

カテゴリは、必ず未分類パラメーターの後ろに表示されます。必須パラメーターは、ツール ダイアログ ボックスで見つけやすいように、カテゴリ内には配置しないでください。

symbology

symbology プロパティは、レイヤー ファイル (*.lyr) を出力パラメーターと関連付けます。

params[2].symbology = "E:/tools/extraction/ToolData/ClassByDist.lyr"

出力シンボルの詳細

schema オブジェクト

タイプがフィーチャクラス、テーブル、ラスター、ワークスペースのすべての出力パラメーターは、schema オブジェクトを持ちます。フィーチャクラス、テーブル、ラスター、ワークスペースの出力だけがスキーマを持ちます。他のタイプはスキーマを持ちません。schema オブジェクトは、ジオプロセシングによって作成されます。このスキーマには、パラメーター オブジェクトを通してアクセスし、ツールの出力を記述するためのルールを設定します。スキーマのルールを設定して、ToolValidator クラスから戻ると、ジオプロセシングの内部整合チェック コードは設定されたルールを調べ、出力の記述を更新します。

確認のため、制御の流れを以下に示します。

  1. ツール ダイアログ ボックスを最初に開いたときに、initializeParameters() が呼び出されます。出力を記述するために、静的ルール (ユーザー入力に基づいて変更されないルール) を設定します。この時点では、ユーザーは (デフォルト値を設定していない限り) パラメーターに値を指定していないため、出力の記述は作成されません。
  2. ユーザーがツール ダイアログ ボックスに何らかの対話的操作を行うと、updateParameters() が呼び出されます。
  3. updateParameters() は、[フィールドの追加 (Add Field)] での新しいフィールドの追加といった、パラメーターの依存性から決定できない動的な動作を扱う schema オブジェクトを変更できます。
  4. updateParameters() の終了後、内部整合チェック ルーチンが呼び出され、schema オブジェクト内にあるルールが適用されて、出力データの記述が更新されます。
  5. 次に、updateMessages() が呼び出されます。内部整合チェックが作成した警告およびエラー メッセージを調べて、それらを変更したり、独自の警告やエラー メッセージを追加したりできます。

すべての schema プロパティは、読み取り専用の type を除いて、すべてが読み書き可能です。

プロパティ名値

type

文字列: "Feature"、"Table"、"Raster"、"Container" (ワークスペースおよびフィーチャ データセットの場合) (読み取り専用プロパティ)

clone

ブール型

featureTypeRule

文字列: "AsSpecified"、"FirstDependency"

featureType

文字列: "Simple"、"Annotation"、"Dimension"

geometryTypeRule

文字列: "Unknown"、"FirstDependency"、"Min"、"Max"、"AsSpecified"

geometryType

文字列: "Point"、"Multipoint"、"Polyline"、"Polygon"

extentRule

文字列: "AsSpecified"、"FirstDependency"、"Intersection"、"Union"、"Environment"

extent

範囲オブジェクト

fieldsRule

文字列: "None"、"FirstDependency"、"FirstDependencyFIDs"、"All"、"AllNoFIDs"、"AllFIDsOnly"

additionalFields

フィールド オブジェクトの Python リスト。

cellSizeRule

文字列: "AsSpecified"、"FirstDependency"、"Min"、"Max"、"Environment"

cellsize

Double

rasterRule

文字列: "FirstDependency"、"Min"、"Max"、"Integer"、"Float"

rasterFormatRule

文字列: "Img"、"Grid"

additionalChildren

ワークスペース スキーマに追加するデータセットの Python リスト

schema オブジェクトのプロパティ

FirstDependency の使用

いくつかのルールは "FirstDependency" に設定できます。これは、parameter.parameterDependencies を使用して、パラメーターの依存性配列セット内にある最初のパラメーターの値を使用することを意味します。次のコードの例では、パラメーター 2 には 0 と 1 の 2 つの従属パラメーターがあり、最初の依存性はパラメーター 0 です。

# Set the dependencies for the output and its schema properties
#
self.params[2].parameterDependencies = [0, 1]

従属パラメーターが複数値 (値のリスト) の場合、複数値リストの最初の値が使用されます。

type

type プロパティは読み取り専用で、ジオプロセシングによって設定されます。

clone

true の場合、ジオプロセシングは、最初の従属パラメーター内にある記述の厳密なコピー (クローン) を作成します。デフォルト値は false です。通常は、initializeParameters() メソッド内で clone を true に設定します。最初の従属パラメーターが複数値 (値のリスト) の場合、複数値リストの最初の値に対してクローンが作成されます。

  • parameter.parameterType が "Derived" の場合、厳密なコピーが作成されます。[フィールドの追加 (Add Field)] ツールの動作はこれです。
  • parameter.parameterType が "Required" の場合、厳密なコピーも作成されますが、データセットへのカタログ パスが変更されます。カタログ パスは 2 つの部分 (ワークスペースとベース名) で構成されます。たとえば、次のように指定します。

    E:/Data/TestData/netcity.gdb/infrastructure/roads

    • ワークスペース = E:/Data/TestData/netcity.gdb/infrastructure
    • ベース名 = roads
    新しい出力名を作成するために使用されるルールは次のとおりです。
    • ベース名は、データセットを含む最初の入力パラメーター (最初の依存性ではなく、最初のパラメーター) のベース名に、スクリプト ツールの名前を付けたものになります (例: roads_MyTool)。
    • ワークスペースは、テンポラリ ワークスペース環境設定に設定されます。これが空の場合、現在のワークスペース環境設定が使用されます。これが空の場合、データセットを含む最初の入力パラメーターのワークスペースが使用されます。このワークスペースが読み取り専用の場合は、システムのテンポラリ ディレクトリが使用されます。

clone を true に設定すると、featureTypeRule、geometryTypeRule、extentRule など、すべてのルールベースのメソッドが "FirstDependency" に設定されます。

次の 2 つのコード例は、同じ処理を行います。両方とも、[クリップ (Clip)] ツールが出力スキーマを作成する方法に基づいています。

例 1: すべてのルールの明示的な設定
def initializeParameters(self):
    # Set the dependencies for the output and its schema properties
    #  The two input parameters are feature classes.
    #
    self.params[2].parameterDependencies = [0, 1]
    # Feature type, geometry type, and fields all come from the first 
    #  dependency (parameter 0), the input features
    #
    self.params[2].schema.featureTypeRule = "FirstDependency"
    self.params[2].schema.geometryTypeRule = "FirstDependency"
    self.params[2].schema.fieldsRule = "FirstDependency"
    # The extent of the output is the intersection of the input features 
    #  and the clip features (parameter 1)
    #
    self.params[2].schema.extentRule = "Intersection"
    return
例 2: clone を使用してルールを FirstDependency に設定後、範囲ルールを上書き
def initializeParameters(self):
    # Set the dependencies for the output and its schema properties
    #  The two input parameters are feature classes.
    #
    self.params[2].parameterDependencies = [0, 1]
    self.params[2].schema.clone = True
    return
    
def updateParameters(self):
    # The only property of the clone that changes is that the extent 
    #  of the output is the intersection of the input features 
    #  and the clip features (parameter 1)
    #
    self.params[2].schema.extentRule = "Intersection"
    return

featureTypeRule

この設定は、出力フィーチャクラスのフィーチャ タイプを決定します。このルールは、出力ラスターまたはテーブルには影響しません。

値説明

"AsSpecified"

フィーチャ タイプは、featureType プロパティによって決定されます。

"FirstDependency"

フィーチャ タイプは、依存性の最初のパラメーターと同じになります。最初の従属パラメーターが複数値 (値のリスト) の場合、複数値リストの最初の値が使用されます。

featureTypeRule の値

featureType

featureTypeRule が "AsSpecified" のとき、featureType の値は出力のフィーチャ タイプを指定するために使用されます。

値説明

"Simple"

出力は、シンプル フィーチャを含みます。フィーチャのジオメトリ タイプは、geometryTypeRule を使用して指定されます。

"Annotation"

出力は、アノテーション フィーチャを含みます。

"Dimension"

出力は、ディメンション フィーチャを含みます。

featureType の値

geometryTypeRule

この設定は、出力フィーチャクラスのジオメトリ タイプ (ポイントやポリゴンなど) を決定します。

値説明

"Unknown"

これがデフォルトです。通常は、他のパラメーターの値に基づいて、updateParameters() 内のジオメトリ タイプを判別できるはずです。ルールを "Unknown" に設定するのは、ジオメトリ タイプを判別するのに十分な情報がない場合だけです。

"FirstDependency"

ジオメトリ タイプは、最初の従属パラメーターと同じになります。最初の従属パラメーターが複数値 (値のリスト) の場合、複数値リストの最初の値が使用されます。

"Min"、"Max"

すべての従属パラメーターのジオメトリを調べ、出力ジオメトリ タイプをその中の最小または最大タイプに設定します。"Min" と "Max" は、次のように定義されます。

  • ポイントおよびマルチポイント = 0
  • ポリライン = 1
  • ポリゴン = 2
従属パラメーターがポイントまたはポリゴン フィーチャクラスの場合、最小はポイントになり、最大はポリゴンになります。

"AsSpecified"

ジオメトリ タイプは、geometryType プロパティの値によって決定されます。

geometryTypeRule の値

geometryType

geometryTypeRule が "AsSpecified" のときに、使用するジオメトリ タイプ ("Point"、"Multipoint"、"Polyline"、"Polygon" のいずれか) に設定します。

extentRule

値説明

"AsSpecified"

出力範囲は、extent プロパティで指定されます。

"FirstDependency"

出力範囲は、最初の従属パラメーターと同じになります。最初の従属パラメーターが複数値 (値のリスト) の場合、複数値リストの最初の値が使用されます。

"Intersection"

出力範囲は、すべての従属パラメーターの交差部分になります (以下に示すように、これは [クリップ (Clip)] ツールが使用する内容です)。

"Union"

出力範囲は、すべての従属パラメーターの幾何学的ユニオンになります。

"Environment"

出力範囲は、出力範囲環境設定に基づき計算されます。

extentRule の値

例

# The extent of the output is the intersection of the input features 
#  and the clip features (the dependent parameters)
#
self.params[2].schema.extentRule = "Intersection"

extent

extentRule が "AsSpecified" のときに、使用する範囲に設定します。範囲は、4 つの値を持つスペースで区切られた文字列または Python リスト オブジェクトで設定できます。順序は、xmin、ymin、xmax、ymax です。

例

self.params[2].schema.extentRule = "AsSpecified"
self.params[2].schema.extent = "123.32 435.8 987.3 567.9"

Python リストを使用した場合

xmin = 123.32
ymin = 435.8
xmax = 987.3
ext = [xmin, ymin, xmax, 567.9]
self.params[2].schema.extent = ext

fieldsRule

fieldsRule は、出力フィーチャクラスまたはテーブルに存在するフィールドを決定します。

次の表で、FID はフィーチャ ID を表していますが、実際は、すべてのフィーチャクラスまたはテーブルにある ObjectID フィールドを参照しています。

値説明

"None"

オブジェクト ID 以外のフィールドは出力されません。

"FirstDependency"

出力フィールドは、最初の従属パラメーターと同じになります。最初の従属パラメーターが複数値 (値のリスト) の場合、複数値リストの最初の値が使用されます。

"FirstDependencyFIDs"

最初の従属入力の ObjectID だけが出力に書き込まれます。

"All"

従属パラメーターのリスト内にあるすべてのフィールドが出力されます。

"AllNoFIDs"

ObjectID を除くすべてのフィールドが出力に書き込まれます。

"AllFIDsOnly"

すべての ObjectID フィールドが出力に書き込まれますが、入力のその他のフィールドは書き込まれません。

fieldsRule の値

fieldsRule に "FirstDependency" を使用した [クリップ (Clip)] の例

def initializeParameters(self):
    # Set the dependencies for the output and its schema properties
    #  The two input parameters are feature classes.
    #
    self.params[2].parameterDependencies = [0, 1]
    # Feature type, geometry type, and fields all come from the first 
    #  dependency (parameter 0), the input features
    #
    self.params[2].schema.featureTypeRule = "FirstDependency"
    self.params[2].schema.geometryTypeRule = "FirstDependency"
    self.params[2].schema.fieldsRule = "FirstDependency"
    # The extent of the output is the intersection of the input features 
    #  and the clip features (parameter 1)
    #
    self.params[2].schema.extentRule = "Intersection"
    return

additionalFields

fieldsRule を使用して追加されたフィールドの他にも、追加フィールドを出力に追加できます。additionalFields は、 フィールド オブジェクトの Python リストを使用します。

AdditionalFields を使用した例を表示する

cellSizeRule

出力ラスターまたはグリッドのセルサイズを決定します。

値説明

"AsSpecified"

出力セルサイズは、cellSize プロパティで指定されます。

"FirstDependency"

セル サイズは、最初の従属パラメーターから計算されます。従属パラメーターがラスターの場合、そのセルサイズが使用されます。従属パラメーターがフィーチャクラスやフィーチャ データセットなど、他のタイプの場合、データの範囲を使用してセルサイズが計算されます。最初の従属パラメーターが複数値 (値のリスト) の場合、複数値リストの最初の値が使用されます。

"Min"、"Max"

"Min" の場合、出力セルサイズは従属パラメーターの最小セルサイズになります。"Max" の場合、出力セルサイズは従属パラメーターの最大セルサイズになります。

"Environment"

出力セルサイズは、セルサイズ環境設定に基づいて計算されます。

cellSizeRule の値

cellSize

cellSizeRule が "AsSpecified" のときに、使用するセルサイズに設定します。

rasterRule

出力ラスターに含まれるデータ タイプ (整数または浮動小数) を決定します。

値説明

"FirstDependency"

データ タイプ (整数または浮動小数) は、最初の従属パラメーターと同じになります。最初の従属パラメーターが複数値 (値のリスト) の場合、複数値リストの最初の値が使用されます。

"Min"、"Max"

整数は浮動小数より小さいと見なされます。たとえば、2 つの従属パラメーターがあり、一方は整数を含み、他方は浮動小数を含む場合、"Min" は整数の出力を作成し、"Max" は浮動小数の出力を作成します。

"Integer"

出力ラスターには整数 (自然数) が含まれます。

"Float"

出力ラスターには浮動小数 (有理数) が含まれます。

rasterRule の値

rasterFormatRule

出力ラスターの形式 ("Grid" または "Img") を決定します。デフォルトは "Img" です。これは、ERDAS IMAGINE 形式です。"Grid" は Esri の形式です。

ラスター データ形式の詳細

additionalChildren

ワークスペースは、データセット (フィーチャ、テーブル、ラスター) のコンテナーです。これらのデータセットは、ワークスペースの子です (ワークスペースは親と考えます)。ツールがデータセットを新規または既存のワークスペースに追加する場合、子の記述を追加することで、ワークスペースの記述を更新することができます。たとえば、フィーチャクラスのリスト (複数値) を使用して、何らかの方法でそれらのフィーチャクラスを変更してから、変更したフィーチャクラスを既存のワークスペースに書き込むツールがあるとします。ModelBuilder でこのツールを使用する場合、ワークスペースはツールの派生出力となり、このワークスペースを [データの選択 (Select Data)] ツールへの入力として使用できます。[データの選択 (Select Data)] では、コンテナー内にある子のデータセットを選択して、それを別のツールの入力として使用できます。

additionalChildren への入力は、1 つ以上の子の記述です。子の記述には、2 つの形式があります。

形式説明

value オブジェクト

value プロパティから返されるフィーチャクラス、テーブル、ラスター、ディメンション、またはアノテーション値。

[type, name, fields, extent, spatial reference] という形式の Python リスト オブジェクト

追加する子の記述を含む Python リスト。リスト内の最初の 2 つのエントリであるタイプと名前だけが必須です。残りの引数はオプションです。

additionalChildren のメンバー リスト

複数の子を追加する場合、子の記述のリストを指定します。Python リスト オブジェクトの形式で子を追加している場合、additionalChildren のリストのリストを作成します。

Python リストの形式には、次の表に示したように 5 つの引数があります。

引数種類説明

type

必須

"Point"、"Multipoint"、"Polyline"、"Polygon"、"Table"、"Raster"、"Annotation"、"Dimension" のいずれか

name

必須

データセットの名前。データセットのベース名 ("streets") またはフル カタログ パス ("E:\mydata\test.gdb\infrastructure\streets") を使用できます。フル カタログ パスで指定した場合、ベース名 ("streets") 以外は無視されます。

fields

オプション

フィールド オブジェクトの Python リスト。これには、子にあるフィールドが含まれます (既知の場合)。

extent

オプション

子の空間範囲を含む文字列または Python リスト。

spatial reference

オプション

空間参照オブジェクト。

子のリストの内容

これらの引数は、この順序で指定する必要があります。オプションの引数をスキップするには、Python のキーワード None または "#" を使用します。

次に、ワークスペース スキーマを設定する例をいくつか示します。これらの例は、次の引数を持つスクリプト ツールに基づいています。

パラメーター名プロパティ

0

入力フィーチャクラス

フィーチャクラス - 入力。

1

入力テーブル

テーブル - 入力。

2

入力ワークスペース

ワークスペース - 入力 (ツールの結果を持つ既存のワークスペース)。

3

派生ワークスペース

ワークスペース - 派生出力、取得元は Input_workspace。このワークスペースのスキーマは、追加の子を持つように変更されます。

ツール例のパラメーター

このツールは、入力フィーチャクラスとテーブルを使い、両方をワークスペースにコピーして、新しいフィールドをフィーチャクラスに追加してから、新しいポリゴン フィーチャクラスをワークスペースに作成します (ここでの目的はワークスペース スキーマの設定を示すことなので、ツールの実際の処理は重要ではありません)。以下のコード例は互いを利用して構築されており、まず additionalChildren を単純に使用しています。以下のコード例をいくつか実装してテストする場合は、次のモデルを使用してコードをテストできます。

整合チェックの結果を表示するのに使用されるモデル

initializeParameters() では、従属パラメーター (パラメーター 2) から、出力ワークスペースのクローンが作成されます。この依存性は、ツールのプロパティで設定されますが、initializeParameters() で設定して、ツールのプロパティで誰かが依存性を削除してしまうのを防ぐこともできます。

class ToolValidator:
  def __init__(self):
     import arcpy 
     self.params = arcpy.GetParameterInfo()
  def initializeParameters(self):
    self.params[3].parameterDependencies = [2]  # input workspace
    self.params[3].schema.clone = True  # Copy all existing contents to output
    return

例: 2 つの入力 (未変更) を出力ワークスペースにコピーします。

def updateParameters(self):
  inFC = self.params[0].value     # input feature class
  inTable = self.params[1].value  # input table
  inWS = self.params[2].value     # input workspace
  if inFC and inTable and inWS:
    self.params[3].schema.additionalChildren = [inFC, inTable]
  return

例: ツールが、新しいポリゴン フィーチャクラスを作成します。この新しいフィーチャクラスについて (整合チェック時に) わかるプロパティは、名前 ("SummaryPolygon") とタイプ ("polygon") だけです。

children = []    # New empty list
children.append(inFC)
children.append(inTable)
children.append(["polygon", "SummaryPolygon"])
self.params[3].schema.additionalChildren = children

例: 入力フィーチャクラスにフィールドを追加します。

# Create a field object with the name "Category" and type "Long"
#
newField = arcpy.Field()
newField.name = "Category"
newField.type = "Long"
# Describe the input feature class in order to get its list of fields. The 9.3
#  version of the geoprocessing object returns fields in a Python list, unlike
#  previous versions, which returned fields in an enumerator.
#
desc = arcpy.Describe(inFC)
fieldList = desc.fields
# Add the new field to the list
#
fieldList.append(newField)
# Create a new child based on the input feature class, but with the 
#  additional field added
#
newChild = [desc.shapeType, desc.catalogPath, fieldList,
            desc.extent, desc.spatialReference]
# Now create our list of children and add to the schema
#
children = []
children.append(newChild)
children.append(inTable)
children.append(["polygon", "SummaryPolygon"])
self.params[3].schema.additionalChildren = children

SummaryPolygon(新しいポリゴン フィーチャクラス) のフィールドを作成するには、上記の例で示したパターンに似たフィールド オブジェクトのリストを作成します。

例: 複数値の入力

この例では、最初のパラメーターはフィーチャクラスの複数値です。複数値内の各フィーチャクラスは、派生ワークスペースにコピーされます。コピーされた各フィーチャクラスに、ProjectID という新しいフィールドが追加されます。

# 0 - input features (multivalue)
# 1 - input workspace
# 2 - derived workspace
class ToolValidator:
  def __init__(self):
     import arcpy 
     self.params = arcpy.GetParameterInfo()
  def initializeParameters(self):
    self.params[2].parameterDependencies = [1]
    self.params[2].schema.clone = True
    return
  def updateParameters(self):
    inVT = self.params[0].value   # multivalue ValueTable
    inWS = self.params[1].value   # WorkSpace
    # Add each feature class to the output workspace. In addition,
    #  add a new field "ProjectID" to each feature class
    #
    if inVT and inWS:
        rowCount = inVT.rowCount  # Number of rows in the MultiValue table
        children = []
        newField = arcpy.Field()
        newField.name = "ProjectID"
        newField.type = "Long"
        for row in range(0, rowCount):
            value = inVT.getValue(row, 0)
            if value:
                d = arcpy.Describe(value)
                fieldList = d.fields
                # Note -- not checking if field already exists
                #
                fieldList.append(newField)
                # Create new child with additional ProjectID field and
                #  add child to list of children
                #
                child = [d.shapeType, d.catalogPath, fieldList]
                children.append(child)            
                      
        self.params[2].schema.additionalChildren = children
    return
  def updateMessages(self):
    return

filter オブジェクト

filter オブジェクトを使用すると、ユーザーが利用できるパラメーターを指定できます。たとえば、選択肢をテキスト フィールドだけに制限するフィールド フィルターを設定できます。フィルターには、3 つの働きがあります。

  • フィルターは、ユーザーに対してデータの参照時に有効な選択肢だけを提供します。ポイント フィーチャクラスにフィルターを設定する場合、ユーザーがデータを参照するときに、ポイント フィーチャクラスだけが表示されます。テキスト フィールドにフィルターを設定する場合、フィールドのドロップダウン リストにはテキスト フィールドだけが表示されます。
  • ユーザーが (リストやファイル ブラウザーから値を選択するのではなく) パラメーター値を入力する場合、その値がフィルターに対してチェックされます。ユーザーが不正な値 (テキスト フィールドではなく数値フィールドなど) を入力した場合、警告またはエラーが自動的に設定されます。
  • 値はフィルターに対して内部整合チェックでチェックされるため、フィルターを使用することで、ToolValidator クラス内に独自の整合チェックをプログラムする必要がなくなります。

フィルターを指定するには、次の 2 つの方法があります。

  • ツールのプロパティ ダイアログ ボックスの [パラメーター] タブで、パラメーターをクリックしてから、[フィルター] の横にあるセルをクリックして、ドロップダウン リストからフィルター タイプを選択します。フィルター タイプを選択すると、ダイアログ ボックスが開くので、フィルターの値を指定します。
  • ToolValidator クラス内のプログラムで値を設定できます (以下に例を示します)。ジオプロセシングは、文字列、long、double、フィーチャクラス、ファイル、フィールド、ワークスペースのタイプのパラメーターに対して、フィルターを自動的に作成します。ツールのプロパティ ダイアログ ボックスでフィルターを選択していない場合でも、パラメーターには空のフィルターが関連付けられています。空のフィルターは、フィルターがない場合と同じです。空のフィルターに値を追加することで、フィルターを有効化して、ユーザーの選択肢をフィルターの内容に制限することができます。

次の表に示すように、フィルターには 6 つの種類があります。

フィルターのタイプ値

ValueList

文字列または数値のリスト。String、Long、Double、Boolean のデータ タイプを使用します。

範囲値

最小値と最大値。Long および Double のデータ タイプの場合に使用されます。

フィーチャクラス

使用可能なフィーチャクラス タイプのリスト。"Point"、"Multipoint"、"Polyline"、"Polygon"、"MultiPatch"、"Sphere"、"Annotation"、"Dimension" の値を指定します。複数の値をフィルターに設定できます。

ファイル

ファイル接尾辞 ("*.txt"、"*.e00"、"*.ditamap" など) のリスト。

フィールド

使用できるフィールド タイプのリスト。"Short"、"Long"、"Single"、"Double"、"Text"、"Date"、"OID"、"Geometry"、"Blob"、"Raster"、"GUID"、"GlobalID"、"XML" の値を指定します。複数の値をフィルターに設定できます。

ワークスペース

使用できるワークスペース タイプのリスト。"FileSystem"、"LocalDatabase"、"RemoteDatabase" の値を指定します。1 つまたは複数の値を設定できます。

フィルターのタイプと値

プロパティ

プロパティ説明

type

フィルターのタイプ (ValueList、Range、FeatureClass、File、Field、Workspace)。Long および Double のパラメーターを扱うときに、フィルターのタイプを設定できます (以下の注意をご参照ください)。その他のタイプのパラメーターの場合、フィルターの有効なタイプは 1 つだけなので、これらのパラメーターのタイプの設定は無視されます。値をフィルターしない場合は、リスト プロパティを空のリストに設定します。

list

フィルターの値の Python リスト。値をフィルターしない場合は、リスト プロパティを空のリストに設定します。

filter のプロパティ

ValueList

文字列パラメーターの場合の ValueList

文字列パラメーターの場合、リストには任意の数の文字列を含めることができます。次の例では、initializeParameters() に文字列値のリストを設定しています。パラメーターには、"NEW_FORMAT" と "OLD_FORMAT" の 2 つの選択肢があります。

def initializeParameters(self):
    # Set the fixed list of "file format type" parameter choices and its
    #  default value
    #
    self.params[1].filter.list = ["OLD_FORMAT", "NEW_FORMAT"]
    self.params[1].value = "OLD_FORMAT"
    return

上の例では、ツールのプロパティ ダイアログ ボックスの [パラメーター] タブで、値のリストを同様に設定できます。実際、値のリストを ("OLD" と "NEW" のように) 他の値に設定した場合、これらの値は、initializeParameters() が呼び出されたときに、"OLD_FORMAT" と "NEW_FORMAT" に置き換えられます。デフォルト値についても同じです。ツールのプロパティ ダイアログ ボックスで設定できますが、ToolValidator でリセットされます。

注意:

ToolValidator で設定した値のリストは、ツールのプロパティ ダイアログ ボックスで設定した値を必ず置き換えます。この動作により、他のパラメーターに基づいて、値を更新することができます。

次のコードはこの例の続きで、updateParameters() において、ユーザーが "OLD_FORMAT" と "NEW_FORMAT" のどちらを選択するかに応じて、別のパラメーターの値のリストを変更しています。

def updateParameters(self):
    # Update the value list filter of the "feature type in file" parameter 
    #   depending on the "file format type" parameter.
    #
    if self.params[1].value.upper() == "OLD_FORMAT":
      self.params[2].filter.list = ["POINT", "LINE", "POLYGON"]
    elif self.params[1].value.upper() == "NEW_FORMAT":
      self.params[2].filter.list = ["POINT", "LINE", "POLYGON", 
                                    "POINT_WITH_ANNO", 
                                    "LINE_WITH_ANNO", 
                                    "POLYGON_WITH_ANNO"]
    # Provide default value for "feature type in file" parameter
    #
    if not self.params[2].altered:
      self.params[2].value = "POINT"

Long および Double パラメーターの場合の ValueList

Long または Double のパラメーターは、数値のリストを持つことができます。ユーザーは、リスト内にある値だけを選択または入力できます。

# Set filter for a Long parameter
#
self.params[7].filter.list = [10, 20, 30, 40, 50]
# Set filter for a Double parameter
#
self.params[8].filter.list = [10.0, 12.5, 15.0]

ブール型パラメーターの場合の ValueList

ブール型パラメーターには、true 値と false 値の 2 つの値があります。true 値が常にリストの 1 番目の値になります。

def initializeParameters(self):
  # Set the Boolean choice for including or excluding angles
  #
  self.params[6].filter.list = ["ANGLE", "NO_ANGLE"]
  # Set the default value to false (no angle)
  #
  self.params[6].value = "NO_ANGLE"
  return
def updateParameters(self):
  # Enable angle format parameter if user wants angles
  #
  if self.params[6].value.upper() == "ANGLE":
    self.params[7].enabled = True

範囲値

Long または Double パラメーターは、範囲フィルターを持つことができます。範囲フィルターでは、最小値と最大値の 2 つの値を使用します。リストの 1 番目の値が最小値です。最小値と最大値はどちらも範囲に含まれます。

def initializeParameters(self):
  # Utility values must be between -10 and 10.
  #
  self.params[7].filter.list = [-10, 10]

Long および Double パラメーターのフィルター タイプの設定

Long および Double パラメーターの場合、デフォルトのフィルター タイプは ValueList です。範囲フィルターにする場合は、次のように initializeParameters() でフィルター タイプを設定します。

def initializeParameters(self):
  # Set the 'score' value parameters to a range filter
  #
  self.params[7].filter.type = "Range"
  self.params[7].filter.list = [-10, 10]

フィルター タイプを設定できるのは、Long および Double パラメーターの場合だけです。

フィーチャクラス

次の例では、ある入力パラメーターのフィーチャ タイプを別の入力パラメーターのフィーチャ タイプに基づいて設定しています。

def updateParameters(self):
    # Set the input feature type of the second parameter based
    #  on the feature type of the first parameter.
    #
    if self.params[0].value:
      desc = arcpy.Describe(self.params[0].value)
      feature_type = desc.shapeType.lower()
      if feature_type == "polygon":
        self.params[1].filter.list = ["point", "multipoint"]
      elif feature_type == "polyline":
        self.params[1].filter.list = ["polygon"]
      
      elif feature_type == "point" or \
           feature_type == "multipoint":
        self.params[1].filter.list = ["polyline"]
      else:
        self.params[1].filter.list = []
      
    return

ファイル

ファイル フィルターには、「.txt」(簡単なテキスト ファイル) や「.csv」(カンマ区切りファイル) などの、使用できるファイル接尾辞のリストが含まれます。接尾辞には任意のテキストを使用できます。ArcGIS で認識される接尾辞である必要はありません。接尾辞の長さは任意で、ドットは含めません。次の例では、入力 File パラメーターにフィルターを設定しています。

def initializeParameters(self):
  # Set the input file type to our recognized options file suffixes
  #
  self.params[0].filter.list = ["opt56", "opt57", "globalopt"]
  return

フィールド

フィールド フィルターは、使用できるフィールド タイプを定義します。使用できる値は、"Short"、"Long"、"Float"、"Single"、"Double"、"Text"、"Date"、"OID"、"Geometry"、"Blob"、"Raster"、"GUID"、"GlobalID"、および "XML" です。

表示名と内部名

次の表に示したように、内部名を持つフィールド タイプが 4 つあります。

表示名内部名

Short

SmallInteger

Long

整数

浮動小数点

単一

テキスト

String

フィールド フィルターのエイリアス

フィールド フィルターを指定する場合、表示名と内部名のいずれかを使用できます。つまり、次の 2 行のコードは同じです。

self.params[1].filter.list = ["short", "long", "float", "text"]
self.params[1].filter.list = ["smallinteger", "integer", "single", "string"]

"short" のように表示名で指定した場合、表示名は変換され、フィルター内には "SmallInteger" として格納されます。フィールド フィルターの値にアクセスしなくてはならない場合はほとんどありませんが、アクセスする場合は内部名が格納されていることに注意してください。次のコード部は、このアクセス方法を示しています。

self.params[1].filter.list = ["short", "long"]
# 
if self.params[1].filter.list[0].lower() == "smallinteger":
  # do something

デフォルト フィールド値の設定

フィールド パラメーターに対して、デフォルト値を設定できます。これには、次のように、入力テーブルのフィールドをループ処理して、フィルターを満たす最初のフィールドを取得します。

def initializeParameters(self):
  self.params[1].filter.list = ["short", "long", "float", "double"]
  return
def updateParameters(self):
  if self.params[0].value and not self.params[1].altered:
    self.params[1].value = ""
    desc = arcpy.Describe(self.params[0].value)
    fields = desc.fields
    # Set default to the first field that matches our filter
    #
    for field in fields:
      fType = field.type.lower()
      if fType in ["smallinteger", "integer", "single", "double"]:
        self.params[1].value = field.name
        break
  return
注意:

ジオプロセシングの ListFields 関数を ToolValidator で使用しないでください。代わりに、上記のように Describe 関数を使用してください。

ワークスペース

ワークスペース フィルターは、使用できる入力ワークスペースのタイプを指定します。これには 3 つの値があります。

ワークスペース フィルター説明

"FileSystem"

シェープファイル、カバレッジ、INFO テーブル、およびグリッドを格納するためのシステム フォルダー

"LocalDatabase"

パーソナルまたはファイル ジオデータベース

"RemoteDatabase"

ArcSDE データベース接続

関連トピック

  • スクリプト ツールの整合チェックについて
  • スクリプト ツールの動作のカスタマイズ
  • ToolValidator クラスのデバッグ
  • スクリプト ツールとは

ArcGIS Desktop

  • ホーム
  • ドキュメント
  • サポート

ArcGIS プラットフォーム

  • ArcGIS Online
  • ArcGIS Desktop
  • ArcGIS Enterprise
  • ArcGIS for Developers
  • ArcGIS Solutions
  • ArcGIS Marketplace

Esri について

  • 会社概要
  • 採用情報
  • Esri ブログ
  • ユーザ カンファレンス
  • デベロッパ サミット
Esri
ご意見・ご感想をお寄せください。
Copyright © 2019 Esri. | プライバシー | リーガル