public class TreeLayout extends MultiStageLayout
TreeLayout provides multiple different arrangements of trees and subtrees. It is easy to
customize the order of edges, the port assignment and
the arrangement of the nodes for each subtree.
Tree layout algorithms are commonly applied to visualize relational data and produce diagrams of high quality that are able to reveal possible hierarchic properties of the graph. More precisely, they find applications in dataflow analysis, software engineering, bioinformatics and business administration.
Example graph with a layout calculated by TreeLayout using default settings
Tree layout using different INodePlacers and rotations
The layout algorithm starts from the leaves and continues with their parents, then with the parents of the parents and
so on. When a node is processed, the algorithm will use the corresponding INodePlacer instance to move its
children (along with their subtrees) to a suitable position and to route the outgoing edges of this node. Then, the next
local root node will be processed.
To avoid moving all nodes several times and to know the area that the subtrees occupy, the layout algorithm uses
TreeLayout.SubtreeShapes. These
TreeLayout.SubtreeShapes are moved and merged during layout calculation.
Each subtree can have a different style of node placement. INodePlacers are responsible for arranging subtrees
and their common root node. They can be specified separately for each local root with a IDataProvider registered
with the graph using key NODE_PLACER_DPKEY.
A custom node can be defined as root of the tree using a IDataProvider registered with the graph with key
SELECTED_ROOT_DPKEY.
The layout algorithm can be configured to reserve space for node labels and place the edge labels along edges such that
the labels won't overlap with other graph elements. Edge labels are placed according to the information stored in a PreferredPlacementDescriptor
instance. However, the placement along the edge will only affect the order of multiple labels at the same edge. The
algorithm will always place the labels close to the target node.
Grouping of nodes can also be handled by this layout algorithm. It is important that a group node contains a whole
subtree. Otherwise, the group nodes may overlap with each other or with other nodes. Furthermore, the user may specify
minimum size constraints for each group node using IDataProvider key
GroupingKeys.MINIMUM_NODE_SIZE_DPKEY.
TreeLayout supports custom sorting of the outgoing edges of a node. For example, a INodePlacer instance
that implements IFromSketchNodePlacer provides a comparator that keeps the current order of siblings, allowing
to extend the graph incrementally.
This layout algorithm can only handle graphs with a tree structure. To apply it to a general graph, a TreeReductionStage
can be appended. This stage will temporarily remove some edges of the input graph until a tree is obtained. After the
layout calculation, the stage will reinsert the edges that were removed and route them separately.
| Modifier and Type | Class and Description |
|---|---|
static class |
TreeLayout.SubtreeShape
A
TreeLayout.SubtreeShape represents the position and the borders of a subtree. |
| Modifier and Type | Field and Description |
|---|---|
static EdgeDpKey<Integer> |
CRITICAL_EDGE_DPKEY
A
DataProvider key for defining the priority of critical edges.
|
protected LayoutGraph |
graph
The input graph for which a layout is calculated.
|
static NodeDpKey<MultiParentDescriptor> |
MULTI_PARENT_DESCRIPTOR_DPKEY
A
DataProvider key for retrieving descriptors for nodes in multi-parent structures.
|
static NodeDpKey<INodePlacer> |
NODE_PLACER_DPKEY
A
DataProvider key for specifying a child node placer for each node.
|
static NodeDpKey<Comparator<Object>> |
OUT_EDGE_COMPARATOR_DPKEY
A
DataProvider key for specifying the comparator for the outgoing edges.
|
static NodeDpKey<IPortAssignment> |
PORT_ASSIGNMENT_DPKEY
A
DataProvider key for assigning ports to nodes.
|
static NodeDpKey<Boolean> |
SELECTED_ROOT_DPKEY
A
DataProvider key for marking the node that will be used as root node of the tree.
|
| Constructor and Description |
|---|
TreeLayout()
Creates a new
TreeLayout instance with default settings. |
| Modifier and Type | Method and Description |
|---|---|
void |
applyLayoutCore(LayoutGraph graph)
Arranges the given graph as a tree.
|
protected TreeLayout.SubtreeShape |
createNodeShape(Node node)
Creates a
TreeLayout.SubtreeShape for the given node that consists only of the bounds of this particular node. |
protected EdgeList |
directTree()
Returns a list of edges that need to be reversed in order to obtain a valid rooted and directed tree from the input
graph.
|
INodePlacer |
getDefaultLeafPlacer()
Gets the default
INodePlacer instance that places the leaf nodes of the tree. |
INodePlacer |
getDefaultNodePlacer()
Gets the default
INodePlacer instance that arranges all subtrees that do not have a specific INodePlacer
assigned using a IDataProvider. |
Comparator<Object> |
getDefaultOutEdgeComparator()
Gets the default
Comparator instance that sorts the outgoing edges in all subtrees that do not have a specific Comparator
assigned using a IDataProvider. |
IPortAssignment |
getDefaultPortAssignment()
Gets the default
IPortAssignment instance for all subtrees that do not have a specific IPortAssignment
assigned using a IDataProvider. |
protected INodePlacer |
getNodePlacer(Node localRoot)
Returns the
INodePlacer instance that is used for the placement of the local root node and the
TreeLayout.SubtreeShapes. |
protected Comparator<Object> |
getOutEdgeComparer(Node localRoot)
Returns the
Comparator instance that will sort the outgoing edges connecting to the given node. |
protected IPortAssignment |
getPortAssignment(Node localRoot)
Returns the
IPortAssignment instance that places the ports of the connecting edges of the given node. |
protected Node[] |
getRootsArray(Node root)
Returns an array of the nodes that will be laid out.
|
protected IDataAcceptor |
getSourceGroupDataAcceptor()
Gets a
IDataAcceptor that can be used for temporarily overwriting the source group information used during the
layout. |
protected IDataAcceptor |
getSourcePortConstraintDataAcceptor()
Gets a
IDataAcceptor that can overwrite the source port contraint temporarily used during
the layout. |
protected TreeLayout.SubtreeShape |
getSubtreeShape(Node localRoot)
Provides access to the
TreeLayout.SubtreeShape for the given node. |
protected IDataAcceptor |
getTargetGroupDataAcceptor()
Gets a
IDataAcceptor that can be used for temporarily overwriting the target group information used during the
layout. |
protected IDataAcceptor |
getTargetPortConstraintDataAcceptor()
Gets a
IDataAcceptor that can overwrite the target port contraint temporarily used during
the layout. |
boolean |
isGroupingSupportEnabled()
Gets whether or not group nodes are handled by the layout algorithm.
|
boolean |
isIntegratedEdgeLabelingEnabled()
Gets whether or not edge labels are placed by the layout algorithm.
|
boolean |
isMultiParentAllowed()
Gets whether or not multi-parent structures are allowed for this tree layout.
|
boolean |
isNodeLabelConsiderationEnabled()
Gets whether or not the layout algorithm reserves space for node labels.
|
protected TreeLayout.SubtreeShape |
layoutRoot(Node localRoot)
Calculates the layout for the given root node and its subtrees.
|
protected void |
reverseEdges(EdgeList reversedEdges)
Reverses the direction of given edges.
|
void |
setComponentLayoutEnabled(boolean value)
Sets whether or not the
ILayoutStage used for arranging the components of the graph is
activated. |
void |
setDefaultLeafPlacer(INodePlacer value)
Sets the default
INodePlacer instance that places the leaf nodes of the tree. |
void |
setDefaultNodePlacer(INodePlacer value)
Sets the default
INodePlacer instance that arranges all subtrees that do not have a specific INodePlacer
assigned using a IDataProvider. |
void |
setDefaultOutEdgeComparator(Comparator<Object> value)
Sets the default
Comparator instance that sorts the outgoing edges in all subtrees that do not have a specific Comparator
assigned using a IDataProvider. |
void |
setDefaultPortAssignment(IPortAssignment value)
Sets the default
IPortAssignment instance for all subtrees that do not have a specific IPortAssignment
assigned using a IDataProvider. |
void |
setGroupingSupportEnabled(boolean value)
Sets whether or not group nodes are handled by the layout algorithm.
|
void |
setIntegratedEdgeLabelingEnabled(boolean value)
Sets whether or not edge labels are placed by the layout algorithm.
|
void |
setMultiParentAllowed(boolean value)
Sets whether or not multi-parent structures are allowed for this tree layout.
|
void |
setNodeLabelConsiderationEnabled(boolean value)
Sets whether or not the layout algorithm reserves space for node labels.
|
void |
setParallelEdgeRouterEnabled(boolean value)
Sets whether or not the
ILayoutStage used for routing parallel edges is activated. |
void |
setSelfLoopRouterEnabled(boolean value)
Sets whether or not the
ILayoutStage used for routing self-loops is activated. |
appendStage, applyLayout, checkNodeSize, disableAllStages, getComponentLayout, getHideGroupsStage, getLabeling, getLayoutOrientation, getOrientationLayout, getParallelEdgeRouter, getSelfLoopRouter, getSubgraphLayout, isComponentLayoutEnabled, isHideGroupsStageEnabled, isLabelingEnabled, isOrientationLayoutEnabled, isParallelEdgeRouterEnabled, isSelfLoopRouterEnabled, isSubgraphLayoutEnabled, prependStage, removeStage, setComponentLayout, setHideGroupsStage, setHideGroupsStageEnabled, setLabeling, setLabelingEnabled, setLayoutOrientation, setOrientationLayout, setOrientationLayoutEnabled, setParallelEdgeRouter, setSelfLoopRouter, setSubgraphLayout, setSubgraphLayoutEnabledpublic static final EdgeDpKey<Integer> CRITICAL_EDGE_DPKEY
DataProvider key for defining the priority of critical edges.
The layout algorithm tries to align each node pair that is connected by a critical edge (integer value >
0). This feature can, for example, be used for highlighting different edge paths that are important for a
user. Conflicts between different critical edges are always resolved in favor of the higher priority.
Critical edges will always align the centers of source and target node, thus replacing the current root alignment of the
INodePlacer.
The critical edge may not be straight if subtrees are rotated or port constraints are assigned.
This feature is only supported by the following INodePlacers:
protected LayoutGraph graph
public static final NodeDpKey<MultiParentDescriptor> MULTI_PARENT_DESCRIPTOR_DPKEY
DataProvider key for retrieving descriptors for nodes in multi-parent structures.
The returned descriptor affects the layout of the multi-parent structure.
MultiParentAllowed. Furthermore, all nodes that belong to the same
multi-parent structure should return the same descriptor.setMultiParentAllowed(boolean)public static final NodeDpKey<INodePlacer> NODE_PLACER_DPKEY
DataProvider key for specifying a child node placer for each node.
setDefaultNodePlacer(INodePlacer)public static final NodeDpKey<Comparator<Object>> OUT_EDGE_COMPARATOR_DPKEY
DataProvider key for specifying the comparator for the outgoing edges.
setDefaultOutEdgeComparator(Comparator)public static final NodeDpKey<IPortAssignment> PORT_ASSIGNMENT_DPKEY
DataProvider key for assigning ports to nodes.
public TreeLayout()
TreeLayout instance with default settings.public void applyLayoutCore(LayoutGraph graph)
applyLayoutCore in class MultiStageLayoutgraph - the input graphprotected TreeLayout.SubtreeShape createNodeShape(Node node)
TreeLayout.SubtreeShape for the given node that consists only of the bounds of this particular node.
It may also include node labels or NodeHalos.
This method may be overridden to return a custom TreeLayout.SubtreeShape for the given node.
node - the given nodeTreeLayout.SubtreeShape instanceprotected EdgeList directTree()
The root node of the tree is either a node marked by a IDataProvider registered with the graph with key SELECTED_ROOT_DPKEY
or is defined according to Trees.getRoot(Graph).
This method is called initially to calculate a rooted tree from the input graph. It may be overridden to apply a custom algorithm that determines which edges need to be reversed.
reverseEdges(EdgeList)public INodePlacer getDefaultLeafPlacer()
INodePlacer instance that places the leaf nodes of the tree.IllegalArgumentException - if the default INodePlacer is set to nullLeafNodePlacerINodePlacer instancesetDefaultNodePlacer(INodePlacer),
setDefaultLeafPlacer(INodePlacer)public INodePlacer getDefaultNodePlacer()
INodePlacer instance that arranges all subtrees that do not have a specific INodePlacer
assigned using a IDataProvider.IllegalArgumentException - if the default INodePlacer is set to nullDefaultNodePlacerINodePlacer instanceNODE_PLACER_DPKEY,
setDefaultNodePlacer(INodePlacer)public Comparator<Object> getDefaultOutEdgeComparator()
Comparator instance that sorts the outgoing edges in all subtrees that do not have a specific Comparator
assigned using a IDataProvider.Comparator for outgoing edges is null, the order of the edges will be maintained.null. No sorting is executed.null if no specific sorting should be doneOUT_EDGE_COMPARATOR_DPKEY,
setDefaultOutEdgeComparator(Comparator)public IPortAssignment getDefaultPortAssignment()
IPortAssignment instance for all subtrees that do not have a specific IPortAssignment
assigned using a IDataProvider.IllegalArgumentException - if the default IPortAssignment is set to nullDefaultPortAssignmentIPortAssignment instancePORT_ASSIGNMENT_DPKEY,
setDefaultPortAssignment(IPortAssignment)protected INodePlacer getNodePlacer(Node localRoot)
INodePlacer instance that is used for the placement of the local root node and the
TreeLayout.SubtreeShapes.
The method may be overridden to return custom INodePlacer instances. It is possible to return a shared instance
for multiple different nodes because the instances are not used after subsequent calls to this method.
The current implementation returns the INodePlacer defined by the IDataProvider registered with key
NODE_PLACER_DPKEY. It falls back to the default INodePlacer if there is no specific INodePlacer
for the given node.
localRoot - the root of the local subtreeINodePlacer instance that places the subtree below the given local root nodeNODE_PLACER_DPKEY,
getDefaultNodePlacer()protected Comparator<Object> getOutEdgeComparer(Node localRoot)
Comparator instance that will sort the outgoing edges connecting to the given node.
The Comparator can be null in case the initial edge order shall be used.
The method may be overridden to return custom Comparator instances. It is possible to return a shared instance
for multiple different nodes because the instances are not used after subsequent calls to this method.
The current implementation returns the Comparator defined in the IDataProvider registered with key
OUT_EDGE_COMPARATOR_DPKEY. It falls back to the default Comparator if there is no specific Comparator
for the given node.
localRoot - the root of the local subtreeComparator or null that sorts the outgoing edges of the given nodeOUT_EDGE_COMPARATOR_DPKEY,
getDefaultOutEdgeComparator()protected IPortAssignment getPortAssignment(Node localRoot)
IPortAssignment instance that places the ports of the connecting edges of the given node.
The method may be overridden to return customized IPortAssignment instances. It is possible to return a shared
instance for multiple different nodes because the instances are not used after subsequent calls to this method.
The current implementation returns the IPortAssignment defined by the IDataProvider registered with key
OUT_EDGE_COMPARATOR_DPKEY. It falls back to the default IPortAssignment if there is no specific IPortAssignment
for the given node.
localRoot - the root of the local subtreeIPortAssignment instance that assigns the ports of the edges at the given nodePORT_ASSIGNMENT_DPKEY,
getDefaultPortAssignment()protected Node[] getRootsArray(Node root)
The given node will be considered as the root of the tree. The order of the elements ensures that no parent is processed before one of its successors.
This method may be overridden to change the order in which the nodes (and their subtrees) are handled. However, it is important to keep the parents after the successors. Only siblings can change places.
root - the node to be considered as root of the treeprotected IDataAcceptor getSourceGroupDataAcceptor()
IDataAcceptor that can be used for temporarily overwriting the source group information used during the
layout.
This method may be overridden to handle those edge groups separately.
IDataAcceptor to associate source edge groups with EdgesPortConstraintKeys.SOURCE_GROUP_ID_DPKEYprotected IDataAcceptor getSourcePortConstraintDataAcceptor()
IDataAcceptor that can overwrite the source port contraint temporarily used during
the layout.
This method sets temporary source PortConstraints, e.g., after edge reversal. It may be overridden to handle
those PortConstraints separately.
IDataAcceptor to associate source PortConstraints with EdgesPortConstraintKeys.SOURCE_PORT_CONSTRAINT_DPKEYprotected TreeLayout.SubtreeShape getSubtreeShape(Node localRoot)
TreeLayout.SubtreeShape for the given node.
The TreeLayout.SubtreeShape contains information about the current extent and location of the subtree rooted at the node.
It should only be modified during the layout of the parent node. Also, it won't be initialized before the layout of the
corresponding subtree is calculated.
This method updates the TreeLayout.SubtreeShape in layoutRoot(Node).
localRoot - the root of the subtreeTreeLayout.SubtreeShape instance if it has already been calculated, null otherwiseprotected IDataAcceptor getTargetGroupDataAcceptor()
IDataAcceptor that can be used for temporarily overwriting the target group information used during the
layout.
This method may be overridden to handle those edge groups separately.
IDataAcceptor to associate target edge groups with EdgesPortConstraintKeys.TARGET_GROUP_ID_DPKEYprotected IDataAcceptor getTargetPortConstraintDataAcceptor()
IDataAcceptor that can overwrite the target port contraint temporarily used during
the layout.
This method sets temporary target PortConstraints, e.g., after edge reversal. It may be overridden to handle
those PortConstraints separately.
IDataAcceptor to associate target PortConstraints with EdgesPortConstraintKeys.TARGET_PORT_CONSTRAINT_DPKEYpublic boolean isGroupingSupportEnabled()
true. Grouping is enabled.true if grouping is supported, false otherwisesetGroupingSupportEnabled(boolean)public boolean isIntegratedEdgeLabelingEnabled()
If this is enabled, the TreeLayout.SubtreeShapes of the subtrees are extended by the edge labels.
The layout algorithm uses the information of PreferredPlacementDescriptor for an edge label to determine the
corresponding placement. However, edge labels are always placed at the target side of the edge. The placement along the
edge only affects the order of the edge labels at the same edge.
labeling algorithm will be
overwritten and when disabling it, any currently specified labeling algorithm will be disabled via property
LabelingEnabled. Therefore, it is recommended to only use this
convenience property instead of manually changing the mentioned other properties.false. Edge labels are ignored.true if the layout algorithm places edge labels, false otherwisesetIntegratedEdgeLabelingEnabled(boolean)public boolean isMultiParentAllowed()
If multi-parent structures are allowed, the directed input graph may contain structures of multiple nodes that share the same predecessors as well as the same successors. All nodes belonging to such a structure are placed side by side and the incident edges are routed in a bus-style manner.
INodePlacers route their edges, multi-parent structures only work for
some INodePlacer implementations:
DefaultNodePlacer delivers the best results for multi-parent structures. However, routing style RoutingStyle.FORK_AT_ROOT
as well as root alignments RootAlignment.LEADING_ON_BUS and RootAlignment.TRAILING_ON_BUS
are not supported.
DendrogramNodePlacer supports multi-parent structures.BusNodePlacer supports multi-parent structures.LeftRightNodePlacer supports multi-parent structures.false. Multi-parent structures are not allowed.true if multi-parent structures are allowed, false otherwisesetMultiParentAllowed(boolean)public boolean isNodeLabelConsiderationEnabled()
If this feature is enabled, the TreeLayout.SubtreeShape of the nodes will also hold the shapes of its labels.
labeling algorithm will be
overwritten and when disabling it, any currently specified labeling algorithm will be disabled via property
LabelingEnabled. Therefore, it is recommended to only use this
convenience property instead of manually changing the mentioned other properties.false. Node labels are not considered.true if node labels are considered, false otherwisesetNodeLabelConsiderationEnabled(boolean)protected TreeLayout.SubtreeShape layoutRoot(Node localRoot)
This method is invoked for each node in the tree exactly once. Thus, children are always handled before their parents. In this manner, the subtrees already have a layout and can be arranged with their parent.
To retrieve the shapes of the subtrees of all children of the local root, this method uses
getSubtreeShape(Node).
The method may be overridden to add configuration code.
localRoot - the root of the subtree that whose layout is calculatedTreeLayout.SubtreeShape of the local root node and all of its children and connecting edgesprotected void reverseEdges(EdgeList reversedEdges)
This method will be called initially after the directTree() method and finally after the layout has been
calculated. It may be overridden to additionally reverse data that depends on the direction of the edges.
reversedEdges - the edges that will be reversedpublic void setComponentLayoutEnabled(boolean value)
ILayoutStage used for arranging the components of the graph is
activated.setComponentLayoutEnabled in class MultiStageLayoutTreeLayout can only handle single components. Disabling ComponentLayout will
lead to errors during execution.true. The stage that arranges connected graph components is activated.value - true if the stage that arranges the graph components is activated, false otherwiseMultiStageLayout.isComponentLayoutEnabled(),
MultiStageLayout.setComponentLayout(com.yworks.yfiles.layout.ILayoutStage),
ComponentLayoutpublic void setDefaultLeafPlacer(INodePlacer value)
INodePlacer instance that places the leaf nodes of the tree.IllegalArgumentException - if the default INodePlacer is set to nullLeafNodePlacervalue - the default INodePlacer instancesetDefaultNodePlacer(INodePlacer),
getDefaultLeafPlacer()public void setDefaultNodePlacer(INodePlacer value)
INodePlacer instance that arranges all subtrees that do not have a specific INodePlacer
assigned using a IDataProvider.IllegalArgumentException - if the default INodePlacer is set to nullDefaultNodePlacervalue - the default INodePlacer instanceNODE_PLACER_DPKEY,
getDefaultNodePlacer()public void setDefaultOutEdgeComparator(Comparator<Object> value)
Comparator instance that sorts the outgoing edges in all subtrees that do not have a specific Comparator
assigned using a IDataProvider.Comparator for outgoing edges is null, the order of the edges will be maintained.null. No sorting is executed.value - the new default instance or null if no specific sorting should be doneOUT_EDGE_COMPARATOR_DPKEY,
getDefaultOutEdgeComparator()public void setDefaultPortAssignment(IPortAssignment value)
IPortAssignment instance for all subtrees that do not have a specific IPortAssignment
assigned using a IDataProvider.IllegalArgumentException - if the default IPortAssignment is set to nullDefaultPortAssignmentvalue - the default IPortAssignment instancePORT_ASSIGNMENT_DPKEY,
getDefaultPortAssignment()public void setGroupingSupportEnabled(boolean value)
true. Grouping is enabled.value - true if grouping is supported, false otherwiseisGroupingSupportEnabled()public void setIntegratedEdgeLabelingEnabled(boolean value)
If this is enabled, the TreeLayout.SubtreeShapes of the subtrees are extended by the edge labels.
The layout algorithm uses the information of PreferredPlacementDescriptor for an edge label to determine the
corresponding placement. However, edge labels are always placed at the target side of the edge. The placement along the
edge only affects the order of the edge labels at the same edge.
labeling algorithm will be
overwritten and when disabling it, any currently specified labeling algorithm will be disabled via property
LabelingEnabled. Therefore, it is recommended to only use this
convenience property instead of manually changing the mentioned other properties.false. Edge labels are ignored.value - true if the layout algorithm places edge labels, false otherwiseisIntegratedEdgeLabelingEnabled()public void setMultiParentAllowed(boolean value)
If multi-parent structures are allowed, the directed input graph may contain structures of multiple nodes that share the same predecessors as well as the same successors. All nodes belonging to such a structure are placed side by side and the incident edges are routed in a bus-style manner.
INodePlacers route their edges, multi-parent structures only work for
some INodePlacer implementations:
DefaultNodePlacer delivers the best results for multi-parent structures. However, routing style RoutingStyle.FORK_AT_ROOT
as well as root alignments RootAlignment.LEADING_ON_BUS and RootAlignment.TRAILING_ON_BUS
are not supported.
DendrogramNodePlacer supports multi-parent structures.BusNodePlacer supports multi-parent structures.LeftRightNodePlacer supports multi-parent structures.false. Multi-parent structures are not allowed.value - true if multi-parent structures are allowed, false otherwiseisMultiParentAllowed()public void setNodeLabelConsiderationEnabled(boolean value)
If this feature is enabled, the TreeLayout.SubtreeShape of the nodes will also hold the shapes of its labels.
labeling algorithm will be
overwritten and when disabling it, any currently specified labeling algorithm will be disabled via property
LabelingEnabled. Therefore, it is recommended to only use this
convenience property instead of manually changing the mentioned other properties.false. Node labels are not considered.value - true if node labels are considered, false otherwiseisNodeLabelConsiderationEnabled()public void setParallelEdgeRouterEnabled(boolean value)
ILayoutStage used for routing parallel edges is activated.setParallelEdgeRouterEnabled in class MultiStageLayoutTreeLayout cannot handle parallel edges. Disabling ParallelEdgeRouter will lead
to errors during execution.true. The stage that routes parallel edges is activated.value - true if the stage responsible for routing parallel edges is activated, false otherwiseMultiStageLayout.isParallelEdgeRouterEnabled(),
MultiStageLayout.setParallelEdgeRouter(com.yworks.yfiles.layout.ILayoutStage),
ParallelEdgeRouterpublic void setSelfLoopRouterEnabled(boolean value)
ILayoutStage used for routing self-loops is activated.setSelfLoopRouterEnabled in class MultiStageLayoutTreeLayout cannot handle self-loops. Disabling SelfLoopRouter will lead to
errors during execution.true. The stage that routes self-loops is activated.value - true if the stage responsible for routing self-loops is activated, false otherwiseMultiStageLayout.isSelfLoopRouterEnabled(),
MultiStageLayout.setSelfLoopRouter(com.yworks.yfiles.layout.ILayoutStage),
SelfLoopRouter