/// <summary>
        /// Return the transformed curve
        /// </summary>
        /// <param name="transformation"></param>
        /// <returns>the transformed curve</returns>
        public ICurve Transform(PlaneTransformation transformation) {
            Curve c = new Curve(segs.Count);
            foreach (ICurve s in segs)
                c.AddSegment(s.Transform(transformation));

            return c;
        }
        /// <summary>
        /// transforms the graph by the given matrix
        /// </summary>
        /// <param name="matrix">the matrix</param>
        public void Transform(PlaneTransformation matrix)
        {
            foreach (var node in Nodes)
            {
                node.Transform(matrix);
            }
            foreach (var edge in Edges)
            {
                edge.Transform(matrix);
            }
// #if DEBUG && TEST_MSAGL
//             if (DebugCurves != null)
//                 foreach (var dc in DebugCurves)
//                     dc.Curve = dc.Curve.Transform(matrix);
// #endif
            UpdateBoundingBox();
        }
        static internal GeometryGraph CreateAndLayoutGraph()
        {
            GeometryGraph graph = new GeometryGraph();

            double width  = 40;
            double height = 10;

            foreach (string id in "0 1 2 3 4 5 6 A B C D E F G a b c d e".Split(' '))
            {
                DrawingUtilsForSamples.AddNode(id, graph, width, height);
            }

            graph.Edges.Add(new Edge(graph.FindNodeByUserData("A"), graph.FindNodeByUserData("B")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("A"), graph.FindNodeByUserData("C")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("A"), graph.FindNodeByUserData("D")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("D"), graph.FindNodeByUserData("E")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("B"), graph.FindNodeByUserData("E")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("D"), graph.FindNodeByUserData("F")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("0"), graph.FindNodeByUserData("F")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("1"), graph.FindNodeByUserData("F")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("2"), graph.FindNodeByUserData("F")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("3"), graph.FindNodeByUserData("F")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("4"), graph.FindNodeByUserData("F")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("5"), graph.FindNodeByUserData("F")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("6"), graph.FindNodeByUserData("F")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("a"), graph.FindNodeByUserData("b")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("b"), graph.FindNodeByUserData("c")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("c"), graph.FindNodeByUserData("d")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("d"), graph.FindNodeByUserData("e")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("A"), graph.FindNodeByUserData("a")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("B"), graph.FindNodeByUserData("a")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("C"), graph.FindNodeByUserData("a")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("D"), graph.FindNodeByUserData("a")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("E"), graph.FindNodeByUserData("a")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("F"), graph.FindNodeByUserData("a")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("G"), graph.FindNodeByUserData("a")));

            var settings = new SugiyamaLayoutSettings {
                Transformation      = PlaneTransformation.Rotation(Math.PI / 2),
                EdgeRoutingSettings = { EdgeRoutingMode = EdgeRoutingMode.Spline }
            };
            var layout = new LayeredLayout(graph, settings);

            layout.Run();
            return(graph);
        }
 static void TransformEdgeCurve(PlaneTransformation transformation, Edge e)
 {
     if (e.Curve != null)
     {
         e.Curve = e.Curve.Transform(transformation);
         var eg = e.EdgeGeometry;
         if (eg.SourceArrowhead != null)
         {
             eg.SourceArrowhead.TipPosition = transformation * eg.SourceArrowhead.TipPosition;
         }
         if (eg.TargetArrowhead != null)
         {
             eg.TargetArrowhead.TipPosition = transformation * eg.TargetArrowhead.TipPosition;
         }
         TransformUnderlyingPolyline(e, transformation);
     }
 }
Esempio n. 5
0
        private static void DumpScatterPlotOfDelaunayFacesAreaChange(string graphName, HashSet <Tuple <int, int, int> > proximityTriangles,
                                                                     GeometryGraph geomGraphOld, GeometryGraph geomGraph, string nameAddon)
        {
            Graph scatterPlot = new Graph();

            for (int i = 0; i < proximityTriangles.Count; i++)
            {
                scatterPlot.AddNode(i.ToString());
            }

            scatterPlot.CreateGeometryGraph();
            int k = 0;

            foreach (var triangle in proximityTriangles)
            {
                Point a = geomGraphOld.Nodes[triangle.Item1].Center;
                Point b = geomGraphOld.Nodes[triangle.Item2].Center;
                Point c = geomGraphOld.Nodes[triangle.Item3].Center;

                Point d = geomGraph.Nodes[triangle.Item1].Center;
                Point e = geomGraph.Nodes[triangle.Item2].Center;
                Point f = geomGraph.Nodes[triangle.Item3].Center;

                double signOld = Point.SignedDoubledTriangleArea(a, b, c);
                double signNew = Point.SignedDoubledTriangleArea(d, e, f);
                var    node    = scatterPlot.FindNode(k.ToString());
                k++;
                node.GeometryNode.BoundaryCurve = CurveFactory.CreateCircle(1, new Point(signOld, signNew));
                if (signNew < 0)
                {
                    node.Attr.FillColor = node.Attr.Color = Color.Red;
                }
            }

            scatterPlot.GeometryGraph.UpdateBoundingBox();
            double w = scatterPlot.GeometryGraph.BoundingBox.Width;
            double h = scatterPlot.GeometryGraph.BoundingBox.Height;
            PlaneTransformation p = new PlaneTransformation(
                200 / w, 0, 0,
                0, 200 / h, 0);

            scatterPlot.GeometryGraph.Transform(p);
            scatterPlot.GeometryGraph.UpdateBoundingBox();
            SvgGraphWriter.Write(scatterPlot, "cdt_area_change_" + graphName + nameAddon + ".svg");
        }
Esempio n. 6
0
    private void RunLayout()
    {
        settings = settings ?? new SugiyamaLayoutSettings
        {
            Transformation      = PlaneTransformation.Rotation(0 * Math.PI / 2),
            PackingMethod       = PackingMethod.Columns,
            EdgeRoutingSettings =
            {
                Padding = 100,
            },
            GroupSplit = 10,
        };

        settings.EdgeRoutingSettings.EdgeRoutingMode = mode;
        var layout = new LayeredLayout(graph, settings);

        layout.Run();
    }
        private void SetGraphTransform()
        {
            //instead of setting transormation for graphics we are going to transform the geometry graph, just to test that GeometryGraph.Transform() works
            RectangleF clientRectangle = ClientRectangle;
            var        gr = geometryGraph.BoundingBox;

            if (clientRectangle.Height > 1 && clientRectangle.Width > 1)
            {
                var scale = Math.Min(clientRectangle.Width * 0.9 / gr.Width, clientRectangle.Height * 0.9 / gr.Height);
                var g0    = (gr.Left + gr.Right) / 2;
                var g1    = (gr.Top + gr.Bottom) / 2;

                var c0 = (clientRectangle.Left + clientRectangle.Right) / 2;
                var c1 = (clientRectangle.Top + clientRectangle.Bottom) / 2;
                var dx = c0 - scale * g0;
                var dy = c1 - scale * g1;
                var planeTransformation = new PlaneTransformation(scale, 0, dx, 0, scale, dy);
                geometryGraph.Transform(planeTransformation);
            }
        }
