diff --git a/MatterControl.Printing/Settings/SettingsHelpers.cs b/MatterControl.Printing/Settings/SettingsHelpers.cs index a6e4907b1..c2e518ca0 100644 --- a/MatterControl.Printing/Settings/SettingsHelpers.cs +++ b/MatterControl.Printing/Settings/SettingsHelpers.cs @@ -186,7 +186,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration } } - public bool HasProbeWithLevelingValidation + public bool ValidateLevelingWithProbe { get { diff --git a/MatterControlLib/ApplicationView/SettingsValidation.cs b/MatterControlLib/ApplicationView/SettingsValidation.cs index cbb26db96..41cd420cb 100644 --- a/MatterControlLib/ApplicationView/SettingsValidation.cs +++ b/MatterControlLib/ApplicationView/SettingsValidation.cs @@ -237,7 +237,7 @@ namespace MatterHackers.MatterControl && printer.Settings.Helpers.PrintLevelingData is PrintLevelingData levelingData && !levelingData.IssuedLevelingTempWarning && Math.Abs(bedTemperature - levelingData.BedTemperature) > 10 - && !printer.Settings.Helpers.HasProbeWithLevelingValidation) + && !printer.Settings.Helpers.ValidateLevelingWithProbe) { errors.Add( new ValidationError(ValidationErrors.BedLevelingTemperature) diff --git a/MatterControlLib/ConfigurationPage/PrintLeveling/LevelingPlan.cs b/MatterControlLib/ConfigurationPage/PrintLeveling/LevelingPlan.cs index 82d8d08a3..9bd6b7d9d 100644 --- a/MatterControlLib/ConfigurationPage/PrintLeveling/LevelingPlan.cs +++ b/MatterControlLib/ConfigurationPage/PrintLeveling/LevelingPlan.cs @@ -29,6 +29,7 @@ either expressed or implied, of the FreeBSD Project. using System; using System.Collections.Generic; +using System.Linq; using MatterHackers.MatterControl.SlicerConfiguration; using MatterHackers.VectorMath; @@ -72,5 +73,151 @@ namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling yield return position; } } + + public static bool NeedsToBeRun(PrinterConfig printer) + { + PrintLevelingData levelingData = printer.Settings.Helpers.PrintLevelingData; + + var required = printer.Settings.GetValue(SettingsKey.print_leveling_required_to_print); + if (required && levelingData == null) + { + // need but don't have data + return true; + } + + if (printer.Settings.GetValue(SettingsKey.has_hardware_leveling)) + { + // If printer has hardware leveling, software leveling is disabled + return false; + } + + var enabled = printer.Settings.GetValue(SettingsKey.print_leveling_enabled); + + if (enabled + && printer.Settings.GetValue(SettingsKey.has_z_probe) + && printer.Settings.GetValue(SettingsKey.use_z_probe) + && printer.Settings.GetValue(SettingsKey.validate_leveling)) + { + return false; + } + + if (printer.Settings.Helpers.ValidateLevelingWithProbe) + { + // If we are going to validate the leveling before printing we do not need to + // make the user do it as part of printer calibration. + return false; + } + + // 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; + } } } \ No newline at end of file diff --git a/MatterControlLib/ConfigurationPage/PrintLeveling/LevelingValidation.cs b/MatterControlLib/ConfigurationPage/PrintLeveling/LevelingValidation.cs deleted file mode 100644 index e0e53bc07..000000000 --- a/MatterControlLib/ConfigurationPage/PrintLeveling/LevelingValidation.cs +++ /dev/null @@ -1,182 +0,0 @@ -/* -Copyright (c) 2018, Lars Brubaker, John Lewin -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The views and conclusions contained in the software and documentation are those -of the authors and should not be interpreted as representing official policies, -either expressed or implied, of the FreeBSD Project. -*/ - -using System; -using System.Linq; -using MatterHackers.MatterControl.SlicerConfiguration; - -namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling -{ - public static class LevelingValidation - { - public static bool NeedsToBeRun(PrinterConfig printer) - { - PrintLevelingData levelingData = printer.Settings.Helpers.PrintLevelingData; - - var required = printer.Settings.GetValue(SettingsKey.print_leveling_required_to_print); - if (required && levelingData == null) - { - // need but don't have data - return true; - } - - if (printer.Settings.GetValue(SettingsKey.has_hardware_leveling)) - { - // If printer has hardware leveling, software leveling is disabled - return false; - } - - var enabled = printer.Settings.GetValue(SettingsKey.print_leveling_enabled); - - if (enabled - && printer.Settings.GetValue(SettingsKey.has_z_probe) - && printer.Settings.GetValue(SettingsKey.use_z_probe) - && printer.Settings.GetValue(SettingsKey.validate_leveling)) - { - return false; - } - - if (printer.Settings.Helpers.HasProbeWithLevelingValidation) - { - return false; - } - - // 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; - } - } -} \ No newline at end of file diff --git a/MatterControlLib/ConfigurationPage/PrintLeveling/SetupWizards/PrintLevelingWizard.cs b/MatterControlLib/ConfigurationPage/PrintLeveling/SetupWizards/PrintLevelingWizard.cs index f52ba21b2..9ca909adc 100644 --- a/MatterControlLib/ConfigurationPage/PrintLeveling/SetupWizards/PrintLevelingWizard.cs +++ b/MatterControlLib/ConfigurationPage/PrintLeveling/SetupWizards/PrintLevelingWizard.cs @@ -65,9 +65,9 @@ namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling public override bool Enabled => !hasHardwareLeveling && Visible && printer.Connection.IsConnected && !printer.Connection.Printing && !printer.Connection.Paused; - public override bool Completed => !hasHardwareLeveling && !LevelingValidation.NeedsToBeRun(printer); + public override bool Completed => !hasHardwareLeveling && !LevelingPlan.NeedsToBeRun(printer); - public override bool SetupRequired => LevelingValidation.NeedsToBeRun(printer); + public override bool SetupRequired => LevelingPlan.NeedsToBeRun(printer); private void Initialize() { diff --git a/MatterControlLib/ConfigurationPage/PrintLeveling/SetupWizards/ZCalibrationWizard.cs b/MatterControlLib/ConfigurationPage/PrintLeveling/SetupWizards/ZCalibrationWizard.cs index bdc583a9f..b5276db4e 100644 --- a/MatterControlLib/ConfigurationPage/PrintLeveling/SetupWizards/ZCalibrationWizard.cs +++ b/MatterControlLib/ConfigurationPage/PrintLeveling/SetupWizards/ZCalibrationWizard.cs @@ -150,7 +150,7 @@ namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling this, levelingStrings.HomingPageInstructions(true, false)); - if (LevelingValidation.NeedsToBeRun(printer)) + if (LevelingPlan.NeedsToBeRun(printer)) { // start heating up the bed as that will be needed next var bedTemperature = printer.Settings.GetValue(SettingsKey.has_heated_bed) ? diff --git a/MatterControlLib/Library/Export/GCodeExport.cs b/MatterControlLib/Library/Export/GCodeExport.cs index 5ae6af918..3898f09d9 100644 --- a/MatterControlLib/Library/Export/GCodeExport.cs +++ b/MatterControlLib/Library/Export/GCodeExport.cs @@ -319,7 +319,7 @@ namespace MatterHackers.MatterControl.Library.Export } if (levelingEnabled - && !LevelingValidation.NeedsToBeRun(printer)) + && !LevelingPlan.NeedsToBeRun(printer)) { accumulatedStream = new PrintLevelingStream(printer, accumulatedStream); } diff --git a/MatterControlLib/PrinterCommunication/PrinterConnection.cs b/MatterControlLib/PrinterCommunication/PrinterConnection.cs index 89b977448..96fa2c4d0 100644 --- a/MatterControlLib/PrinterCommunication/PrinterConnection.cs +++ b/MatterControlLib/PrinterCommunication/PrinterConnection.cs @@ -2360,12 +2360,12 @@ Make sure that your printer is turned on. Some printers will appear to be connec totalGCodeStream?.Dispose(); totalGCodeStream = null; GCodeStream accumulatedStream; + var doingPrintRecovery = this.RecoveryIsEnabled && ActivePrintTask != null; if (gcodeStream != null) { gCodeFileSwitcher = new GCodeSwitcher(gcodeStream, Printer); - if (this.RecoveryIsEnabled - && ActivePrintTask != null) // We are resuming a failed print (do lots of interesting stuff). + if (doingPrintRecovery) // We are resuming a failed print (do lots of interesting stuff). { accumulatedStream = new SendProgressStream(new PrintRecoveryStream(gCodeFileSwitcher, Printer, ActivePrintTask.PercentDone), Printer); // And increment the recovery count @@ -2403,12 +2403,14 @@ Make sure that your printer is turned on. Some printers will appear to be connec bool enableLineSplitting = gcodeStream != null && Printer.Settings.GetValue(SettingsKey.enable_line_splitting); accumulatedStream = maxLengthStream = new MaxLengthStream(Printer, accumulatedStream, enableLineSplitting ? 1 : 2000); - var hasProbeWithLevelingValidation = Printer.Settings.Helpers.HasProbeWithLevelingValidation; - if (!LevelingValidation.NeedsToBeRun(Printer) - || hasProbeWithLevelingValidation) + var doValidateLeveling = Printer.Settings.Helpers.ValidateLevelingWithProbe; + if (!LevelingPlan.NeedsToBeRun(Printer) + || doValidateLeveling) { - if (hasProbeWithLevelingValidation) + if (!doingPrintRecovery + && doValidateLeveling) { + // make sure we don't validate the leveling while recovering a print accumulatedStream = new ValidatePrintLevelingStream(Printer, accumulatedStream); } diff --git a/MatterControlLib/PrinterControls/ControlWidgets/PrinterCalibrationWizard.cs b/MatterControlLib/PrinterControls/ControlWidgets/PrinterCalibrationWizard.cs index 74da765f0..63cb928e4 100644 --- a/MatterControlLib/PrinterControls/ControlWidgets/PrinterCalibrationWizard.cs +++ b/MatterControlLib/PrinterControls/ControlWidgets/PrinterCalibrationWizard.cs @@ -380,7 +380,7 @@ namespace MatterHackers.MatterControl public static bool SetupRequired(PrinterConfig printer, bool requiresLoadedFilament) { return printer == null - || LevelingValidation.NeedsToBeRun(printer) // PrintLevelingWizard + || LevelingPlan.NeedsToBeRun(printer) // PrintLevelingWizard || ZCalibrationWizard.NeedsToBeRun(printer) || (requiresLoadedFilament && LoadFilamentWizard.NeedsToBeRun0(printer)) || (requiresLoadedFilament && LoadFilamentWizard.NeedsToBeRun1(printer))