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 = printer.Settings.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));
        }
Example #2
0
        public static bool NeedsToBeRun(PrinterConfig printer)
        {
            PrintLevelingData levelingData = printer.Settings.Helpers.PrintLevelingData;

            var required = printer.Settings.GetValue <bool>(SettingsKey.print_leveling_required_to_print);

            if (required && levelingData == null)
            {
                // need but don't have data
                return(true);
            }

            if (printer.Settings.GetValue <bool>(SettingsKey.has_hardware_leveling))
            {
                // If printer has hardware leveling, software leveling is disabled
                return(false);
            }

            var enabled = printer.Settings.GetValue <bool>(SettingsKey.print_leveling_enabled);

            if (enabled &&
                printer.Settings.Helpers.ProbeBeingUsed &&
                printer.Settings.GetValue <bool>(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 <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 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);
        }