Exemplo n.º 1
1
        private void RebuildGraph()
        {
            // Clear prev Graph
            this.node_map.Clear();
            this.in_edge_map.Clear();
            this.out_edge_map.Clear();
            this.Graph.Nodes.Clear();
            this.Graph.Edges.Clear();

            // Build new Graph
            if( this.grammar == null || this.canonical_sets == null )
                return;

            // Make the layout with the Glee lib
            var layout_g = new Microsoft.Glee.Drawing.Graph("Fdsm");
            layout_g.Directed = true;
            var layout_nodes = new Dictionary<Node, Microsoft.Glee.Drawing.Node>();
            var layout_edges = new Dictionary<Edge, Microsoft.Glee.Drawing.Edge>();

            // Create nodes
            for( int state_index = 0; state_index < this.canonical_sets.Sets.Count; ++state_index )
            {
                var node = new Node();
                node.Shape = NodeShape.Circle;
                node.Box = new RectangleF(this.node_diameter / -2, this.node_diameter / -2, this.node_diameter, this.node_diameter);
                node.BorderType = (this.canonical_sets.Sets[state_index].FirstOrDefault(
                    item => item.CursorPosition == item.Rule.RightHandSide.Count) == null)
                        ? NodeBorderType.Single
                        : NodeBorderType.Double;
                node.LabelText = state_index.ToString();
                node.LabelFont = this.Font;
                var label_size = this.Graph.MeasureString(this.Font, node.LabelText);
                node.LabelOffset = new PointF(label_size.Width / -2, label_size.Height / -2);
                node.BorderPen = this.border_pen;
                node.BackBrush = this.back_brush;
                node.LabelBrush = this.label_brush;

                this.Graph.Nodes.Add(node);
                this.node_map.Add(state_index, node);
                this.in_edge_map.Add(state_index, new Dictionary<SyntacticAnalysis.Symbol, Edge>());
                this.out_edge_map.Add(state_index, new Dictionary<SyntacticAnalysis.Symbol, Edge>());

                // Layout
                var layout_node = layout_g.AddNode(node.LabelText);
                layout_node.Attr.LabelMargin = 6;
                layout_nodes.Add(node, layout_node);
            }

            // Create edges
            for( int state_index = 0; state_index < this.canonical_sets.Sets.Count; ++state_index )
            {
                // Terminals
                foreach( var symbol in this.grammar.Terminals )
                {
                    int transition_to = this.canonical_sets.GetTransition(state_index, symbol);
                    if( transition_to != -1 )
                    {
                        var edge = new Edge();
                        edge.StartNode = this.node_map[state_index];
                        edge.EndNode = this.node_map[transition_to];
                        edge.LabelText = symbol.Name;
                        edge.LabelFont = this.Font;
                        edge.LabelBrush = this.label_brush;
                        edge.LinePen = this.edge_pen;

                        this.Graph.Edges.Add(edge);
                        this.out_edge_map[state_index][symbol] = edge;
                        this.in_edge_map[transition_to][symbol] = edge;

                        // Layout
                        var layout_edge = layout_g.AddEdge(edge.StartNode.LabelText, edge.EndNode.LabelText);
                        layout_edge.Attr.Label = edge.LabelText;
                        layout_edges.Add(edge, layout_edge);
                    }
                }

                // Grammaticals
                foreach( var symbol in this.grammar.Grammaticals )
                {
                    int transition_to = this.canonical_sets.GetTransition(state_index, symbol);
                    if( transition_to != -1 )
                    {
                        var edge = new Edge();
                        edge.StartNode = this.node_map[state_index];
                        edge.EndNode = this.node_map[transition_to];
                        edge.LabelText = symbol.Name;
                        edge.LabelFont = this.Font;
                        edge.LabelBrush = this.label_brush;
                        edge.LinePen = this.edge_pen;

                        this.Graph.Edges.Add(edge);
                        this.out_edge_map[state_index][symbol] = edge;
                        this.in_edge_map[transition_to][symbol] = edge;

                        // Layout
                        var layout_edge = layout_g.AddEdge(edge.StartNode.LabelText, edge.EndNode.LabelText);
                        layout_edge.Attr.Label = edge.LabelText;
                        layout_edges.Add(edge, layout_edge);
                    }
                }
            }

            // Let Glee calculate a layout
            var layout_rnd = new Microsoft.Glee.GraphViewerGdi.GraphRenderer(layout_g);
            layout_rnd.CalculateLayout();

            // Extract and replicate layout
            // Nodes
            foreach( var kv in layout_nodes )
                kv.Key.Position = this.FromGleePoint(kv.Value.Attr.Pos);

            // Edges
            foreach( var kv in layout_edges )
            {
                var edge = kv.Key;
                var layout_edge = kv.Value;

                var curve = layout_edge.Attr.EdgeCurve as Microsoft.Glee.Splines.Curve;
                if( curve != null )
                {
                    var segments = new List<CurveSegment>();

                    foreach( Microsoft.Glee.Splines.ICurve segment in curve.Segs )
                    {
                        if( segment is Microsoft.Glee.Splines.CubicBezierSeg )
                        {
                            var b = (Microsoft.Glee.Splines.CubicBezierSeg)segment;

                            segments.Add(new CurveSegment(new PointF[]
                                {
                                    this.FromGleePoint(b.B(0)),
                                    this.FromGleePoint(b.B(1)),
                                    this.FromGleePoint(b.B(2)),
                                    this.FromGleePoint(b.B(3)),
                                }));
                        }
                        else // Fallback to linearity, even if it is not a LineSeg.
                        {
                            segments.Add(new CurveSegment(new PointF[]
                                {
                                    this.FromGleePoint(segment.Start),
                                    this.FromGleePoint(segment.End),
                                }));
                        }
                    }

                    // Snap edge ends to nodes
                    var e = new PointF(
                        edge.StartNode.Position.X - segments[0].Points[0].X,
                        edge.StartNode.Position.Y - segments[0].Points[0].Y);
                    var diff = e.Norm().Multiply(e.Length() - this.node_radius);
                    edge.StartPosition = segments[0].Points[0] = segments[0].Points[0].Add(diff);

                    var seg = segments[segments.Count - 1];
                    e = new PointF(
                        edge.EndNode.Position.X - seg.Points[seg.Points.Length - 1].X,
                        edge.EndNode.Position.Y - seg.Points[seg.Points.Length - 1].Y);
                    diff = e.Norm().Multiply(e.Length() - this.node_radius);
                    edge.EndPosition = seg.Points[seg.Points.Length - 1] =
                        seg.Points[seg.Points.Length - 1].Add(diff);

                    edge.Segments = segments.ToArray();
                }
                else
                {
                    // Fallback to line
                    edge.StartPosition = edge.StartNode.Position;
                    edge.EndPosition = edge.EndNode.Position;

                    // Snap edge ends to nodes
                    var e = new PointF(
                        edge.EndPosition.X - edge.StartPosition.X,
                        edge.EndPosition.Y - edge.StartPosition.Y)
                        .Norm().Multiply(this.node_radius);

                    edge.StartPosition = edge.StartPosition.Add(e);
                    edge.EndPosition = edge.EndPosition.Substract(e);
                }

                // Label
                edge.LabelPosition = new PointF(
                    -(float)layout_edge.Attr.LabelTop,
                    (float)layout_edge.Attr.LabelLeft);
            }

            // Add an 'in-edge' to the start state node
            var start_edge = new Edge();
            start_edge.LinePen = this.edge_pen;
            start_edge.EndNode = this.node_map[0];
            start_edge.EndPosition = new PointF(
                start_edge.EndNode.Position.X - this.node_radius,
                start_edge.EndNode.Position.Y);
            start_edge.StartPosition = new PointF(
                start_edge.EndPosition.X - this.node_diameter,
                start_edge.EndPosition.Y);

            this.Graph.Edges.Add(start_edge);
        }
