/// <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(); } }
/// <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); }
/// <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; } }
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); } }
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); } }
/// <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); } }
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(); } }
/// <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(); } } }
/// <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); } }
public MainViewModel() { _automata = new AutomataGraph(); _automata.StateChanged += AutomataChanged; StateTypes = new [] { "Starting", "Transition", "Accepting" }; }
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"); } } }