Example #1
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();
    }
Example #2
0
        void DrawTree(Parser.TreeNode tree, Microsoft.Glee.Drawing.Node x)
        {
            Microsoft.Glee.Drawing.Node n = x;
            Microsoft.Glee.Drawing.Node y = new Microsoft.Glee.Drawing.Node("b");

            while (tree != null)
            {
                if (tree.nodekind == NodeKind.StmtK)
                {
                    switch (tree.kind.stmt)
                    {
                    case StmtKind.IfK:
                        n.Attr.Id = "IF";
                        //graph.AddNode("If");
                        break;

                    case StmtKind.RepeatK:
                        n.Attr.Id = "Repeat";
                        //graph.AddNode("Repeat");
                        break;

                    case StmtKind.AssignK:
                        n.Attr.Id = "Assign to " + tree.attr.name;
                        //graph.AddNode("Assign to: " + tree.attr.name);
                        break;

                    case StmtKind.ReadK:
                        n.Attr.Id = "Read: " + tree.attr.name;
                        //graph.AddNode("Read: " + tree.attr.name);
                        break;

                    case StmtKind.WriteK:
                        n.Attr.Id = "Write";
                        //graph.AddNode("Write");
                        break;

                    default:
                        n.Attr.Id = "Unknown ExpNode kind\n";
                        break;
                    }
                }
                else if (tree.nodekind == NodeKind.ExpK)
                {
                    switch (tree.kind.exp)
                    {
                    case ExpKind.OpK:
                        n.Attr.Id = "Op: " + tree.attr.op;

                        //graph.AddNode("Op: " + tree.attr.op);
                        break;

                    case ExpKind.ConstK:

                        n.Attr.Id = "Const: " + tree.attr.val;
                        //graph.AddNode("Const: " + tree.attr.val);
                        break;

                    case ExpKind.IdK:

                        n.Attr.Id = "Id: " + tree.attr.name;
                        //graph.AddNode("Id: " + tree.attr.name);
                        break;

                    default:
                        n.Attr.Id = "Unknown ExpNode kind\n";
                        break;
                    }
                }

                else
                {
                    n.Attr.Id = "Unknown node kind\n";
                }
                for (int i = 0; i < Parser.MAXCHILDREN; i++)
                {
                    if (y.Attr.Id != "b")
                    {
                        graph.AddEdge(n.Attr.Id, y.Attr.Id);
                    }
                    DrawTree(tree.child[i], y);
                }

                tree = tree.sibling;
            }
        }
Example #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;
        }