Exemplo n.º 2
0
    public void GambarPeta()
    //Method menggabarkan peta penyebaran atribut graf pada form baru
    {
        System.Windows.Forms.Form             peta = new System.Windows.Forms.Form();
        Microsoft.Glee.GraphViewerGdi.GViewer view = new Microsoft.Glee.GraphViewerGdi.GViewer();
        Microsoft.Glee.Drawing.Graph          map  = new Microsoft.Glee.Drawing.Graph("Peta Penyebaran Virus");

        Dictionary <string, Graph> .KeyCollection keys = this.graf.Keys;
        foreach (string node1 in keys)
        {
            if (graf[node1].GetNEdge() == 0)
            {
                map.AddNode(node1);
            }
            else
            {
                foreach (string node2 in graf[node1].GetEdge())
                {
                    map.AddEdge(node1, node2);
                }
                if (graf[node1].GetDayInf() != -1)
                {
                    Microsoft.Glee.Drawing.Node temp = map.FindNode(node1);
                    temp.Attr.Fillcolor = Microsoft.Glee.Drawing.Color.Red;
                }
            }
        }

        //bind the graph to the viewer
        view.Graph = map;

        //associate the viewer with the form
        peta.SuspendLayout();
        view.Dock = System.Windows.Forms.DockStyle.Fill;
        peta.Controls.Add(view);
        peta.ResumeLayout();
        peta.Text          = "Peta Penyebaran Virus";
        peta.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;

        //show the form
        peta.ShowDialog();
    }
