#! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! this out."/>#! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! FME_PYTHON_VERSION 27#!START_HEADER#!START_WB_HEADERREADER_TYPE NULLREADER_KEYWORD NULL_SOURCENULL_SOURCE_DATASET nullWRITER_TYPE NULLWRITER_KEYWORD NULL_DESTNULL_DEST_DATASET null#!END_WB_HEADER#!START_WB_HEADER#!END_WB_HEADER#!END_HEADERLOG_FILENAME "$(FME_MF_DIR)Test.log"LOG_APPEND NOLOG_MAX_FEATURES 200LOG_MAX_RECORDED_FEATURES 200FME_REPROJECTION_ENGINE FMEFME_IMPLICIT_CSMAP_REPROJECTION_MODE AutoFME_GEOMETRY_HANDLING EnhancedFME_STROKE_MAX_DEVIATION 0LOG_FILTER_MASK -1# -------------------------------------------------------------------------MULTI_READER_CONTINUE_ON_READER_FAILURE No# -------------------------------------------------------------------------MACRO WORKSPACE_NAME TestMACRO FME_VIEWER_APP fmedatainspector# -------------------------------------------------------------------------INCLUDE [ if {[info exists env(FME_TEMP)] && [file isdirectory $env(FME_TEMP)]} {set gVisualizerTemp $env(FME_TEMP)} elseif {[info exists env(TEMP)] && [file isdirectory $env(TEMP)]} {set gVisualizerTemp $env(TEMP)} elseif { $tcl_platform(platform) == "unix" } {set gVisualizerTemp "/tmp"} else {set gVisualizerTemp c:};regsub -all {[ ,&]} {$(WORKSPACE_NAME)} {_} wsname;set gVisualizerTemp $gVisualizerTemp/${wsname}_[clock format [clock seconds] -format %H%M%S];puts "MACRO WORKSPACE_TEMP_DIR $gVisualizerTemp";MACRO VISUALIZER_FEATURE_FILE $(WORKSPACE_TEMP_DIR)/inspector.ffsMACRO VISUALIZER_SCHEMA_FILE $(WORKSPACE_TEMP_DIR)/inspector.fscMACRO VISUALIZER_CREATE_SPATIAL_INDEX YESDEFAULT_MACRO WB_CURRENT_CONTEXT# -------------------------------------------------------------------------Tcl2 proc Creator_CoordSysRemover {} { global FME_CoordSys;set FME_CoordSys {};}MACRO Creator_XML NOT_ACTIVATEDMACRO Creator_CLASSIC NOT_ACTIVATEDMACRO Creator_2D3D 2D_GEOMETRYMACRO Creator_COORDS INCLUDE [ if { {Geometry Object} == {Geometry Object} } { puts {MACRO Creator_XML *} } ]INCLUDE [ if { {Geometry Object} == {2D Coordinate List} } { puts {MACRO Creator_2D3D 2D_GEOMETRY};puts {MACRO Creator_CLASSIC *} } ]INCLUDE [ if { {Geometry Object} == {3D Coordinate List} } { puts {MACRO Creator_2D3D 3D_GEOMETRY};puts {MACRO Creator_CLASSIC *} } ]INCLUDE [ if { {Geometry Object} == {2D Min/Max Box} } { set comment { We need to turn the COORDS which are minX minY maxX maxY into a full polygon list of coordinates };set splitCoords [split [string trim { }]];if { [llength $splitCoords] > 4} { set trimmedCoords {};foreach item $splitCoords { if { $item != {} } {lappend trimmedCoords $item} };set splitCoords $trimmedCoords;};if { [llength $splitCoords] != 4 } { error {Creator: Coordinate list is expected to be a space delimited list of four numbers as 'minx miny maxx maxy' - ` ' is invalid};};set minX [lindex $splitCoords 0];set minY [lindex $splitCoords 1];set maxX [lindex $splitCoords 2];set maxY [lindex $splitCoords 3];puts "MACRO Creator_COORDS $minX $minY $minX $maxY $maxX $maxY $maxX $minY $minX $minY";puts {MACRO Creator_2D3D 2D_GEOMETRY};puts {MACRO Creator_CLASSIC *} } ]FACTORY_DEF $(Creator_XML) CreationFactory FACTORY_NAME Creator_XML_Creator CREATE_AT_END no OUTPUT FEATURE_TYPE _____CREATED______ @Geometry(FROM_ENCODED_STRING, ?xml version= 1.0 encoding= US_ASCII standalone= no ? geometry dimension= 2 null geometry )FACTORY_DEF $(Creator_CLASSIC) CreationFactory FACTORY_NAME Creator_CLASSIC_Creator $(Creator_2D3D) $(Creator_COORDS) CREATE_AT_END no OUTPUT FEATURE_TYPE _____CREATED______FACTORY_DEF * TeeFactory FACTORY_NAME Creator_Cloner INPUT FEATURE_TYPE _____CREATED______ NUMBER_OF_COPIES 1 COPY_NUMBER_ATTRIBUTE "_creation_instance" OUTPUT FEATURE_TYPE Creator_CREATED @Tcl2(Creator_CoordSysRemover) @CoordSys() fme_feature_type CreatorFACTORY_DEF * TeeFactory FACTORY_NAME "Creator CREATED Splitter" INPUT FEATURE_TYPE Creator_CREATED OUTPUT FEATURE_TYPE Creator_CREATED_0_GJAgmIF9G6c= OUTPUT FEATURE_TYPE Creator_CREATED_1_Exx7idfjvCA=FACTORY_DEF * BranchingFactory FACTORY_NAME "Creator_CREATED_0_GJAgmIF9G6c= Brancher -1 3" INPUT FEATURE_TYPE Creator_CREATED_0_GJAgmIF9G6c= TARGET_FACTORY "$(WB_CURRENT_CONTEXT)_CREATOR_BRANCH_TARGET" OUTPUT PASSED FEATURE_TYPE * @RemoveAttributes("Creator_CREATED_0_GJAgmIF9G6c= Brancher -1 3".BranchingFactory.Count)FACTORY_DEF * BranchingFactory FACTORY_NAME "Creator_CREATED_1_Exx7idfjvCA= Brancher -1 13" INPUT FEATURE_TYPE Creator_CREATED_1_Exx7idfjvCA= TARGET_FACTORY "$(WB_CURRENT_CONTEXT)_CREATOR_BRANCH_TARGET" OUTPUT PASSED FEATURE_TYPE * @RemoveAttributes("Creator_CREATED_1_Exx7idfjvCA= Brancher -1 13".BranchingFactory.Count)# -------------------------------------------------------------------------FACTORY_DEF * TeeFactory FACTORY_NAME "$(WB_CURRENT_CONTEXT)_CREATOR_BRANCH_TARGET" INPUT FEATURE_TYPE * OUTPUT FEATURE_TYPE *# -------------------------------------------------------------------------FACTORY_DEF * AttrSetFactory FACTORY_NAME AttributeCreator INPUT FEATURE_TYPE Creator_CREATED_1_Exx7idfjvCA= MULTI_FEATURE_MODE NO NULL_ATTR_MODE NO_OP ATTRSET_CREATE_DIRECTIVES _PROPAGATE_MISSING_FDIV ATTR_ACTION "" "XML" "SET_TO" "Try this out." OUTPUT OUTPUT FEATURE_TYPE AttributeCreator_OUTPUT# -------------------------------------------------------------------------FACTORY_DEF * TeeFactory FACTORY_NAME XMLTemplater_SITUATION_INPUT_FACTORY INPUT FEATURE_TYPE __dummy__ INPUT FEATURE_TYPE AttributeCreator_OUTPUT OUTPUT FEATURE_TYPE XMLTemplater_DataFeatures __xml_templater_bucket__ SITUATIONFACTORY_DEF * XMLTemplaterFactory FACTORY_NAME XMLTemplater INPUT CONTROL_FEATURE FEATURE_TYPE Creator_CREATED_0_GJAgmIF9G6c= INPUT DATA_FEATURE FEATURE_TYPE XMLTemplater_DataFeatures RESULT_ATTR _result OUTPUT_XML_HEADER YES BUCKET_ATTR_NAME __xml_templater_bucket__ CONTROL_TEMPLATE_EXPR Test xmlns:xsi= http: www.w3.org 2001 XMLSCHEMA-instance Situation fme:process-features SITUATION Situation Test BUCKET_TEMPLATE_EXPR SITUATION " fme:get-attribute XML " OUTPUT XML_DOCUMENT FEATURE_TYPE XMLTemplater_OUTPUT# -------------------------------------------------------------------------FACTORY_DEF * XMLFormatterFactory FACTORY_NAME XMLFormatter INPUT INPUT FEATURE_TYPE XMLTemplater_OUTPUT XML_INPUT_TEXT_ATTR "_result" XML_OUTPUT_ATTR "_xml_output" LIST_ATTR "_xml_error" FORMATTING PRETTY_PRINT DETECT_IGNORABLE_WHITESPACE No INDENT_SIZE 1 REPLACE_TABS_WITH_SPACES no TEXT_INDENT no REMOVE_ALL_COMMENT No REMOVE_EMPTY_ELEMENT No COLLAPSE_EMPTY_ELEMENT No CLEANUP_NAMESPACE No CLEANUP_SCHEMALOCATION No XML_OUTPUT_ENCODING utf-8 OUTPUT PASSED FEATURE_TYPE XMLFormatter_PASSED# -------------------------------------------------------------------------# Set the directive to add all the meta-attributes to the features.# We do this so users see all possible information in the viewed# features.READER_META_ATTRIBUTES fme_feature_type fme_dataset fme_basename# Assumption is that the workspace temp dir has been already set and created.See controldefs.cpp - ControlDefs::writeVisualizerTempDirDEFAULT_MACRO WORKSPACE_TEMP_DIRINCLUDE [ set grpByAttrs {};if { [string length $grpByAttrs] > 0 } { if { [string first "@EvaluateExpression" $grpByAttrs] == 0 } { puts "MACRO CATMAC _$grpByAttrs";} else { set catter "";set comma "";foreach attr $grpByAttrs { set catter "$catter$comma@Value(\"$attr\")";set comma ",_,";};puts "MACRO CATMAC _@Concatenate($catter)";} } else { puts "MACRO CATMAC ";};set 亚搏在线safeName "[regsub -all {[^a-zA-Z0-9]} {XMLFormatter_Passed} _]_[expr round(rand() * 1000000)]_[clock clicks -milliseconds]";puts "MACRO 亚搏在线SAFE_FFS_NAME $safeName";]# Make the temporary directory that the FFS files will live in.FACTORY_DEF * CreationFactory FACTORY_NAME XMLFormatter_Passed_DirCreator OUTPUT FEATURE_TYPE __nukeme__ @Tcl2("catch {file mkdir {$(WORKSPACE_TEMP_DIR)}}")FACTORY_DEF * TeeFactory FACTORY_NAME XMLFormatter_Passed_DirCreatorCleanerUpper INPUT FEATURE_TYPE __nukeme__# Send raster,point cloud and vector features down different paths to prepare# them for viewingFACTORY_DEF * TestFactory FACTORY_NAME XMLFormatter_Passed_FeatureDirector INPUT FEATURE_TYPE XMLFormatter_PASSED TEST &fme_type == "fme_raster" OUTPUT FAILED FEATURE_TYPE XMLFormatter_Passed___NotRasterFeatures___ OUTPUT PASSED FEATURE_TYPE XMLFormatter_Passed___RasterFeatures___FACTORY_DEF * TestFactory FACTORY_NAME XMLFormatter_Passed___FeatureDirector1 INPUT FEATURE_TYPE XMLFormatter_Passed___NotRasterFeatures___ TEST &fme_type == "fme_point_cloud" OUTPUT FAILED FEATURE_TYPE XMLFormatter_Passed___VectorFeatures___ OUTPUT PASSED FEATURE_TYPE XMLFormatter_Passed___PointCloudFeatures___# Vector features simply may get their colors overriddenFACTORY_DEF * TeeFactory FACTORY_NAME XMLFormatter_Passed_VectorSetterUpper INPUT FEATURE_TYPE XMLFormatter_Passed___VectorFeatures___ OUTPUT FEATURE_TYPE __viewme__# Point Cloud Features Might Need to be thinned# Note that we don't call the ThinPointCloud function directly,but rather# do it through TCL.This should allow this transformer to be used with a# Desktop license,even though ThinPointCloud requires Professional.Tcl2 proc XMLFormatter_Passed_993ce0b9_c764_4964_a6ba_8640837dbe026_thinPointCloud {} { if {[string equal {NO_THINNING} {KEEPNPOINT}]} { FME_Execute ThinPointCloud NO_THINNING "\" \"";} elseif {[string equal {NO_THINNING} {MAXNUMPOINTS}]} { FME_Execute ThinPointCloud NO_THINNING "\" \"";} elseif {[string equal {NO_THINNING} {FIRSTNPOINTS}]} { FME_Execute ThinPointCloud NO_THINNING "\" \"";} elseif {[string equal {NO_THINNING} {LASTNPOINTS}]} { FME_Execute ThinPointCloud NO_THINNING "\" \"";};}FACTORY_DEF * TeeFactory FACTORY_NAME XMLFormatter_Passed___PointCloudThinner INPUT FEATURE_TYPE XMLFormatter_Passed___PointCloudFeatures___ OUTPUT FEATURE_TYPE __viewme__ @Tcl2("XMLFormatter_Passed_993ce0b9_c764_4964_a6ba_8640837dbe026_thinPointCloud")Tcl2 proc XMLFormatter_Passed_993ce0b9_c764_4964_a6ba_8640837dbe026_prepareRaster {subsetStartRow subsetNumRows subsetStartCol subsetNumCols} { set useDI [string equal -nocase {$(FME_VIEWER_APP)} {fmedatainspector}];if {!$useDI} { FME_Execute ApplyRasterRotation BILINEAR;};set doResample [string equal {NoReduction} {Resample}];set doSubset [string equal {NoReduction} {Subset}];set doBounds [string equal {NoReduction} {BoundingBoxOnly}];if {$doBounds} { FME_Execute GeometryType fme_polygon;} elseif {$doResample || $doSubset} { set comment { First,we need to prefix all the attributes.This is done because we are going to call @RasterProperties,and we want to make sure it doesn't overwrite any existing attributes.};set kAttrPrefix ".";set allNames [FME_AttributeNames];foreach oldName $allNames { set newName $kAttrPrefix;append newName $oldName;FME_RenameAttribute $newName $oldName;};FME_Execute RasterProperties RASTER;if {$doResample} { set oldNumCols [FME_GetAttribute _num_columns];set oldNumRows [FME_GetAttribute _num_rows];set oldSpacingX [FME_GetAttribute _spacing_x];set oldSpacingY [FME_GetAttribute _spacing_y];set kMinNumCells 32;set kMaxNumCells 512;set comment { We will only resample if both dimensions are greater than the minimum num cells,and at least one is greater than the maximum.};if {$oldNumRows > $kMinNumCells && $oldNumCols > $kMinNumCells && ($oldNumRows > $kMaxNumCells || $oldNumCols > $kMaxNumCells)} { set newSpacingX 1.0;set newSpacingY 1.0;if {$oldNumRows > $oldNumCols} { set comment { If we have more rows than columns,we need to choose a spacing that reduces the number of rows to the maximum we've chosen.};set newSpacingY [expr 1.0 * $oldNumRows * $oldSpacingY / $kMaxNumCells];set newSpacingX [expr 1.0 * $newSpacingY / $oldSpacingY * $oldSpacingX];set comment { Now we need to check if doing this will result in the columns going below the minimum.If so,choose the spacing such that we only go down to the minimum (and not past).};set newNumCols [expr $oldNumCols * $oldSpacingX / $newSpacingX];if {$newNumCols < $kMinNumCells} { set newSpacingX [expr 1.0 * $oldNumCols * $oldSpacingX / $kMinNumCells];set newSpacingY [expr 1.0 * $newSpacingX / $oldSpacingX * $oldSpacingY];};} else { set comment { This is identical to the above case,except the roles of rows and cols are reversed.};set newSpacingX [expr 1.0 * $oldNumCols * $oldSpacingX / $kMaxNumCells];set newSpacingY [expr 1.0 * $newSpacingX / $oldSpacingX * $oldSpacingY];set newNumRows [expr $oldNumRows * $oldSpacingY / $newSpacingY];if {$newNumRows < $kMinNumCells} { set newSpacingY [expr 1.0 * $oldNumRows * $oldSpacingY / $kMinNumCells];set newSpacingX [expr 1.0 * $newSpacingY / $oldSpacingY * $oldSpacingX];};};FME_Execute ResampleRaster CELL_SIZE $newSpacingX $newSpacingY NearestNeighbor;};} elseif {$doSubset} { set comment { Get the value of some strings that may be attributes or constants.Note that we pass in the attribute prefix we're using,because if one does turn out to be an attribute,it won't actually be the exact name in the string (since we renamed all our attributes above).};set rasterNumRows [FME_GetAttribute _num_rows];set rasterNumCols [FME_GetAttribute _num_columns];set comment { Only do subsetting if the specified start position is actually within the raster.};if {$subsetStartRow < $rasterNumRows && $subsetStartCol < $rasterNumCols} { set comment { Now bound the subset to the size of the raster,so that we don't create padding.};if {[expr $subsetStartRow + $subsetNumRows] > $rasterNumRows} { set subsetNumRows [expr $rasterNumRows - $subsetStartRow];};if {[expr $subsetStartCol + $subsetNumCols] > $rasterNumCols} { set subsetNumCols [expr $rasterNumCols - $subsetStartCol];};FME_Execute SubsetRaster $subsetStartRow $subsetNumRows $subsetStartCol $subsetNumCols;};};set comment { Remove all the attributes added by @RasterProperties and remove the prefix from the real attributes.We assume they all start with an underscore.};FME_Execute RemoveAttributes fme_regexp_match {^_};foreach oldName $allNames { set newName $kAttrPrefix;append newName $oldName;FME_RenameAttribute $oldName $newName;};};}FACTORY_DEF * TeeFactory FACTORY_NAME XMLFormatter_Passed_RasterSetterUpper INPUT FEATURE_TYPE XMLFormatter_Passed___RasterFeatures___ OUTPUT FEATURE_TYPE __viewme__ @Tcl2("XMLFormatter_Passed_993ce0b9_c764_4964_a6ba_8640837dbe026_prepareRaster { } { } { } { }")# Now route all the features into the recorder,changing their# feature type to the transformer name so that they view nicely# XMLFormatter_Passed_993ce0b9_c764_4964_a6ba_8640837dbe026_VIS_FEAT_TYPE changes the feature types# of the features being visualized.DEFAULT_MACRO XMLFormatter_Passed_993ce0b9_c764_4964_a6ba_8640837dbe026_VIS_FEAT_TYPE XMLFormatter_Passed$(CATMAC)DEFAULT_MACRO VISUALIZER_FEATURE_FILE $(WORKSPACE_TEMP_DIR)/$(亚搏在线SAFE_FFS_NAME).ffsDEFAULT_MACRO VISUALIZER_CREATE_SPATIAL_INDEX NO# [PR#45549] The Data Inspector will limit the maximum number of features# it reads on WIN32,so we will correspondingly limit the number of# features we record here using the MAX_FEATURES_TO_RECORD directive.FACTORY_DEF * RecorderFactory FACTORY_NAME XMLFormatter_Passed_Recorder INPUT FEATURE_TYPE __viewme__ _wb_termination_feature Yes @FeatureType(TERMINATOR_@Value(_wb_termination_xformer)) INPUT FEATURE_TYPE __viewme__ @FeatureType($(XMLFormatter_Passed_993ce0b9_c764_4964_a6ba_8640837dbe026_VIS_FEAT_TYPE)) FEATURE_FILE "$(VISUALIZER_FEATURE_FILE)" CREATE_SPATIAL_INDEX "$(VISUALIZER_CREATE_SPATIAL_INDEX)" INSPECTOR "$(VISUALIZER_CREATE_SPATIAL_INDEX)" FSC_SCHEMA _creation_instance,varchar 255 ,_result,varchar 255 ,_xml_output,varchar 255 MODE RECORD RECORD_DIRECTLY_TO_DISK YES MAX_FEATURES_TO_RECORD WIN32 2000000# -------------------------------------------------------------------------FACTORY_DEF * RoutingFactory FACTORY_NAME "Destination Feature Type Routing Correlator" COMMAND_PARM_EVALUATION SINGLE_PASS INPUT FEATURE_TYPE * FEATURE_TYPE_ATTRIBUTE __wb_out_feat_type__ OUTPUT ROUTED FEATURE_TYPE * OUTPUT NOT_ROUTED FEATURE_TYPE __nuke_me__ @Tcl2("FME_StatMessage 818059 [FME_GetAttribute fme_template_feature_type] 818060 818061 fme_warn")# -------------------------------------------------------------------------FACTORY_DEF * TeeFactory FACTORY_NAME "Final Output Nuker" INPUT FEATURE_TYPE __nuke_me__# -------------------------------------------------------------------------FACTORY_DEF * CreationFactory CREATE_AT_END OUTPUT FEATURE_TYPE __NUKEME__ @TCL("if [file exists {$(WORKSPACE_TEMP_DIR)}] {set files [glob -nocomplain -directory {$(WORKSPACE_TEMP_DIR)} -tails *.ffs];if {[llength $files] == 1} { set theFile {$(WORKSPACE_TEMP_DIR)/};append theFile [lindex $files 0];eval FME_Execute System \173\042$(FME_HOME_UNIX)/fmedatainspector\042 --visualizer --single-application --delete-on-close --no-source-prompt -f FFS $theFile & \175;} elseif { [llength $files] == 0 } { catch { file delete -force {$(WORKSPACE_TEMP_DIR)} };} else { set filesNoExt {};set lastfile {};foreach {fileName} [lsort $files] { set fileNoExt [string trimright $fileName {.ffs}];if [regexp {(.*)_[0-9]*$} $fileNoExt wholething fileNoExtBase] { if { $fileNoExtBase == $lastfile } { continue } };set lastfile $fileNoExt;lappend filesNoExt $fileNoExt };eval FME_Execute System \173\042$(FME_HOME_UNIX)/fmedatainspector\042 --visualizer --single-application --delete-on-close --no-source-prompt -d {$(WORKSPACE_TEMP_DIR)} -a ffs -f FFS $filesNoExt & \175;};};")FACTORY_DEF * TeeFactory INPUT FEATURE_TYPE __NUKEME__