DefinitionWikipedia defines a loop as "...a sequence of statements which is specified once but which may be carried out several times in succession" - either "a specified number of times... or until some condition is met."
Looping in FMEFME has a loop "transformer" for use in Custom Transformers. Using this technology, a feature entering a custom transformer can be processed using the same set of transformers, a set number of times. Once this feature meets a certain condition, it exits the custom transformer, and the next feature in the pipeline enters.
LimitationsA custom transformer containing a loop permits a single feature to be processed an indeterminate number of times. However, some transformers do not work on the basis of one-feature-at-a-time. These transformers, known as Group-Based Transformers process multiple features at once. A transformer that carries out a geometric overlay is one example of this since, by definition, an overlay function needs to process two or more features at once to have any meaning.
Therefore a loop within a custom transformer is not permitted to contain any transformer that carries out its processing on a group basis. The only permitted transformers are those that process on a feature-by-feature basis. These are known as Feature-Based Transformers.
Defining in WorkbenchIn Workbench a loop repeats a section between a loop placemarker, and a standard custom transformer input port. Right-click on the canvas and choose 'Insert Transformer Loop'. A dialog opens asking which input port you wish to loop to. On selecting the appropriate port a loop transformer is placed containing the annotation 'Loop to xxxx' (where xxxx is the input port chosen). To define an input port as being used as a loop entry point only, and not as an entry point for features from outside the custom transformer, right-click the input port and remove the checkmark from the setting 'published'.
Above: A section of custom transformer containing a loop. In this case a feature passes through the loop whilst a certain condition is not met. This condition is defined by the Tester transformer. This example is slightly unusual in that the feature being looped does not exit the loop on meeting the test condition, but is instead thrown away (indicated by the unused PASSED port on the Tester). Output features are actually derived from a duplicate connection on the ExpressionEvaluator - hence there will be a separate output feature for each iteration of the loop.
Loopy ArtThe usefulness to the FME Art movement of repeating a function again and again is shown by this page of Loopy Artwork.
Suggested Similar Articles
Looping within a custom transformer is a perfect tool for making FME Art.
A custom transformer is a sequence of standard workspace transformers condensed into a single transformer.
Looping in custom transformers is a relatively old feature in FME - it dates back to 2006. However, blocking transformers such as the Clipper or SpatialRelator or any transformer that can use "Group By" functionality, could not work properly within loops.
It can be difficult to publish an attribute selection from within a custom transformer. In a Tester transformer if <attribute> = -999, when you publish this the user parameter becomes TEST @Value(<AttributeName>) = -999. How can you publish just the attribute choice without the full expression?
The proper way to use your attributes within a custom transformer is to publish them so a user can set them outside of the custom transformer.