Esempio n. 8
0
        public override void AfterVisitTree()
        {
            LayoutSettings = new SugiyamaLayoutSettings
            {
                Transformation      = PlaneTransformation.Rotation(System.Math.PI),
                EdgeRoutingSettings = { EdgeRoutingMode = EdgeRoutingMode.Spline },
                MinNodeHeight       = 10,
                MinNodeWidth        = 20,
            };
            //LayoutSettings.NodeSeparation *= 2;
            Graph.LayoutAlgorithmSettings = LayoutSettings;


            foreach (Node n in Graph.Nodes)
            {
                Graph.GeometryGraph.Nodes.Add(
                    new GeometryNode(CurveFactory.CreateRectangle(20, 10, new GeometryPoint()), n));
            }

            foreach (Edge e in Graph.Edges)
            {
                GeometryNode source = Graph.FindGeometryNode(e.SourceNode.Id);
                GeometryNode target = Graph.FindGeometryNode(e.TargetNode.Id);
                Graph.GeometryGraph.Edges.Add(new GeometryEdge(source, target));
            }

            Graph.GeometryGraph.UpdateBoundingBox();
            using (Bitmap bmp = new Bitmap(1200, 1200, PixelFormat.Format32bppPArgb))
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    Rectangle rect = new Rectangle(0, 0, 1200, 1200);

                    g.Clear(System.Drawing.Color.White);

                    GraphDiagramUtil.SetGraphTransform(Graph.GeometryGraph, rect, g);
                    LayeredLayout layout = new LayeredLayout(Graph.GeometryGraph, LayoutSettings);
                    layout.Run();
                    GraphDiagramUtil.DrawFromGraph(rect, Graph.GeometryGraph, g);
                    bmp.Save("graph.bmp", ImageFormat.Bmp);
                }
        }
        /// <summary>
        /// transforms the graph by the given matrix
        /// </summary>
        /// <param name="matrix">the matrix</param>
        public void Transform(PlaneTransformation matrix)
        {
            foreach (var node in Nodes)
            {
                node.Transform(matrix);
            }
            foreach (var edge in Edges)
            {
                edge.Transform(matrix);
            }
#if TEST_MSAGL && TEST_MSAGL
            if (DebugCurves != null)
            {
                foreach (var dc in DebugCurves)
                {
                    dc.Curve = dc.Curve.Transform(matrix);
                }
            }
#endif
            UpdateBoundingBox();
        }
Esempio n. 10
0
        private static void DisplayGraph(Graph graph)
        {
            var settings = graph.LayoutAlgorithmSettings as SugiyamaLayoutSettings;

            settings.Transformation = PlaneTransformation.Rotation(Math.PI / 2);

            Form form = new Form();

            form.Width  = 1024;
            form.Height = 768;

            GViewer viewer = new GViewer();

            viewer.Graph = graph;

            form.SuspendLayout();
            viewer.Dock = DockStyle.Fill;
            form.Controls.Add(viewer);
            form.ResumeLayout();

            form.ShowDialog();
        }
        static internal GeometryGraph CreateAndLayoutGraph()
        {
            GeometryGraph graph = new GeometryGraph();

            double width  = 40;
            double height = 10;

            foreach (string id in "0 1 2 3 4 5 6 A B C D E F G a b c d e".Split(' '))
            {
                AddNode(id, graph, width, height);
            }

            graph.Edges.Add(new Edge(graph.FindNodeByUserData("A"), graph.FindNodeByUserData("B")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("A"), graph.FindNodeByUserData("C")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("A"), graph.FindNodeByUserData("D")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("D"), graph.FindNodeByUserData("E")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("B"), graph.FindNodeByUserData("E")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("D"), graph.FindNodeByUserData("F")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("0"), graph.FindNodeByUserData("F")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("1"), graph.FindNodeByUserData("F")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("2"), graph.FindNodeByUserData("F")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("3"), graph.FindNodeByUserData("F")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("4"), graph.FindNodeByUserData("F")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("5"), graph.FindNodeByUserData("F")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("6"), graph.FindNodeByUserData("F")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("a"), graph.FindNodeByUserData("b")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("b"), graph.FindNodeByUserData("c")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("c"), graph.FindNodeByUserData("d")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("d"), graph.FindNodeByUserData("e")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("A"), graph.FindNodeByUserData("a")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("B"), graph.FindNodeByUserData("a")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("C"), graph.FindNodeByUserData("a")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("D"), graph.FindNodeByUserData("a")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("E"), graph.FindNodeByUserData("a")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("F"), graph.FindNodeByUserData("a")));
            graph.Edges.Add(new Edge(graph.FindNodeByUserData("G"), graph.FindNodeByUserData("a")));

            var settings = new SugiyamaLayoutSettings();

            settings.Transformation = PlaneTransformation.Rotation(Math.PI / 2);
            settings.EdgeRoutingSettings.EdgeRoutingMode = EdgeRoutingMode.Spline;
            var layout = new LayeredLayout(graph, settings);

            layout.Run();
            return(graph);
//            double w = 40;
//            double h = 10;
//            GeometryGraph graph = new GeometryGraph();
            //columns
//            var col0 = new[] { "a", "b", "c" };
//            var col1 = new[] { "d", "e", "f", "g" };
//            var col2 = new[] { "k", "l", "m", "n" };
//            var col3 = new[] { "w", "y", "z" };
//
//            var settings = new SugiyamaLayoutSettings();
//
//            foreach (var id in col0)
//                AddNode(id, graph, w, h);
//            foreach (var id in col1)
//                AddNode(id, graph, w, h);
//            foreach (var id in col2)
//                AddNode(id, graph, w, h);
//            foreach (var id in col3)
//                AddNode(id, graph, w, h);
//
            //pinning columns
//            settings.PinNodesToSameLayer(col0.Select(s=>graph.FindNodeByUserData(s)).ToArray());
//            settings.PinNodesToSameLayer(col1.Select(s => graph.FindNodeByUserData(s)).ToArray());
//            settings.PinNodesToSameLayer(col2.Select(s => graph.FindNodeByUserData(s)).ToArray());
//            settings.PinNodesToSameLayer(col3.Select(s => graph.FindNodeByUserData(s)).ToArray());
//
//            AddEdgesBetweenColumns(col0, col1, graph);
//            AddEdgesBetweenColumns(col1, col2, graph);
//            AddEdgesBetweenColumns(col2, col3, graph);
            //rotate layer to columns
            // graph.Transformation = PlaneTransformation.Rotation(Math.PI / 2);
//            settings.NodeSeparation = 5;
//            settings.LayerSeparation = 100;
//            var ll = new LayeredLayout(graph, settings);
//            ll.Run();
//            return graph;
        }