Exemplo n.º 3
0
        public FormGanttChart()
        {
            InitializeComponent();

            /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
             *                          GANTT CHART                                      *
             * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
            chart.ChartAreas[0].AxisY.IntervalType = DateTimeIntervalType.Days;
            //chart.ChartAreas[0].AxisY.Interval = 1;

            // Get each task start date and finish date
            HashSet<Node> Nodes = Program.formMain.GetNodes();
            int maxEmployees = 0;
            // While there are uncomlited tasks
            DateTime currentDate = Program.formMain.dateTimePicker.Value;
            for (; Nodes.Any(new Func<Node, bool>(delegate(Node node) { return node.Days > 0; })); currentDate = currentDate.AddDays(1))
            {
                // Start unstarted tasks that have all dependencies complited
                foreach (Node node in Nodes)
                    if (!node.HasStarted && node.Dependencies.All(new Func<Node, bool>(delegate(Node dependency) { return dependency.Days == 0; })))
                    {
                        node.HasStarted = true;
                        node.StartDate = currentDate;
                    }

                // Decrese days of uncomplited started tasks and finish them if current day was last
                if (Program.formMain.checkboxes[(int)currentDate.DayOfWeek].Checked)
                {
                    // Count of employees required at current day
                    int employ = 0;
                    foreach (Node node in Nodes)
                        if (node.HasStarted && node.Days > 0)
                        {
                            employ++;
                            if (--node.Days == 0)
                                node.FinishDate = currentDate;
                        }
                    // Check for loops
                    if (employ == 0) throw new Exception("Loop detected");
                    // Check if max emloyees required at current day
                    if (employ > maxEmployees) maxEmployees = employ;
                }
            }
            employees.Text = maxEmployees.ToString();
            deadline.Text = currentDate.ToLongDateString();
            period.Text = (currentDate - Program.formMain.dateTimePicker.Value).Days.ToString() + " days";

            // Set Y axis maximum an minimum dates
            chart.ChartAreas[0].AxisY.Minimum = Program.formMain.dateTimePicker.Value.AddDays(-1).ToOADate();
            chart.ChartAreas[0].AxisY.Maximum = currentDate.ToOADate();

            // Add DataPoints to chart
            for (int i = 0; i < Nodes.Count(); i++)
            {
                Node node = Nodes.ElementAt(i);
                chart.Series[0].Points.AddXY(i, node.StartDate, node.FinishDate.AddDays(1));
                chart.Series[0].Points[i].Label = chart.Series[0].Points[i].AxisLabel = node.ID;
                chart.Series[0].Points[i].ToolTip = node.StartDate.ToShortDateString() + " - " + node.FinishDate.ToShortDateString();
            }

            /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
             * Program Evaluation and Review Technique                                   *
             * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
            // Get union of all nodes dependencies
            List<Node> allDependencies = new List<Node>();
            // List of checkpoints
            List<Checkpoint> checkpoints = new List<Checkpoint>();
            for (int i = 0, m = 0; i < Nodes.Count; i++)
            {
                Node node = Nodes.ElementAt(i);
                allDependencies.AddRange(node.Dependencies);
                if (node.checkpoint == null)
                {
                    // Set checkpoint to node
                    Checkpoint checkpoint = new Checkpoint();
                    checkpoint.ID = (checkpoint.Dependencies = node.Dependencies).Count == 0 ? "Start" : Checkpoint.template + m++.ToString();
                    node.checkpoint = checkpoint;
                    // Check other nodes for same dependencies
                    for (int j = i + 1; j < Nodes.Count; j++)
                    {
                        Node otherNode = Nodes.ElementAt(j);
                        if (otherNode.Dependencies.SetEquals(node.Dependencies))
                            otherNode.checkpoint = checkpoint;
                    }
                    checkpoints.Add(checkpoint);
                }
            }

            // Create finish checkpoint
            Checkpoint finish = new Checkpoint();
            finish.ID = "Finish";
            finish.Dependencies = new HashSet<Node>(Nodes.Except(allDependencies));
            checkpoints.Add(finish);

            // Get critical way
            List<object> critical = new List<object>();
            critical.Add(finish);
            for (Checkpoint checkpoint = finish; checkpoint.Dependencies.Count > 0; )
            {
                DateTime latestDate = checkpoint.Dependencies.Max(new Func<Node, DateTime>(delegate(Node node) { return node.FinishDate; }));
                Node latestNode = checkpoint.Dependencies.First(new Func<Node, bool>(delegate(Node next) { return next.FinishDate == latestDate; }));
                critical.Add(checkpoint = latestNode.checkpoint);
                critical.Add(latestNode);
            }

            // Create graph
            Microsoft.Glee.Drawing.Graph graph = new Microsoft.Glee.Drawing.Graph("PERT");
            // Add nodes
            foreach (Node node in Nodes)
            {
                graph.AddNode(node.ID);
                graph.FindNode(node.ID).Attr.Fillcolor = Microsoft.Glee.Drawing.Color.Azure;
            }
            // Add checkpoints
            foreach (Checkpoint checkpoint in checkpoints)
            {
                graph.AddNode(checkpoint.ID);
                Microsoft.Glee.Drawing.Node graphNode = graph.FindNode(checkpoint.ID);
                graphNode.Attr.Fillcolor = Microsoft.Glee.Drawing.Color.MistyRose;
                graphNode.Attr.Shape = Microsoft.Glee.Drawing.Shape.Diamond;
            }
            // Connect each node to its dependency checkpoint
            foreach (Node node in Nodes)
            {
                Microsoft.Glee.Drawing.Edge edge = new Microsoft.Glee.Drawing.Edge(node.checkpoint.ID, null, node.ID);
                if (critical.Contains(node))
                    edge.Attr.Color = Microsoft.Glee.Drawing.Color.Red;
                graph.Edges.Add(edge);
            }
            // Connect each checkpoint to all dependency nodes
            foreach (Checkpoint checkpoint in checkpoints)
                foreach (Node node in checkpoint.Dependencies)
                {
                    Microsoft.Glee.Drawing.Edge edge = new Microsoft.Glee.Drawing.Edge(node.ID, null, checkpoint.ID);
                    if (critical.Contains(node) && critical.Contains(checkpoint))
                        edge.Attr.Color = Microsoft.Glee.Drawing.Color.Red;
                    graph.Edges.Add(edge);
                }

            // Bind the graph to the viewer
            gViewer.Graph = graph;
            gViewer.OutsideAreaBrush = Brushes.OldLace;
        }
