예제 #1
0
        /// <summary>
        /// Handles the load button's click event.
        /// </summary>
        /// <param name="sender">The triggerer object.</param>
        /// <param name="e">The event arguments.</param>
        private void LoadButton_Click(object sender, EventArgs e)
        {
            if (!SaveGraphIfNeeded())
            {
                return;
            }

            if (loadAutomataDialog.ShowDialog() == DialogResult.OK)
            {
                Graph = null;

                try
                {
                    Graph = AutomataLoader.Load(loadAutomataDialog.FileName);
                }
                catch
                {
                }

                if (Graph == null)
                {
                    MessageBox.Show("Hiba történt az automata beolvasása közben!");
                    return;
                }

                Graph.OnRedraw += DrawGraph;
                Graph.IsSaved   = true;

                SetupUI();

                DrawGraph();
            }
        }
예제 #2
0
        /// <summary>
        /// Asks the user to save the current edited automata, if it wasn't saved already.
        /// </summary>
        /// <returns>True, if the process was successful.</returns>
        private bool SaveGraphIfNeeded()
        {
            if (Graph == null || Graph.IsSaved)
            {
                return(true);
            }

            var mBoxResult = MessageBox.Show("A jelenlegi automata nincs elmentve. Szertné menteni?", "Mentés", MessageBoxButtons.YesNoCancel);

            if (mBoxResult == DialogResult.Yes)
            {
                SaveAutomata();

                if (!Graph.IsSaved)
                {
                    return(false);
                }
            }
            else if (mBoxResult == DialogResult.No)
            {
                Graph = null;

                DrawGraph();
            }
            else if (mBoxResult == DialogResult.Cancel)
            {
                return(false);
            }

            return(true);
        }