Esempio n. 12
0
        int ProcessDotFile(string inputFile)
        {
            Graph graph;
            int   i = CreateGraphFromDotFile(inputFile, out graph);

            graph.Attr.LayerDirection = GetLayerDirection();

            if (i != 0)
            {
                return(i);
            }
            if (argsParser.OptionIsUsed("-nolayout") && GeometryIsPresent(graph))
            {
                double nodeScale;
                bool   scaling = argsParser.GetDoubleOptionValue("-scaleNodesBy", out nodeScale);
                if (scaling)
                {
                    foreach (var node in graph.GeometryGraph.Nodes)
                    {
                        node.BoundaryCurve = node.BoundaryCurve.Transform(PlaneTransformation.ScaleAroundCenterTransformation(nodeScale,
                                                                                                                              node.Center));
                    }
                    graph.GeometryGraph.UpdateBoundingBox();
                }
                double nodeLineWidth;
                if (argsParser.GetDoubleOptionValue("-nblw", out nodeLineWidth))
                {
                    foreach (var node in graph.Nodes)
                    {
                        node.Attr.LineWidth = nodeLineWidth;
                    }
                    graph.GeometryGraph.UpdateBoundingBox();
                }
            }
            else
            {
                PrepareForOutput(graph);
            }

            var    outputFile = Path.ChangeExtension(inputFile, ".svg");
            string outputDir  = argsParser.GetStringOptionValue(OutputDirOption);

            if (outputDir != null)
            {
                var name = Path.GetFileName(outputFile);
                if (name != null)
                {
                    outputFile = Path.Combine(outputDir, name);
                }
            }


            SetConsolasFontAndSize(graph, 11);
            if (argsParser.OptionIsUsed(NoLabelsOption))
            {
                RemoveLabelsFromGraph(graph);
            }
            using (var stream = File.Create(outputFile)) {
                var svgWriter = new SvgGraphWriter(stream, graph)
                {
                    BlackAndWhite     = argsParser.OptionIsUsed("-bw"),
                    NodeSanitizer     = AntiXss.HtmlAttributeEncode,
                    AttrSanitizer     = AntiXss.HtmlAttributeEncode,
                    Precision         = precision,
                    AllowedToWriteUri = !argsParser.OptionIsUsed(NoUrls),
                    IgnoreEdges       = argsParser.OptionIsUsed("-noedges")
                };
                svgWriter.Write();
                DumpFileToConsole(outputFile);
            }

            if (msaglOutput)
            {
                outputFile = SetMsaglOutputFileName(inputFile);
                var geomGraph = graph.GeometryGraph;
                WriteGeomGraph(outputFile, geomGraph);
            }
            return(0);
        }
Esempio n. 13
0
 ///<summary>
 ///</summary>
 ///<param name="transformation"></param>
 public void Transform(PlaneTransformation transformation)
 {
     BoundaryCurve = BoundaryCurve.Transform(transformation);
 }
Esempio n. 14
0
        private void Graph_GraphLayoutStarting(object sender, EventArgs e)
        {
            // I'd like to just call RemoveAllConstraints here, but it doesn't work.

            if (LayeredLayoutButton.IsChecked.Value)
            {
                Graph.Graph.LayoutAlgorithmSettings = new SugiyamaLayoutSettings();
                var settings = Graph.Graph.LayoutAlgorithmSettings as SugiyamaLayoutSettings;

                if (InitialNodesButton.IsChecked.Value && InitialNodes != null)
                {
                    // Declare all initial nodes to be above every other node.
                    foreach (DNode nc in InitialNodes)
                    {
                        foreach (DNode nc2 in Graph.Nodes().Where(ec => !InitialNodes.Contains(ec as DNode)))
                        {
                            settings.AddUpDownConstraint(nc.GeometryNode, nc2.GeometryNode);
                        }
                    }
                }

                if (AspectRatioButton.IsChecked.Value && GraphContainer.ActualHeight != 0.0 && GraphContainer.ActualWidth != 0.0)
                {
                    settings.AspectRatio = HorizontalLayoutButton.IsChecked.Value ? GraphContainer.ActualHeight / GraphContainer.ActualWidth : GraphContainer.ActualWidth / GraphContainer.ActualHeight;
                }

                if (HorizontalLayoutButton.IsChecked.Value)
                {
                    (Graph.Graph.LayoutAlgorithmSettings as SugiyamaLayoutSettings).Transformation = PlaneTransformation.Rotation(Math.PI / 2);
                }
                else
                {
                    (Graph.Graph.LayoutAlgorithmSettings as SugiyamaLayoutSettings).Transformation = PlaneTransformation.Rotation(Math.PI);
                }

                settings.EdgeRoutingSettings.EdgeRoutingMode = (EdgeRoutingMode)typeof(EdgeRoutingMode).GetField((EdgeRoutingComboBox.SelectedItem as ComboBoxItem).Tag.ToString()).GetValue(null);
                int separation = 5;
                Int32.TryParse(BundlingSeparationTextBox.Text, out separation);
                settings.EdgeRoutingSettings.BundlingSettings = new BundlingSettings()
                {
                    EdgeSeparation = separation
                };
            }
            else
            {
                Graph.Graph.LayoutAlgorithmSettings = new MdsLayoutSettings();
                var settings = Graph.Graph.LayoutAlgorithmSettings as MdsLayoutSettings;

                settings.ScaleX = 100.0;
                settings.ScaleY = 100.0;
            }
        }
