if-then-else 論理は、条件に基づいて異なる処理を実行するための単純で強力な概念です。if-then-else 論理は、「条件が true の場合はある処理を実行し、同じ条件が false の場合は別の処理を実行する」のように説明できます。
ModelBuilder での if-then-else 論理の使用
ModelBuilder で if-then-else 論理を実装するには、条件をテストして true と false の状態を表す 2 つの Boolean 変数を出力するスクリプト ツールを作成し、このスクリプト ツールをモデルに組み込みます。スクリプト ツールを作成する代わりに、[値の計算 (Calculate Value)] ツールを使用して、条件のテストと Boolean 値の出力を行うこともできます。
次のモデルは、[座標系の確認 (Check Coordinate System)] というスクリプト ツールを組み込んで、分岐の論理を使用しています。このスクリプト ツールは入力データセットを評価して、そのデータセットの座標系が投影された State Plane 座標系であるか、不明の座標系であるかを通知します。このモデルでは、入力データセットの座標系が投影された State Plane 座標系であると判断された場合、何も処理は実行されません。一方、入力データの座標系が不明の座標系であると判断された場合、モデルは投影システムを定義して、入力データを投影変換します。ModelBuilder で分岐論理を使用する際の主な手順の 1 つは、条件出力の 1 つを後の処理に対する前提条件として設定することです。
if-then-else 論理の例
次のサンプル コードは、上で説明した [座標系の確認 (Check Coordinate System)] スクリプト ツールで、if-then-else による分岐がどのように実装されるかを示しています。スクリプトは 2 つの変数を出力し、1 つは if (true) 条件を表し、もう 1 つは else (false) 条件を表しています。
座標系の確認の例
この例は、入力データが StatePlane であるか、PRJ がないか、StatePlane 以外であるかをチェックします。
# Import modules
import arcpy
import sys
import traceback
# Set local variables
prj = ""
indata = "C:/ToolData/well.shp"
dsc = arcpy.Describe(indata)
sr = dsc.spatialReference
prj = sr.name.lower()
try:
# check if indata is in StatePlane, has no PRJ, or one other than StatePlane
if prj.find("_stateplane_") > -1:
# Set the Is Unknown parameter to FALSE, and the Is StatePlane parameter to TRUE
arcpy.SetParameterAsText(1,"false") #The first parameter refers to the "Is Unknown" variable
arcpy.SetParameterAsText(2,"true") #The second parameter refers to the "Is StatePlane" variable
arcpy.AddMessage("Coordinate system is StatePlane")
elif prj == "unknown":
# Set the Is Unknown parameter to TRUE, and the Is StatePlane parameter to FALSE
arcpy.SetParameterAsText(1,"true")
arcpy.SetParameterAsText(2,"false")
arcpy.AddMessage("To continue, first define a coordinate system!")
else:
# Set the Is Unknown parameter to FALSE, and the Is StatePlane parameter to FALSE
arcpy.SetParameterAsText(1,"false")
arcpy.SetParameterAsText(2,"false")
arcpy.AddMessage("Coordinate system is not StatePlane or Unknown")
except Exception as e:
AddPrintMessage(e[0], 2)
モデル内での if-then-else 論理の使用例については、以下のブログをご参照ください。
- Understanding which "if" troubles you (「if」の概要)
- If you are stuck at "if" - Part 1 - Calculate Value examples (「if」の問題 - パート 1 - 値の計算例)
- If you are stuck at "if" - Part 2 - Script tool example (「if」の問題 - パート 2 - スクリプト ツールの例)
- If you are stuck at "if" - Part 3 - Does Extension Exist model example (「if」の問題 - パート 3 - 「エクステンションが存在するか?」モデルの例)
- If you are stuck at "if" - Part 4 - Does Selection Exist model example (「if」の問題 - パート 4 - 「選択セットが存在するか?」モデルの例)
- If you are stuck at "if" - Part 5 - Does Projection Exist model example (「if」の問題 - パート 5 - 「投影が存在するか?」モデルの例)