在進階運算式中使用函數
本主題說明指派至使用關係連結及零件之運算式中所使用的函數的不同定義方法,以及在「選項」篩選過程中通過「選項」篩選委派對這些函數進行求值的方法。以下各節涵蓋下列方面:
• 為函數指定別名的不同方法,以便縮小運算式的大小並使其可以重複使用
• 有關實行者如何能夠取得篩選架構物件存取權限的資訊:「選項」導覽篩選器、導覽條件、選項集、生失效日期、被篩選的物件或篩選過程中牽涉的物件 (例如零件、使用關係連結,以及與它們相關聯的資料)。
函數定義概觀及其在運算式中的使用
使用公開靜態方法 (函數) 來定義 Java 類別,也就是將您要傳遞的引數代入函數。您可以傳遞到函數的唯一可變引數是「選擇」(具體而言,如果選取,其選取狀態為 true;如果未選取,則為 false),以及在執行時間由篩選架構提供並填入的 com.ptc.windchill.option.model.ATONavigationBean 類型的物件 (在稍後各節中說明)。定義 Java 類別的公開靜態方法之後,便可使用下列格式以許多不同的方式在運算式中使用該方法:
• 使用該方法的完全類別路徑
• 如果類別的對應匯入已定義,則使用 ClassName.MethodName() 格式
• 如果類別的對應靜態匯入已定義,則使用 MethodName() format () 格式
• 如果已針對該方法定義縮寫 (別名),則使用 MethodAbbreviation()
• 如果已定義巨集,則使用巨集
在下列各節中,您可以找到建構某些範本函數的範例,以及針對上述每個情況而使用這些函數的運算式的範例。您可以編寫函數以充分利用變數 ATONavigationBean 物件,此物件提供下列項目的存取權限:目前的 NavigationCriteria、ATONavigationFilter、「選項」篩選器的生失效日期、「選項」篩選器的選項集、「選項」篩選器中所選的選擇、OptionSet 中所有選擇的選取狀態、目前具有「可篩選」節點 (例如 WTPartUsageLink) 及支援節點 (例如使用關係連結的子項 WTPart) 的 NavigationUnit。具體而言,即允許在篩選決定中使用其他物件 (例如有關零件、使用關係連結及使用關係出現位置的屬性值)。
函數定義
若要定義函數,請使用具有所需引數之公開靜態方法來編寫 Java 類別。
Java 程式碼:
說明:
這是一個靜態布林函數的範例,此範例取四個布林引數,並從下列真值表 (T 表示 true,F 表示 FALSE) 傳回決定的值:
真值表:
x1 | x2 | x3 | x4 | Return |
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
然後,將列布林運算式與交集運算子 (||) 合併,以達到對應真值表的運算式。
| 如果在運算式中重複使用相同選擇,則可以因引進函數並將它用於運算式中而獲益,說明如下。 |
該函數可以傳回任何類型 (例如整數、雙精度浮點數、浮點數之類的任何數字原始元素),然後可以與相同類型的常數比較,以產生布林運算式,如下列範例。
這類函數可讓您篩選出超過指定總成本的那些組態。另一個方法是將成本整數當成另一個參數傳遞給函數,然後在函數內部進行比較。其結果是從函數傳回一個布林值。
在運算式中使用
下列範例假定 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
使用巨集
與提供單一函數的完整函數路徑別名的縮寫不同,巨集是運算式片段的別名。針對數個物件 (例如使用關係連結和零件) 重複使用運算式片段時,這很有用。匯入、靜態匯入及縮寫宣告是在運算式剖析過程中即時解析的。巨集片段會先替代運算式中的巨集,然後運算式才會被剖析。如同其他剖析器內容一樣,巨集對應是在 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)
然後,最後兩個運算式會假設以下格式:
• BLUE && EVALUATE || MEDIUM
• GET_COST > 100
巨集用來表示含有導覽條件及正在篩選之結構物件的相關資訊的 ATONavigationBean。
存取目前的篩選資訊
物件 com.ptc.windchill.option.model.ATONavigationBean 是一個 wrapper bean,而不是 ATONavigationFilter 的實例及篩選架構所提供之目前 NavigationUnit。除了篩選器與導覽單位之外,bean 也定義取得 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
若要使用 bean,您必須先定義採用它作為其參數之一的函數。例如,內建的類別可供您使用 – 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)
另外還有三種方法可以採用額外的「字串」引數來指定日期模式 (適用於美國以外地區)。在運算式中指定具體物件時,您必須在靜態方法 ATONavigationBean.newATONavigationBean() 傳回時,傳遞 ATONavigationBean 類型的空物件。使用巨集來表示此片段所提供的 bean 是很方便的。篩選架構會在 bean 中填入 ATONavigationFilter 和 NavigationUnit,讓您有權存取目前的篩選資料。
首先,在檔案 LookUpService.properties 中定義 ATONavigationBean 之實例的巨集和 NavigationUtils 方法的縮寫,如下所示:
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”)
此運算式有效地採用四個不同形式,以四個不相交的不同時間間隔為基礎,如以下每一列所指定:
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 之後