Private
Public Access
192 lines
10 KiB
C#
192 lines
10 KiB
C#
using Advanced_Software_Engineering.Verbs.DrawingVerbs;
|
|
using Advanced_Software_Engineering.Verbs.Value;
|
|
using Advanced_Software_Engineering.Verbs.Value.ValueObjects;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace Advanced_Software_Engineering {
|
|
|
|
/// <summary>
|
|
/// This class is responsible for creating Verbs.
|
|
/// </summary>
|
|
public class VerbFactory {
|
|
|
|
/// <summary>
|
|
/// This function returns a IVerb from a command and drawer.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// This factory is specifically useful since it automatically converts the parameters to what they should be.
|
|
/// </remarks>
|
|
/// <param name="drawer">The drawer to affect</param>
|
|
/// <param name="fullCommand">The command as a string</param>
|
|
/// <returns>A IVerb that maches the command</returns>
|
|
public static IVerb MakeVerb(Drawer drawer, string fullCommand) {
|
|
Dictionary<string, string[]> commandAndParameters = SettingsAndHelperFunctions.CommandAndParameterParser(fullCommand);
|
|
|
|
if (!commandAndParameters.Keys.Contains("command")) throw new Exception("There is no command to process");
|
|
|
|
string command = commandAndParameters["command"][0];
|
|
string[] parameters = commandAndParameters.Keys.Contains("parameters") ? commandAndParameters["parameters"] : new string[] { };
|
|
int parameterLength = parameters.Length;
|
|
|
|
switch (command) {
|
|
//Drawing commands
|
|
case "move":
|
|
case "moveto":
|
|
//Check parameters
|
|
if (parameterLength == 2) {
|
|
return new MoveTo(drawer, new PointValue(parameters[0], parameters[1]));
|
|
} else throw new Exception(command + " has an incorrect number of parameters");
|
|
|
|
case "drawto":
|
|
case "line":
|
|
case "lineto":
|
|
//Check parameters
|
|
if (parameterLength == 2) {
|
|
return new DrawTo(drawer, new PointValue(ValueFactory.CreateValue(drawer, parameters[0]), ValueFactory.CreateValue(drawer, parameters[1])));
|
|
} else throw new Exception(command + " has an incorrect number of parameters");
|
|
case "regularpolygon":
|
|
case "rp":
|
|
//Check parameters
|
|
if (parameterLength == 2) {
|
|
return new
|
|
RegularPolygon(drawer,
|
|
ValueHelper.ConvertToInt(parameters[0]),
|
|
ValueHelper.ConvertToDouble(parameters[1])
|
|
);
|
|
} else if (parameterLength == 3) {
|
|
return new RegularPolygon(drawer,
|
|
ValueHelper.ConvertToInt(parameters[0]),
|
|
ValueHelper.ConvertToDouble(parameters[1]),
|
|
ValueHelper.ConvertToDouble(parameters[2])
|
|
);
|
|
} else throw new Exception(command + " has an incorrect number of parameters");
|
|
case "square":
|
|
//Check parameters
|
|
if (parameterLength == 1) {
|
|
return new
|
|
Square(drawer,
|
|
ValueHelper.ConvertToDouble(parameters[0])
|
|
);
|
|
} else if (parameterLength == 2) {
|
|
return new Square(drawer,
|
|
ValueHelper.ConvertToDouble(parameters[0]),
|
|
ValueHelper.ConvertToDouble(parameters[1])
|
|
);
|
|
} else throw new Exception(command + " has an incorrect number of parameters");
|
|
case "quadrilateral":
|
|
//Check parameters
|
|
if (parameterLength == 8) {
|
|
return new Quadrilateral(drawer,
|
|
ValueHelper.ConvertToPoint(parameters[0], parameters[1]),
|
|
ValueHelper.ConvertToPoint(parameters[2], parameters[3]),
|
|
ValueHelper.ConvertToPoint(parameters[4], parameters[5]),
|
|
ValueHelper.ConvertToPoint(parameters[6], parameters[7])
|
|
);
|
|
} else throw new Exception(command + " has an incorrect number of parameters");
|
|
case "rectangle":
|
|
//Check parameters
|
|
if (parameterLength == 2) {
|
|
return new Rectangle(drawer,
|
|
ValueHelper.ConvertToDouble(parameters[0]),
|
|
ValueHelper.ConvertToDouble(parameters[1])
|
|
);
|
|
} else if (parameterLength == 8) {
|
|
return new Quadrilateral(drawer,
|
|
ValueHelper.ConvertToPoint(parameters[0], parameters[1]),
|
|
ValueHelper.ConvertToPoint(parameters[2], parameters[3]),
|
|
ValueHelper.ConvertToPoint(parameters[4], parameters[5]),
|
|
ValueHelper.ConvertToPoint(parameters[6], parameters[7])
|
|
);
|
|
} else throw new Exception(command + " has an incorrect number of parameters");
|
|
case "circle":
|
|
//Check parameters
|
|
if (parameterLength == 1) {
|
|
return new Circle(drawer, ValueFactory.CreateValue(drawer, parameters[0]));
|
|
} else throw new Exception(command + " has an incorrect number of parameters");
|
|
case "triangle":
|
|
//Check parameters
|
|
if (parameterLength == 1) {
|
|
return new
|
|
Triangle(drawer,
|
|
ValueHelper.ConvertToDouble(parameters[0])
|
|
);
|
|
} else if (parameterLength == 2) {
|
|
return new
|
|
Triangle(drawer,
|
|
ValueHelper.ConvertToDouble(parameters[0]),
|
|
ValueHelper.ConvertToDouble(parameters[1])
|
|
);
|
|
} else if (parameterLength == 6) {
|
|
return new Triangle(drawer,
|
|
ValueHelper.ConvertToPoint(parameters[0], parameters[1]),
|
|
ValueHelper.ConvertToPoint(parameters[2], parameters[3]),
|
|
ValueHelper.ConvertToPoint(parameters[4], parameters[5])
|
|
);
|
|
} else throw new Exception(command + " has an incorrect number of parameters");
|
|
|
|
case "dot":
|
|
if (parameterLength == 0) {
|
|
return new Dot(drawer);
|
|
} else throw new Exception(command + " doesn't take parameters");
|
|
|
|
case "clear":
|
|
if (parameterLength == 0) {
|
|
return new Clear(drawer);
|
|
} else throw new Exception(command + " doesn't take parameters");
|
|
|
|
case "reset":
|
|
case "resetpen":
|
|
if (parameterLength == 0) {
|
|
return new ResetPen(drawer);
|
|
} else throw new Exception(command + " doesn't take parameters");
|
|
|
|
case "fillon":
|
|
if (parameterLength == 0) {
|
|
return new Fill(drawer, true);
|
|
} else throw new Exception(command + " doesn't take parameters");
|
|
|
|
case "filloff":
|
|
if (parameterLength == 0) {
|
|
return new Fill(drawer, false);
|
|
} else throw new Exception(command + " doesn't take parameters");
|
|
|
|
case "pen":
|
|
if (parameterLength == 1) {
|
|
return new PenColor(drawer, ValueFactory.CreateValue(drawer, parameters[0]));
|
|
} else if (parameterLength == 3) {
|
|
return new PenColor(drawer, ValueFactory.CreateValue(drawer, parameters[0], parameters[1], parameters[2], "color"));
|
|
} else if (parameterLength == 4) {
|
|
return new PenColor(drawer, ValueFactory.CreateValue(drawer, parameters[0], parameters[1], parameters[2], parameters[3], "color"));
|
|
} else throw new Exception(command + " has an incorrect number of parameters");
|
|
case "fill":
|
|
if (parameterLength == 1) {
|
|
return new FillColor(drawer, ValueFactory.CreateValue(drawer, parameters[0]));
|
|
} else if (parameterLength == 3) {
|
|
return new FillColor(drawer, ValueFactory.CreateValue(drawer, parameters[0], parameters[1], parameters[2], "color"));
|
|
} else if (parameterLength == 4) {
|
|
return new FillColor(drawer, ValueFactory.CreateValue(drawer, parameters[0], parameters[1], parameters[2], parameters[3], "color"));
|
|
} else throw new Exception(command + " has an incorrect number of parameters");
|
|
|
|
case "int":
|
|
case "double":
|
|
case "bool":
|
|
case "color":
|
|
if (parameterLength == 1) {
|
|
return new DeclareVariable(drawer, command, parameters[0]);
|
|
} else throw new Exception(command + "s need to be initialised");
|
|
|
|
default:
|
|
//assignment
|
|
if (command.Contains("=") && !command.Contains("==")) {
|
|
string[] assignmentCommands = command.Split("="[0]);
|
|
if (assignmentCommands.Length > 2) throw new Exception("Cannot have two assignments");
|
|
return new UpdateVariable(drawer, assignmentCommands[0], assignmentCommands[1]);
|
|
}
|
|
//not assignment
|
|
throw new Exception("Unknown command or cannot parse");
|
|
}
|
|
}
|
|
}
|
|
} |