protected override IEnumerator <PrinterSetupWizardPage> GetWizardSteps() { var probePositions = new List <ProbePosition>(levelingPlan.ProbeCount); for (int j = 0; j < levelingPlan.ProbeCount; j++) { probePositions.Add(new ProbePosition()); } var levelingStrings = new LevelingStrings(printer.Settings); // If no leveling data has been calculated bool showWelcomeScreen = printer.Settings.Helpers.GetPrintLevelingData().SampledPositions.Count == 0 && !ProbeCalibrationWizard.UsingZProbe(printer); if (showWelcomeScreen) { yield return(new PrinterSetupWizardPage( this, levelingStrings.InitialPrinterSetupStepText, string.Format( "{0}\n\n{1}", "Congratulations on connecting to your printer. Before starting your first print we need to run a simple calibration procedure.".Localize(), "The next few screens will walk your through calibrating your printer.".Localize()))); } bool hasHeatedBed = printer.Settings.GetValue <bool>(SettingsKey.has_heated_bed); bool useZProbe = printer.Settings.Helpers.UseZProbe(); int zProbeSamples = printer.Settings.GetValue <int>(SettingsKey.z_probe_samples); var secondsPerManualSpot = 10 * 3; var secondsPerAutomaticSpot = 3 * zProbeSamples; var secondsToCompleteWizard = levelingPlan.ProbeCount * (useZProbe ? secondsPerAutomaticSpot : secondsPerManualSpot); secondsToCompleteWizard += (hasHeatedBed ? 60 * 3 : 0); yield return(new PrinterSetupWizardPage( this, "Print Leveling Overview".Localize(), levelingStrings.WelcomeText(levelingPlan.ProbeCount, (int)Math.Round(secondsToCompleteWizard / 60.0)))); yield return(new HomePrinterPage( this, "Homing The Printer".Localize(), levelingStrings.HomingPageInstructions(useZProbe, hasHeatedBed), useZProbe)); // figure out the heating requirements double targetBedTemp = 0; double targetHotendTemp = 0; if (hasHeatedBed) { targetBedTemp = printer.Settings.GetValue <double>(SettingsKey.bed_temperature); } if (!useZProbe) { targetHotendTemp = printer.Settings.Helpers.ExtruderTemperature(0); } if (targetBedTemp > 0 || targetHotendTemp > 0) { string heatingInstructions = ""; if (targetBedTemp > 0 && targetHotendTemp > 0) { // heating both the bed and the hotend heatingInstructions = "Waiting for the bed to heat to ".Localize() + targetBedTemp + "°C\n" + "and the hotend to heat to ".Localize() + targetHotendTemp + "°C.\n" + "\n" + "This will improve the accuracy of print leveling ".Localize() + "and ensure that no filament is stuck to your nozzle.".Localize() + "\n" + "\n" + "Warning! The tip of the nozzle will be HOT!".Localize() + "\n" + "Avoid contact with your skin.".Localize(); } else if (targetBedTemp > 0) { // only heating the bed heatingInstructions = "Waiting for the bed to heat to ".Localize() + targetBedTemp + "°C.\n" + "This will improve the accuracy of print leveling.".Localize(); } else // targetHotendTemp > 0 { // only heating the hotend heatingInstructions += "Waiting for the hotend to heat to ".Localize() + targetHotendTemp + "°C.\n" + "This will ensure that no filament is stuck to your nozzle.".Localize() + "\n" + "\n" + "Warning! The tip of the nozzle will be HOT!".Localize() + "\n" + "Avoid contact with your skin.".Localize(); } yield return(new WaitForTempPage( this, "Waiting For Printer To Heat".Localize(), heatingInstructions, targetBedTemp, targetHotendTemp)); } double bedRadius = Math.Min(printer.Settings.GetValue <Vector2>(SettingsKey.bed_size).X, printer.Settings.GetValue <Vector2>(SettingsKey.bed_size).Y) / 2; double startProbeHeight = printer.Settings.GetValue <double>(SettingsKey.print_leveling_probe_start); int i = 0; foreach (var goalProbePosition in levelingPlan.GetPrintLevelPositionToSample()) { var validProbePosition = EnsureInPrintBounds(printer.Settings, goalProbePosition); if (printer.Settings.Helpers.UseZProbe()) { yield return(new AutoProbeFeedback( this, new Vector3(validProbePosition, startProbeHeight), string.Format( "{0} {1} {2} - {3}", $"{"Step".Localize()} {i + 1} {"of".Localize()} {levelingPlan.ProbeCount}:", "Position".Localize(), i + 1, "Auto Calibrate".Localize()), probePositions, i)); } else { yield return(new GetCoarseBedHeight( this, new Vector3(validProbePosition, startProbeHeight), string.Format( "{0} {1} {2} - {3}", levelingStrings.GetStepString(levelingPlan.TotalSteps), "Position".Localize(), i + 1, "Low Precision".Localize()), probePositions, i, levelingStrings)); yield return(new GetFineBedHeight( this, string.Format( "{0} {1} {2} - {3}", levelingStrings.GetStepString(levelingPlan.TotalSteps), "Position".Localize(), i + 1, "Medium Precision".Localize()), probePositions, i, levelingStrings)); yield return(new GetUltraFineBedHeight( this, string.Format( "{0} {1} {2} - {3}", levelingStrings.GetStepString(levelingPlan.TotalSteps), "Position".Localize(), i + 1, "High Precision".Localize()), probePositions, i, levelingStrings)); } i++; } yield return(new LastPageInstructions( this, "Print Leveling Wizard".Localize(), useZProbe, probePositions)); }
protected override IEnumerator <WizardPage> GetPages() { var levelingStrings = new LevelingStrings(); // If no leveling data has been calculated bool showWelcomeScreen = printer.Settings.Helpers.PrintLevelingData.SampledPositions.Count == 0 && !ProbeCalibrationWizard.UsingZProbe(printer); if (showWelcomeScreen) { yield return(new WizardPage( this, "Initial Printer Setup".Localize(), string.Format( "{0}\n\n{1}", "Congratulations on connecting to your printer. Before starting your first print we need to run a simple calibration procedure.".Localize(), "The next few screens will walk your through calibrating your printer.".Localize())) { WindowTitle = Title }); } // Switch to raw mode and construct leveling structures this.Initialize(); // var probePositions = new List<ProbePosition>(Enumerable.Range(0, levelingPlan.ProbeCount).Select(p => new ProbePosition())); var probePositions = new List <ProbePosition>(levelingPlan.ProbeCount); for (int j = 0; j < levelingPlan.ProbeCount; j++) { probePositions.Add(new ProbePosition()); } bool hasHeatedBed = printer.Settings.GetValue <bool>(SettingsKey.has_heated_bed); bool useZProbe = printer.Settings.Helpers.UseZProbe(); int zProbeSamples = printer.Settings.GetValue <int>(SettingsKey.z_probe_samples); // Build welcome text for Print Leveling Overview page string buildWelcomeText() { var secondsPerManualSpot = 10 * 3; var secondsPerAutomaticSpot = 3 * zProbeSamples; var secondsToCompleteWizard = levelingPlan.ProbeCount * (useZProbe ? secondsPerAutomaticSpot : secondsPerManualSpot); secondsToCompleteWizard += (hasHeatedBed ? 60 * 3 : 0); int numberOfSteps = levelingPlan.ProbeCount; int numberOfMinutes = (int)Math.Round(secondsToCompleteWizard / 60.0); if (hasHeatedBed) { return("{0}\n\n\t• {1}\n\t• {2}\n\t• {3}\n\t• {4}\n\t• {5}\n\n{6}\n\n{7}".FormatWith( "Welcome to the print leveling wizard. Here is a quick overview on what we are going to do.".Localize(), "Select the material you are printing".Localize(), "Home the printer".Localize(), "Heat the bed".Localize(), "Sample the bed at {0} points".Localize().FormatWith(numberOfSteps), "Turn auto leveling on".Localize(), "We should be done in approximately {0} minutes.".Localize().FormatWith(numberOfMinutes), "Click 'Next' to continue.".Localize())); } else { return("{0}\n\n\t• {1}\n\t• {2}\n\t• {3}\n\n{4}\n\n{5}".FormatWith( "Welcome to the print leveling wizard. Here is a quick overview on what we are going to do.".Localize(), "Home the printer".Localize(), "Sample the bed at {0} points".Localize().FormatWith(numberOfSteps), "Turn auto leveling on".Localize(), "We should be done in approximately {0} minutes.".Localize().FormatWith(numberOfMinutes), "Click 'Next' to continue.".Localize())); } } yield return(new WizardPage( this, "Print Leveling Overview".Localize(), buildWelcomeText()) { WindowTitle = Title }); yield return(new HomePrinterPage( this, "Homing The Printer".Localize(), levelingStrings.HomingPageInstructions(useZProbe, hasHeatedBed), useZProbe)); // if there is a level_x_carriage_markdown oem markdown page if (!string.IsNullOrEmpty(printer.Settings.GetValue(SettingsKey.level_x_carriage_markdown))) { yield return(GetLevelXCarriagePage(this, printer)); } // figure out the heating requirements double targetBedTemp = 0; double targetHotendTemp = 0; if (hasHeatedBed) { targetBedTemp = printer.Settings.GetValue <double>(SettingsKey.bed_temperature); } if (!useZProbe) { targetHotendTemp = printer.Settings.Helpers.ExtruderTargetTemperature(0); } if (targetBedTemp > 0 || targetHotendTemp > 0) { string heatingInstructions = ""; if (targetBedTemp > 0 && targetHotendTemp > 0) { // heating both the bed and the hotend heatingInstructions = "Waiting for the bed to heat to ".Localize() + targetBedTemp + "°C\n" + "and the hotend to heat to ".Localize() + targetHotendTemp + "°C.\n" + "\n" + "This will improve the accuracy of print leveling ".Localize() + "and ensure that no filament is stuck to your nozzle.".Localize() + "\n" + "\n" + "Warning! The tip of the nozzle will be HOT!".Localize() + "\n" + "Avoid contact with your skin.".Localize(); } else if (targetBedTemp > 0) { // only heating the bed heatingInstructions = "Waiting for the bed to heat to ".Localize() + targetBedTemp + "°C.\n" + "This will improve the accuracy of print leveling.".Localize(); } else // targetHotendTemp > 0 { // only heating the hotend heatingInstructions += "Waiting for the hotend to heat to ".Localize() + targetHotendTemp + "°C.\n" + "This will ensure that no filament is stuck to your nozzle.".Localize() + "\n" + "\n" + "Warning! The tip of the nozzle will be HOT!".Localize() + "\n" + "Avoid contact with your skin.".Localize(); } yield return(new WaitForTempPage( this, "Waiting For Printer To Heat".Localize(), heatingInstructions, targetBedTemp, new double[] { targetHotendTemp })); } double bedRadius = Math.Min(printer.Settings.GetValue <Vector2>(SettingsKey.bed_size).X, printer.Settings.GetValue <Vector2>(SettingsKey.bed_size).Y) / 2; double startProbeHeight = printer.Settings.GetValue <double>(SettingsKey.print_leveling_probe_start); int i = 0; var probePoints = levelingPlan.GetPrintLevelPositionToSample().ToList(); AutoProbePage autoProbePage = null; if (printer.Settings.Helpers.UseZProbe()) { autoProbePage = new AutoProbePage(this, printer, "Bed Detection", probePoints, probePositions); yield return(autoProbePage); } else { foreach (var goalProbePoint in probePoints) { if (wizardExited) { // Make sure when the wizard is done we turn off the bed heating printer.Connection.TurnOffBedAndExtruders(TurnOff.AfterDelay); if (printer.Settings.GetValue <bool>(SettingsKey.z_homes_to_max)) { printer.Connection.HomeAxis(PrinterConnection.Axis.XYZ); } yield break; } var validProbePosition = EnsureInPrintBounds(printer, goalProbePoint); { yield return(new GetCoarseBedHeight( this, new Vector3(validProbePosition, startProbeHeight), string.Format( "{0} {1} {2} - {3}", levelingStrings.GetStepString(levelingPlan.TotalSteps), "Position".Localize(), i + 1, "Low Precision".Localize()), probePositions, i, levelingStrings)); yield return(new GetFineBedHeight( this, string.Format( "{0} {1} {2} - {3}", levelingStrings.GetStepString(levelingPlan.TotalSteps), "Position".Localize(), i + 1, "Medium Precision".Localize()), probePositions, i, levelingStrings)); yield return(new GetUltraFineBedHeight( this, string.Format( "{0} {1} {2} - {3}", levelingStrings.GetStepString(levelingPlan.TotalSteps), "Position".Localize(), i + 1, "High Precision".Localize()), probePositions, i, levelingStrings)); } i++; } } // if we are not using a z-probe, reset the baby stepping at the successful conclusion of leveling if (!printer.Settings.GetValue <bool>(SettingsKey.use_z_probe)) { // clear the baby stepping so we don't save the old values babySteppingValue = 0; } yield return(new LastPageInstructions( this, "Print Leveling Wizard".Localize(), useZProbe, probePositions)); }