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" |
ツールのプロパティの [パラメータ] タブで定義されているタイプ。 |
読み書き |
Python リスト |
各従属パラメータのインデックスのリスト。 |
|
読み書き |
Value オブジェクト |
パラメータの値。 |
|
defaultEnvironmentName |
読み取り専用 |
文字列 |
ツールのプロパティの [パラメータ] タブで定義されているデフォルトの環境設定。 |
enabled |
読み書き |
ブール型 |
パラメータがグレー表示(使用不可)の場合は false。 |
読み取り専用 |
ブール型 |
ユーザが値を変更した場合は true。 |
|
読み取り専用 |
ブール型 |
内部整合チェック ルーチンがパラメータをチェック済みの場合は true。 |
|
読み書き |
文字列 |
パラメータのカテゴリ。 |
|
読み取り専用 |
GP Schema オブジェクト |
出力データセットのスキーマ。 |
|
読み取り専用 |
GP Filter オブジェクト |
パラメータ内の値に適用するフィルタ。 |
|
読み書き |
文字列 |
出力の描画に使用されるレイヤ ファイル(*.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 クラスから戻ると、ジオプロセシングの内部整合チェック コードは設定されたルールを調べ、出力の記述を更新します。
確認のため、制御の流れを以下に示します。
- ツール ダイアログ ボックスが最初に開いたとき、initializeParameters() が呼び出されます。出力を記述するために、静的ルール(ユーザ入力に基づいて変更されないルール)を設定します。この時点では、ユーザは(デフォルト値を設定していない限り)パラメータに値を指定していないため、出力の記述は作成されません。
- ユーザがツール ダイアログ ボックスと何らかの対話を行うと、updateParameters() が呼び出されます。
- updateParameters() は、[フィールドの追加(Add Field)] での新しいフィールドを追加といった、パラメータの依存性から決定できない動的な動作を扱う schema オブジェクトを変更できます。
- updateParameters() の終了後、内部整合チェック ルーチンが呼び出され、schema オブジェクト内にあるルールが適用されて、出力データの記述が更新されます。
- 次に、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 リスト |
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" |
フィーチャ タイプは、依存性の最初のパラメータと同じになります。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。 |
featureType
featureTypeRule が "AsSpecified" のとき、featureType の値は出力のフィーチャ タイプを指定するために使用されます。
値 |
説明 |
---|---|
"Simple" |
出力は、シンプル フィーチャを含みます。フィーチャのジオメトリ タイプは、geometryTypeRule を使用して指定されます。 |
"Annotation" |
出力は、アノテーション フィーチャを含みます。 |
"Dimension" |
出力は、ディメンション フィーチャを含みます。 |
geometryTypeRule
この設定は、出力フィーチャクラスのジオメトリ タイプ(ポイントやポリゴンなど)を決定します。
値 |
説明 |
---|---|
"Unknown" |
これがデフォルトの設定です。通常は、他のパラメータの値に基づいて、updateParameters() 内のジオメトリ タイプを判別できるはずです。ルールを "Unknown" に設定するのは、initializeParameters() などで、ジオメトリ タイプを判別するのに十分な情報がない場合だけです。 |
"FirstDependency" |
ジオメトリ タイプは、最初の従属パラメータと同じになります。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。 |
"Min"、"Max" |
すべての従属パラメータのジオメトリを調べ、出力ジオメトリ タイプをその中の最小または最大タイプに設定します。"Min" と "Max" は、次のように定義されます。
|
"AsSpecified" |
ジオメトリ タイプは、geometryType プロパティの値によって決定されます。 |
geometryType
geometryTypeRule が "AsSpecified" のときに、使用するジオメトリ タイプ("Point"、"Multipoint"、"Polyline"、"Polygon" のいずれか)に設定します。
extentRule
値 |
説明 |
---|---|
"AsSpecified" |
出力範囲は、extent プロパティで指定されます。 |
"FirstDependency" |
出力範囲は、最初の従属パラメータと同じになります。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。 |
"Intersection" |
出力範囲は、すべての従属パラメータの交差部分になります(以下に示すように、これは [クリップ(Clip)] ツールが使用する内容です)。 |
"Union" |
出力範囲は、すべての従属パラメータの幾何学的ユニオンになります。 |
"Environment" |
出力範囲は、出力範囲環境設定に基づき計算されます。 |
例
# 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 に "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 リストを使用します。
cellSizeRule
出力ラスタまたはグリッドのセルサイズを決定します。
値 |
説明 |
---|---|
"AsSpecified" |
出力セルサイズは、cellSize プロパティで指定されます。 |
"FirstDependency" |
セル サイズは、最初の従属パラメータから計算されます。従属パラメータがラスタの場合、そのセルサイズが使用されます。従属パラメータがフィーチャクラスやフィーチャ データセットなど、他のタイプの場合、データの範囲を使用してセルサイズが計算されます。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。 |
"Min"、"Max" |
"Min" の場合、出力セルサイズは従属パラメータの最小セルサイズになります。"Max" の場合、出力セルサイズは従属パラメータの最大セルサイズになります。 |
"Environment" |
出力セルサイズは、セルサイズ環境設定に基づいて計算されます。 |
cellSize
cellSizeRule が "AsSpecified" のときに、使用するセルサイズに設定します。
rasterRule
出力ラスタに含まれるデータ タイプ(整数または浮動小数)を決定します。
値 |
説明 |
---|---|
"FirstDependency" |
データ タイプ(整数または浮動小数)は、最初の従属パラメータと同じになります。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。 |
"Min"、"Max" |
整数は浮動小数より小さいと見なされます。たとえば、2 つの従属パラメータがあり、一方は整数を含み、他方は浮動小数を含む場合、"Min" は整数の出力を作成し、"Max" は浮動小数の出力を作成します。 |
"Integer" |
出力ラスタには整数(自然数)が含まれます。 |
"Float" |
出力ラスタには浮動小数(有理数)が含まれます。 |
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 つのエントリであるタイプと名前だけが必須です。残りの引数はオプションです。 |
複数の子を追加する場合、子の記述のリストを指定します。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 つの働きがあります。
- フィルタは、ユーザに対してデータの参照時に有効な選択肢だけを提供します。ポイント フィーチャクラスにフィルタを設定する場合、ユーザがデータを参照するときに、ポイント フィーチャクラスだけが表示されます。テキスト フィールドにフィルタを設定する場合、フィールドのドロップダウン リストにはテキスト フィールドだけが表示されます。
- ユーザが(リストやファイル ブラウザから値を選択するのではなく)パラメータ値を入力する場合、その値がフィルタに対してチェックされます。ユーザが不正な値(テキスト フィールドではなく数値フィールドなど)を入力した場合、警告またはエラーが自動的に設定されます。
- 値はフィルタに対して内部整合チェックでチェックされるため、フィルタを使用することで、ToolValidator クラス内に独自の整合チェックをプログラムする必要がなくなります。
フィルタを指定するには、次の 2 つの方法があります。
- ツールのプロパティ ダイアログ ボックスの [パラメータ] タブで、パラメータをクリックしてから、[フィルタ] の横にあるセルをクリックして、ドロップダウン リストからフィルタ タイプを選択します。フィルタ タイプを選択すると、ダイアログ ボックスが開くので、フィルタの値を指定します。
- ToolValidator クラス内のプログラムで値を設定できます(以下に例を示します)。ジオプロセシングは、文字列、long、double、フィーチャクラス、ファイル、フィールド、ワークスペースのタイプのパラメータに対して、フィルタを自動的に作成します。ツールのプロパティ ダイアログ ボックスでフィルタを選択していない場合でも、パラメータには空のフィルタが関連付けられています。空のフィルタは、フィルタがない場合と同じです。空のフィルタに値を追加することで、フィルタを有効化して、ユーザの選択肢をフィルタの内容に制限することができます。
次の表に示すように、フィルタには 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 リスト。値をフィルタしない場合は、リスト プロパティを空のリストに設定します。 |
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 データベース接続