アドバンスロジックでの数値演算子と関数の使用
さまざまなタイプのパラメータを定義できます。このセクションでは、アドバンスロジックで数値パラメータに演算子と関数を使用する例を示します。
数値パラメータの演算子
整数タイプまたは実数タイプのパラメータを定義できます。これらのタイプはパラメータをマッピング可能な Windchill タイプ定義に対応していますが、これらはそれぞれ内部で long および double の Java プリミティブ型にマッピングされ、有効な Java 定義式で long 変数および double 変数として使用できます。
定義式は以下から定義できます。
• 制約タイプの
「定義式」では、定義式がブール値に評価される必要があります。制約タイプの定義式については、
定義式エディタを参照してください。
• 定義式はアドバンスケーステーブルでも使用できます。アドバンスケーステーブルの詳細については、
ケーステーブルエディタを参照してください。
算術演算子
定義式では数値パラメータとともに算術演算子を使用できます。これには 2 項加算 (+)、減算 (-)、乗算 (*)、除算 (/) 演算子があります。たとえば、定義式制約の例を以下に示します。
• 2 * a – 3 * b == c / d + e / 3
• A == 2.5 * B / C – D / 7.5
単項演算子 - および + も使用できます (+A は A に相当します)。
• A == -B + 2 * C
• D = +A – (-C)
モジュロ (%) 演算子を使用して、1 番目の引数を 2 番目の引数で割ったときの余りを計算できます。
A == B % 7
関連演算子
関連演算子は、ブール値に評価される必要がある定義式制約内で数値サブ定義式の比較に使用されます。以下のような演算子があります。
• 等しい (==)
• より大きい (>)
• より小さい (<)
• 以上 (>=)
• 以下 (<=)
• 等しくない (!=)
|
"等しい" 演算子は "=" ではなく "==" として記述する必要があります。
|
"==" 演算子を使用した定義式の左辺または右辺に定義式が 1 つだけ含まれている場合、その定義式は代入 (=) として処理されます。以下の定義式制約に例を示します。
• A == 2 * B + 3 * C
• B / 4 - C / 3 == A
パラメータ B と C の値が既知になると、パラメータ A の値がその計算式に従って計算されます。上記の例では、パラメータ A を非入力パラメータとして定義することで、その値をユーザーが入力してから計算式によって計算するのではなく、その値を計算式によって計算しています。これは、A の出現より前に B と C が定義されているという入力順序が重要であることも意味します。ほかの順序で定義され、パラメータ B と C の前にパラメータ A に値が代入された場合、その定義式はブール定義式として扱われ、パラメータ A の値は B と C の値に基づいて評価される計算式の値と比較されます。
|
右辺と左辺の両方に複数のパラメータが含まれている場合、定義式制約が評価されるためにはすべてのパラメータが既知になっている必要があります。
|
関数での数値パラメータのメソッドまたは定義式フラグメントの参照
数値パラメータは、既成の関数、標準 Java 関数、およびユーザー定義関数で引数として使用することもできます。以下の各セクションでは、メソッドまたは定義式フラグメントを参照する方法について説明します。
以下の例では、D_1、D_2、D_3、D_4、D_5、および D_6 が実数 (Java double) パラメータ、P_1、P_2、P_3、および P_4 が整数 (Java long) パラメータであるとします。さらに、GeomFunctions は、ジオメトリ関数が含まれている、ext.geom パッケージからのユーザー定義クラスの名前です。
メソッドへのフルクラスパスの使用
完全修飾名 (<package path>.<class name>.<method name>) を使用して、これらのパラメータを引数として渡す関数を指定できます。次の例はこのアプローチを示しています。
• D_1 == java.lang.Math.cos(D_2) + java.lang.Math.sin(D_3)
• P_1 == java.lang.StrictMath.addExact(P_2, P_3)
• D_4 == ext.geom.GeomFunctions.area(D_5, D_6)
インポート宣言の使用
インポートするクラスを WT_HOME/codebase/com/ptc/wpcfg/exparser/LookUpService.properties ファイルで以下のように指定できます。
exparser.import.1=java.lang.Math
exparser.import.2=java.lang.StrictMath
exparser.import.3=ext.geom.GeomFunctions
上記のインポート宣言を使用した場合、定義式で関数を指定するときにパッケージのパスを省略できます。
• D_1 == Math.exp(D_2)
• P_1 == StrictMath.round(D_3)
• D_3 == ext.geom.GeomFunctions.volume(D_4, D_5, D_6)
静的インポート宣言の使用
最初に静的インポート宣言を WT_HOME/codebase/com/ptc/wpcfg/exparser/LookUpService.properties ファイルで以下のように指定できます。
exparser.static.import.1=java.lang.Math
exparser.static.import.2=ext.geom.GeomFunctions
静的インポート宣言を使用した場合、定義式で関数を指定するときに、メソッド名のみを残して、パッケージのパスとクラス名の両方を省略できます。
• D_1 == exp(D_2)
• P_1 == round(D_3)
• D_3 == ext.geom.GeomFunctions.volume(D_4, D_5, D_6)
静的インポートで登録されている複数のクラスに同じ名前のメソッドが存在する場合、例外エラーが表示されます。たとえば、java.lang.Math と java.lang.StrictMath には共通のメソッド名が多数あります。両方のクラスを静的インポートとして登録した場合、計算式でそのような共通メソッドを使用するとエラー状態になります。
メソッドの省略形 (エイリアス) の使用
メソッドの省略形とメソッドへのフルパスの間のマッピングを、WT_HOME/codebase/com/ptc/wpcfg/exparser/LookUpService.properties ファイルで以下のように定義できます。
exparser.abbreviation.1=SURFACE_AREA=ext.geom.GeomFunctions.area
exparser.abbreviation.2=ARC_TAN=java.lang.StrictMath.atan
メソッドの省略形とそのフルパスの間のマッピングが定義された後は、定義式内でこれらのエイリアスを使用して関数にアクセスできます。
• D_1 == ARC_TAN(D_2)
• D_3 == SURFACE_AREA(D_4, D_5)
この方法は、Java クラスのメソッドを Microsoft Excel などの別のアプリケーションの関数と同じ名前に再定義する場合に便利です。WT_HOME/wt.properties ファイルでプロパティ ato.expression.rendering.context=com.ptc.wpcfg.logic.XLSExpressionRenderingContext を設定した場合、Microsoft Excel アプリケーションで使用されている名前でほとんどの数値関数、テキスト関数、論理関数にアクセスできるように適切なエイリアスが追加されます。このような数値関数には、ABS、ACOS、ASIN、ATAN、CEILING、COS、DEGREES、FLOOR、INT、LN、LOG、MAX、MIN、MOD、POWER、RADIANS、ROUND、ROUNDDOWN、ROUNDUP、SIN、SQRT、TAN、ACOSH、ASINH、ATANH、COMBIN、COSH、EXP、FACT、LOG10、SIGN、SINH、TANH などがあります。
マクロの使用
省略形は 1 つの関数のフル関数パスのエイリアスを提供するのに対し、マクロは定義式のフラグメントのエイリアスです。これは、複数の定義式で定義式のフラグメントを繰り返し使用する場合に便利です。インポート、静的インポート、および省略形の宣言は、定義式の解析時にその場で解決されます。最初に定義式でマクロのフラグメントがマクロの代わり使用され、次に定義式が解析されます。その他のパーサープロパティと同様に、マクロのマッピングは WT_HOME/codebase/com/ptc/wpcfg/exparser/LookUpService.properties ファイルで以下のように定義されます。
exparser.macro.1=AREA=SURFACE_AREA(D_2, D_3)
exparser.macro.2=SUM=java.lang.StrictMath.addExact(P_2, P_3)
この後、以下のようにして定義式でマクロを使用できます。
• D_1 == AREA + 10.2
• P_1 == SUM + P_4