Esempio n. 15
0
    public void GenerateTechs()
    {
        foreach (var instance in _ringInstances)
        {
            instance.ReturnToPool();
        }
        _ringInstances.Clear();

        foreach (var instance in _techInstances)
        {
            instance.ReturnToPool();
        }
        _techInstances.Clear();

        foreach (var instance in _linkInstances)
        {
            instance.ReturnToPool();
        }
        _linkInstances.Clear();

        foreach (var instance in _arrowInstances)
        {
            instance.ReturnToPool();
        }
        _arrowInstances.Clear();

        var graph = new GeometryGraph();

        var settings = new SugiyamaLayoutSettings();

        if (TestMode)
        {
            for (int i = 0; i < TechCount; i++)
            {
                var node = NewNode(i);
                graph.Nodes.Add(node);
                if (i > SeedTechs)
                {
                    graph.Edges.Add(new Edge(graph.Nodes[Random.Range(max(0, i - RollingWindowSize), i - 1)], node));
                }
            }
            foreach (var vertex in graph.Nodes.Where(v => !graph.Edges.Any(e => e.Source == v || e.Target == v)))
            {
                graph.Edges.Add(new Edge(vertex, graph.Nodes[Random.Range(0, TechCount - 1)]));
            }
        }
        else
        {
            var nodeMap = new Dictionary <BlueprintData, Node>();
            foreach (var blueprint in Blueprints)
            {
                var node = NewNode(blueprint);
                nodeMap[blueprint] = node;
                graph.Nodes.Add(node);
            }

            foreach (var targetBlueprint in Blueprints)
            {
                foreach (var sourceBlueprint in Blueprints.Where(sb =>
                                                                 targetBlueprint.Dependencies.Any(dep => sb.ID == dep)))
                {
                    var edge = new Edge(nodeMap[sourceBlueprint], nodeMap[targetBlueprint]);
                    graph.Edges.Add(edge);
                    var splitName = sourceBlueprint.Name.Split(' ');
                    if (splitName.Length > 1)
                    {
                        var nameStart = string.Join(" ", splitName.Take(splitName.Length - 1));
                        if (targetBlueprint.Name.StartsWith(nameStart))
                        {
                            edge.Weight *= 10;
                        }
                    }
                }
            }
        }

        settings.BrandesThreshold = 9999;

        var islands   = graph.GetClusteredConnectedComponents();
        var islandMap =
            graph.Nodes.ToDictionary(n => n, n => islands.Find(c => c.Nodes.Any(cn => cn.UserData == n)));

        if (TestMode)
        {
            foreach (var island in islands)
            {
                foreach (var node in island.Nodes)
                {
                    var region = GetRegion(island, node, DependencyAncestorDepth, DependencyDepth);
                    while (Random.value < MultipleDependencyProbability && region.Count > 0)
                    {
                        var dependency = region[Random.Range(0, region.Count)];
                        graph.Edges.Add(new Edge(dependency.UserData as Node, node.UserData as Node));
                        region.Remove(dependency);
                    }
                }
            }
        }

        var islandsBySize = islands.OrderByDescending(i => i.Nodes.Count);
        var largestIsland = islandsBySize.First();

        foreach (var island in islandsBySize.Skip(1))
        {
            settings.VerticalConstraints.SameLayerConstraints.Insert(new Tuple <Node, Node>(
                                                                         largestIsland.Nodes[Random.Range(0, largestIsland.Nodes.Count)].UserData as Node, island.Nodes[Random.Range(0, island.Nodes.Count)].UserData as Node));
        }

        settings.PackingMethod  = PackingMethod;
        settings.Transformation = PlaneTransformation.Rotation(PI);
        var layout = new LayeredLayout(graph, settings);

        layout.Run();

        var positions     = graph.Nodes.ToDictionary(n => n, n => (float2)n.Center);
        var islandCenters = islands.ToDictionary(i => i,
                                                 i => i.Nodes.Aggregate(float2(0, 0), (total, v) => total + positions[v.UserData as Node]) / i.Nodes.Count);

        Rect bounds = Rect.MinMaxRect(
            positions.Values.Min(v => v.x),
            positions.Values.Min(v => v.y),
            positions.Values.Max(v => v.x),
            positions.Values.Max(v => v.y));

        var tiers =
            Mathf.RoundToInt(graph.Nodes.Max(n => Rect.PointToNormalized(bounds, n.Center).y) /
                             graph.Nodes.Min(n =>
        {
            var normalized = Rect.PointToNormalized(bounds, n.Center);
            return(normalized.y > .001f ? normalized.y : 1);
        }));

        // var islandsBySize = islands.OrderByDescending(i => i.Nodes.Count);
        // var largestIsland = islandsBySize.First();
        // foreach(var island in islandsBySize.Skip(1))
        //     settings.AddSameLayerNeighbors(largestIsland.Nodes.RandomElement().UserData as Node, island.Nodes.RandomElement().UserData as Node);
        //
        // layout = new LayeredLayout(graph, settings);
        // layout.Run();

        positions     = graph.Nodes.ToDictionary(n => n, n => (float2)n.Center);
        islandCenters = islands.ToDictionary(i => i,
                                             i => i.Nodes.Aggregate(float2(0, 0), (total, v) => total + positions[v.UserData as Node]) / i.Nodes.Count);

        bounds = Rect.MinMaxRect(
            positions.Values.Min(v => v.x),
            positions.Values.Min(v => v.y),
            positions.Values.Max(v => v.x),
            positions.Values.Max(v => v.y));

        Debug.Log($"Generated {tiers} tiers of techs!");

        var islandColors = islandCenters.ToDictionary(
            i => i.Key,
            i => Color.HSVToRGB(lerp(HueMin, HueMax, Rect.PointToNormalized(bounds, i.Value).x), Saturation, Brightness));

        var islandFillMaterials = islandColors.ToDictionary(i => i.Key, i =>
        {
            var mat = new Material(TechFillMaterial);
            var col = i.Value;
            col.a   = FillOpacity;
            mat.SetColor("_TintColor", col);
            return(mat);
        });

        var islandGlowMaterials = islandColors.ToDictionary(i => i.Key, i =>
        {
            var mat = new Material(TechGlowMaterial);
            var col = i.Value;
            col.a   = GlowOpacity;
            mat.SetColor("_TintColor", col);
            return(mat);
        });

        var islandArrowMaterials = islandColors.ToDictionary(i => i.Key, i =>
        {
            var mat = new Material(TechArrowMaterial);
            var col = i.Value;
            col.a   = 1;
            mat.SetColor("_TintColor", col);
            return(mat);
        });

        var islandLinkMaterials = islandColors.ToDictionary(i => i.Key, i =>
        {
            var mat = new Material(TechLinkMaterial);
            var col = i.Value;
            col.a   = 1;
            mat.SetColor("_TintColor", col);
            return(mat);
        });

        if (Radial)
        {
            positions = positions.ToDictionary(
                kvp => kvp.Key,
                kvp =>
            {
                var normalized = Rect.PointToNormalized(bounds, kvp.Value);
                var rads       = normalized.x * (PI * 2 - PaddingRadians) + PaddingRadians / 2;
                return(float2(sin(rads), -cos(rads)) * ((normalized.y * tiers + StartTier + .5f) * LayerDistance) * Scale);
            });
        }
        else
        {
            positions = positions.ToDictionary(
                kvp => kvp.Key,
                kvp =>
            {
                var normalized = Rect.PointToNormalized(bounds, kvp.Value);
                return(float2(
                           normalized.x * LayerDistance * tiers * (bounds.width / bounds.height),
                           (normalized.y * tiers / 2 + StartTier + .5f) * LayerDistance));
            });
        }

        foreach (var vertex in graph.Nodes.Where(positions.ContainsKey))
        {
            var tech = Tech.Instantiate <TechNode>();
            tech.transform.position = (Vector2)positions[vertex];
            tech.Label.text         = $"{(TestMode ? ((int) vertex.UserData).ToString() : ((BlueprintData) vertex.UserData).ID.ToString().Substring(0,2))}";
            var gradient = tech.Label.colorGradient;
            gradient.bottomLeft      = gradient.bottomRight = islandColors[islandMap[vertex]];
            tech.Label.colorGradient = gradient;
            tech.Icon.material.SetTexture("_MainTex", _icons[Random.Range(0, _icons.Length - 1)]);
            tech.Fill.material = islandFillMaterials[islandMap[vertex]];
            tech.Glow.material = islandGlowMaterials[islandMap[vertex]];
            if (!TestMode)
            {
                tech.Fill.GetComponent <ClickableCollider>().OnClick += (collider, data) =>
                {
                    PropertiesPanel.Clear();
                    var blueprint = (BlueprintData)vertex.UserData;
                    PropertiesPanel.Title.text = blueprint.Name;
                    PropertiesPanel.AddProperty("Research Time", () => $"{blueprint.ResearchTime:0.##} MH");
                    PropertiesPanel.AddProperty("Produces", () => $"{Context.Cache.Get<ItemData>(blueprint.Item).Name}");
                    PropertiesPanel.AddProperty("Production Quality", () => $"{Mathf.RoundToInt(blueprint.Quality * 100)}%");
                    PropertiesPanel.AddProperty("Production Time", () => $"{blueprint.ProductionTime:0.##} MH");

                    var ingredientsList = PropertiesPanel.AddList("Ingredients");
                    foreach (var ingredient in blueprint.Ingredients)
                    {
                        var ingredientData = Context.Cache.Get <ItemData>(ingredient.Key);
                        ingredientsList.AddProperty(ingredientData.Name, () => ingredient.Value.ToString());
                    }
                    ingredientsList.SetExpanded(true, true);

                    var dependenciesList = PropertiesPanel.AddList("Dependencies");
                    foreach (var dependency in blueprint.Dependencies)
                    {
                        var dependencyBlueprint = Context.Cache.Get <BlueprintData>(dependency);
                        dependenciesList.AddProperty(dependencyBlueprint.Name);
                    }
                    dependenciesList.SetExpanded(true, true);

                    var descendantsList = PropertiesPanel.AddList("Descendants");
                    foreach (var descendant in Blueprints.Where(bp => bp.Dependencies.Any(dep => blueprint.ID == dep)))
                    {
                        descendantsList.AddProperty(descendant.Name);
                    }
                    descendantsList.SetExpanded(true, true);
                }
            }
            ;
            _techInstances.Add(tech.GetComponent <Prototype>());
        }

        foreach (var edge in graph.Edges)
        {
            var link = RadialLink.Instantiate <LineRenderer>();
            link.material      = islandLinkMaterials[islandMap[edge.Source]];
            link.positionCount = LinkPoints;
            var p1r      = length(positions[edge.Source]);
            var p2r      = length(positions[edge.Target]);
            var p1a      = (atan2(positions[edge.Source].y, positions[edge.Source].x) + PI * 2.5f) % (PI * 2);
            var p2a      = (atan2(positions[edge.Target].y, positions[edge.Target].x) + PI * 2.5f) % (PI * 2);
            var p1       = float2(sin(p1a) * p1r, -cos(p1a) * p1r);
            var p2       = float2(sin(p2a) * p2r, -cos(p2a) * p2r);
            var dist     = length(p2 - p1);
            var distProp = (dist - LinkTargetDistance) / dist;
            var dir      = new float2();
            var lastPos  = new float2();
            link.SetPositions(Enumerable.Range(0, LinkPoints).Select(i =>
            {
                var lerp   = (float)i / (LinkPoints - 1) * distProp;
                var angle  = math.lerp(p1a, p2a, (lerp));
                var radius = math.lerp(p1r, p2r, lerp);
                var pos    = Radial ? float2(sin(angle) * radius, -cos(angle) * radius) : math.lerp(positions[edge.Source], positions[edge.Target], lerp);
                dir        = normalize(pos - lastPos);
                lastPos    = pos;
                return((Vector3)float3(lastPos, LinkDepth));
            }).ToArray());
            _linkInstances.Add(link.GetComponent <Prototype>());

            var arrow = Arrow.Instantiate <TechArrow>();
            arrow.transform.position = new Vector3(lastPos.x, lastPos.y, ArrowDepth);
            arrow.transform.rotation = Quaternion.Euler(0, 0, atan2(dir.y, dir.x) * Mathf.Rad2Deg);
            arrow.Icon.material      = islandArrowMaterials[islandMap[edge.Source]];
            _arrowInstances.Add(arrow.GetComponent <Prototype>());
        }

        if (Radial)
        {
            for (int i = 1; i <= tiers; i++)
            {
                var ring          = Ring.Instantiate <LineRenderer>();
                var ringPositions = new Vector3[Sections];
                for (int s = 0; s < Sections; s++)
                {
                    var rads = ((float)s / (Sections - 1)) * (PI * 2 - PaddingRadians) + PaddingRadians / 2;
                    ringPositions[s]   = new Vector3(sin(rads), -cos(rads), 0) * ((i + StartTier) * (LayerDistance) * Scale);
                    ringPositions[s].z = RingDepth;
                }

                ring.positionCount = Sections;
                ring.SetPositions(ringPositions);
                var tierLerp = (float)i / (tiers - 1);
                ring.colorGradient = new Gradient
                {
                    alphaKeys = new [] { new GradientAlphaKey(1, 0), new GradientAlphaKey(1, 1) },
                    colorKeys = Enumerable.Range(0, RingColorKeys).Select(x =>
                    {
                        var ringLerp = (float)x / (RingColorKeys - 1);
                        return(new GradientColorKey(
                                   Color.HSVToRGB(HueMin + (HueMax - HueMin) * ringLerp,
                                                  lerp(RingInnerSaturation, RingOuterSaturation, tierLerp),
                                                  lerp(RingInnerBrightness, RingOuterBrightness, tierLerp)), ringLerp));
                    }).ToArray()
                };

                _ringInstances.Add(ring.GetComponent <Prototype>());
            }
        }
    }
}
Esempio n. 16
0
 private void SetRenderTransformWithoutRaisingEvents(PlaneTransformation value)
 {
     GraphCanvas.RenderTransform = new MatrixTransform(value[0, 0], value[0, 1], value[1, 0], value[1, 1],
                                                       value[0, 2],
                                                       value[1, 2]);
 }
