span8
span4
我试着写一个Python脚本,着眼于公共参数自定义变压器。
有很多试验和错误发生的情况,但我认为我做的,因为它现在应该。
这让我入门:
如果公共参数设置为一个固定值或变压器工作,如果它被设置为一个功能属性值。但是,当有自定义变压器的两个实例,它着眼于什么首先开始。因此,第二个变压器采用第一变压器的固定值。
custom_transformer_name = 'MultiInstanceBug' PARAMETER_NAME = '编码长度' INSTANCE_NAME = FME_MacroValues [custom_transformer_name + '_WORKSPACE_NAME'] mv_codeLength = FME_MacroValues [实例名+ '_' + PARAMETER_NAME]如果mv_codeLength [0:6] == '@Value':编码长度= INT(feature.performFunction(mv_codeLength))的elif mv_codeLength [0:6] == '@Evalu':编码长度= INT(feature.performFunction(mv_codeLength))的elif mv_codeLength = '':编码长度= INT(mv_codeLength)否则:编码长度= 0 logger.logMessageString('codeLength: ' + str(codeLength),fmeobjects.FME_INFORM)
这给了意想不到的效果,唯一的解决方法我现在看到的是使用AttributeCreator和AttributeRemover先写值的功能。
见我创建了工作台:多实例错误.fmwt
有点晚了可能,但你有没有尝试过我的解决方法(如讨论在这里)?它可能做的伎俩获取正确的宏观价值,但您必须将自定义转换器导出/链接为FMX。
在你的情况,你可以尝试在你的Python代码的“全局”级增加了如下功能:
DEF get_macro_value(PARAM_NAME,默认=无):在FME_MacroValues.items()为密钥上下文= FME_MacroValues.get( 'WB_CURRENT_CONTEXT'),值:如果key.endswith(PARAM_NAME):如果没有上下文或(上下文和key.startswith(上下文)):返回值返回默认
然后,你可以替换第一个4行你的代码以上:
PARAMETER_NAME = '编码长度' mv_codeLength = get_macro_value(PARAMETER_NAME)
指定自定义变压器的名字在这里无关紧要,因为该函数取从WB_CURRENT_CONTEXT宏观价值,它总是一个定制的变压器中存在,并返回该变压器的当前名称。这就是为什么它仅适用于连接定制变压器:WB_CURRENT_CONTEXT是空的嵌入式变压器。
让我知道这是否为你的作品了!
顺便说一句,我会替换6-13行的代码(让它多了几分稳健):
codeLength=0尝试:如果mv庘u codeLength.startswith(('@Value','@Evaluate')):codeLength=int(feature.performFunction(mv庘codeLength))elif mv庘u codeLength.isdigit():codeLength=int(mv庘codeLength),除了(TypeError,AttributeError,ValueError)as e:#可能发生在mv_codeLength不是字符串或功能函数输出不能转换为整数时。#您可以在此处记录此错误或执行其他操作。通过
最后,实际上有一种方法可以从内部获取当前自定义转换器名称(即使它是嵌入的),但是您必须使用PythonCaller和FeatureProcessor类。当实例化时,一个名为工厂名称是set,它以自定义转换器的名称开头,后跟PythonCaller的名称(并由下划线连接)!
©2019安全亚搏在线软件公司|法律