예제 #3
0
        /// <summary>
        /// Draws the preview automata based on the form fields' value.
        /// </summary>
        private void DrawPreviewAutomata()
        {
            if (WindowState == FormWindowState.Minimized)
            {
                return;
            }

            var graph = new AutomataGraph(Automata);

            if (TransitionComboBox.SelectedIndex != -1 && _comboBoxSelectionList.Count > TransitionComboBox.SelectedIndex)
            {
                var sourceDrawingState = graph.FindNode(Simulation.CurrentState.Id) as State;

                foreach (var outEdge in sourceDrawingState.Edges)
                {
                    if (outEdge is Edge edge && edge.SourceNode == sourceDrawingState && edge.LogicTransition.HandlesSymbol(Simulation.CurrentInputSymbol))
                    {
                        if (edge.LogicTransition == _comboBoxSelectionList[TransitionComboBox.SelectedIndex])
                        {
                            edge.Attr.Color      = MsaglColor.Blue;
                            edge.Label.FontColor = MsaglColor.Blue;
                        }
                        else
                        {
                            edge.Attr.Color      = MsaglColor.Orange;
                            edge.Label.FontColor = MsaglColor.Orange;
                        }
                    }
                    else
                    {
                        outEdge.Attr.Color      = MsaglColor.Black;
                        outEdge.Label.FontColor = MsaglColor.Black;
                    }
                }
예제 #4
0
        private void DrawPreviewAutomata()
        {
            if (WindowState == FormWindowState.Minimized)
            {
                return;
            }

            var graph = new AutomataGraph(Automata);

            try
            {
                if (SourceStateIdComboBox.SelectedIndex == -1 || TargetStateIdComboBox.SelectedIndex == -1)
                {
                    return;
                }

                var sourceDrawingState = graph.FindNode(SourceStateIdComboBox.SelectedItem as string) as State;
                var targetDrawingState = graph.FindNode(TargetStateIdComboBox.SelectedItem as string) as State;

                var transition = ConstructTransition(sourceDrawingState.LogicState.Id, targetDrawingState.LogicState.Id);

                var edge = new Edge(sourceDrawingState, targetDrawingState, transition);

                graph.SetupEdge(edge);

                edge.Attr.Color = edge.Label.FontColor = MsaglColor.Blue;

                graph.AddPrecalculatedEdge(edge);

                ErrorLabel.Text = "";
            }
            catch
            {
                ErrorLabel.Text = "A megadott szimbólum nem elérhető az ábécében!";
            }

            var renderer = new GraphRenderer(graph);

            renderer.CalculateLayout();

            using (var graphics = DrawPanel.CreateGraphics())
            {
                graphics.SmoothingMode      = SmoothingMode.HighQuality;
                graphics.TextRenderingHint  = TextRenderingHint.AntiAliasGridFit;
                graphics.CompositingQuality = CompositingQuality.HighQuality;
                graphics.InterpolationMode  = InterpolationMode.HighQualityBicubic;

                renderer.Render(graphics, 0, 0, DrawPanel.Width, DrawPanel.Height);
            }
        }
예제 #5
0
        private void DrawPreviewAutomata()
        {
            if (WindowState == FormWindowState.Minimized)
            {
                return;
            }

            var graph = new AutomataGraph(Automata);

            if (Automata.GetState(StateIdTextBox.Text) != null)
            {
                return;
            }

            if (StateIdTextBox.Text.Length > 0)
            {
                var state = new State(ConstructState());

                state.Attr.Color      = MsaglColor.Blue;
                state.Label.FontColor = MsaglColor.Blue;

                var startState = Automata.GetStartState();

                if (state.IsStartState && startState != null)
                {
                    var oldStartState = graph.FindNode(startState.Id) as State;

                    oldStartState.OverrideIsStartState = false;
                }

                graph.SetupState(state);
                graph.AddNode(state);
            }

            var renderer = new GraphRenderer(graph);

            renderer.CalculateLayout();

            using (var graphics = DrawPanel.CreateGraphics())
            {
                graphics.SmoothingMode      = SmoothingMode.HighQuality;
                graphics.TextRenderingHint  = TextRenderingHint.AntiAliasGridFit;
                graphics.CompositingQuality = CompositingQuality.HighQuality;
                graphics.InterpolationMode  = InterpolationMode.HighQualityBicubic;

                renderer.Render(graphics, 0, 0, DrawPanel.Width, DrawPanel.Height);
            }
        }
예제 #6
0
        /// <summary>
        /// Draws the modified automata based on the form fields' value.
        /// </summary>
        private void DrawPreviewAutomata()
        {
            if (WindowState == FormWindowState.Minimized)
            {
                return;
            }

            var graph = new AutomataGraph(Automata);

            if (SourceStateIdComboBox.SelectedIndex != -1 && TransitionComboBox.SelectedIndex != -1 && _comboBoxSelectionList.Count > TransitionComboBox.SelectedIndex)
            {
                var sourceDrawingState = graph.FindNode(SourceStateIdComboBox.SelectedItem as string) as State;

                foreach (var outEdge in sourceDrawingState.Edges)
                {
                    if (outEdge is Edge edge && edge.SourceNode == sourceDrawingState)
                    {
                        if (edge.LogicTransition == _comboBoxSelectionList[TransitionComboBox.SelectedIndex])
                        {
                            edge.Attr.Color      = MsaglColor.Red;
                            edge.Label.FontColor = MsaglColor.Red;
                        }
                        else
                        {
                            edge.Attr.Color      = MsaglColor.Orange;
                            edge.Label.FontColor = MsaglColor.Orange;
                        }
                    }
                }
            }

            var renderer = new GraphRenderer(graph);

            renderer.CalculateLayout();

            using (var graphics = DrawPanel.CreateGraphics())
            {
                graphics.SmoothingMode      = SmoothingMode.HighQuality;
                graphics.TextRenderingHint  = TextRenderingHint.AntiAliasGridFit;
                graphics.CompositingQuality = CompositingQuality.HighQuality;
                graphics.InterpolationMode  = InterpolationMode.HighQualityBicubic;

                renderer.Render(graphics, 0, 0, DrawPanel.Width, DrawPanel.Height);
            }
        }
예제 #7
0
 public void Load(string filename)
 {
     try {
         AutomataGraph newAutomata = new AutomataGraph();
         newAutomata.Read(filename);
         _automata.StateChanged -= AutomataChanged;
         _automata = newAutomata;
         _automata.StateChanged += AutomataChanged;
         AutomataChanged?.Invoke(filename, new PropertyChangedEventArgs("Refresh"));
         foreach (KeyValuePair <char, AutomataGraph.State> entry in _automata.States)
         {
             AutomataChanged?.Invoke(entry, new PropertyChangedEventArgs("State"));
         }
     }
     catch (Exception e) {
         var t = e.ToString();
     }
 }
예제 #8
0
        /// <summary>
        /// Handles the new button's click event.
        /// </summary>
        /// <param name="sender">The triggerer object.</param>
        /// <param name="e">The event arguments.</param>
        private void NewButton_Click(object sender, EventArgs e)
        {
            if (!SaveGraphIfNeeded())
            {
                return;
            }

            using (var form = new CreateAutomataForm())
            {
                if (form.ShowDialog() == DialogResult.OK)
                {
                    Graph           = new AutomataGraph(form.CreateAutomata(), true);
                    Graph.OnRedraw += DrawGraph;
                    Graph.IsSaved   = false;

                    SetupUI();

                    DrawGraph();
                }
            }
        }
예제 #9
0
        /// <summary>
        /// Draws the modified automata based on the form fields' value.
        /// </summary>
        private void DrawPreviewAutomata()
        {
            if (WindowState == FormWindowState.Minimized)
            {
                return;
            }

            var graph = new AutomataGraph(Automata);

            var selectedStateId = DeleteStateComboBox.SelectedItem as string;

            if (!String.IsNullOrWhiteSpace(selectedStateId) && Automata.GetState(selectedStateId) != null)
            {
                if (graph.FindNode(selectedStateId) is State state)
                {
                    state.Attr.Color      = MsaglColor.Red;
                    state.Label.FontColor = MsaglColor.Red;

                    foreach (var edge in state.Edges)
                    {
                        edge.Attr.Color      = MsaglColor.Red;
                        edge.Label.FontColor = MsaglColor.Red;
                    }
                }
            }

            var renderer = new GraphRenderer(graph);

            renderer.CalculateLayout();

            using (var graphics = DrawPanel.CreateGraphics())
            {
                graphics.SmoothingMode      = SmoothingMode.HighQuality;
                graphics.TextRenderingHint  = TextRenderingHint.AntiAliasGridFit;
                graphics.CompositingQuality = CompositingQuality.HighQuality;
                graphics.InterpolationMode  = InterpolationMode.HighQualityBicubic;

                renderer.Render(graphics, 0, 0, DrawPanel.Width, DrawPanel.Height);
            }
        }
예제 #10
0
 public MainViewModel()
 {
     _automata = new AutomataGraph();
     _automata.StateChanged += AutomataChanged;
     StateTypes              = new [] { "Starting", "Transition", "Accepting" };
 }
예제 #11
0
파일: App.cs 프로젝트: matmerr/dfa
        static void Main(string[] args)
        {
            AutomataGraph automata = null;

            Console.WriteLine("Finite Automata Demo");
            Console.WriteLine("Type 'load demo' to load sample automata, \n     'load existing' to load existing automata XML \n     'start' to create automata");
            string selection = null;

            while (true)
            {
                Console.Write(":> ");
                selection = Console.ReadLine();
                if (selection == "load")
                {
                    Console.WriteLine();
                    break;
                }



                if (selection == "load demo")
                {
                    Console.WriteLine("Loading demo.xml");
                    automata = new AutomataGraph("../../../demo.xml");

                    //Show both an accepted, and unaccepted string for the loaded Automata.
                    Console.WriteLine("\nRunning Test Cases...");
                    Console.WriteLine("Testing 'Accepted' String: '10100'");
                    Console.WriteLine(automata.TestString("10100"));

                    Console.WriteLine("Testing 'Unaccepted String: '011101010");
                    Console.WriteLine(automata.TestString("011101010"));

                    break;
                }
                if (selection == "load existing")
                {
                    Console.Write("Please enter a file name, including the full path: ");
                    string filename = Console.ReadLine();
                    try {
                        automata = new AutomataGraph(filename);
                        break;
                    }
                    catch {
                        Console.WriteLine("Automata Load Failed");
                    }
                }


                else if (selection == "start")
                {
                    automata = new AutomataGraph();
                    Console.WriteLine("Creating new Deterministic Finite Automata");
                    Console.WriteLine("Type 'done' to finish building");
                    Console.WriteLine("Type 'add state' to create new state");
                    Console.WriteLine("Type 'add path' to create new path between states");
                    Console.WriteLine("Type 'delete state' to delete an already existing state");
                    while (true)
                    {
                        Console.Write(":> ");
                        string sel = Console.ReadLine();
                        if (sel == "done")
                        {
                            foreach (char c in automata.States.Keys)
                            {
                                Console.WriteLine(c);
                            }

                            break;
                        }
                        switch (sel)
                        {
                        case "add state":
                            Console.WriteLine("Enter a letter for state: ( ex. 'A', 'B' ...)");
                            Console.Write(":> ");
                            char statename = Convert.ToChar(Console.ReadLine());
                            Console.WriteLine("Enter the state type: ('Starting', 'Transition' or 'Accepting'");
                            Console.Write(":> ");
                            string type = Console.ReadLine();
                            Console.WriteLine(automata.AddState(statename, type));
                            break;

                        case "add path":
                            Console.WriteLine("Enter the starting state for the path: ( ex. 'A', 'B' ...)");
                            Console.Write(":> ");
                            char pathstart = Convert.ToChar(Console.ReadLine());
                            Console.WriteLine("Enter the stopping state for the path: ( ex. 'C', 'D' ...)");
                            Console.Write(":> ");
                            char pathstop = Convert.ToChar(Console.ReadLine());
                            Console.WriteLine("Enter the path weight: ('1' or '0')");
                            Console.Write(":> ");
                            char pathweight = Convert.ToChar(Console.ReadLine());

                            Console.WriteLine(automata.AddPath(pathstart, pathweight, pathstop));

                            break;

                        case "delete state":
                            Console.WriteLine("Enter the starting state for the desired path: ( ex. 'A', 'B' ...)");
                            Console.Write(":> ");
                            char deleteName = Convert.ToChar(Console.ReadLine());
                            Console.WriteLine(automata.DeleteState(deleteName));
                            break;
                        }
                    }
                }
            }


            // Hardcoded Example:

            // XML contains states, and a string

            //EX:
            //State A:
            //    Starting
            //    Path: 1, B
            //    Path: 0, C

            //State B:
            //    Transition
            //    Path: 0, A
            //    Path: 1, C

            //State C:
            //    Accepting

            //        Open XML file, connect states with each other



            Console.WriteLine("\nType 'check' to check if string exists in FA");
            Console.WriteLine("Type 'quit' to quit");
            Console.WriteLine("Type 'save' to save");
            while (true)
            {
                Console.Write(":> ");
                string input = Console.ReadLine();

                if (input == "quit")
                {
                    return;
                }
                if (input == "save")
                {
                    automata.Save("../../../ demo.save.xml"); // this is the default demo save, can be changed once final
                    Console.WriteLine("FA Saved.");
                    continue;
                }

                if (input == "check")
                {
                    // 1011 works with default
                    Console.Write("Enter a string to check in DFA: ");
                    Console.WriteLine(automata.TestString(Console.ReadLine()) ? "Accepted" : "Not Accepted");
                }
            }
        }