mattercontrol/ConfigurationPage/PrintLeveling/PrintLevelingData.cs
Lars Brubaker 64648e1ed7 Adding in the ability to specify custom leveling probe positions
issue: MatterHackers/MCCentral#4048
Allow custom probing positions for bed leveling
2018-08-27 14:58:34 -07:00

169 lines
No EOL
4.5 KiB
C#

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<Vector3> SampledPositions = new List<Vector3>();
public LevelingSystem LevelingSystem;
public DateTime CreationDate;
public double BedTemperature;
#endregion
public PrintLevelingData()
{
}
public static bool NeedsToBeRun(PrinterConfig printer)
{
PrintLevelingData levelingData = printer.Settings.Helpers.GetPrintLevelingData();
var required = printer.Settings.GetValue<bool>(SettingsKey.print_leveling_required_to_print);
if (required && levelingData == null)
{
// need but don't have data
return true;
}
var enabled = ActiveSliceSettings.Instance.GetValue<bool>(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<LevelingSystem>(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<bool>(SettingsKey.has_heated_bed) ?
printer.Settings.GetValue<double>(SettingsKey.bed_temperature)
: 0;
// check that it is within 10 degrees
if(Math.Abs(requiredLevelingTemp - levelingData.BedTemperature) > 10)
{
return true;
}
// 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();
}
// All the above need to pass, as well as all rules defined in ProbeCalibrationWizard - any variance and we need to re-run
return ProbeCalibrationWizard.NeedsToBeRun(printer);
}
public bool SamplesAreSame(List<Vector3> 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;
}
}
}