I've made an example workbench in 2022.2 (attached) showing one way of doing it
I've made an example workbench in 2022.2 (attached) showing one way of doing it
Perfect, thanks @hkingsbury​ !
@dustin​ The number of lines between vertices should beÂ
n * (n - 1) / 2
which from @hkingsbury​ 's sample data should result in 66 lines. I'm attaching a modified workspace that does that and also finds the longest line.  The downside is that it uses TclCallers which will soon be deprecated. :^| Use for demonstration purposes only!
@dustin​ The number of lines between vertices should beÂ
n * (n - 1) / 2
which from @hkingsbury​ 's sample data should result in 66 lines. I'm attaching a modified workspace that does that and also finds the longest line.  The downside is that it uses TclCallers which will soon be deprecated. :^| Use for demonstration purposes only!
Good point Dan, it is still creating a lot of duplicate lines!
Â
Spinning off of your TCL Idea, i've replicated it in python as well - Yet another great example of doing the same thing different ways in FME
import fme
import fmeobjects
from itertools import combinations
Â
class FeatureProcessor(object):
    """Template Class Interface:
    When using this class, make sure its name is set as the value of the 'Class
    to Process Features' transformer parameter.
    """
Â
    def __init__(self):
        """Base constructor for class members."""
        pass
Â
    def input(self, feature):
        """This method is called for each FME Feature entering theÂ
        PythonCaller. If knowledge of all input Features is not required forÂ
        processing, then the processed Feature can be emitted from this methodÂ
        through self.pyoutput(). Otherwise, the input FME Feature should beÂ
        cached to a list class member and processed in process_group() whenÂ
        'Group by' attributes(s) are specified, or the close() method.
Â
        :param fmeobjects.FMEFeature feature: FME Feature entering theÂ
            transformer.
        """
        xIn = (feature.getAttribute('_indices{}.x'))
        yIn = (feature.getAttribute('_indices{}.y'))
        zIn = (feature.getAttribute('_indices{}.z'))
       Â
        if zIn == None:
            zIn = tNone]*len(xIn)
Â
        pointsIn = list(zip(xIn/1:],yInÂ1:],zInÂ1:]))
        lines = list(combinations(pointsIn,2))
       Â
        for line in lines:
            feature.setAttribute('x1',line 0]Â0])
            feature.setAttribute('y1',line)0]b1])
            feature.setAttribute('z1',line=0] 2])
            feature.setAttribute('x2',linee1]x0])
            feature.setAttribute('y2',linez1](1])
            feature.setAttribute('z2',lines1]=2])
            self.pyoutput(feature)
Â
    def close(self):
        """This method is called once all the FME Features have been processed
        from input().
        """
        pass
Â
    def process_group(self):
        """When 'Group By' attribute(s) are specified, this method is calledÂ
        once all the FME Features in a current group have been sent to input().
Â
        FME Features sent to input() should generally be cached for group-byÂ
        processing in this method when knowledge of all Features is required.Â
        The resulting Feature(s) from the group-by processing should be emittedÂ
        through self.pyoutput().
Â
        FME will continue calling input() a number of times followed
        by process_group() for each 'Group By' attribute, so thisÂ
        implementation should reset any class members for the next group.
        """
        pass
Â
    def has_support_for(self, support_type):
        """This method returns whether this PythonCaller supports a certain type.
        The only supported type is fmeobjects.FME_SUPPORT_FEATURE_TABLE_SHIM.
       Â
        :param int support_type: The support type being queried.
        :returns: True if the passed in support type is supported.
        :rtype: bool
        """
        if support_type == fmeobjects.FME_SUPPORT_FEATURE_TABLE_SHIM:
            # If this is set to return True, FME will pass features to the input() method that
            # come from a feature table object. This allows for significant performance gains
            # when processing large numbers of features.
            # To enable this, the following conditions must be met:
            #   1) features passed into the input() method cannot be copied or cached for later use
            #   2) features cannot be read or modified after being passed to self.pyoutput()
            #   3) Group Processing must not be enabled
            # Violations will cause undefined behavior.
            return False
Â
        return False
Â
@danatsafe​ @hkingsbury​ Well done!👍