private void KeybardLoop() { ConsoleKeyInfo? k = null; do { Thread.Sleep(200); k = PressedKey(); if (k != null) { switch (k.Value.KeyChar) { case '+': _currentDelay -= 1; if (_currentDelay < 0) _currentDelay = 0; Send("VS" + _currentDelay + ";"); break; case '-': _currentDelay += 1; Send("VS" + _currentDelay + ";"); break; default: switch (k.Value.Key) { case ConsoleKey.Spacebar: { var dump = base.Send("OD;"); Console.WriteLine(">" + dump); break; } case ConsoleKey.LeftArrow: case ConsoleKey.RightArrow: case ConsoleKey.UpArrow: case ConsoleKey.DownArrow: { MovePen(k.Value); break; } case ConsoleKey.D: base.Send("PD;"); break; case ConsoleKey.U: base.Send("PU;"); break; case ConsoleKey.R: Console.WriteLine(); return; case ConsoleKey.Q: base.Send("PU;"); Environment.Exit(1); return; case ConsoleKey.B: base.Send("BP;"); break; case ConsoleKey.I: base.Send("IN;"); break; case ConsoleKey.N: IsPaused = true; return; case ConsoleKey.D1: { var measure = new Measure(); measure.Visit(Commands); base.Send(String.Format("PU{0},{1};", measure.Min.X, measure.Min.Y)); break; } case ConsoleKey.D2: { var measure = new Measure(); measure.Visit(Commands); base.Send(String.Format("PU{0},{1};", measure.Max.X, measure.Max.Y)); break; } case ConsoleKey.Backspace: if (CurrentCommand > 0) CurrentCommand--; Console.Clear(); DumpCommands(); break; } break; } k = null; } } while (k == null); }
private static void Run() { var inputFileName = cmd.arguments.First(); if (!File.Exists(inputFileName)) { throw new Exception(String.Format("File {0} does not exists", inputFileName)); } //TODO?: read SVG and convert to HPGL //TODO?: vectorize SVG, so white fills are wiped out from vectors List<HpglItem> hpglData; if (cmd.GetParamOrDefault("gerber", false)) { var gerberParser = new GerberParser(); using (var f = File.OpenRead(inputFileName)) { var gerberData = gerberParser.Parse(f); foreach (var item in gerberData.OfType<Gerber.Language.UnknownCommand>()) { Console.WriteLine(item); } var comp = cmd.GetParamOrDefault("gerberpen", 0.0); var unitstext = cmd.GetParamOrDefault("gerberunits", "Inches"); var units = (Units)Enum.Parse(typeof(Units), unitstext); var g2h = new Gerber.Transformations.Gerber2Hpgl() { PenWidthCompensation = comp, Units = units }; hpglData = g2h.Translate(gerberData); } } else { var parser = new HpglParser(); using (var f = File.OpenRead(inputFileName)) { hpglData = parser.Parse(f); } Console.WriteLine("HPGL file {0} readed", inputFileName); Console.WriteLine("Stats:"); Console.WriteLine("Parser: {0} tokens, {1} commands", hpglData.Count, hpglData.Where(h => !(h is Terminator)).Count()); } //MEASURE { var measure = new Measure(); measure.Visit(hpglData); Console.WriteLine("Dimensions: min={0}, max={1}", measure.Min, measure.Max); Console.WriteLine("Length of lines: with pen down={0:.1}, with pen up={1:.1}", measure.PenDownLength, measure.PenUpLength); } //remove unknowns hpglData = hpglData.Where(h => !(h is Hpgl.Language.UnknownCommand)).ToList(); int width = cmd.GetParamOrDefault("width", 1520); int height = cmd.GetParamOrDefault("height", 2160); if (cmd.GetParamOrDefault("textify", false)) { Console.WriteLine("Textificating..."); var t = new Textificator(); hpglData = t.Process(hpglData); } if (cmd.GetParamOrDefault("absolutize", false)) { var a = new Absolutizer(); hpglData = a.Process(hpglData); } //transformation { var transformer = new Transformer(cmd.GetParamOrDefault("transform", string.Empty)); hpglData = transformer.Transform(hpglData); } //autoscale if (cmd.GetParamOrDefault("autoscale", false)) { Console.WriteLine("Autoscaling..."); var measure = new Measure(); measure.Visit(hpglData); if (measure.ContainsRelative) { Console.WriteLine("Warning: input contains PR, results can be strange"); } Console.WriteLine("Dimensions: min={0}, max={1}", measure.Min, measure.Max); var size = new HPoint(measure.Max.X - measure.Min.X, measure.Max.Y - measure.Min.Y); //size.X/size.Y=width/height //newptx/pt.x = width/size.X double sx = (double)(width * 0.9d) / size.X; double sy = (double)(height * 0.9d) / size.Y; var transformer = new Transformer(); transformer.Move(-measure.Min.X, -measure.Min.Y); transformer.Scale(sx < sy ? sx : sy); transformer.Move((int)(width * 0.05d), (int)(height * 0.05d)); hpglData = transformer.Transform(hpglData); } //optimalization if (cmd.GetParamOrDefault("optimize", true)) { Console.WriteLine("Optimizing..."); var optimizer = new SegmentationOptimizer(); hpglData = optimizer.Process(hpglData); var optmeasure = new Measure(); optmeasure.Visit(hpglData); Console.WriteLine("Optimized lines: with pen down={0:.1}, with pen up={1:.1}", optmeasure.PenDownLength, optmeasure.PenUpLength); } var maxstep = cmd.GetParamOrDefault("maxstep", 0); if (maxstep > 0) { int split = 0; int i = 0; while (i < hpglData.Count) { var pcmd = hpglData[i] as HpglPointsCommand; if (pcmd != null) { if (pcmd.Points.Count > maxstep) { split++; var newcmd = Activator.CreateInstance(pcmd.GetType()) as HpglPointsCommand; newcmd.Points = pcmd.Points.Take(maxstep).ToList(); hpglData.Insert(i, newcmd); pcmd.Points = pcmd.Points.Skip(maxstep).ToList(); } } i++; } Console.WriteLine("Splitted " + split + " commands for maximum " + maxstep + " steps."); } //outline var outline = cmd.GetParamOrDefault("outline", -1); if (outline >= 0) { var measure = new Measure(); measure.Visit(hpglData); var size = new HPoint(outline, outline); var rect = new[]{ new HPoint(measure.Min.X - outline, measure.Max.Y + outline), new HPoint(measure.Max.X + outline, measure.Max.Y + outline), new HPoint(measure.Max.X + outline, measure.Min.Y - outline), new HPoint(measure.Min.X - outline, measure.Min.Y - outline), }; hpglData.Insert(0, new PenUp() { Points = { rect[3] } }); hpglData.Insert(1, new PenDown() { Points = { rect[0], rect[1], rect[2], rect[3] } }); //hpglData.Insert(2, new PenUp() { } ); } //speed, delay var s = cmd.GetParamOrDefault("speed", 0); var d = cmd.GetParamOrDefault("updelay",0); if (s != 0 || d!=0) { var ss = new SetSpeed() { SpeedMove = s, DelayUp = d }; hpglData.Insert(0, ss); } if (cmd.GetParamOrDefault("noinit", false)) { hpglData.RemoveAll(x => x is Initialization); } var outputType = cmd.GetParamOrDefault("output", "image").ToLowerInvariant(); switch (outputType) { case "image": { //TODO3: // colorization - add colors (SP, better gray) by position in list var outFile = cmd.GetParamOrDefault("filename", "result.png"); Console.WriteLine("Writing to bitmap {0} ({1}x{2})", outFile, width, height); var bmp = new Bitmap(width, height); var hpgl2Bmp = new Hpgl2Bmp(); hpgl2Bmp.DebugPenUp = cmd.GetParamOrDefault("showPenUp", false); hpgl2Bmp.Numbering = cmd.GetParamOrDefault("showNumbers", false); hpgl2Bmp.Process(bmp, hpglData); bmp.Save(outFile); break; } case "serial": { var sp = cmd.GetParamOrDefault("serial", "COM1,9600"); var ser = new Hpgl2SerialConsole(sp); if (cmd.GetParamOrDefault("paused", false)) ser.IsPaused = true; Console.WriteLine("Writing to serial {0},{1},{2},{3},{4}", ser.Port.PortName, ser.Port.BaudRate, ser.Port.Parity, ser.Port.DataBits, ser.Port.StopBits); ser.Proces(hpglData); break; } case "file": { var outFile = cmd.GetParamOrDefault("filename", "result.plt"); Console.WriteLine("Writing to file {0}", outFile); var f = new Hpgl2File(); f.Process(outFile, hpglData); break; } default: { throw new ArgumentOutOfRangeException("output"); } } }