Esempio n. 17
0
        void CreateAndLayoutAndDisplayGraph(object sender, ExecutedRoutedEventArgs ex)
        {
            try
            {
//                Graph graph = new Graph();
//
//                //graph.LayoutAlgorithmSettings=new MdsLayoutSettings();
//
//                graph.AddEdge("1", "2");
//                graph.AddEdge("1", "3");
//                var e = graph.AddEdge("4", "5");
//                e.LabelText = "Some edge label";
//                e.Attr.Color = Color.Red;
//                e.Attr.LineWidth *= 2;
//
//                graph.AddEdge("4", "6");
//                e = graph.AddEdge("7", "8");
//                e.Attr.LineWidth *= 2;
//                e.Attr.Color = Color.Red;
//
//                graph.AddEdge("7", "9");
//                e = graph.AddEdge("5", "7");
//                e.Attr.Color = Color.Red;
//                e.Attr.LineWidth *= 2;
//
//                graph.AddEdge("2", "7");
//                graph.AddEdge("10", "11");
//                graph.AddEdge("10", "12");
//                graph.AddEdge("2", "10");
//                graph.AddEdge("8", "10");
//                graph.AddEdge("5", "10");
//                graph.AddEdge("13", "14");
//                graph.AddEdge("13", "15");
//                graph.AddEdge("8", "13");
//                graph.AddEdge("2", "13");
//                graph.AddEdge("5", "13");
//                graph.AddEdge("16", "17");
//                graph.AddEdge("16", "18");
//                graph.AddEdge("16", "18");
//                graph.AddEdge("19", "20");
//                graph.AddEdge("19", "21");
//                graph.AddEdge("17", "19");
//                graph.AddEdge("2", "19");
//                graph.AddEdge("22", "23");
//
//                e = graph.AddEdge("22", "24");
//                e.Attr.Color = Color.Red;
//                e.Attr.LineWidth *= 2;
//
//                e = graph.AddEdge("8", "22");
//                e.Attr.Color = Color.Red;
//                e.Attr.LineWidth *= 2;
//
//                graph.AddEdge("20", "22");
//                graph.AddEdge("25", "26");
//                graph.AddEdge("25", "27");
//                graph.AddEdge("20", "25");
//                graph.AddEdge("28", "29");
//                graph.AddEdge("28", "30");
//                graph.AddEdge("31", "32");
//                graph.AddEdge("31", "33");
//                graph.AddEdge("5", "31");
//                graph.AddEdge("8", "31");
//                graph.AddEdge("2", "31");
//                graph.AddEdge("20", "31");
//                graph.AddEdge("17", "31");
//                graph.AddEdge("29", "31");
//                graph.AddEdge("34", "35");
//                graph.AddEdge("34", "36");
//                graph.AddEdge("20", "34");
//                graph.AddEdge("29", "34");
//                graph.AddEdge("5", "34");
//                graph.AddEdge("2", "34");
//                graph.AddEdge("8", "34");
//                graph.AddEdge("17", "34");
//                graph.AddEdge("37", "38");
//                graph.AddEdge("37", "39");
//                graph.AddEdge("29", "37");
//                graph.AddEdge("5", "37");
//                graph.AddEdge("20", "37");
//                graph.AddEdge("8", "37");
//                graph.AddEdge("2", "37");
//                graph.AddEdge("40", "41");
//                graph.AddEdge("40", "42");
//                graph.AddEdge("17", "40");
//                graph.AddEdge("2", "40");
//                graph.AddEdge("8", "40");
//                graph.AddEdge("5", "40");
//                graph.AddEdge("20", "40");
//                graph.AddEdge("29", "40");
//                graph.AddEdge("43", "44");
//                graph.AddEdge("43", "45");
//                graph.AddEdge("8", "43");
//                graph.AddEdge("2", "43");
//                graph.AddEdge("20", "43");
//                graph.AddEdge("17", "43");
//                graph.AddEdge("5", "43");
//                graph.AddEdge("29", "43");
//                graph.AddEdge("46", "47");
//                graph.AddEdge("46", "48");
//                graph.AddEdge("29", "46");
//                graph.AddEdge("5", "46");
//                graph.AddEdge("17", "46");
//                graph.AddEdge("49", "50");
//                graph.AddEdge("49", "51");
//                graph.AddEdge("5", "49");
//                graph.AddEdge("2", "49");
//                graph.AddEdge("52", "53");
//                graph.AddEdge("52", "54");
//                graph.AddEdge("17", "52");
//                graph.AddEdge("20", "52");
//                graph.AddEdge("2", "52");
//                graph.AddEdge("50", "52");
//                graph.AddEdge("55", "56");
//                graph.AddEdge("55", "57");
//                graph.AddEdge("58", "59");
//                graph.AddEdge("58", "60");
//                graph.AddEdge("20", "58");
//                graph.AddEdge("29", "58");
//                graph.AddEdge("5", "58");
//                graph.AddEdge("47", "58");
//
//                var subgraph = new Subgraph("subgraph 1");
//                graph.RootSubgraph.AddSubgraph(subgraph);
//                subgraph.AddNode(graph.FindNode("47"));
//                subgraph.AddNode(graph.FindNode("58"));
//
//                graph.AddEdge(subgraph.Id, "55");
//
//                var node = graph.FindNode("5");
//                node.LabelText = "Label of node 5";
//                node.Label.FontSize = 5;
//                node.Label.FontName = "New Courier";
//                node.Label.FontColor = Microsoft.Msagl.Drawing.Color.Blue;
//
//                node = graph.FindNode("55");
//
//
//                graph.Attr.LayerDirection= LayerDirection.LR;
//             //   graph.LayoutAlgorithmSettings.EdgeRoutingSettings.RouteMultiEdgesAsBundles = true;
//                //graph.LayoutAlgorithmSettings.EdgeRoutingSettings.EdgeRoutingMode = EdgeRoutingMode.SplineBundling;
//                //layout the graph and draw it
                Graph graph = new Graph();
                graph.AddEdge("47", "58");
                graph.AddEdge("70", "71");



                var subgraph = new Subgraph("subgraph1");
                subgraph.Label.Text = "Outer";
                graph.RootSubgraph.AddSubgraph(subgraph);
                subgraph.AddNode(graph.FindNode("47"));
                subgraph.AddNode(graph.FindNode("58"));

                var subgraph2 = new Subgraph("subgraph2");
                subgraph2.Label.Text              = "Inner";
                subgraph2.Attr.Color              = Color.Black;
                subgraph2.Attr.FillColor          = Color.Yellow;
                subgraph2.Attr.ClusterLabelMargin = LabelPlacement.Bottom;
                subgraph2.AddNode(graph.FindNode("70"));
                subgraph2.AddNode(graph.FindNode("71"));
                subgraph.AddSubgraph(subgraph2);
                graph.AddEdge("58", subgraph2.Id);

                graph.Attr.LayerDirection = LayerDirection.LR;
                //graph.LayoutAlgorithmSettings.EdgeRoutingSettings.EdgeRoutingMode = EdgeRoutingMode.Rectilinear;

                var global = (SugiyamaLayoutSettings)graph.LayoutAlgorithmSettings;
                var local  = (SugiyamaLayoutSettings)global.Clone();
                local.Transformation     = PlaneTransformation.Rotation(-Math.PI / 2);
                subgraph2.LayoutSettings = local;   // for Collapsing\Expanding
                global.ClusterSettings.Add(subgraph2, local);

                graphViewer.Graph = graph;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString(), "Load Failed", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
Esempio n. 18
0
        void CreateGraphClustersBig(bool horizontal)
        {
            Graph graph = new Graph("clusters big");

            void addCluster(string clusterId, params string[] nodeIds)
            {
                if (nodeIds.Length == 0)
                {
                    nodeIds = new string[] { clusterId }
                }
                ;
                var cluster = new Subgraph(clusterId);

                foreach (var nodeId in nodeIds)
                {
                    var node = new Node(clusterId + "." + nodeId);
                    node.LabelText = nodeId;
                    graph.AddNode(node);
                    cluster.AddNode(node);
                }
                if (horizontal)
                {
                    cluster.Attr.ClusterLabelMargin = Microsoft.Msagl.Core.Layout.LgNodeInfo.LabelPlacement.Right;
                }
                graph.RootSubgraph.AddSubgraph(cluster);
            }

            addCluster("Arabinose");
            addCluster("Arabinose_control");
            addCluster("Arabinose_growth");
            addCluster("Auto");
            addCluster("Auto_control");
            addCluster("Auto_growth");
            addCluster("Degrader");
            addCluster("Degrader_control");
            addCluster("Degrader_growth");
            addCluster("Receivers", "Receiver0", "Receiver1", "Receiver2", "Receiver3");
            addCluster("Receivers_control", "Receiver0_control", "Receiver1_control", "Receiver2_control", "Receiver3_control");
            addCluster("Receivers_growth", "Receiver0_growth", "Receiver1_growth", "Receiver2_growth", "Receiver3_growth");
            addCluster("Relays", "Relay1", "Relay2");
            addCluster("Relays_control", "Relay1_control", "Relay2_control");
            addCluster("Relays_growth", "Relay1_growth", "Relay2_growth");
            addCluster("Standard");
            addCluster("Standard_control");
            addCluster("Standard_growth");

            void addEdge(string sourceCluster, string sourceNode, string targetCluster, string targetNode)
            {
                graph.AddEdge(sourceNode == null ? sourceCluster : (sourceCluster + "." + sourceNode), targetNode == null ? targetCluster : (targetCluster + "." + targetNode));
            }

            addEdge("Arabinose", "Arabinose", "Degrader", "Degrader");
            addEdge("Arabinose_control", "Arabinose_control", "Arabinose", "Arabinose");
            addEdge("Arabinose_control", "Arabinose_control", "Degrader_control", "Degrader_control");
            addEdge("Arabinose_growth", "Arabinose_growth", "Arabinose_control", "Arabinose_control");
            addEdge("Auto", null, "Standard", null);
            addEdge("Auto_control", "Auto_control", "Auto", "Auto");
            addEdge("Auto_control", null, "Standard_control", null);
            addEdge("Auto_growth", "Auto_growth", "Auto_control", "Auto_control");
            addEdge("Degrader_control", "Degrader_control", "Degrader", "Degrader");
            addEdge("Degrader_growth", "Degrader_growth", "Degrader_control", "Degrader_control");
            addEdge("Receivers", null, "Relays", null);
            addEdge("Receivers_control", null, "Relays_control", null);
            addEdge("Receivers_control", "Receiver0_control", "Receivers", "Receiver0");
            addEdge("Receivers_control", "Receiver1_control", "Receivers", "Receiver1");
            addEdge("Receivers_control", "Receiver2_control", "Receivers", "Receiver2");
            addEdge("Receivers_control", "Receiver3_control", "Receivers", "Receiver3");
            addEdge("Receivers_growth", "Receiver0_growth", "Receivers_control", "Receiver0_control");
            addEdge("Receivers_growth", "Receiver1_growth", "Receivers_control", "Receiver1_control");
            addEdge("Receivers_growth", "Receiver2_growth", "Receivers_control", "Receiver2_control");
            addEdge("Receivers_growth", "Receiver3_growth", "Receivers_control", "Receiver3_control");
            addEdge("Relays", null, "Degrader", null);
            addEdge("Relays_control", "Relay1_control", "Relays", "Relay1");
            addEdge("Relays_control", "Relay2_control", "Relays", "Relay2");
            addEdge("Relays_growth", "Relay1_growth", "Relays_control", "Relay1_control");
            addEdge("Relays_growth", "Relay2_growth", "Relays_control", "Relay2_control");
            addEdge("Standard", null, "Receivers", null);
            addEdge("Standard_control", null, "Receivers_control", null);
            addEdge("Standard_control", "Standard_control", "Standard", "Standard");
            addEdge("Standard_growth", "Standard_growth", "Standard_control", "Standard_control");

            if (horizontal)
            {
                (graph.LayoutAlgorithmSettings as SugiyamaLayoutSettings).Transformation = PlaneTransformation.Rotation(Math.PI / 2.0);
            }
            gViewer.Graph = graph;
            this.propertyGrid1.SelectedObject = graph;
        }

        void CreateGraph()
        {
#if TEST_MSAGL
            DisplayGeometryGraph.SetShowFunctions();
#endif
            //Graph graph = new Graph();
            //graph.AddEdge("47", "58");
            //graph.AddEdge("70", "71");



            //var subgraph = new Subgraph("subgraph1");
            //graph.RootSubgraph.AddSubgraph(subgraph);
            //subgraph.AddNode(graph.FindNode("47"));
            //subgraph.AddNode(graph.FindNode("58"));

            //var subgraph2 = new Subgraph("subgraph2");
            //subgraph2.Attr.Color = Color.Black;
            //subgraph2.Attr.FillColor = Color.Yellow;
            //subgraph2.AddNode(graph.FindNode("70"));
            //subgraph2.AddNode(graph.FindNode("71"));
            //subgraph.AddSubgraph(subgraph2);
            //graph.AddEdge("58", subgraph2.Id);
            //graph.Attr.LayerDirection = LayerDirection.LR;
            //gViewer.Graph = graph;
            Graph graph = new Graph("graph");
            //graph.LayoutAlgorithmSettings=new MdsLayoutSettings();
            gViewer.BackColor = System.Drawing.Color.FromArgb(10, System.Drawing.Color.Red);

            /*
             * 4->5
             * 5->7
             * 7->8
             * 8->22
             * 22->24
             */

            graph.AddEdge("1", "2");
            graph.AddEdge("1", "3");
            var e = graph.AddEdge("4", "5");
            e.Attr.Color      = Color.Red;
            e.Attr.LineWidth *= 2;
            graph.LayerConstraints.AddUpDownVerticalConstraint(graph.FindNode("4"), graph.FindNode("5"));
            StraightenEdge(e, graph);
            e                  = graph.AddEdge("4", "6");
            e.LabelText        = "Changing label";
            this.labelToChange = e.Label;
            e                  = graph.AddEdge("7", "8");
            e.Attr.LineWidth  *= 2;
            e.Attr.Color       = Color.Red;
            StraightenEdge(e, graph);
            graph.AddEdge("7", "9");
            e                 = graph.AddEdge("5", "7");
            e.Attr.Color      = Color.Red;
            e.Attr.LineWidth *= 2;
            StraightenEdge(e, graph);

            graph.AddEdge("2", "7");
            graph.AddEdge("10", "11");
            graph.AddEdge("10", "12");
            graph.AddEdge("2", "10");
            graph.AddEdge("8", "10");
            graph.AddEdge("5", "10");
            graph.AddEdge("13", "14");
            graph.AddEdge("13", "15");
            graph.AddEdge("8", "13");
            graph.AddEdge("2", "13");
            graph.AddEdge("5", "13");
            graph.AddEdge("16", "17");
            graph.AddEdge("16", "18");
            graph.AddEdge("19", "20");
            graph.AddEdge("19", "21");
            graph.AddEdge("17", "19");
            graph.AddEdge("2", "19");
            graph.AddEdge("22", "23");

            e                 = graph.AddEdge("22", "24");
            e.Attr.Color      = Color.Red;
            e.Attr.LineWidth *= 2;
            StraightenEdge(e, graph);

            e                 = graph.AddEdge("8", "22");
            e.Attr.Color      = Color.Red;
            e.Attr.LineWidth *= 2;
            StraightenEdge(e, graph);
            graph.AddEdge("20", "22");
            graph.AddEdge("25", "26");
            graph.AddEdge("25", "27");
            graph.AddEdge("20", "25");
            graph.AddEdge("28", "29");
            graph.AddEdge("28", "30");
            graph.AddEdge("31", "32");
            graph.AddEdge("31", "33");
            graph.AddEdge("5", "31");
            graph.AddEdge("8", "31");
            graph.AddEdge("2", "31");
            graph.AddEdge("20", "31");
            graph.AddEdge("17", "31");
            graph.AddEdge("29", "31");
            graph.AddEdge("34", "35");
            graph.AddEdge("34", "36");
            graph.AddEdge("20", "34");
            graph.AddEdge("29", "34");
            graph.AddEdge("5", "34");
            graph.AddEdge("2", "34");
            graph.AddEdge("8", "34");
            graph.AddEdge("17", "34");
            graph.AddEdge("37", "38");
            graph.AddEdge("37", "39");
            graph.AddEdge("29", "37");
            graph.AddEdge("5", "37");
            graph.AddEdge("20", "37");
            graph.AddEdge("8", "37");
            graph.AddEdge("2", "37");
            graph.AddEdge("40", "41");
            graph.AddEdge("40", "42");
            graph.AddEdge("17", "40");
            graph.AddEdge("2", "40");
            graph.AddEdge("8", "40");
            graph.AddEdge("5", "40");
            graph.AddEdge("20", "40");
            graph.AddEdge("29", "40");
            graph.AddEdge("43", "44");
            graph.AddEdge("43", "45");
            graph.AddEdge("8", "43");
            graph.AddEdge("2", "43");
            graph.AddEdge("20", "43");
            graph.AddEdge("17", "43");
            graph.AddEdge("5", "43");
            graph.AddEdge("29", "43");
            graph.AddEdge("46", "47");
            graph.AddEdge("46", "48");
            graph.AddEdge("29", "46");
            graph.AddEdge("5", "46");
            graph.AddEdge("17", "46");
            graph.AddEdge("49", "50");
            graph.AddEdge("49", "51");
            graph.AddEdge("5", "49");
            graph.AddEdge("2", "49");
            graph.AddEdge("52", "53");
            graph.AddEdge("52", "54");
            graph.AddEdge("17", "52");
            graph.AddEdge("20", "52");
            graph.AddEdge("2", "52");
            graph.AddEdge("50", "52");
            graph.AddEdge("55", "56");
            graph.AddEdge("55", "57");
            graph.AddEdge("58", "59");
            graph.AddEdge("58", "60");
            graph.AddEdge("20", "58");
            graph.AddEdge("29", "58");
            graph.AddEdge("5", "58");
            graph.AddEdge("47", "58");

            //ChangeNodeSizes(graph);

            //var sls = graph.LayoutAlgorithmSettings as SugiyamaLayoutSettings;
            //if (sls != null)
            //{
            //    sls.GridSizeByX = 30;
            //    // sls.GridSizeByY = 0;
            //}
            //layout the graph and draw it
            gViewer.Graph = graph;
            this.propertyGrid1.SelectedObject = graph;
        }
        public void Invalidate()
        {
            if (!Node.IsVisible)
            {
                foreach (var fe in FrameworkElements)
                {
                    fe.Visibility = Visibility.Hidden;
                }
                return;
            }

            if (BoundaryCurveIsDirty)
            {
                BoundaryPath.Data    = CreatePathFromNodeBoundary();
                BoundaryCurveIsDirty = false;
            }

            if (LgNodeInfo != null)
            {
                double scale = 1; // LgNodeInfo != null && LgNodeInfo.Kind == LgNodeInfoKind.Satellite
                                  // ? LgNodeInfo.Scale
                                  // : 1;
                var planeTransform = PlaneTransformation.ScaleAroundCenterTransformation(scale,
                                                                                         node.BoundingBox.Center);
                var transform = new MatrixTransform(planeTransform[0, 0], planeTransform[0, 1],
                                                    planeTransform[1, 0], planeTransform[1, 1],
                                                    planeTransform[0, 2], planeTransform[1, 2]);
                BoundaryPath.RenderTransform = transform;

                if (FrameworkElementOfNodeForLabel != null)
                {
                    Common.PositionFrameworkElement(FrameworkElementOfNodeForLabel, node.GeometryNode.Center,
                                                    scale);
                }
            }
            else
            {
                Common.PositionFrameworkElement(FrameworkElementOfNodeForLabel, Node.BoundingBox.Center, 1);
            }


            SetFillAndStroke();
            if (subgraph == null)
            {
                return;
            }
            PositionTopMarginBorder((Cluster)subgraph.GeometryNode);
            double collapseBorderSize   = GetCollapseBorderSymbolSize();
            var    collapseButtonCenter = GetCollapseButtonCenter(collapseBorderSize);

            Common.PositionFrameworkElement(collapseButtonBorder, collapseButtonCenter, 1);
            double w = collapseBorderSize * 0.4;

            collapseSymbolPath.Data            = CreateCollapseSymbolPath(collapseButtonCenter + new Point(0, -w / 2), w);
            collapseSymbolPath.RenderTransform = ((Cluster)subgraph.GeometryNode).IsCollapsed
                                                     ? new RotateTransform(180, collapseButtonCenter.X,
                                                                           collapseButtonCenter.Y)
                                                     : null;

            topMarginRect.Visibility                =
                collapseSymbolPath.Visibility       =
                    collapseButtonBorder.Visibility = Visibility.Visible;
        }
Esempio n. 20
0
        static ICurve ScaledCurve(double s, ICurve curve)
        {
            PlaneTransformation t = new PlaneTransformation(s, 0, 0, 0, s, 0);

            return(curve.Transform(t));
        }
Esempio n. 21
0
        /// <summary>
        /// flips the y-coordinate
        /// </summary>
        public void TransformGraphByFlippingY()
        {
            var matrix = new PlaneTransformation(1, 0, 0, 0, -1, 0);

            _graph.GeometryGraph.Transform(matrix);
        }
Esempio n. 22
0
        public static SmoothedPolyline SmoothedPolylineTransform(SmoothedPolyline smoothedPolyline, PlaneTransformation m)
        {
            //GPoint delta = new GPoint(deltaVec.X, deltaVec.Y);
            SmoothedPolyline sm = smoothedPolyline.Clone();

            //PlaneTransformation pt = new PlaneTransformation(m.M11, m.M12,m.OffsetX,m.M21, m.M22, m.OffsetY);
            for (Microsoft.Msagl.Core.Geometry.Site s = sm.HeadSite, s0 = sm.HeadSite;
                 s != null;
                 s = s.Next, s0 = s0.Next)
            {
                s.Point = m * s0.Point;
            }
            return(sm);
        }