Exemplo n.º 1
0
        /// <summary>
        /// Creates and configures the <see cref="TreeLayout"/> and the <see cref="TreeLayoutData"/>
        /// such that node types are considered.
        /// </summary>
        private Sample CreateTreeSample()
        {
            // create a tree layout including a reduction stage to support non-tree graphs too
            var layout = new TreeLayout {
                DefaultNodePlacer = new CompactNodePlacer()
            };
            var edgeRouter = new EdgeRouter {
                Scope = Scope.RouteAffectedEdges
            };
            var reductionStage = new TreeReductionStage {
                NonTreeEdgeRouter = edgeRouter, NonTreeEdgeSelectionKey = edgeRouter.AffectedEdgesDpKey
            };

            layout.PrependStage(reductionStage);

            // the node types are specified as delegate on the nodeTypes property of the layout data
            var layoutData = new TreeLayoutData {
                NodeTypes = { Delegate = node => GetNodeType(node) }
            };

            return(new Sample {
                Name = "Tree",
                File = "tree",
                Layout = layout,
                LayoutData = layoutData,
                IsDirected = true
            });
        }
    /// <summary>
    /// Configures the tree reduction stage that will handle edges that do not belong to the tree.
    /// </summary>
    private TreeReductionStage CreateTreeReductionStage() {
      var reductionStage = new TreeReductionStage();
      if (EdgeLabelingItem == EnumEdgeLabeling.Integrated) {
        reductionStage.NonTreeEdgeLabelingAlgorithm = new GenericLabeling();
      }
      reductionStage.MultiParentAllowed =
          (LayoutStyleItem == EnumStyle.Classic &&
           !EnforceGlobalLayeringItem &&
           ChildPlacementPolicyItem != LeafPlacement.AllLeavesOnSameLayer) ||
          (LayoutStyleItem == EnumStyle.Default &&
           (NodePlacerItem == EnumNodePlacer.Default ||
            NodePlacerItem == EnumNodePlacer.Bus ||
            NodePlacerItem == EnumNodePlacer.LeftRight ||
            NodePlacerItem == EnumNodePlacer.Dendrogram) &&
           AllowMultiParentsItem);

      if (RoutingStyleForNonTreeEdgesItem == EnumRoute.Organic) {
        reductionStage.NonTreeEdgeRouter = new OrganicEdgeRouter();
        reductionStage.NonTreeEdgeSelectionKey = OrganicEdgeRouter.AffectedEdgesDpKey;
      } else if (RoutingStyleForNonTreeEdgesItem == EnumRoute.Orthogonal) {
        var edgeRouter = new EdgeRouter { Rerouting = true, Scope = Scope.RouteAffectedEdges };
        reductionStage.NonTreeEdgeRouter = edgeRouter;
        reductionStage.NonTreeEdgeSelectionKey = edgeRouter.AffectedEdgesDpKey;
      } else if (RoutingStyleForNonTreeEdgesItem == EnumRoute.StraightLine) {
        reductionStage.NonTreeEdgeRouter = reductionStage.CreateStraightLineRouter();
      } else if (RoutingStyleForNonTreeEdgesItem == EnumRoute.Bundled) {
        var ebc = reductionStage.EdgeBundling;
        ebc.BundlingStrength = EdgeBundlingStrengthItem;
        ebc.DefaultBundleDescriptor = new EdgeBundleDescriptor { Bundled = true };
      }
      return reductionStage;
    }
