高度な定義式での関数の使用
このトピックでは、親子リンクと部品に割り当てられた定義式で使用され、オプションフィルタプロセスの過程でオプションフィルタ委任によって評価される関数を定義するさまざまな方法を説明します。次の各セクションでは、以下の要素について説明します。
• サイズを縮小したり定義式の再使用を可能にしたりする関数のエイリアスを指定するためのさまざまな方法。
• 関数のインプリメンターがフィルタフレームワークのオブジェクトにアクセスする方法に関する情報。オプションナビゲーションフィルタ、ナビゲーション基準、オプションセット、エフェクティビティ日付、フィルタ対象のオブジェクトやフィルタプロセスに含まれるオブジェクト (部品、親子リンク、それらに関連したデータなど)。
関数定義の概要と定義式での使用方法
関数に渡す引数を取るパブリック静的メソッド (関数) を含む Java クラスを定義します。関数に渡すことができる変数引数は、選択肢 (厳密には、選択されている場合は選択ステータスが true で、選択されていない場合は false) と、実行時にフィルタフレームワークによって設定および適用されるタイプ com.ptc.windchill.option.model.ATONavigationBean のオブジェクトです (後のセクションを参照)。Java クラスのパブリック静的メソッドを定義したら、次のフォーマットを使用して、定義式内で多様な方法で使用できます。
• メソッドへのフルクラスパスを使用
• クラスに対応するインポートが定義されている場合は ClassName.MethodName() フォーマットを使用
• クラスに対応する静的インポートが定義されている場合は MethodName() format () を使用
• メソッドに対して略称 (またはエイリアス) が定義されている場合は MethodAbbreviation() を使用
• マクロが定義されている場合はマクロを使用
次の各セクションでは、前述の各状況に応じた、いくつかのサンプル関数とその関数を使用した定義式の構築例を示しています。現在の NavigationCriteria、ATONavigationFilter、オプションフィルタのエフェクティビティ日付、オプションフィルタのオプションセット、オプションフィルタで選択された選択肢、OptionSet 内のすべての選択肢の選択ステータス、フィルタ可能ノード (WTPartUsageLink など) とサポートノード (親子リンクの子の WTPart など) を含む現在の NavigationUnit へのアクセスを提供する ATONavigationBean 変数オブジェクトを利用して、関数を作成できます。特に、これによりフィルタ決定の際にほかのオブジェクト (部品、親子リンク、親子関係オカレンスの属性値など) を使用できるようになります。
関数定義
関数を定義するには、必要な引数を持つパブリック静的メソッドを含む Java クラスを作成します。
Java コード:
説明:
4 つのブール型の引数を取り、次の真理値表 (T は true、F は FALSE を意味する) で決定される値を返す静的ブール関数の例を、次に示します。
真理値表:
x1 | x2 | x3 | x4 | 戻り値 |
---|
T | F | T | F | T |
T | T | F | F | T |
F | T | F | T | T |
F | F | T | T | T |
x1、x2、x3、x4 のその他すべての組み合わせは、FALSE 値 (F) を生成します。
各行に対応する定義式に到達するには、T をパラメータの名前 (たとえば x1) に、F をパラメータの否定 (! x1) に置き換え、論理積演算子 (&&) を使用してこれらの結果を連結します。たとえば、最初の列は次のような定義式になります。
x1 && ! x2 && x3 && ! x4
さらに、論理和演算子 (||) を使用して行のブール型定義式を連結し、真理値表を表す定義式に到達します。
| 定義式内で同じ選択肢を繰り返し使用する場合は、次に説明するように、関数を導入してその関数を定義式で使用することからメリットが得られます。 |
関数は任意のタイプ (たとえば、int、double、float などのプリミティブな数値) を返し、同じタイプの定数と比較することができるので、次の例に示すようなブール型の定義式を生成できます。
このような関数により、指定したコスト合計を超えるコンフィギュレーションをフィルタにより除外できます。もう 1 つのアプローチは、コスト整数を別のパラメータとして関数へ渡し、関数の内部で比較を行うことです。これにより、関数からはブール値が返されます。
定義式での使用
次の例では、COLOR オプションの選択肢 RED, GREEN, BLUE, WHITE、COUNTRY オプションの UK, US, MX、MATERIAL オプションの PLASTIC, STEEL, WOOD、SIZE オプションの SMALL, MEDIUM, LARGE, X_LARGE があることを前提にしています。さらに、選択肢 hasHD_TV, hasBLUERAY, hasWI_FI も使用します。
メソッドへのフルクラスパスの使用
この場合には、フルクラスパスとメソッド名を使用して関数を指定します。この例では、関数の引数として、選択肢名を渡します。次の例はこのアプローチを示しています。
• com.ptc.ext.BooleanTableFunction.evaluate(RED, UK, PLASTIC, LARGE)
• BLUE && com.ptc.ext.BooleanTableFunction.evaluate(GREEN, US, STEEL, SMALL) || MEDIUM
• com.ptc.ext.CostFunction.getCost(hasHD_TV, hasBLUERAY, hasWI_FI)> 100
インポート宣言の使用
インポートされるクラスは、プロパティファイル WT_HOME/codebase/ com/ptc/wpcfg/exparser/LookUpService.properties で次のように指定できます。
• exparser.import.1=com.ptc.ext.BooleanTableFunction
• exparser.import.2=com.ptc.ext.CostFunction
この場合には、定義式で関数を指定するときにパッケージパスを省略できます。
• BooleanTableFunction.evaluate(RED, UK, PLASTIC, LARGE)
• BLUE && BooleanTableFunction.evaluate(GREEN, US, STEEL, SMALL) || MEDIUM
• CostFunction.getCost(hasHD_TV, hasBLUERAY, hasWI_FI)> 100
静的なインポート宣言の使用
この場合には、最初にプロパティファイル WT_HOME/codebase/ com/ptc/wpcfg/exparser/LookUpService.properties で静的なインポート宣言を次のように指定します。
exparser.static.import.1=com.ptc.ext.BooleanTableFunction
exparser.static.import.2=com.ptc.ext.CostFunction
この場合には、定義式で関数を指定するときに、パッケージパスとクラス名の両方を省略できます (メソッド名のみを残すことになります)。
• evaluate(RED, UK, PLASTIC, LARGE)
• BLUE && evaluate(GREEN, US, STEEL, SMALL) || MEDIUM
• getCost(hasHD_TV, hasBLUERAY, hasWI_FI) > 100
メソッドに対する略称 (エイリアス) を使用
この場合には、プロパティファイル WT_HOME/codebase/com/ptc/wpcfg/exparser/LookUpService.properties で、メソッドの省略形とメソッドへのフルパスのマッピングを次のように定義します。
exparser.abbreviation.1=EVAL=com.ptc.ext.BooleanTableFunction.evaluate
exparser.abbreviation.2=COST=com.ptc.ext.CostFunction.getCost
これで、これらのエイリアスを使用して、定義式内の関数にアクセスできます。
• EVAL(RED, UK, PLASTIC, LARGE)
• BLUE && EVAL(GREEN, US, STEEL, SMALL) || MEDIUM
• COST(hasHD_TV, hasBLUERAY, hasWI_FI) > 100
マクロの使用
1 つの関数のフル関数パスのエイリアスを提供する省略形と異なり、マクロは定義式のフラグメントのエイリアスです。これは、定義式のフラグメントが、親子リンクや部品などの多数のオブジェクトに対して繰り返し使用される場合に役立ちます。インポート、静的インポート、省略形の宣言は、定義式の解析中にオンザフライで解決されます。最初に定義式でマクロのフラグメントがマクロの代わり使用され、次に定義式が解析されます。その他のパーサープロパティとして、マクロのマッピングは、WT_HOME/codebase/com/ptc/wpcfg/exparser/LookUpService.properties で次のように定義されます。
exparser.macro.1=EVALUATE=com.ptc.ext.BooleanTableFunction.evaluate(GREEN, US, STEEL, SMALL)
exparser.macro.2=GET_COST= com.ptc.ext.CostFunction.getCost(hasHD_TV, hasBLUERAY, hasWI_FI)
したがって、最後の 2 つの定義式は次のようなフォームになります。
• BLUE && EVALUATE || MEDIUM
• GET_COST > 100
マクロは、ナビゲーション基準とフィルタ対象の構造オブジェクトに関する情報を含む ATONavigationBean を示すために役立ちます。
現在のフィルタリング情報へのアクセス
オブジェクト com.ptc.windchill.option.model.ATONavigationBean は、ATONavigationFilter のインスタンスと、フィルタフレームワークによって提供される現在の NavigationUnit にまたがるラッパービーンです。フィルタやナビゲーションユニットとは別に、このビーンは、NavigationCriteria の取得メソッド、オプションフィルタのエフェクティビティ日付、OptionSet、オプションフィルタで選択される選択肢、オプションによってグループ化された OptionSet におけるすべての選択肢の選択ステータスを定義します。
public ATONavigationFilter getFilter();
public NavigationUnit getNavigationUnit();
public NavigationCriteria getNavigationCriteria();
public Timestamp getFilterEffectivityDate();
public OptionSet getFilterOptionSet();
public Map<String, Set<String>> getFilterChoiceMap();
public Map<String, Boolean> getFilterSelectedChoiceMap();
定義式での ATONavigationBean の使用
このビーンを使用するには、このビーンをパラメータの 1 つとして取得する関数を最初に定義する必要があります。1 つの例として、組み込みクラス com.ptc.windchill.option.filter.NavigationUtils を使用できます。これは、フィルタのエフェクティビティ日付と固定タイムスタンプの上限または下限 (あるいはその両方) を比較するメソッド (関数) を提供します。
public static boolean afterDate(ATONavigationBean beanOfActivity, String after)
public static boolean beforeDate(ATONavigationBean beanOfActivity, String before)
public static boolean betweenDate(ATONavigationBean beanOfActivity, String after, String before)
このほかに、日付パターンを指定するために追加の文字列引数を取る 3 つのメソッドもあります (米国以外のロケールに役立ちます)。定義式で具体的なオブジェクトを指定するときには、静的メソッド ATONavigationBean.newATONavigationBean() によって返されるような、ATONavigationBean タイプの空のオブジェクトを渡す必要があります。このフラグメントによって提供されるビーンを示すには、マクロを使用すると便利です。フィルタフレームワークは、ATONavigationFilter と NavigationUnit にビーンを適用し、現在のフィルタデータへのアクセスを可能にします。
最初に、ファイル LookUpService.properties で、NavigationUtils のインスタンスと ATONavigationBean のメソッドの省略形に対するマクロを、次のように定義します。
exparser.macro.1=EFFECTIVITY_INFO= com.ptc.windchill.option.model.ATONavigationBean.newATONavigationBean()
exparser.abbreviation.1=BEFORE= com.ptc.windchill.option.filter.NavigationUtils.beforeDate
exparser.abbreviation.2=AFTER= com.ptc.windchill.option.filter.NavigationUtils.afterDate
exparser.abbreviation.3=BETWEEN= com.ptc.windchill.option.filter.NavigationUtils.betweenDates
これで、エフェクティビティ日付が期限切れになる時間間隔に応じて、定義式を定義できます。
RED && SMALL && BEFORE(EFFECTIVITY_INFO, “05/05/2005”) ||
GREEN && LARGE && BETWEEN(EFFECTIVITY_INFO, “05/05/2005”, “06/06/2006”) ||
BLUE && MEDIUM && BETWEEN(EFFECTIVITY_INFO, “06/06/2006”, “07/07/2007”) ||
WHITE && X_LARGE && AFTER(EFFECTIVITY_INFO, “07/07/2007”)
この定義式は、次の 4 つのばらばらの時間間隔に基づいて、各行に指定されている 4 つの異なるフォームで有効になります。
RED && SMALL - エフェクティビティ日付が 05/05/2005 より前の場合
GREEN && LARGE - エフェクティビティ日付が 05/05/2005 と 06/06/2006 の間にある場合
BLUE && MEDIUM - エフェクティビティ日付が 06/06/2006 と 07/07/2007 の間にある場合
WHITE && X_LARGE - エフェクティビティ日付が 07/07/2007 より後の場合