在高级表达式中使用函数
该主题介绍了定义用于表达式的函数的不同方式,这些表达式可被分配给使用关系链接和部件,并在“选项”筛选过程中通过“选项”筛选委派进行评估。下一部分包括下列方面:
• 为函数指定别名的不同方式,以便减少表达式大小并启用表达式重用
• 有关函数实施者如何获取筛选框架对象的信息:选项浏览筛选器、浏览条件、选项集、有效日期、筛选过程中被筛选或涉及的对象 (例如部件、使用关系链接和与其相关的数据)。
函数定义及其在表达式中用途的概述
用公用静态方法 (函数) 来定义 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 是由筛选框架提供的 ATONavigationFilter 和当前 NavigationUnit 的实例的封套 bean。除筛选器和浏览单位之外,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 十分方便。筛选框架利用 ATONavigationFilter 和 NavigationUnit 填充 bean,使您有权访问当前筛选数据。
首先,在 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