Exemplo n.º 3
0
        /// <summary>
        /// Gets the layout algorithm selected by the user.
        /// </summary>
        /// <returns></returns>
        private ILayoutAlgorithm GetLayoutAlgorithm()
        {
            var graph               = graphControl.Graph;
            var item                = layoutChooserBox.SelectedItem as ComboBoxItem;
            var layoutName          = item != null ? item.Tag as String: null;
            ILayoutAlgorithm layout = new HierarchicLayout();

            if (layoutName != null)
            {
                if (layoutName == "hierarchic")
                {
                    layout = new HierarchicLayout();
                }
                else if (layoutName == "organic")
                {
                    layout = new OrganicLayout {
                        PreferredEdgeLength = 1.5 * Math.Max(graph.NodeDefaults.Size.Width, graph.NodeDefaults.Size.Height)
                    };
                }
                else if (layoutName == "orthogonal")
                {
                    layout = new OrthogonalLayout();
                }
                else if (layoutName == "circular")
                {
                    layout = new CircularLayout();
                }
                else if (layoutName == "tree")
                {
                    layout = new TreeReductionStage(new TreeLayout())
                    {
                        NonTreeEdgeRouter = new OrganicEdgeRouter()
                    };
                }
                else if (layoutName == "balloon")
                {
                    layout = new TreeReductionStage(new BalloonLayout())
                    {
                        NonTreeEdgeRouter = new OrganicEdgeRouter()
                    };
                }
                else if (layoutName == "radial")
                {
                    layout = new RadialLayout();
                }
                else if (layoutName == "router-polyline")
                {
                    layout = new EdgeRouter();
                }
                else if (layoutName == "router-organic")
                {
                    layout = new OrganicEdgeRouter {
                        EdgeNodeOverlapAllowed = false
                    };
                }
            }
            return(layout);
        }
Exemplo n.º 4
0
 /// <summary>
 /// removes additional layout stages and data providers.
 /// </summary>
 protected override void PerformPostLayout()
 {
     if (additionalStage != null)
     {
         multiStageLayout.RemoveStage(additionalStage);
         additionalStage = null;
     }
     CurrentLayoutGraph.RemoveDataProvider(AspectRatioTreeLayout.SubtreeRoutingPolicyDpKey);
 }
Exemplo n.º 5
0
        /// <summary>
        /// Gets the layout algorithm selected by the user.
        /// </summary>
        /// <returns></returns>
        private ILayoutAlgorithm GetLayoutAlgorithm()
        {
            var graph               = graphControl.Graph;
            var layoutName          = layoutBox.SelectedItem as string;
            ILayoutAlgorithm layout = new HierarchicLayout();

            if (layoutName != null)
            {
                if (layoutName == "Layout: Hierarchic")
                {
                    layout = new HierarchicLayout();
                }
                else if (layoutName == "Layout: Organic")
                {
                    layout = new OrganicLayout {
                        PreferredEdgeLength = 1.5 * Math.Max(graph.NodeDefaults.Size.Width, graph.NodeDefaults.Size.Height)
                    };
                }
                else if (layoutName == "Layout: Orthogonal")
                {
                    layout = new OrthogonalLayout();
                }
                else if (layoutName == "Layout: Circular")
                {
                    layout = new CircularLayout();
                }
                else if (layoutName == "Layout: Tree")
                {
                    layout = new TreeReductionStage(new TreeLayout())
                    {
                        NonTreeEdgeRouter = new OrganicEdgeRouter()
                    };
                }
                else if (layoutName == "Layout: Balloon")
                {
                    layout = new TreeReductionStage(new BalloonLayout())
                    {
                        NonTreeEdgeRouter = new OrganicEdgeRouter()
                    };
                }
                else if (layoutName == "Layout: Radial")
                {
                    layout = new RadialLayout();
                }
                else if (layoutName == "Routing: Polyline")
                {
                    layout = new EdgeRouter();
                }
                else if (layoutName == "Routing: Organic")
                {
                    layout = new OrganicEdgeRouter {
                        EdgeNodeOverlapAllowed = false
                    };
                }
            }
            return(layout);
        }
