public void ShowPosition() { GrblViewModel model = (GrblViewModel)DataContext; Machine.ToolPosition = null; positionPoints.Clear(); if (Machine.Limits.X == 0d) { Machine.SetLimits(GrblSettings.GetDouble(GrblSetting.AxisSetting_XMaxTravel), GrblSettings.GetDouble(GrblSetting.AxisSetting_YMaxTravel), GrblSettings.GetDouble(GrblSetting.AxisSetting_ZMaxTravel)); } positionPoints.Add(new Point3D(Math.Min(model.Position.X, model.ProgramLimits.MinX) - 5d, model.Position.Y, model.Position.Z)); positionPoints.Add(new Point3D(Machine.Limits.X, model.Position.Y, model.Position.Z)); positionPoints.Add(new Point3D(model.Position.X, Math.Min(model.Position.Y, model.ProgramLimits.MinY) - 5d, model.Position.Z)); positionPoints.Add(new Point3D(model.Position.X, Machine.Limits.Y, model.Position.Z)); positionPoints.Add(new Point3D(model.Position.X, model.Position.Y, Math.Min(model.Position.Z, model.ProgramLimits.MinZ) - 5d)); positionPoints.Add(new Point3D(model.Position.X, model.Position.Y, Machine.Limits.Z)); Machine.ToolPosition = positionPoints; var orgpos = Machine.StartPosition; Machine.SetStartPosition(model.Position.X, model.Position.Y, model.Position.Z); if (Machine.RapidLines != null && Machine.RapidLines.Count > 0 && Machine.RapidLines[0].Equals(orgpos)) { Machine.RapidLines.RemoveAt(0); Machine.RapidLines.Insert(0, Machine.StartPosition); } }
// Configure to match Grbl settings (if loaded) public bool Config(Config config) { bool useFirmwareJog = false; if (GrblSettings.Loaded) { double val; if ((useFirmwareJog = !(val = GrblSettings.GetDouble(GrblSetting.JogStepDistance)).Equals(double.NaN))) { jogDistance[(int)JogMode.Step] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogSlowDistance)).Equals(double.NaN)) { jogDistance[(int)JogMode.Slow] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogFastDistance)).Equals(double.NaN)) { jogDistance[(int)JogMode.Fast] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogStepSpeed)).Equals(double.NaN)) { jogSpeed[(int)JogMode.Step] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogSlowSpeed)).Equals(double.NaN)) { jogSpeed[(int)JogMode.Slow] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogFastSpeed)).Equals(double.NaN)) { jogSpeed[(int)JogMode.Fast] = val; } model.IsMetric = GrblSettings.GetString(GrblSetting.ReportInches) != "1"; } if (!useFirmwareJog) { jogDistance[(int)JogMode.Step] = config.Jog.StepDistance; jogDistance[(int)JogMode.Slow] = config.Jog.SlowDistance; jogDistance[(int)JogMode.Fast] = config.Jog.SlowDistance; jogSpeed[(int)JogMode.Step] = config.Jog.StepFeedrate; jogSpeed[(int)JogMode.Slow] = config.Jog.SlowFeedrate; jogSpeed[(int)JogMode.Fast] = config.Jog.FastFeedrate; } GCodeParser.IgnoreM6 = config.IgnoreM6; GCodeParser.IgnoreM7 = config.IgnoreM7; GCodeParser.IgnoreM8 = config.IgnoreM8; useBuffering = config.UseBuffering && GrblSettings.IsGrblHAL; return(GrblSettings.Loaded); }
public KeypressHandler(GrblViewModel model) { grbl = model; bool useFirmwareJog = false; if (GrblSettings.IsLoaded) { double val; if ((useFirmwareJog = !(val = GrblSettings.GetDouble(GrblSetting.JogStepDistance)).Equals(double.NaN))) { jogDistance[(int)JogMode.Step] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogSlowDistance)).Equals(double.NaN)) { jogDistance[(int)JogMode.Slow] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogFastDistance)).Equals(double.NaN)) { jogDistance[(int)JogMode.Fast] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogStepSpeed)).Equals(double.NaN)) { jogSpeed[(int)JogMode.Step] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogSlowSpeed)).Equals(double.NaN)) { jogSpeed[(int)JogMode.Slow] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogFastSpeed)).Equals(double.NaN)) { jogSpeed[(int)JogMode.Fast] = val; } model.IsMetric = GrblSettings.GetString(GrblSetting.ReportInches) != "1"; } if (!useFirmwareJog) { model.JogStep = jogDistance[(int)JogMode.Step] = AppConfig.Settings.Jog.StepDistance; jogDistance[(int)JogMode.Slow] = AppConfig.Settings.Jog.SlowDistance; jogDistance[(int)JogMode.Fast] = AppConfig.Settings.Jog.SlowDistance; jogSpeed[(int)JogMode.Step] = AppConfig.Settings.Jog.StepFeedrate; jogSpeed[(int)JogMode.Slow] = AppConfig.Settings.Jog.SlowFeedrate; jogSpeed[(int)JogMode.Fast] = AppConfig.Settings.Jog.FastFeedrate; } fullJog = AppConfig.Settings.Jog.KeyboardEnable || GrblSettings.IsGrblHAL; }
public void ShowPosition() { GrblViewModel model = (GrblViewModel)DataContext; foreach (var path in position) { viewport.Children.Remove(path); } position.Clear(); double maxX = GrblSettings.GetDouble(GrblSetting.AxisSetting_XMaxTravel); double maxY = GrblSettings.GetDouble(GrblSetting.AxisSetting_YMaxTravel); double maxZ = GrblSettings.GetDouble(GrblSetting.AxisSetting_ZMaxTravel); var positionX = new LinesVisual3D(); positionX.Color = Colors.Green; positionX.Thickness = 1; positionX.Points.Add(new Point3D(model.ProgramLimits.MinX - 5d, model.Position.Y, model.Position.Z)); positionX.Points.Add(new Point3D(maxX, model.Position.Y, model.Position.Z)); position.Add(positionX); var positionY = new LinesVisual3D(); positionY.Color = Colors.Green; positionY.Thickness = 1; positionY.Points.Add(new Point3D(model.Position.X, model.ProgramLimits.MinY - 5d, model.Position.Z)); positionY.Points.Add(new Point3D(model.Position.X, maxY, model.Position.Z)); position.Add(positionY); var positionZ = new LinesVisual3D(); positionZ.Color = Colors.Green; positionZ.Thickness = 1; positionZ.Points.Add(new Point3D(model.Position.X, model.Position.Y, model.ProgramLimits.MinZ - 5d)); positionZ.Points.Add(new Point3D(model.Position.X, model.Position.Y, maxZ)); position.Add(positionZ); foreach (var path in position) { viewport.Children.Add(path); } }
public KeypressHandler(GrblViewModel model) { grbl = model; bool useFirmwareJog = false; if (GrblSettings.IsLoaded) { double val; if ((useFirmwareJog = !(val = GrblSettings.GetDouble(GrblSetting.JogStepDistance)).Equals(double.NaN))) { jogDistance[(int)JogMode.Step] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogSlowDistance)).Equals(double.NaN)) { jogDistance[(int)JogMode.Slow] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogFastDistance)).Equals(double.NaN)) { jogDistance[(int)JogMode.Fast] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogStepSpeed)).Equals(double.NaN)) { jogSpeed[(int)JogMode.Step] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogSlowSpeed)).Equals(double.NaN)) { jogSpeed[(int)JogMode.Slow] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogFastSpeed)).Equals(double.NaN)) { jogSpeed[(int)JogMode.Fast] = val; } fullJog = GrblSettings.IsGrblHAL; model.IsMetric = GrblSettings.GetString(GrblSetting.ReportInches) != "1"; } if (!useFirmwareJog) { AppConfig.Settings.Jog.PropertyChanged += Jog_PropertyChanged; updateConfig(); } }
// Configure to match Grbl settings (if loaded) public bool Config() { if (GrblSettings.Loaded) { double val; if (!(val = GrblSettings.GetDouble(GrblSetting.JogStepDistance)).Equals(double.NaN)) { jogDistance[(int)JogMode.Step] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogSlowDistance)).Equals(double.NaN)) { jogDistance[(int)JogMode.Slow] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogFastDistance)).Equals(double.NaN)) { jogDistance[(int)JogMode.Fast] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogStepSpeed)).Equals(double.NaN)) { jogSpeed[(int)JogMode.Step] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogSlowSpeed)).Equals(double.NaN)) { jogSpeed[(int)JogMode.Slow] = val; } if (!(val = GrblSettings.GetDouble(GrblSetting.JogFastSpeed)).Equals(double.NaN)) { jogSpeed[(int)JogMode.Fast] = val; } if (GrblSettings.GetString(GrblSetting.ReportInches) == "1") { model.Unit = "in"; model.Format = GrblConstants.FORMAT_IMPERIAL; } } return(GrblSettings.Loaded); }
public bool Update() { if (GrblSettings.IsLoaded) { XMaxFeedRate = GrblSettings.GetDouble(GrblSetting.AxisSetting_XMaxRate); XAcceleration = GrblSettings.GetDouble(GrblSetting.AxisSetting_XAcceleration); ZMaxFeedRate = GrblSettings.GetDouble(GrblSetting.AxisSetting_ZMaxRate); ZAcceleration = GrblSettings.GetDouble(GrblSetting.AxisSetting_ZAcceleration); RpmMin = GrblSettings.GetDouble(GrblSetting.RpmMin); RpmMax = GrblSettings.GetDouble(GrblSetting.RpmMax); GrblParserState.Get(); if (!xmodelock) { xmode = GrblParserState.LatheMode; } SetLimits(); } return(GrblSettings.IsLoaded); }
public bool Update() { if (GrblSettings.IsLoaded) { XMaxFeedRate = GrblSettings.GetDouble(GrblSetting.MaxFeedRateBase); XAcceleration = GrblSettings.GetDouble(GrblSetting.AccelerationBase); ZMaxFeedRate = GrblSettings.GetDouble(GrblSetting.MaxFeedRateBase + GrblConstants.Z_AXIS); ZAcceleration = GrblSettings.GetDouble(GrblSetting.AccelerationBase + GrblConstants.Z_AXIS); RpmMin = GrblSettings.GetDouble(GrblSetting.RpmMin); RpmMax = GrblSettings.GetDouble(GrblSetting.RpmMax); GrblParserState.Get(); if (!xmodelock) { xmode = GrblParserState.LatheMode; } SetLimits(); } return(GrblSettings.IsLoaded); }
public bool LoadFile(CNC.Controls.GCode job, string filename) { bool ok = true; this.job = job; if (filename.EndsWith("Edge_Cuts.plt") || filename.EndsWith("Paste.plt")) { isCut = !filename.EndsWith("Paste.plt"); } else { isCut = (GrblMode)GrblSettings.GetDouble(GrblSetting.Mode) != GrblMode.Laser; } settings.EnableToolSelection = true; settings.Profile = "HPGL" + (isCut ? "" : "Laser"); if (new JobParametersDialog(settings) { Owner = Application.Current.MainWindow }.ShowDialog() != true) { return(false); } FileInfo file = new FileInfo(filename); StreamReader sr = file.OpenText(); using (new UIUtils.WaitCursor()) { string s = sr.ReadLine(); while (s != null) { foreach (string cmd in s.Split(';')) { try { switch (cmd.Substring(0, 2)) { case "PM": if ((inPolygon = dbl.Parse(cmd.Substring(2)) == 0d)) { pm0.Clear(); HPGLCommand hpgl = new HPGLCommand(); hpgl.Command = commands.Last().Command; hpgl.Pos.X = commands.Last().Pos.X; hpgl.Pos.Y = commands.Last().Pos.Y; pm0.Add(hpgl); } else if (pm0.Count > 0) { Polygon polygon; toVectors(pm0); if ((polygon = Polygon.findPolygon(vectors, tolerance)) != null) { polygons.Add(polygon); } } break; case "PT": scaleFix = 0.025d; break; case "PA": { var args = cmd.Substring(2).Split(','); if (args.Length > 1) { HPGLCommand hpgl = new HPGLCommand(); hpgl.Command = cmd.Substring(0, 2); hpgl.Pos.X = dbl.Parse(args[0]) * scaleFix; hpgl.Pos.Y = dbl.Parse(args[1]) * scaleFix; offset.X = Math.Min(offset.X, hpgl.Pos.X); offset.Y = Math.Min(offset.Y, hpgl.Pos.Y); if (inPolygon) { pm0.Add(hpgl); } else { commands.Add(hpgl); } } } break; case "AA": { var args = cmd.Substring(2).Split(','); if (args.Length > 2) { HPGLCommand hpgl = new HPGLCommand(); hpgl.Command = cmd.Substring(0, 2); hpgl.Pos.X = dbl.Parse(args[0]) * scaleFix; hpgl.Pos.Y = dbl.Parse(args[1]) * scaleFix; hpgl.R = dbl.Parse(args[2]) * scaleFix; offset.X = Math.Min(offset.X, hpgl.Pos.X); offset.Y = Math.Min(offset.Y, hpgl.Pos.Y); if (inPolygon) { pm0.Add(hpgl); } else { commands.Add(hpgl); } } } break; case "PD": case "PU": { HPGLCommand hpgl = new HPGLCommand(); hpgl.Command = cmd.Substring(0, 2); if (inPolygon) { pm0.Add(hpgl); } else { isDown = hpgl.Command == "PD"; commands.Add(hpgl); } } break; default: { HPGLCommand hpgl = new HPGLCommand(); hpgl.Command = cmd.Substring(0, 2); commands.Add(hpgl); } break; } } catch { } } s = sr.ReadLine(); } sr.Close(); for (int i = 0; i < commands.Count; i++) { var cmd = commands[i]; try { switch (cmd.Command) { case "IN": pos.X = cmd.Pos.X = 0d; pos.Y = cmd.Pos.Y = 0d; isDown = cmd.isDown = false; break; case "PU": if (isDown) { cmd.Pos.X = pos.X; cmd.Pos.Y = pos.Y; isDown = false; } break; case "PD": if (!isDown) { cmd.Pos.X = pos.X; cmd.Pos.Y = pos.Y; isDown = true; } break; case "PA": cmd.Pos.X -= offset.X; cmd.Pos.Y -= offset.Y; if ((cmd.isDown = isDown)) { var v = new Vector(); v.IsArc = false; v.Start = pos; v.End.X = cmd.Pos.X; v.End.Y = cmd.Pos.Y; vectors.Add(v); } break; case "AA": { cmd.Pos.X = cmd.Pos.X - offset.X; cmd.Pos.Y = cmd.Pos.Y - offset.X; if ((cmd.isDown = isDown)) { var v = new Vector(); v.IsArc = true; v.Start = pos; v.End.X = cmd.Pos.X + (cmd.Pos.X - pos.X); v.End.Y = cmd.Pos.Y + (cmd.Pos.Y - pos.Y); vectors.Add(v); } } break; } pos.X = cmd.Pos.X; pos.Y = cmd.Pos.Y; } catch { } } { Polygon polygon; while ((polygon = Polygon.findPolygon(vectors, tolerance)) != null) { polygons.Add(polygon); } } job.AddBlock(filename, CNC.Core.Action.New); job.AddBlock("(Translated by HPGL to GCode converter)"); job.AddBlock(string.Format("(Tool diameter: {0} mm)", settings.ToolDiameter.ToInvariantString())); job.AddBlock("G90G91.1G17G21G50"); if (settings.ScaleX != 1d || settings.ScaleY != 1d) { job.AddBlock(string.Format("G51X{0}Y{1}", settings.ScaleX.ToInvariantString(), settings.ScaleY.ToInvariantString())); } job.AddBlock("G0Z" + settings.ZRapids.ToInvariantString()); job.AddBlock("X0Y0"); if (isCut) { job.AddBlock(string.Format("M3S{0}", settings.RPM.ToInvariantString())); job.AddBlock("G4P2"); } else { job.AddBlock("M122P1"); // Enable laser job.AddBlock("M123P800"); // PPI job.AddBlock("M124P1500"); // Pulse width job.AddBlock("M125Q1P2"); // Enable tube coolant job.AddBlock("M4S90"); job.AddBlock("M7"); job.AddBlock("M8"); } foreach (var polygon in polygons) { if (settings.ToolDiameter != 0d) { polygon.Offset((isCut ? -settings.ToolDiameter : settings.ToolDiameter) / 2d); } cutPolygon(polygon); } job.AddBlock("G0X0Y0Z" + settings.ZHome.ToInvariantString()); job.AddBlock("M30", CNC.Core.Action.End); } return(ok); }
public void Apply() { double arcTolerance = GrblSettings.GetDouble(GrblSetting.ArcTolerance); GCodeEmulator emu = new GCodeEmulator(); List <GCodeToken> toolPath = new List <GCodeToken>(); uint lnr = 0, lnroffset = 0; using (new UIUtils.WaitCursor()) { toolPath.Add(new GCComment(Commands.Comment, 0, "Arcs to lines transform applied")); foreach (var cmd in emu.Execute(GCode.File.Tokens)) { switch (cmd.Token.Command) { case Commands.G2: case Commands.G3: { var arc = cmd.Token as GCArc; lnroffset++; lnr = arc.LineNumber; toolPath.Add(new GCComment(Commands.Comment, arc.LineNumber + lnroffset, "Arc to lines start: " + arc.ToString())); List <Point3D> points = arc.GeneratePoints(emu.Plane, ToPos(cmd.Start, emu.IsImperial), arcTolerance, emu.DistanceMode == DistanceMode.Incremental); // Dynamic resolution foreach (Point3D point in points) { lnroffset++; toolPath.Add(new GCLinearMotion(Commands.G1, arc.LineNumber + lnroffset, ToPos(point, emu.IsImperial), AxisFlags.XYZ)); } lnroffset++; toolPath.Add(new GCComment(Commands.Comment, arc.LineNumber + lnroffset, "Arc to lines end")); } break; case Commands.G5: { var spline = cmd.Token as GCSpline; lnroffset++; lnr = spline.LineNumber; toolPath.Add(new GCComment(Commands.Comment, spline.LineNumber + lnroffset, "Spline to lines start: " + spline.ToString())); List <Point3D> points = spline.GeneratePoints(ToPos(cmd.Start, emu.IsImperial), arcTolerance, emu.DistanceMode == DistanceMode.Incremental); // Dynamic resolution foreach (Point3D point in points) { lnroffset++; toolPath.Add(new GCLinearMotion(Commands.G1, spline.LineNumber + lnroffset, ToPos(point, emu.IsImperial), AxisFlags.XYZ)); } lnroffset++; toolPath.Add(new GCComment(Commands.Comment, lnr, "Spline to lines end")); } break; default: cmd.Token.LineNumber += lnroffset; toolPath.Add(cmd.Token); lnr = cmd.Token.LineNumber; break; } } List <string> gc = GCodeParser.TokensToGCode(toolPath, AppConfig.Settings.Base.AutoCompress); GCode.File.AddBlock(string.Format("Arcs to lines transform applied: {0}", GCode.File.Model.FileName), Core.Action.New); foreach (string block in gc) { GCode.File.AddBlock(block, Core.Action.Add); } GCode.File.AddBlock("", Core.Action.End); } }
private void JogControl_Loaded(object sender, RoutedEventArgs e) { if (DataContext is GrblViewModel) { mode = GrblSettings.GetInteger(GrblSetting.ReportInches) == 0 ? "G21" : "G20"; softLimits = !(GrblInfo.IsGrblHAL && GrblSettings.GetInteger(grblHALSetting.SoftLimitJogging) == 1) && GrblSettings.GetInteger(GrblSetting.SoftLimitsEnable) == 1; limitSwitchesClearance = GrblSettings.GetDouble(GrblSetting.HomingPulloff); JogData.SetMetric(mode == "G21"); if (!keyboardMappingsOk) { if (!GrblInfo.HasFirmwareJog || AppConfig.Settings.Jog.LinkStepJogToUI) { JogData.PropertyChanged += JogData_PropertyChanged; } if (softLimits) { (DataContext as GrblViewModel).PropertyChanged += Model_PropertyChanged; } keyboard = (DataContext as GrblViewModel).Keyboard; keyboardMappingsOk = true; if (AppConfig.Settings.Jog.Mode == JogConfig.JogMode.UI) { keyboard.AddHandler(Key.PageUp, ModifierKeys.None, cursorKeyJog, false); keyboard.AddHandler(Key.PageDown, ModifierKeys.None, cursorKeyJog, false); keyboard.AddHandler(Key.Left, ModifierKeys.None, cursorKeyJog, false); keyboard.AddHandler(Key.Up, ModifierKeys.None, cursorKeyJog, false); keyboard.AddHandler(Key.Right, ModifierKeys.None, cursorKeyJog, false); keyboard.AddHandler(Key.Down, ModifierKeys.None, cursorKeyJog, false); } keyboard.AddHandler(xplus, ModifierKeys.Control | ModifierKeys.Shift, normalKeyJog, false); keyboard.AddHandler(xminus, ModifierKeys.Control | ModifierKeys.Shift, normalKeyJog, false); keyboard.AddHandler(yplus, ModifierKeys.Control | ModifierKeys.Shift, normalKeyJog, false); keyboard.AddHandler(yminus, ModifierKeys.Control | ModifierKeys.Shift, normalKeyJog, false); keyboard.AddHandler(zplus, ModifierKeys.Control | ModifierKeys.Shift, normalKeyJog, false); keyboard.AddHandler(zminus, ModifierKeys.Control | ModifierKeys.Shift, normalKeyJog, false); if (GrblInfo.AxisFlags.HasFlag(AxisFlags.A)) { keyboard.AddHandler(aplus, ModifierKeys.Control | ModifierKeys.Shift, normalKeyJog, false); keyboard.AddHandler(aminus, ModifierKeys.Control | ModifierKeys.Shift, normalKeyJog, false); } if (AppConfig.Settings.Jog.Mode != JogConfig.JogMode.Keypad) { keyboard.AddHandler(Key.End, ModifierKeys.None, endJog, false); keyboard.AddHandler(Key.NumPad0, ModifierKeys.Control, adjustJog); keyboard.AddHandler(Key.NumPad1, ModifierKeys.Control, adjustJog); keyboard.AddHandler(Key.NumPad2, ModifierKeys.Control, adjustJog); keyboard.AddHandler(Key.NumPad3, ModifierKeys.Control, adjustJog); keyboard.AddHandler(Key.NumPad4, ModifierKeys.Control, adjustJog); keyboard.AddHandler(Key.NumPad5, ModifierKeys.Control, adjustJog); keyboard.AddHandler(Key.NumPad6, ModifierKeys.Control, adjustJog); keyboard.AddHandler(Key.NumPad7, ModifierKeys.Control, adjustJog); keyboard.AddHandler(Key.NumPad2, ModifierKeys.None, adjustJog2); keyboard.AddHandler(Key.NumPad4, ModifierKeys.None, adjustJog2); keyboard.AddHandler(Key.NumPad6, ModifierKeys.None, adjustJog2); keyboard.AddHandler(Key.NumPad8, ModifierKeys.None, adjustJog2); } } } }