Exemplo n.º 4
0
        public FormGanttChart()
        {
            InitializeComponent();

            /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
            *                          GANTT CHART                                      *
            * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
            chart.ChartAreas[0].AxisY.IntervalType = DateTimeIntervalType.Days;
            //chart.ChartAreas[0].AxisY.Interval = 1;

            // Get each task start date and finish date
            HashSet <Node> Nodes        = Program.formMain.GetNodes();
            int            maxEmployees = 0;
            // While there are uncomlited tasks
            DateTime currentDate = Program.formMain.dateTimePicker.Value;

            for (; Nodes.Any(new Func <Node, bool>(delegate(Node node) { return(node.Days > 0); })); currentDate = currentDate.AddDays(1))
            {
                // Start unstarted tasks that have all dependencies complited
                foreach (Node node in Nodes)
                {
                    if (!node.HasStarted && node.Dependencies.All(new Func <Node, bool>(delegate(Node dependency) { return(dependency.Days == 0); })))
                    {
                        node.HasStarted = true;
                        node.StartDate  = currentDate;
                    }
                }

                // Decrese days of uncomplited started tasks and finish them if current day was last
                if (Program.formMain.checkboxes[(int)currentDate.DayOfWeek].Checked)
                {
                    // Count of employees required at current day
                    int employ = 0;
                    foreach (Node node in Nodes)
                    {
                        if (node.HasStarted && node.Days > 0)
                        {
                            employ++;
                            if (--node.Days == 0)
                            {
                                node.FinishDate = currentDate;
                            }
                        }
                    }
                    // Check for loops
                    if (employ == 0)
                    {
                        throw new Exception("Loop detected");
                    }
                    // Check if max emloyees required at current day
                    if (employ > maxEmployees)
                    {
                        maxEmployees = employ;
                    }
                }
            }
            employees.Text = maxEmployees.ToString();
            deadline.Text  = currentDate.ToLongDateString();
            period.Text    = (currentDate - Program.formMain.dateTimePicker.Value).Days.ToString() + " days";

            // Set Y axis maximum an minimum dates
            chart.ChartAreas[0].AxisY.Minimum = Program.formMain.dateTimePicker.Value.AddDays(-1).ToOADate();
            chart.ChartAreas[0].AxisY.Maximum = currentDate.ToOADate();

            // Add DataPoints to chart
            for (int i = 0; i < Nodes.Count(); i++)
            {
                Node node = Nodes.ElementAt(i);
                chart.Series[0].Points.AddXY(i, node.StartDate, node.FinishDate.AddDays(1));
                chart.Series[0].Points[i].Label   = chart.Series[0].Points[i].AxisLabel = node.ID;
                chart.Series[0].Points[i].ToolTip = node.StartDate.ToShortDateString() + " - " + node.FinishDate.ToShortDateString();
            }


            /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
            * Program Evaluation and Review Technique                                   *
            * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
            // Get union of all nodes dependencies
            List <Node> allDependencies = new List <Node>();
            // List of checkpoints
            List <Checkpoint> checkpoints = new List <Checkpoint>();

            for (int i = 0, m = 0; i < Nodes.Count; i++)
            {
                Node node = Nodes.ElementAt(i);
                allDependencies.AddRange(node.Dependencies);
                if (node.checkpoint == null)
                {
                    // Set checkpoint to node
                    Checkpoint checkpoint = new Checkpoint();
                    checkpoint.ID   = (checkpoint.Dependencies = node.Dependencies).Count == 0 ? "Start" : Checkpoint.template + m++.ToString();
                    node.checkpoint = checkpoint;
                    // Check other nodes for same dependencies
                    for (int j = i + 1; j < Nodes.Count; j++)
                    {
                        Node otherNode = Nodes.ElementAt(j);
                        if (otherNode.Dependencies.SetEquals(node.Dependencies))
                        {
                            otherNode.checkpoint = checkpoint;
                        }
                    }
                    checkpoints.Add(checkpoint);
                }
            }

            // Create finish checkpoint
            Checkpoint finish = new Checkpoint();

            finish.ID           = "Finish";
            finish.Dependencies = new HashSet <Node>(Nodes.Except(allDependencies));
            checkpoints.Add(finish);

            // Get critical way
            List <object> critical = new List <object>();

            critical.Add(finish);
            for (Checkpoint checkpoint = finish; checkpoint.Dependencies.Count > 0;)
            {
                DateTime latestDate = checkpoint.Dependencies.Max(new Func <Node, DateTime>(delegate(Node node) { return(node.FinishDate); }));
                Node     latestNode = checkpoint.Dependencies.First(new Func <Node, bool>(delegate(Node next) { return(next.FinishDate == latestDate); }));
                critical.Add(checkpoint = latestNode.checkpoint);
                critical.Add(latestNode);
            }

            // Create graph
            Microsoft.Glee.Drawing.Graph graph = new Microsoft.Glee.Drawing.Graph("PERT");
            // Add nodes
            foreach (Node node in Nodes)
            {
                graph.AddNode(node.ID);
                graph.FindNode(node.ID).Attr.Fillcolor = Microsoft.Glee.Drawing.Color.Azure;
            }
            // Add checkpoints
            foreach (Checkpoint checkpoint in checkpoints)
            {
                graph.AddNode(checkpoint.ID);
                Microsoft.Glee.Drawing.Node graphNode = graph.FindNode(checkpoint.ID);
                graphNode.Attr.Fillcolor = Microsoft.Glee.Drawing.Color.MistyRose;
                graphNode.Attr.Shape     = Microsoft.Glee.Drawing.Shape.Diamond;
            }
            // Connect each node to its dependency checkpoint
            foreach (Node node in Nodes)
            {
                Microsoft.Glee.Drawing.Edge edge = new Microsoft.Glee.Drawing.Edge(node.checkpoint.ID, null, node.ID);
                if (critical.Contains(node))
                {
                    edge.Attr.Color = Microsoft.Glee.Drawing.Color.Red;
                }
                graph.Edges.Add(edge);
            }
            // Connect each checkpoint to all dependency nodes
            foreach (Checkpoint checkpoint in checkpoints)
            {
                foreach (Node node in checkpoint.Dependencies)
                {
                    Microsoft.Glee.Drawing.Edge edge = new Microsoft.Glee.Drawing.Edge(node.ID, null, checkpoint.ID);
                    if (critical.Contains(node) && critical.Contains(checkpoint))
                    {
                        edge.Attr.Color = Microsoft.Glee.Drawing.Color.Red;
                    }
                    graph.Edges.Add(edge);
                }
            }

            // Bind the graph to the viewer
            gViewer.Graph            = graph;
            gViewer.OutsideAreaBrush = Brushes.OldLace;
        }
