public override bool TryRun(BMyDrawingCommand command, BMyCanvas canvas, BMyEnvironment Env) { string[] argv = command.Args.Split(new char[] { ',' }); int x; int y; if ( argv.Length == 2 && int.TryParse(argv[0], out x) && int.TryParse(argv[1], out y) ) { bool success = false; BMyPoint origin = canvas.Position; BMyDrawingCommand linetoCommand = new BMyDrawingCommand(string.Format(@"lineto {0},{1}", x, origin.Y)); if (Env.TryRunDraw(linetoCommand, canvas)) { linetoCommand = new BMyDrawingCommand(string.Format(@"lineto {0},{1}", x, y)); if (Env.TryRunDraw(linetoCommand, canvas)) { linetoCommand = new BMyDrawingCommand(string.Format(@"lineto {0},{1}", origin.X, y)); if (Env.TryRunDraw(linetoCommand, canvas)) { linetoCommand = new BMyDrawingCommand(string.Format(@"lineto {0},{1}", origin.X, origin.Y)); if (Env.TryRunDraw(linetoCommand, canvas)) { success = true; } } } } canvas.Position = new BMyPoint(x, y); return(success); } else { return(false); } }
public override bool TryRun(BMyDrawingCommand command, BMyCanvas canvas, BMyEnvironment Env) { bool success = false; string[] argv = command.Args.Split(new char[] { ' ' }); foreach (string arg in argv) { string[] _pos = arg.Split(new char[] { ',' }, 2); int x; int y; if (_pos.Length == 2 && int.TryParse(_pos[0], out x) && int.TryParse(_pos[1], out y) ) { success = success && Env.TryRunDraw(new BMyDrawingCommand(string.Format(@"lineto {0},{1}", x, y)), canvas); } else { return(false); } } return(success); }
public BMyCanvas run(string[] source, Program Assembly) { #region Environment BMyEnvironment Env = new BMyEnvironment(Assembly); Env.Log?.PushStack("run(string[] source, Program Assembly)"); #endregion Environment #region build plugins // prepare pluginhandlers Env.Log?.Debug("START - Preparing Plugins"); Env.DrawPlugins.AddPlugin(new BMyDrawPlugin_Background()); // "background R,G,B" where R G B is 0-6 Env.DrawPlugins.AddPlugin(new BMyDrawPlugin_Circle()); // "circle RADIUS" where RADIUS is integer Env.DrawPlugins.AddPlugin(new BMyDrawPlugin_LineTo()); // "lineto x,y" where x y is integer Env.DrawPlugins.AddPlugin(new BMyDrawPlugin_MoveTo()); // "moveto x,y" where x y is integer Env.DrawPlugins.AddPlugin(new BMyDrawPlugin_Rect()); // "rect x,y" where x y is integer Env.DrawPlugins.AddPlugin(new BMyDrawPlugin_Polygon()); // "poly x,y x,y x,y" where x y is integer Env.DrawPlugins.AddPlugin(new BMyDrawPlugin_Color()); // "color R,G,B" where R G B is 0-6 Env.DrawPlugins.AddPlugin(new BMyDrawPlugin_Dot()); // "dot x,y" where x y is integer foreach (KeyValuePair <string, List <BMyDrawPlugin> > _pluginlist in Env.DrawPlugins) { Env.Log?.Debug(@"{0} Plugins for {1}", _pluginlist.Value.Count, _pluginlist.Key); } Env.Log?.Debug("END - Preparing Plugins"); #endregion build plugins #region build code queue Env.Log?.Debug("START - Building Code queue"); Queue <BMyDrawingCommand> codeQueue = new Queue <BMyDrawingCommand>(); Env.Log?.Debug("code has {0} lines", source.Length); foreach (string currentLine in source) { Env.Log?.Debug("enqueue command: {0}", currentLine); codeQueue.Enqueue(new BMyDrawingCommand(currentLine)); } Env.Log?.Debug("END - Building Code queue"); #endregion build code queue #region make canvas BMyCanvas canvas = new BMyCanvas(50, 50, new BMyColor(0, 0, 0)); Env.Log?.Debug("created canvas. {0}x{1}", canvas.Width, canvas.Height); #endregion make canvas #region progress codeQueue Env.Log?.Debug("START - progressing code"); while (codeQueue.Count > 0) { // break if over limits BMyDrawingCommand command = codeQueue.Dequeue(); if (Env.TryRunDraw(command, canvas)) { Env.Log?.Debug("OK: command \"{0}\"", command); } else { Env.Log?.Debug("FAIL: command \"{0}\"", command); } } Env.Log?.Debug("END - progressing code"); Env.Log?.PopStack(); return(canvas); #endregion progress codeQueue }