#! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! DEFAULT_MACRO VAL 2 DEFAULT_MACRO VAL_2 5 DEFAULT_MACRO DECIMALPLACES 2 DEFAULT_MACRO FIRSTPNTPOSITION Yes DEFAULT_MACRO TOLERANCE 0 #! START_HEADER #! END_HEADER DEFAULT_MACRO WB_CURRENT_CONTEXT DEFAULT_MACRO PointDisperser_WORKSPACE_NAME "" INCLUDE [puts {MACRO WB_OLD_CONTEXT_$(PointDisperser_WORKSPACE_NAME) $(WB_CURRENT_CONTEXT)}; puts {MACRO WB_CURRENT_CONTEXT $(PointDisperser_WORKSPACE_NAME)}] FACTORY_DEF * TeeFactory FACTORY_NAME "$(PointDisperser_WORKSPACE_NAME)_INPUT Input Splitter" INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_INPUT OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_INPUT # ------------------------------------------------------------------------- FACTORY_DEF * SnappingFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_Snapper INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_INPUT SNAP_TYPE END_NODE SNAP_TOLERANCE $($(PointDisperser_WORKSPACE_NAME)_TOLERANCE) EXTEND_LINES_TO_SNAP NEVER SAVE_SHORT_LINES No OUTPUT SNAPPED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Snapper_SNAPPED OUTPUT UNTOUCHED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Snapper_UNTOUCHED # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_AttributeCreator INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Snapper_SNAPPED INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Snapper_UNTOUCHED OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_AttributeCreator_OUTPUT @SupplyAttributes(ENCODED,_radius_min,,_radius_max,,_decimal_places,3,_range,1) # ------------------------------------------------------------------------- Tcl2 proc $(PointDisperser_WORKSPACE_NAME)_AttributeSetter_doSetAttr {} { if { [string range {&_radius_min} 0 0] == {&} } { FME_SetAttribute [FME_DecodeText [string range {&_radius_min} 1 end]] [FME_DecodeTextOrAttr {$($(PointDisperser_WORKSPACE_NAME)_VAL)}] } else { FME_SetAttribute [FME_DecodeText {&_radius_min}] [FME_DecodeTextOrAttr {$($(PointDisperser_WORKSPACE_NAME)_VAL)}] } } FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_AttributeSetter INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_AttributeCreator_OUTPUT OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_AttributeSetter_OUTPUT @Tcl2($(PointDisperser_WORKSPACE_NAME)_AttributeSetter_doSetAttr) # ------------------------------------------------------------------------- Tcl2 proc $(PointDisperser_WORKSPACE_NAME)_AttributeSetter_2_doSetAttr {} { if { [string range {&_radius_max} 0 0] == {&} } { FME_SetAttribute [FME_DecodeText [string range {&_radius_max} 1 end]] [FME_DecodeTextOrAttr {$($(PointDisperser_WORKSPACE_NAME)_VAL_2)}] } else { FME_SetAttribute [FME_DecodeText {&_radius_max}] [FME_DecodeTextOrAttr {$($(PointDisperser_WORKSPACE_NAME)_VAL_2)}] } } FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_AttributeSetter_2 INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_AttributeSetter_OUTPUT OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_AttributeSetter_2_OUTPUT @Tcl2($(PointDisperser_WORKSPACE_NAME)_AttributeSetter_2_doSetAttr) # ------------------------------------------------------------------------- FACTORY_DEF * TestFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_Tester_4 INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_AttributeSetter_2_OUTPUT TEST @Value(_radius_max) >= @Value(_radius_min) BOOLEAN_OPERATOR OR OUTPUT PASSED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_4_PASSED OUTPUT FAILED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_4_FAILED # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_Terminator INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_4_FAILED OUTPUT FEATURE_TYPE * @Abort("Maximum radius is smaller than the minimal radius. CHeck PointDisperser parameters.") # ------------------------------------------------------------------------- Tcl2 proc $(PointDisperser_WORKSPACE_NAME)_AttributeSetter_3_doSetAttr {} { if { [string range {&_decimal_places} 0 0] == {&} } { FME_SetAttribute [FME_DecodeText [string range {&_decimal_places} 1 end]] [FME_DecodeTextOrAttr {$($(PointDisperser_WORKSPACE_NAME)_DECIMALPLACES)}] } else { FME_SetAttribute [FME_DecodeText {&_decimal_places}] [FME_DecodeTextOrAttr {$($(PointDisperser_WORKSPACE_NAME)_DECIMALPLACES)}] } } FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_AttributeSetter_3 INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_4_PASSED OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_AttributeSetter_3_OUTPUT @Tcl2($(PointDisperser_WORKSPACE_NAME)_AttributeSetter_3_doSetAttr) # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- DEFAULT_MACRO $($(PointDisperser_WORKSPACE_NAME)_FIRSTPNTPOSITION) FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_ParameterFetcher INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_AttributeSetter_3_OUTPUT OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_ParameterFetcher_OUTPUT @SupplyAttributes(ENCODED,"_firstPoint","$($(PointDisperser_WORKSPACE_NAME)_FIRSTPNTPOSITION)") # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_ExpressionEvaluator_4 INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_ParameterFetcher_OUTPUT OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_ExpressionEvaluator_4_OUTPUT _random_number @Evaluate("round((0 + rand() * 1) * pow(10,@Value(_decimal_places)))/pow(10,@Value(_decimal_places))") # ------------------------------------------------------------------------- FACTORY_DEF * TestFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_CoordinateFetcher INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_ExpressionEvaluator_4_OUTPUT TEST @Dimension() == 2 OUTPUT PASSED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_CoordinateFetcher_OUTPUT _x @Coordinate(x,0,FLATTEN_AGGREGATE) _y @Coordinate(y,0,FLATTEN_AGGREGATE) @SupplyAttributes(_z,-9999) OUTPUT FAILED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_CoordinateFetcher_OUTPUT _x @Coordinate(x,0,FLATTEN_AGGREGATE) _y @Coordinate(y,0,FLATTEN_AGGREGATE) _z @Coordinate(z,0,FLATTEN_AGGREGATE) # ------------------------------------------------------------------------- Tcl2 set {$(PointDisperser_WORKSPACE_NAME)_Concatenator_valList} [split &_x,_,&_y ,]; # We use TCL here instead of @Concatenate because TCL is more flexible. Tcl2 proc $(PointDisperser_WORKSPACE_NAME)_Concatenator_concatter {} { global {$(PointDisperser_WORKSPACE_NAME)_Concatenator_valList}; set val {}; foreach {valEnc} [set {$(PointDisperser_WORKSPACE_NAME)_Concatenator_valList}] { append val [FME_DecodeTextOrAttr $valEnc]; }; FME_SetAttribute {_ptLocation} $val; } FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_Concatenator INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_CoordinateFetcher_OUTPUT OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Concatenator_OUTPUT @Tcl2($(PointDisperser_WORKSPACE_NAME)_Concatenator_concatter) # ------------------------------------------------------------------------- FACTORY_DEF * TestFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_Tester_2 INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Concatenator_OUTPUT TEST @Value(_firstPoint) = Yes BOOLEAN_OPERATOR OR OUTPUT PASSED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_2_PASSED OUTPUT FAILED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_2_FAILED # ------------------------------------------------------------------------- MACRO $(PointDisperser_WORKSPACE_NAME)_Counter_2_COUNT_DOMAIN @Value(_ptLocation) INCLUDE [if {{Local} == {Local}} { puts {MACRO $(PointDisperser_WORKSPACE_NAME)_Counter_2_COUNT_DOMAIN $(PointDisperser_WORKSPACE_NAME)_Counter_2_@Value(_ptLocation)}; }; FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_Counter_2 INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_2_FAILED OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Counter_2_OUTPUT _count @Count($($(PointDisperser_WORKSPACE_NAME)_Counter_2_COUNT_DOMAIN),1) # ------------------------------------------------------------------------- MACRO $(PointDisperser_WORKSPACE_NAME)_Counter_COUNT_DOMAIN @Value(_ptLocation) INCLUDE [if {{Local} == {Local}} { puts {MACRO $(PointDisperser_WORKSPACE_NAME)_Counter_COUNT_DOMAIN $(PointDisperser_WORKSPACE_NAME)_Counter_@Value(_ptLocation)}; }; FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_Counter INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_2_PASSED OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Counter_OUTPUT _count @Count($($(PointDisperser_WORKSPACE_NAME)_Counter_COUNT_DOMAIN),0) # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_ExpressionEvaluator_3 INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Counter_OUTPUT INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Counter_2_OUTPUT OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_ExpressionEvaluator_3_OUTPUT _radius @Evaluate("@Value(_radius_min)+(@Value(_radius_max)-@Value(_radius_min))*@Value(_random_number)") # ------------------------------------------------------------------------- Tcl2 set $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_noinput 1; Tcl2 proc $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_groupKey {} { global $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_groupCount; global $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_noinput; global $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_data; set key {}; foreach attr {_ptLocation} { lappend key [FME_GetAttribute $attr] }; set COMMENT { Initialize structures if this is the first time we've seen this group key. }; upvar 0 $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_groupCount($key) groupCount; if [info exists groupCount] { incr groupCount; } else { set groupCount 0; if { ![info exists $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_noinput($key)] } { if {{_median} != {}} {set dolist 1} else {set dolist 0}; set "$(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_data([list $key sum])" 0.0; set "$(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_data([list $key sumsq])" 0.0; set "$(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_data([list $key count])" 0; set "$(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_data([list $key numcount])" 0; set "$(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_data([list $key firstin])" 1; set "$(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_data([list $key firstout])" 1; set "$(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_data([list $key dolist])" $dolist; }; }; return $key; } Tcl2 proc $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_input {} { global $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_noinput; global $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_data; global $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_histo; set groupKey [$(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_groupKey]; upvar 0 $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_histo histo; upvar 0 $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_noinput noinput; foreach element {firstin list dolist sum sumsq count numcount min max mode} { upvar 0 "$(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_data([list $groupKey $element])" $element; }; set noinput 0; if {[catch {set val [FME_GetAttribute _count]}]} { set val {}; }; if {$firstin} { set min $val; set max $val; set firstin 0; } else { if {$val < $min} {set min $val}; if {$val > $max} {set max $val}; }; if {$dolist} {lappend list $val}; incr count; if {[string is double -strict $val]} { incr numcount; set sum [expr $sum + $val]; set sumsq [expr $sumsq + double($val * $val)]; }; if {{_mode} != {}} { set histoKey [list $groupKey $val]; if {[info exists histo($histoKey)]} { incr histo($histoKey); } else { set histo($histoKey) 1; }; }; } Tcl2 proc $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_output {outputType} { global $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_noinput; global $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_data; global $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_histo; global $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_groupCount; upvar 0 $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_histo histo; upvar 0 $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_noinput noinput; if {$noinput == 1} { return; }; if { \"$outputType\" == \"__SINGLE_GUY__\" } { set groupKeys [array names $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_groupCount]; } else { set groupKeys [list [$(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_groupKey]]; }; set attrPrefix {}; set minAttr {_min}; set maxAttr {_max}; set countAttr {}; set numericAttr {}; set sumAttr {_sum}; set rangeAttr {_range}; set meanAttr {_mean}; set medianAttr {_median}; set stdevAttr {_stdev}; set modeAttr {_mode}; set groupnum -1; foreach groupKey [lsort $groupKeys] { foreach element {firstout list dolist sum sumsq count numcount min max range mean median stdev mode} { upvar 0 "$(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_data([list $groupKey $element])" $element ; }; if {$firstout} { if {{_median} != {}} { if {$numcount == $count} { set list [lsort -real $list]; if {$count % 2 == 1} { set median [lindex $list [expr $count / 2]]; } else { set half [expr $count / 2]; set first [lindex $list [expr $half - 1]]; set second [lindex $list $half]; set median [expr double($first + $second) / 2]; }; } else { set median [lindex [lsort $list] [expr int(ceil(double($count) / 2) - 1)]]; }; }; set range {}; catch { set range [expr $max - $min]; }; set mean {}; set stdev {}; if {$numcount > 0} { set mean [expr double($sum) / double($numcount)]; }; if {( {_stdev} != {} ) && ($numcount > 1)} { set tmp [expr double($sumsq * double($numcount)) - double($sum * $sum)]; if {$tmp >= 0} { set stdev [expr sqrt($tmp / double($numcount * double($numcount - 1)))]; } else { set stdev -1; FME_LogMessage fme_warn {$(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator: Overflow when calculating standard deviation - _stdev will be set to -1}; }; }; if {{_mode} != {}} { set maxHisto 0; foreach {name hcount} [array get histo] { set histKey [lindex $name 0]; if { ($histKey == $groupKey) && ($hcount >= $maxHisto) } { set maxHisto $hcount; set mode [lindex $name end]; }; }; }; set firstout 0; }; if { "(\"$outputType\" == \"__SINGLE_GUY__\")" } { set attrPrefix \"$(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_stats{[incr groupnum]}.\"; set groupAttrs {}; set groupAttrs {_ptLocation}; foreach attr $groupAttrs val $groupKey { FME_SetAttribute "$attrPrefix$attr" $val; }; }; if {{_min} != {}} { FME_SetAttribute "$attrPrefix$minAttr" $min; }; if {{_max} != {}} { FME_SetAttribute "$attrPrefix$maxAttr" $max; }; if {{} != {}} { FME_SetAttribute "$attrPrefix$countAttr" $count; }; if {{} != {}} { FME_SetAttribute "$attrPrefix$numericAttr" $numcount; }; if {{_sum} != {}} { FME_SetAttribute "$attrPrefix$sumAttr" $sum; }; if {{_range} != {}} { FME_SetAttribute "$attrPrefix$rangeAttr" $range; }; if {{_mean} != {}} { FME_SetAttribute "$attrPrefix$meanAttr" $mean; }; if {{_median} != {}} { FME_SetAttribute "$attrPrefix$medianAttr" $median; }; if {{_stdev} != {}} { FME_SetAttribute "$attrPrefix$stdevAttr" $stdev; }; if {{_mode} != {}} { FME_SetAttribute "$attrPrefix$modeAttr" $mode; }; }; }; FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_Processor INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_ExpressionEvaluator_3_OUTPUT OUTPUT FEATURE_TYPE __ORIGINAL__ @Tcl2($(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_input) FACTORY_DEF * CreationFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_Creator CREATE_AT_END NUMBER_TO_CREATE 1 OUTPUT FEATURE_TYPE __SINGLE_GUY__ @SupplyAttributes($(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_SUMMARY_STATS,True) FACTORY_DEF * SortFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_Outputter INPUT FEATURE_TYPE __ORIGINAL__ OUTPUT SORTED FEATURE_TYPE __ORIGINAL__ @Tcl2("$(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_output __ORIGINAL__") FACTORY_DEF * ElementFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_Exploder INPUT FEATURE_TYPE __ORIGINAL__ $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_SUMMARY_STATS True @RemoveAttributes($(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_SUMMARY_STATS) LIST_NAME $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_stats{} MODE LEAN_AND_MEAN CLONE_GEOMETRY no OUTPUT ELEMENT FEATURE_TYPE __ORIGINAL__ FACTORY_DEF * TestFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_FinalJudge INPUT FEATURE_TYPE __ORIGINAL__ INPUT FEATURE_TYPE __SINGLE_GUY__ TEST @FeatureType() == __ORIGINAL__ OUTPUT PASSED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_STATISTICS # ------------------------------------------------------------------------- FACTORY_DEF * TestFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_Tester_3 INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_StatisticsCalculator_STATISTICS TEST @Value(_max) != 0 TEST @Value(_firstPoint) = Yes BOOLEAN_OPERATOR AND OUTPUT PASSED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_3_PASSED OUTPUT FAILED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_3_FAILED # ------------------------------------------------------------------------- FACTORY_DEF * TestFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_Tester_5 INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_3_FAILED TEST @Value(_max) != 1 BOOLEAN_OPERATOR AND OUTPUT PASSED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_5_PASSED OUTPUT FAILED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_5_FAILED # ------------------------------------------------------------------------- FACTORY_DEF * TestFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_Tester INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_5_PASSED INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_3_PASSED TEST @Value(_count) != 0 BOOLEAN_OPERATOR OR OUTPUT PASSED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_PASSED OUTPUT FAILED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_FAILED # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_ExpressionEvaluator INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_PASSED OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_ExpressionEvaluator_OUTPUT _x_new @Evaluate("@Value(_x)+@Value(_radius)*sin(6.28318531/@Value(_max)*@Value(_count))") # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_ExpressionEvaluator_2 INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_ExpressionEvaluator_OUTPUT OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_ExpressionEvaluator_2_OUTPUT _y_new @Evaluate("@Value(_y)+@Value(_radius)*cos( 6.28318531/@Value(_max)*@Value(_count))") # ------------------------------------------------------------------------- FACTORY_DEF * TestFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_2DPointReplacer INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_ExpressionEvaluator_2_OUTPUT TEST &fme_type = fme_text OUTPUT PASSED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_2DPointReplacer_POINT @XValue("@Value(_x_new)",RESET) @YValue("@Value(_y_new)") @Dimension(2) OUTPUT FAILED FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_2DPointReplacer_POINT @XValue("@Value(_x_new)",RESET) @YValue("@Value(_y_new)") @Dimension(2) @GeometryType(fme_point) FACTORY_DEF * TeeFactory FACTORY_NAME "$(PointDisperser_WORKSPACE_NAME)_2DPointReplacer POINT Splitter" INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_2DPointReplacer_POINT OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_2DPointReplacer_POINT_0 OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_2DPointReplacer_POINT_1 # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_AttributeRemover_2 INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_5_FAILED INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_2DPointReplacer_POINT_1 INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Tester_FAILED OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_AttributeRemover_2_OUTPUT @RemoveAttributes(_decimal_places,_firstPoint,_max,_mean,_median,_min,_mode,_radius,_radius_max,_radius_min,_random_number,_range,_stdev,_sum,_x,_x_new,_y,_y_new,_z) # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_2DPointAdder INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_2DPointReplacer_POINT_0 OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_2DPointAdder_OUTPUT @Dimension(2) @Tcl2("FME_Coordinates addCoord {@Value(_x)} {@Value(_y)}") @GeometryType(fme_polygon) # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_Orientor INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_2DPointAdder_OUTPUT OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Orientor_ORIENTED @Orient(REVERSE) # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME $(PointDisperser_WORKSPACE_NAME)_AttributeRemover INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_Orientor_ORIENTED OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_AttributeRemover_OUTPUT @RemoveAttributes(_decimal_places,_firstPoint,_max,_mean,_median,_min,_mode,_radius,_radius_max,_radius_min,_random_number,_range,_stdev,_sum,_x,_x_new,_y,_y_new,_z) FACTORY_DEF * TeeFactory FACTORY_NAME "$(PointDisperser_WORKSPACE_NAME)_RADIUS Output Collector" INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_AttributeRemover_OUTPUT OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_RADIUS FACTORY_DEF * TeeFactory FACTORY_NAME "$(PointDisperser_WORKSPACE_NAME)_POINTS Output Collector" INPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_AttributeRemover_2_OUTPUT OUTPUT FEATURE_TYPE $(PointDisperser_WORKSPACE_NAME)_POINTS INCLUDE [puts {MACRO WB_CURRENT_CONTEXT $(WB_OLD_CONTEXT_$(PointDisperser_WORKSPACE_NAME))}]