using MatterHackers.MatterControl.DataStorage; using MatterHackers.MatterControl.SlicerConfiguration; using MatterHackers.VectorMath; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using System.Collections.Generic; using System; using System.Linq; namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling { [JsonConverter(typeof(StringEnumConverter))] public enum LevelingSystem { Probe3Points, Probe7PointRadial, Probe13PointRadial, Probe100PointRadial, Probe3x3Mesh, Probe5x5Mesh, Probe10x10Mesh, ProbeCustom } public class PrintLevelingData { #region JSON data public List SampledPositions = new List(); public LevelingSystem LevelingSystem; public DateTime CreationDate; public double BedTemperature; public bool IssuedLevelingTempWarning; #endregion public PrintLevelingData() { } public static bool NeedsToBeRun(PrinterConfig printer) { PrintLevelingData levelingData = printer.Settings.Helpers.GetPrintLevelingData(); var required = printer.Settings.GetValue(SettingsKey.print_leveling_required_to_print); if (required && levelingData == null) { // need but don't have data return true; } var enabled = printer.Settings.GetValue(SettingsKey.print_leveling_enabled); // check if leveling is turned on if (required && !enabled) { // need but not turned on return true; } if(!required && !enabled) { return false; } // check that there are no duplicate points var positionCounts = from x in levelingData.SampledPositions group x by x into g let count = g.Count() orderby count descending select new { Value = g.Key, Count = count }; foreach (var x in positionCounts) { if(x.Count > 1) { return true; } } // check that the solution last measured is the currently selected solution if(printer.Settings.GetValue(SettingsKey.print_leveling_solution) != levelingData.LevelingSystem) { return true; } // check that the bed temperature at probe time was close enough to the current print bed temp double requiredLevelingTemp = printer.Settings.GetValue(SettingsKey.has_heated_bed) ? printer.Settings.GetValue(SettingsKey.bed_temperature) : 0; // check that the number of points sampled is correct for the solution switch (levelingData.LevelingSystem) { case LevelingSystem.Probe3Points: if (levelingData.SampledPositions.Count != 3) // different criteria for what is not initialized { return true; } break; case LevelingSystem.Probe7PointRadial: if (levelingData.SampledPositions.Count != 7) // different criteria for what is not initialized { return true; } break; case LevelingSystem.Probe13PointRadial: if (levelingData.SampledPositions.Count != 13) // different criteria for what is not initialized { return true; } break; case LevelingSystem.Probe100PointRadial: if (levelingData.SampledPositions.Count != 100) // different criteria for what is not initialized { return true; } break; case LevelingSystem.Probe3x3Mesh: if (levelingData.SampledPositions.Count != 9) // different criteria for what is not initialized { return true; } break; case LevelingSystem.Probe5x5Mesh: if (levelingData.SampledPositions.Count != 25) // different criteria for what is not initialized { return true; } break; case LevelingSystem.Probe10x10Mesh: if (levelingData.SampledPositions.Count != 100) // different criteria for what is not initialized { return true; } break; case LevelingSystem.ProbeCustom: if (levelingData.SampledPositions.Count != LevelWizardCustom.ParseLevelingSamplePoints(printer).Count) { return true; } break; default: throw new NotImplementedException(); } return false; } public bool SamplesAreSame(List sampledPositions) { if (sampledPositions.Count == SampledPositions.Count) { for (int i = 0; i < sampledPositions.Count; i++) { if (sampledPositions[i] != SampledPositions[i]) { return false; } } return true; } return false; } } }