Exemplo n.º 5
0
        private void draw_button_Click(object sender, EventArgs e)
        {
            ////////////////////////////////////////
            ///////////////////////////////////////
            for (int z = 0; z < gridorg.RowCount - 1; z++)
            {
                if (gridorg.Rows[z].Cells[2].Value == null)
                {
                    gridorg.Rows[z].Cells[2].Value = "";
                }
            }
            ///////////////////////////////////////
            for (int z = 0; z < gridorg.RowCount - 1; z++)
            {
                if (gridorg.Rows[z].Cells[1].Value == null)
                {
                    gridorg.Rows[z].Cells[1].Value = "";
                }
            }
            ///////////////////////////////////////
            for (int z = 0; z < gridorg.RowCount - 1; z++)
            {
                if (gridorg.Rows[z].Cells[0].Value == null)
                {
                    gridorg.Rows[z].Cells[0].Value = "";
                }
            }
            ///////////////////////////////////////
            int x = 0;

            Microsoft.Glee.Drawing.Graph graph = new Microsoft.Glee.Drawing.Graph("graph");
            ////////////////////////////////////////
            ///////////////////////////////////////
            for (int i = 0; i < gridorg.Rows.Count - 1; i++)
            {
                /* x = gridorg.Rows[i].Cells[0].Value.ToString();
                 * Console.WriteLine("{0}", x);
                 * graph.AddEdge("hellow","hello");*/
                if (gridorg.Rows[i].Cells[2].Value.ToString() == "")
                {
                    graph.AddNode(gridorg.Rows[i].Cells[0].Value.ToString() + "\n" + gridorg.Rows[i].Cells[1].Value.ToString());
                    graph.FindNode(gridorg.Rows[i].Cells[0].Value.ToString() + "\n" + gridorg.Rows[i].Cells[1].Value.ToString()).Attr.Shape     = Microsoft.Glee.Drawing.Shape.Ellipse;
                    graph.FindNode(gridorg.Rows[i].Cells[0].Value.ToString() + "\n" + gridorg.Rows[i].Cells[1].Value.ToString()).Attr.Fillcolor = Microsoft.Glee.Drawing.Color.AliceBlue;
                    graph.FindNode(gridorg.Rows[i].Cells[0].Value.ToString() + "\n" + gridorg.Rows[i].Cells[1].Value.ToString()).Attr.FontName  = "Tahoma";
                    continue;
                }
                for (int j = 0; j < gridorg.RowCount - 1; j++)//looks for the description of the rankabove
                {
                    if (gridorg.Rows[i].Cells[2].Value.ToString() == gridorg.Rows[j].Cells[0].Value.ToString())
                    {
                        x = j;
                    }
                }
                graph.AddEdge(gridorg.Rows[i].Cells[2].Value.ToString() + "\n" + gridorg.Rows[x].Cells[1].Value.ToString(), gridorg.Rows[i].Cells[0].Value.ToString() + "\n" + gridorg.Rows[i].Cells[1].Value.ToString()).Attr.Color = Microsoft.Glee.Drawing.Color.Black;
                graph.FindNode(gridorg.Rows[i].Cells[2].Value.ToString() + "\n" + gridorg.Rows[x].Cells[1].Value.ToString()).Attr.Shape     = Microsoft.Glee.Drawing.Shape.Box;
                graph.FindNode(gridorg.Rows[i].Cells[2].Value.ToString() + "\n" + gridorg.Rows[x].Cells[1].Value.ToString()).Attr.Color     = Microsoft.Glee.Drawing.Color.Black;
                graph.FindNode(gridorg.Rows[i].Cells[2].Value.ToString() + "\n" + gridorg.Rows[x].Cells[1].Value.ToString()).Attr.Fillcolor = Microsoft.Glee.Drawing.Color.AliceBlue;
                graph.FindNode(gridorg.Rows[i].Cells[0].Value.ToString() + "\n" + gridorg.Rows[i].Cells[1].Value.ToString()).Attr.Shape     = Microsoft.Glee.Drawing.Shape.Box;
                graph.FindNode(gridorg.Rows[i].Cells[0].Value.ToString() + "\n" + gridorg.Rows[i].Cells[1].Value.ToString()).Attr.Color     = Microsoft.Glee.Drawing.Color.Black;
                graph.FindNode(gridorg.Rows[i].Cells[0].Value.ToString() + "\n" + gridorg.Rows[i].Cells[1].Value.ToString()).Attr.Fillcolor = Microsoft.Glee.Drawing.Color.AliceBlue;
            }
            //graph.FindNode("Mohamed Bahaa" + "hello world");
            ////////////////////////////////////////
            ///////////////////////////////////////bind the graph to the viewer
            graph.GraphAttr.Orientation = Microsoft.Glee.Drawing.Orientation.Portrait;
            graph.GraphAttr.Border      = 2;

            graph.GraphAttr.AspectRatio = 1;

            graph.GraphAttr.NodeAttr.FontName = "Tahoma";
            graph.GraphAttr.NodeAttr.Fontsize = 5;
            graph.GraphAttr.NodeAttr.Shape    = Microsoft.Glee.Drawing.Shape.Box;

            graph.GraphAttr.EdgeAttr.FontName          = "Tahoma";
            graph.GraphAttr.EdgeAttr.Fontsize          = 50;
            graph.GraphAttr.EdgeAttr.Separation        = 1000;
            graph.GraphAttr.EdgeAttr.ArrowHeadAtTarget = Microsoft.Glee.Drawing.ArrowStyle.Tee;

            viewer.Graph = graph;

            //associate the viewer with the form
            form.SuspendLayout();
            viewer.Dock = System.Windows.Forms.DockStyle.Fill;
            //viewer.Size = new Size(1000, 1000);
            //viewer.MinimumSize = new Size(Screen.PrimaryScreen.Bounds.Height, Screen.PrimaryScreen.Bounds.Width);
            //viewer.AutoScroll = true;
            form.Controls.Add(viewer);

            form.ResumeLayout();
            //show the form
            form.ShowDialog();
        }