static void Main() { // this will creates the originator canvas and the other lists neccessary to run the application Originator canvas = new Originator(); // This will add shapes to the array list ArrayList mem = new ArrayList(); Memento m = new Memento(mem); List <Memento> holder = new List <Memento>(); //this random number generator Random rnd = new Random(); //This will prompt for user to use application adn help the user Console.WriteLine("Welcome to the canvas!"); Console.WriteLine("Please enter a command: (H for Help)" + Environment.NewLine); while (true) { //gets the size of the current canvas for referencing int x = canvas.Count(); string sc = Console.ReadLine(); //closing sequence for the application if the user chooses too. if (sc.Equals("q") || sc.Equals("Q")) { Console.WriteLine("Closing application...."); System.Threading.Thread.Sleep(2000); Console.WriteLine("Succusfully closed application"); break; } else { switch (sc) { //If user chooses this command it will show this drop down menu case "H": Console.WriteLine("Commands: "); Console.WriteLine(" A <shape> Add <shape> to canvas"); Console.WriteLine(" U Undo last operation"); Console.WriteLine(" R Redo last operation"); Console.WriteLine(" D Display Canvas"); Console.WriteLine(" S Save canvas to SVG file"); Console.WriteLine(" C Clear canvas"); Console.WriteLine(" Q Close application"); break; //all these cases will add whatever shape the user chooses onto the canvas case "A Rectangle": Rectangle rect = new Rectangle(rnd.Next(1, 500), rnd.Next(1, 500), rnd.Next(1, 500), rnd.Next(1, 500)); string Rect = rect.ToString(); canvas.Add(Rect); m = canvas.SaveMemento(); break; case "A Circle": Circle circle = new Circle(); string Circle = circle.ToString(); canvas.Add(Circle); m = canvas.SaveMemento(); break; case "A Ellipse": Ellipse ellipse = new Ellipse(rnd.Next(1, 500), rnd.Next(1, 500), rnd.Next(1, 500), rnd.Next(1, 500)); string Ellipse = ellipse.ToString(); canvas.Add(Ellipse); m = canvas.SaveMemento(); break; case "A Line": Line line = new Line(rnd.Next(1, 500), rnd.Next(1, 500), rnd.Next(1, 500), rnd.Next(1, 500)); string Line = line.ToString(); canvas.Add(Line); m = canvas.SaveMemento(); break; case "A Polyline": Polyline polyline = new Polyline(); string Polyline = polyline.ToString(); canvas.Add(Polyline); m = canvas.SaveMemento(); break; case "A Polygon": Polygon polygon = new Polygon(); string Polygon = polygon.ToString(); canvas.Add(Polygon); m = canvas.SaveMemento(); break; case "A Path": Path path = new Path(); string Path = path.ToString(); canvas.Add(Path); m = canvas.SaveMemento(); break; case "U": // if statement to check if the canvas is not empty if it is not then it will do the undo operation if (x == 0) { Console.WriteLine("Canvas is empty! No undo is possible."); } else if (x > 0) { m = canvas.SaveMemento(); canvas.RemoveAt(); } break; case "R": //this will restore the canvas if an undo is completed canvas.SaveMemento(); canvas.RestoreMemento(m); break; case "C": //if statment to check if the canvas is empty. If it is it will not perform the clear operation as there is nothing to clear. if (x == 0) { Console.WriteLine("Canvas is empty! Nothing to clear."); } //if it isnt empty then obviously clear the canvas else if (x > 0) { canvas = new Originator(); Console.WriteLine("Successfully cleared canvas."); } break; //This will also check if the canvas is empty and if it is it will inform the user there is nothing to display case "D": if (x == 0) { Console.WriteLine("Canvas is empty! Nothing to display."); } else if (x > 0) { canvas.getShapes(); } break; case "S": String PathToSVG = @"./Shapes.svg"; List <string> Shapes = canvas.ListShapes(); //https://docs.microsoft.com/en-us/dotnet/api/system.io.file.create?view=net-5.0 using (FileStream fs = File.Create(PathToSVG)) { // insert open svg tag into first line byte[] info = new UTF8Encoding(true).GetBytes(@"<svg height=""2000"" width=""2000"" xmlns=""http://www.w3.org/2000/svg"">" + Environment.NewLine); // Add some information to the file. fs.Write(info, 0, info.Length); } //add close tag to the end using (StreamWriter sw = File.AppendText(PathToSVG)) { foreach (string item in Shapes) { sw.WriteLine(item); } sw.WriteLine("</svg>"); } Console.WriteLine("Successfully saved your canvas!"); break; default: //informs the user his/her input is invalid Console.WriteLine("Invalid Input"); break; } } } }