public static bool SetupRequired(PrinterConfig printer, bool requiresLoadedFilament)
 {
     return(printer == null ||
            LevelingPlan.NeedsToBeRun(printer) ||              // PrintLevelingWizard
            ZCalibrationWizard.NeedsToBeRun(printer) ||
            (requiresLoadedFilament && LoadFilamentWizard.NeedsToBeRun0(printer)) ||
            (requiresLoadedFilament && LoadFilamentWizard.NeedsToBeRun1(printer)) ||
            XyCalibrationWizard.NeedsToBeRun(printer));
 }
        private void SetupForValidation()
        {
            validationRunning = true;
            activeProbeIndex  = 0;

            printer.Connection.LineReceived += GetZProbeHeight;

            printer.Settings.ForTools <double>(SettingsKey.baby_step_z_offset, (key, value, i) =>
            {
                // remember the current baby stepping values
                babySteppingValue[i] = value;
                // clear them while we measure the offsets
                printer.Settings.SetValue(key, "0");
            });

            // turn off print leveling
            printer.Connection.AllowLeveling = false;

            var levelingData = new PrintLevelingData()
            {
                LevelingSystem = printer.Settings.GetValue <LevelingSystem>(SettingsKey.print_leveling_solution)
            };

            switch (levelingData.LevelingSystem)
            {
            case LevelingSystem.Probe3Points:
                levelingPlan = new LevelWizard3Point(printer);
                break;

            case LevelingSystem.Probe7PointRadial:
                levelingPlan = new LevelWizard7PointRadial(printer);
                break;

            case LevelingSystem.Probe13PointRadial:
                levelingPlan = new LevelWizard13PointRadial(printer);
                break;

            case LevelingSystem.Probe100PointRadial:
                levelingPlan = new LevelWizard100PointRadial(printer);
                break;

            case LevelingSystem.Probe3x3Mesh:
                levelingPlan = new LevelWizardMesh(printer, 3, 3);
                break;

            case LevelingSystem.Probe5x5Mesh:
                levelingPlan = new LevelWizardMesh(printer, 5, 5);
                break;

            case LevelingSystem.Probe10x10Mesh:
                levelingPlan = new LevelWizardMesh(printer, 10, 10);
                break;

            case LevelingSystem.ProbeCustom:
                levelingPlan = new LevelWizardCustom(printer);
                break;

            default:
                throw new NotImplementedException();
            }

            sampledPositions = new List <PrintLevelingWizard.ProbePosition>(levelingPlan.ProbeCount);
            for (int j = 0; j < levelingPlan.ProbeCount; j++)
            {
                sampledPositions.Add(new PrintLevelingWizard.ProbePosition());
            }

            positionsToSample = levelingPlan.GetPositionsToSample(printer.Connection.HomingPosition).ToList();

            StartReporting();
        }