Exemplo n.º 6
0
        private static ILayoutAlgorithm CreateTreeLayout()
        {
            var reductionStage = new TreeReductionStage
            {
                NonTreeEdgeRouter       = new NonTreeEdgeRouterStage(),
                NonTreeEdgeSelectionKey = LayoutKeys.AffectedEdgesDpKey
            };
            var treeLayout = new TreeLayout {
                IntegratedEdgeLabeling = true
            };

            treeLayout.PrependStage(reductionStage);
            DisableAutoFlipping(treeLayout);
            return(treeLayout);
        }
        /// <summary>
        /// configures tree reduction state and non-tree edge routing.
        /// </summary>
        protected override void PerformPreLayout()
        {
            if ((bool)Handler.GetValue(GENERAL, ALLOW_NON_TREE_EDGES))
            {
                additionalStage = new TreeReductionStage();
                multiStageLayout.AppendStage(additionalStage);
                string routingStyleChoice = (string)Handler.GetValue(GENERAL, ROUTING_STYLE_FOR_NON_TREE_EDGES);
                switch (routingStyleChoice)
                {
                case ROUTE_ORGANIC:
                    OrganicEdgeRouter organic = new OrganicEdgeRouter();
                    additionalStage.NonTreeEdgeRouter       = organic;
                    additionalStage.NonTreeEdgeSelectionKey = OrganicEdgeRouter.AffectedEdgesDpKey;
                    break;

                case ROUTE_ORTHOGONAL:
                    EdgeRouter orthogonal = new EdgeRouter {
                        Rerouting = true,
                        Scope     = Scope.RouteAffectedEdges
                    };

                    additionalStage.NonTreeEdgeSelectionKey = orthogonal.AffectedEdgesDpKey;
                    additionalStage.NonTreeEdgeRouter       = orthogonal;
                    break;

                case ROUTE_STRAIGHTLINE:
                    additionalStage.NonTreeEdgeRouter = additionalStage.CreateStraightLineRouter();
                    break;

                case ROUTE_BUNDLED:
                    EdgeBundling         ebc        = additionalStage.EdgeBundling;
                    EdgeBundleDescriptor descriptor = new EdgeBundleDescriptor();
                    descriptor.Bundled          = true;
                    ebc.DefaultBundleDescriptor = descriptor;
                    ebc.BundlingStrength        = (double)Handler.GetValue(GENERAL, EDGE_BUNDLING_STRENGTH);

                    // Sets a new straight-line router in case some edges are not bundled, e.g. self-loops
                    OrganicEdgeRouter oer = new OrganicEdgeRouter();
                    additionalStage.NonTreeEdgeRouter       = oer;
                    additionalStage.NonTreeEdgeSelectionKey = OrganicEdgeRouter.AffectedEdgesDpKey;
                    break;
                }
            }
        }
        /// <summary>
        /// Configures the tree reduction stage that will handle edges that do not belong to the tree.
        /// </summary>
        private TreeReductionStage CreateTreeReductionStage()
        {
            var reductionStage = new TreeReductionStage();

            if (EdgeLabelingItem == EnumEdgeLabeling.Integrated)
            {
                reductionStage.NonTreeEdgeLabelingAlgorithm = new GenericLabeling();
            }
            reductionStage.MultiParentAllowed =
                (NodePlacerItem == EnumNodePlacer.Default ||
                 NodePlacerItem == EnumNodePlacer.Bus ||
                 NodePlacerItem == EnumNodePlacer.LeftRight ||
                 NodePlacerItem == EnumNodePlacer.Dendrogram) &&
                AllowMultiParentsItem;

            if (RoutingStyleForNonTreeEdgesItem == EnumRoute.Organic)
            {
                reductionStage.NonTreeEdgeRouter       = new OrganicEdgeRouter();
                reductionStage.NonTreeEdgeSelectionKey = OrganicEdgeRouter.AffectedEdgesDpKey;
            }
            else if (RoutingStyleForNonTreeEdgesItem == EnumRoute.Orthogonal)
            {
                var edgeRouter = new EdgeRouter {
                    Rerouting = true, Scope = Scope.RouteAffectedEdges
                };
                reductionStage.NonTreeEdgeRouter       = edgeRouter;
                reductionStage.NonTreeEdgeSelectionKey = edgeRouter.AffectedEdgesDpKey;
            }
            else if (RoutingStyleForNonTreeEdgesItem == EnumRoute.StraightLine)
            {
                reductionStage.NonTreeEdgeRouter = reductionStage.CreateStraightLineRouter();
            }
            else if (RoutingStyleForNonTreeEdgesItem == EnumRoute.Bundled)
            {
                var ebc = reductionStage.EdgeBundling;
                ebc.BundlingStrength        = EdgeBundlingStrengthItem;
                ebc.DefaultBundleDescriptor = new EdgeBundleDescriptor {
                    Bundled = true
                };
            }
            return(reductionStage);
        }
