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

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

パラメータ オブジェクト

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

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

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

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

  import arcpy
  params = arcpy.GetParameterInfo()

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

パラメータの順序

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

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

パラメータのリストは 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 Value Table

Geostatistical Layer

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

取得元のデータ タイプ

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

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

value

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

値が内部整合チェック ルーチンで整合チェックされないため、パラメータ値を 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 self.params[3].value == "Get Spatial Weights From File":
      self.params[8].enabled = True
  else:
      self.params[8].enabled = False

上記のテストは、パラメータのデータ タイプがフィーチャクラスやデータセットを表す値の場合は機能しません。値がフィーチャクラスやラスタなど、ディスク上のデータを表す場合は、文字列操作を実行する前に、値を文字列に変換する必要があります。内蔵の Python 関数 str は、次のように、値オブジェクトを文字列に変換します。

  if str(self.params[0].value) == "E:/data/example.gdb/roads":

データセットを表すデータ タイプの値に対して必要なのは、str 関数を使用することだけです。これらのタイプの値に対して、str 関数はデータセットへのカタログ パスを返します。この関数を、long や距離単位など、他のデータ タイプに使用する必要はありません。これらのデータ タイプはデータセットを表していないため、文字列に自動的に変換されます。

注意注意:

ジオプロセシングの Describe() メソッドを ToolValidator で使用するときは、値の文字列表現を使用してはなりません。

正しくない例str 関数を使用)

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

正しい例str を使用しない)

  desc = arcpy.Describe(self.params[0].value)

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

注意注意:

ListFields など、カタログ パスを使うジオプロセシング オブジェクトのメソッドを ToolValidator で使用しないでください。ModelBuilder でツールが整合チェックされるときにデータセットが存在せず、メソッドが失敗する可能性があります(ListFields の場合、Describe オブジェクトの fields プロパティを代わりに使用できます)。

文字列が等しいかテストする場合は、大文字と小文字を区別しない比較を使用する必要があります。次のコードでは、Python の lower 関数を使用してフィーチャクラスの形状タイプを小文字に変換して、小文字の文字列を比較しています(または、upper 関数を使用して、大文字の文字列を比較することもできます)。

  fc = self.params[0].value
  shapetype = arcpy.Describe(fc).shapeType.lower()
    if shapetype == "point" or shapetype == "multipoint":

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

ツール ダイアログ ボックスのサイズを最小限に抑えるために、パラメータをさまざまなカテゴリに配置できます。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"、"FirstDependencyFIDsOnly"、"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 に設定すると、featureTypeRulegeometryTypeRuleextentRule など、すべてのルールベースのメソッドが "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" に設定するのは、initializeParameters() などで、ジオメトリ タイプを判別するのに十分な情報がない場合だけです。

"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"

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

"FirstDependencyFIDsOnly"

最初の従属入力の 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 プロパティから返されるフィーチャクラス、テーブル、ラスタ、ディメンション、またはアノテーション値。例:

inFeatures = self.params[0].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

:ツールが、新しいポリゴン フィーチャクラスを作成します。この新しいフィーチャクラスについて(整合チェック時に)わかるプロパティは、名前("SummaryPoly")とタイプ("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 つの働きがあります。

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

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

フィルタのタイプ

ValueList

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

Range

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

FeatureClass

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

File

接尾辞(".txt"、".e00"、".ditamap" など)のリスト。

Field

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

Workspace

使用できるワークスペース タイプのリスト。"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

Range

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 パラメータの場合だけです。

FeatureClass

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

  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

File

ファイル フィルタには、「.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

Field

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

表示名と内部名

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

表示名

内部名

Short

SmallInteger

Long

Integer

Float

Single

Text

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 == "smallinteger" or \
               fType == "integer" or \
               fType == "single" or \
               fType == "double":
                self.params[1].value = field.name
                break
    return
注意注意:

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

Workspace

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

  • "FileSystem"

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

  • "LocalDatabase"

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

  • "RemoteDatabase"

    ArcSDE データベース接続


7/10/2012