Exemplo n.º 9
0
            /// <summary>
            /// Creates a new instance configured for the specified graph.
            /// </summary>
            /// <param name="graph">The graph to configure the layout data for</param>
            /// <param name="fromSketch"/> Whether the <see cref="HierarchicLayout"/> shall be run in incremental layout mode.
            public LayoutData(IGraph graph, bool fromSketch)
            {
                // set up port candidates for edges (edges should be attached to the left/right side of the corresponding node
                var candidates = new List <PortCandidate>
                {
                    PortCandidate.CreateCandidate(PortDirections.West),
                    PortCandidate.CreateCandidate(PortDirections.East)
                };

                // configure the different sub group layout settings
                var leftToRightTreeLayout = new TreeReductionStage();

                leftToRightTreeLayout.NonTreeEdgeRouter = leftToRightTreeLayout.CreateStraightLineRouter();
                leftToRightTreeLayout.CoreLayout        = new TreeLayout {
                    LayoutOrientation = LayoutOrientation.LeftToRight,
                };

                var rightToLeftTreeLayout = new TreeReductionStage();

                rightToLeftTreeLayout.NonTreeEdgeRouter = rightToLeftTreeLayout.CreateStraightLineRouter();
                rightToLeftTreeLayout.CoreLayout        = new TreeLayout {
                    LayoutOrientation = LayoutOrientation.RightToLeft,
                };

                var view = graph.Lookup <IFoldingView>();

                Items.Add(new RecursiveGroupLayoutData {
                    SourcePortCandidates = { Constant = candidates },
                    TargetPortCandidates = { Constant = candidates },

                    // map each group node to the layout algorithm that should be used for its content
                    GroupNodeLayouts =
                    {
                        Delegate = node => {
                            switch (GetTierType(node, view, graph))
                            {
                            case TierType.LeftTreeGroupNode:
                                return(leftToRightTreeLayout);

                            case TierType.RightTreeGroupNode:
                                return(rightToLeftTreeLayout);

                            default:
                                return(null);
                            }
                        }
                    }
                });

                var hlData = new HierarchicLayoutData {
                    NodeLayoutDescriptors =
                    {
                        Delegate                   = node => {
                            // align tree group nodes within their layer
                            switch (GetTierType(node, view, graph))
                            {
                            case TierType.LeftTreeGroupNode:
                                return(new NodeLayoutDescriptor {
                                    LayerAlignment = 1
                                });

                            case TierType.RightTreeGroupNode:
                                return(new NodeLayoutDescriptor {
                                    LayerAlignment = 0
                                });

                            default:
                                return(null);
                            }
                        }
                    }
                };

                if (!fromSketch)
                {
                    // insert layer constraints to guarantee the desired placement for "left" and "right" group nodes
                    var layerConstraintData = hlData.LayerConstraints;
                    foreach (var node in graph.Nodes)
                    {
                        // align tree group nodes within their layer
                        TierType type = GetTierType(node, view, graph);
                        if (type == TierType.LeftTreeGroupNode)
                        {
                            layerConstraintData.PlaceAtTop(node);
                        }
                        else if (type == TierType.RightTreeGroupNode)
                        {
                            layerConstraintData.PlaceAtBottom(node);
                        }
                    }
                }
                Items.Add(hlData);
            }
        /// <inheritdoc />
        protected override ILayoutAlgorithm CreateConfiguredLayout(GraphControl graphControl)
        {
            var layout = new BalloonLayout();

            ((ComponentLayout)layout.ComponentLayout).Style = ComponentArrangementStyles.MultiRows;

            layout.RootNodePolicy         = RootNodePolicyItem;
            layout.PreferredChildWedge    = PreferredChildWedgeItem;
            layout.PreferredRootWedge     = PreferredRootWedgeItem;
            layout.MinimumEdgeLength      = MinimumEdgeLengthItem;
            layout.CompactnessFactor      = 1 - CompactnessFactorItem;
            layout.AllowOverlaps          = AllowOverlapsItem;
            layout.FromSketchMode         = FromSketchItem;
            layout.ChainStraighteningMode = StraightenChainsItem;
            layout.InterleavedMode        = PlaceChildrenInterleavedItem ? InterleavedMode.AllNodes : InterleavedMode.Off;

            switch (NodeLabelingStyleItem)
            {
            case EnumNodeLabelingPolicies.None:
                layout.ConsiderNodeLabels = false;
                break;

            case EnumNodeLabelingPolicies.RaylikeLeaves:
                layout.IntegratedNodeLabeling = true;
                layout.NodeLabelingPolicy     = NodeLabelingPolicy.RayLikeLeaves;
                break;

            case EnumNodeLabelingPolicies.ConsiderCurrentPosition:
                layout.ConsiderNodeLabels = true;
                break;

            case EnumNodeLabelingPolicies.Horizontal:
                layout.IntegratedNodeLabeling = true;
                layout.NodeLabelingPolicy     = NodeLabelingPolicy.Horizontal;
                break;

            default:
                layout.ConsiderNodeLabels = false;
                break;
            }

            // configures tree reduction stage and non-tree edge routing.
            layout.SubgraphLayoutEnabled = ActOnSelectionOnlyItem;
            MultiStageLayout multiStageLayout = layout;

            var treeReductionStage = new TreeReductionStage();

            multiStageLayout.AppendStage(treeReductionStage);
            if (RoutingStyleForNonTreeEdgesItem == EnumRoute.Organic)
            {
                var organic = new OrganicEdgeRouter();
                treeReductionStage.NonTreeEdgeRouter       = organic;
                treeReductionStage.NonTreeEdgeSelectionKey = OrganicEdgeRouter.AffectedEdgesDpKey;
            }
            else if (RoutingStyleForNonTreeEdgesItem == EnumRoute.Orthogonal)
            {
                var edgeRouter = new EdgeRouter {
                    Rerouting = true,
                    Scope     = Scope.RouteAffectedEdges
                };
                treeReductionStage.NonTreeEdgeSelectionKey = edgeRouter.AffectedEdgesDpKey;
                treeReductionStage.NonTreeEdgeRouter       = edgeRouter;
            }
            else if (RoutingStyleForNonTreeEdgesItem == EnumRoute.StraightLine)
            {
                treeReductionStage.NonTreeEdgeRouter = treeReductionStage.CreateStraightLineRouter();
            }
            else if (RoutingStyleForNonTreeEdgesItem == EnumRoute.Bundled)
            {
                var ebc = treeReductionStage.EdgeBundling;
                var bundleDescriptor = new EdgeBundleDescriptor {
                    Bundled = true
                };
                ebc.BundlingStrength        = EdgeBundlingStrengthItem;
                ebc.DefaultBundleDescriptor = bundleDescriptor;
            }

            if (EdgeLabelingItem == EnumEdgeLabeling.Generic)
            {
                layout.IntegratedEdgeLabeling = false;
                var genericLabeling = new GenericLabeling {
                    PlaceEdgeLabels = true,
                    PlaceNodeLabels = false,
                    ReduceAmbiguity = ReduceAmbiguityItem
                };
                layout.LabelingEnabled = true;
                layout.Labeling        = genericLabeling;
            }
            else if (EdgeLabelingItem == EnumEdgeLabeling.Integrated)
            {
                layout.IntegratedEdgeLabeling = true;
                treeReductionStage.NonTreeEdgeLabelingAlgorithm = new GenericLabeling();
            }

            if (NodeLabelingStyleItem == EnumNodeLabelingPolicies.RaylikeLeaves || NodeLabelingStyleItem == EnumNodeLabelingPolicies.Horizontal)
            {
                foreach (var label in graphControl.Graph.GetNodeLabels())
                {
                    graphControl.Graph.SetLabelLayoutParameter(label, FreeNodeLabelModel.Instance.FindBestParameter(label, FreeNodeLabelModel.Instance, label.GetLayout()));
                }
            }

            return(layout);
        }