Consolidate XYCalibrationData into XYCalibrationWizard

- Type acts as state for wizard, simplify by unifying into one
This commit is contained in:
jlewin 2019-03-26 11:48:29 -07:00
parent 5e7811b2fd
commit a71c19e0c9
6 changed files with 85 additions and 134 deletions

View file

@ -1,53 +0,0 @@
/*
Copyright (c) 2019, 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.
*/
namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling
{
public class XyCalibrationData
{
public enum QualityType { Coarse, Normal, Fine }
public XyCalibrationData(int extruderToCalibrateIndex)
{
this.ExtruderToCalibrateIndex = extruderToCalibrateIndex;
}
public int ExtruderToCalibrateIndex { get; }
public QualityType Quality { get; set; } = QualityType.Normal;
/// <summary>
/// The index of the calibration print that was picked
/// </summary>
public int XPick { get; set; } = -1;
public int YPick { get; set; } = -1;
public double Offset { get; set; } = .1;
public bool PrintAgain { get; set; }
}
}

View file

@ -37,16 +37,29 @@ namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling
{
public class XyCalibrationWizard : PrinterSetupWizard
{
private int extruderToCalibrateIndex;
public XyCalibrationWizard(PrinterConfig printer, int extruderToCalibrateIndex)
: base(printer)
{
this.extruderToCalibrateIndex = extruderToCalibrateIndex;
this.ExtruderToCalibrateIndex = extruderToCalibrateIndex;
this.Title = "Nozzle Calibration".Localize();
this.WindowSize = new Vector2(600 * GuiWidget.DeviceScale, 700 * GuiWidget.DeviceScale);
}
public enum QualityType { Coarse, Normal, Fine }
public int ExtruderToCalibrateIndex { get; }
public QualityType Quality { get; set; } = QualityType.Normal;
/// <summary>
/// The index of the calibration print that was picked
/// </summary>
public int XPick { get; set; } = -1;
public int YPick { get; set; } = -1;
public double Offset { get; set; } = .1;
public bool PrintAgain { get; set; }
public override bool SetupRequired => NeedsToBeRun(printer);
public override bool Visible => printer.Settings.GetValue<int>(SettingsKey.extruder_count) > 1;
@ -71,19 +84,17 @@ namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling
protected override IEnumerator<WizardPage> GetPages()
{
var wizardState = new XyCalibrationData(extruderToCalibrateIndex);
yield return new XyCalibrationSelectPage(this, printer, wizardState);
yield return new XyCalibrationStartPrintPage(this, printer, wizardState);
yield return new XyCalibrationCollectDataPage(this, printer, wizardState);
yield return new XyCalibrationDataRecieved(this, printer, wizardState);
yield return new XyCalibrationSelectPage(this, printer);
yield return new XyCalibrationStartPrintPage(this, printer);
yield return new XyCalibrationCollectDataPage(this, printer);
yield return new XyCalibrationDataRecieved(this, printer);
// loop until we are done calibrating
while (wizardState.PrintAgain)
while (this.PrintAgain)
{
yield return new XyCalibrationStartPrintPage(this, printer, wizardState);
yield return new XyCalibrationCollectDataPage(this, printer, wizardState);
yield return new XyCalibrationDataRecieved(this, printer, wizardState);
yield return new XyCalibrationStartPrintPage(this, printer);
yield return new XyCalibrationCollectDataPage(this, printer);
yield return new XyCalibrationDataRecieved(this, printer);
}
}
}

View file

@ -38,15 +38,15 @@ namespace MatterHackers.MatterControl
public class XyCalibrationCollectDataPage : WizardPage
{
private List<RadioButton> xButtons;
private XyCalibrationData xyCalibrationData;
private List<RadioButton> yButtons;
private bool HaveWrittenData = false;
private bool pageCanceled;
private XyCalibrationWizard calibrationWizard;
public XyCalibrationCollectDataPage(ISetupWizard setupWizard, PrinterConfig printer, XyCalibrationData xyCalibrationData)
: base(setupWizard)
public XyCalibrationCollectDataPage(XyCalibrationWizard calibrationWizard, PrinterConfig printer)
: base(calibrationWizard)
{
this.xyCalibrationData = xyCalibrationData;
this.calibrationWizard = calibrationWizard;
this.WindowTitle = "Nozzle Offset Calibration Wizard".Localize();
this.HeaderText = "Nozzle Offset Calibration".Localize() + ":";
this.Name = "Nozzle Offset Calibration Wizard";
@ -58,7 +58,7 @@ namespace MatterHackers.MatterControl
Margin = new Agg.BorderDouble(0, 15, 0, 0)
});
// disable the next button until we recieve data about both the x and y axis alignment
// disable the next button until we receive data about both the x and y axis alignment
NextButton.Enabled = false;
var xButtonsGroup = new FlowLayoutWidget(FlowDirection.TopToBottom)
@ -122,14 +122,14 @@ namespace MatterHackers.MatterControl
// save the offsets to the extruder
if (!pageCanceled
&& !HaveWrittenData
&& xyCalibrationData.XPick != -1
&& xyCalibrationData.YPick != -1)
&& calibrationWizard.XPick != -1
&& calibrationWizard.YPick != -1)
{
var hotendOffset = printer.Settings.Helpers.ExtruderOffset(xyCalibrationData.ExtruderToCalibrateIndex);
hotendOffset.X -= xyCalibrationData.Offset * -3 + xyCalibrationData.Offset * xyCalibrationData.XPick;
hotendOffset.Y -= xyCalibrationData.Offset * -3 + xyCalibrationData.Offset * xyCalibrationData.YPick;
var hotendOffset = printer.Settings.Helpers.ExtruderOffset(calibrationWizard.ExtruderToCalibrateIndex);
hotendOffset.X -= calibrationWizard.Offset * -3 + calibrationWizard.Offset * calibrationWizard.XPick;
hotendOffset.Y -= calibrationWizard.Offset * -3 + calibrationWizard.Offset * calibrationWizard.YPick;
printer.Settings.Helpers.SetExtruderOffset(xyCalibrationData.ExtruderToCalibrateIndex, hotendOffset);
printer.Settings.Helpers.SetExtruderOffset(calibrationWizard.ExtruderToCalibrateIndex, hotendOffset);
HaveWrittenData = true;
}
@ -138,8 +138,8 @@ namespace MatterHackers.MatterControl
private void CheckIfCanAdvance()
{
if (xyCalibrationData.YPick != -1
&& xyCalibrationData.XPick != -1)
if (calibrationWizard.YPick != -1
&& calibrationWizard.XPick != -1)
{
NextButton.Enabled = true;
}
@ -152,7 +152,7 @@ namespace MatterHackers.MatterControl
{
if (button == sender)
{
xyCalibrationData.XPick = i;
calibrationWizard.XPick = i;
break;
}
i++;
@ -167,7 +167,7 @@ namespace MatterHackers.MatterControl
{
if (button == sender)
{
xyCalibrationData.YPick = i;
calibrationWizard.YPick = i;
break;
}
i++;

View file

@ -31,13 +31,14 @@ using MatterHackers.Agg.UI;
using MatterHackers.Localizations;
using MatterHackers.MatterControl.ConfigurationPage.PrintLeveling;
using MatterHackers.MatterControl.SlicerConfiguration;
using static MatterHackers.MatterControl.ConfigurationPage.PrintLeveling.XyCalibrationWizard;
namespace MatterHackers.MatterControl
{
public class XyCalibrationDataRecieved : WizardPage
{
public XyCalibrationDataRecieved(ISetupWizard setupWizard, PrinterConfig printer, XyCalibrationData xyCalibrationData)
: base(setupWizard)
public XyCalibrationDataRecieved(XyCalibrationWizard calibrationWizard, PrinterConfig printer)
: base(calibrationWizard)
{
this.WindowTitle = "Nozzle Offset Calibration Wizard".Localize();
this.HeaderText = "Nozzle Offset Calibration".Localize() + ":";
@ -45,13 +46,13 @@ namespace MatterHackers.MatterControl
contentRow.Padding = theme.DefaultContainerPadding;
xyCalibrationData.PrintAgain = false;
calibrationWizard.PrintAgain = false;
// check if we picked an outside of the calibration
if (xyCalibrationData.XPick == 0
|| xyCalibrationData.XPick == 6
|| xyCalibrationData.YPick == 0
|| xyCalibrationData.YPick == 6)
if (calibrationWizard.XPick == 0
|| calibrationWizard.XPick == 6
|| calibrationWizard.YPick == 0
|| calibrationWizard.YPick == 6)
{
// offer to re-run the calibration with the same settings as last time
contentRow.AddChild(new TextWidget("Your printer has been adjusted but we need to run calibrating again to improve accuracy.".Localize(), textColor: theme.TextColor, pointSize: theme.DefaultFontSize)
@ -59,13 +60,13 @@ namespace MatterHackers.MatterControl
Margin = new Agg.BorderDouble(0, 15, 0, 0)
});
xyCalibrationData.PrintAgain = true;
calibrationWizard.PrintAgain = true;
}
else
{
switch (xyCalibrationData.Quality)
switch (calibrationWizard.Quality)
{
case XyCalibrationData.QualityType.Coarse:
case QualityType.Coarse:
// if we are on coarse calibration offer to move down to normal
contentRow.AddChild(new TextWidget("Coarse calibration complete, we will now do a normal calibration to improve accuracy.".Localize(), textColor: theme.TextColor, pointSize: theme.DefaultFontSize)
{
@ -73,11 +74,11 @@ namespace MatterHackers.MatterControl
});
// switch to normal calibration
xyCalibrationData.Quality = XyCalibrationData.QualityType.Normal;
xyCalibrationData.PrintAgain = true;
calibrationWizard.Quality = QualityType.Normal;
calibrationWizard.PrintAgain = true;
break;
case XyCalibrationData.QualityType.Normal:
case QualityType.Normal:
// let the user know they are done with calibration, but if they would like they can print a fine calibration for even better results
// add a button to request fine calibration
var normalMessage = "Your nozzles should now be calibrated.".Localize();
@ -93,15 +94,15 @@ namespace MatterHackers.MatterControl
startFineCalibratingButton.Click += (s, e) =>
{
// switch to fine
xyCalibrationData.Quality = XyCalibrationData.QualityType.Fine;
calibrationWizard.Quality = QualityType.Fine;
// start up at the print window
xyCalibrationData.PrintAgain = true;
calibrationWizard.PrintAgain = true;
this.NextButton.InvokeClick();
};
contentRow.AddChild(startFineCalibratingButton);
break;
case XyCalibrationData.QualityType.Fine:
case QualityType.Fine:
// done!
contentRow.AddChild(new TextWidget("Offset Calibration complete.".Localize(), textColor: theme.TextColor, pointSize: theme.DefaultFontSize)
{
@ -111,7 +112,7 @@ namespace MatterHackers.MatterControl
}
}
if (!xyCalibrationData.PrintAgain)
if (!calibrationWizard.PrintAgain)
{
// this is the last page of the wizard hide the next button
this.NextButton.Visible = false;

View file

@ -27,11 +27,11 @@ of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project.
*/
using System.Collections.Generic;
using MatterHackers.Agg.UI;
using MatterHackers.Localizations;
using MatterHackers.MatterControl.ConfigurationPage.PrintLeveling;
using MatterHackers.MatterControl.SlicerConfiguration;
using static MatterHackers.MatterControl.ConfigurationPage.PrintLeveling.XyCalibrationWizard;
namespace MatterHackers.MatterControl
{
@ -41,8 +41,8 @@ namespace MatterHackers.MatterControl
private RadioButton normalCalibration;
private RadioButton fineCalibration;
public XyCalibrationSelectPage(ISetupWizard setupWizard, PrinterConfig printer, XyCalibrationData xyCalibrationData)
: base(setupWizard)
public XyCalibrationSelectPage(XyCalibrationWizard calibrationWizard, PrinterConfig printer)
: base(calibrationWizard)
{
this.WindowTitle = "Nozzle Offset Calibration Wizard".Localize();
this.HeaderText = "Nozzle Offset Calibration".Localize() + ":";
@ -50,7 +50,7 @@ namespace MatterHackers.MatterControl
contentRow.Padding = theme.DefaultContainerPadding;
// default to normal offset
xyCalibrationData.Offset = printer.Settings.GetValue<double>(SettingsKey.nozzle_diameter) / 3.0;
calibrationWizard.Offset = printer.Settings.GetValue<double>(SettingsKey.nozzle_diameter) / 3.0;
contentRow.AddChild(new TextWidget("Choose the calibration you would like to perform.".Localize(), textColor: theme.TextColor, pointSize: theme.DefaultFontSize)
{
@ -59,30 +59,30 @@ namespace MatterHackers.MatterControl
contentRow.AddChild(coarseCalibration = new RadioButton("Coarse Calibration: If your printer is way off".Localize(), textColor: theme.TextColor, fontSize: theme.DefaultFontSize)
{
Checked = xyCalibrationData.Quality == XyCalibrationData.QualityType.Coarse
Checked = calibrationWizard.Quality == QualityType.Coarse
});
coarseCalibration.CheckedStateChanged += (s, e) =>
{
xyCalibrationData.Quality = XyCalibrationData.QualityType.Coarse;
xyCalibrationData.Offset = printer.Settings.GetValue<double>(SettingsKey.nozzle_diameter);
calibrationWizard.Quality = QualityType.Coarse;
calibrationWizard.Offset = printer.Settings.GetValue<double>(SettingsKey.nozzle_diameter);
};
contentRow.AddChild(normalCalibration = new RadioButton("Normal Calibration: Start here".Localize(), textColor: theme.TextColor, fontSize: theme.DefaultFontSize)
{
Checked = xyCalibrationData.Quality == XyCalibrationData.QualityType.Normal
Checked = calibrationWizard.Quality == QualityType.Normal
});
normalCalibration.CheckedStateChanged += (s, e) =>
{
xyCalibrationData.Quality = XyCalibrationData.QualityType.Normal;
xyCalibrationData.Offset = printer.Settings.GetValue<double>(SettingsKey.nozzle_diameter) / 3.0;
calibrationWizard.Quality = QualityType.Normal;
calibrationWizard.Offset = printer.Settings.GetValue<double>(SettingsKey.nozzle_diameter) / 3.0;
};
contentRow.AddChild(fineCalibration = new RadioButton("Fine Calibration: When you want that extra precision".Localize(), textColor: theme.TextColor, fontSize: theme.DefaultFontSize)
{
Checked = xyCalibrationData.Quality == XyCalibrationData.QualityType.Fine
Checked = calibrationWizard.Quality == QualityType.Fine
});
fineCalibration.CheckedStateChanged += (s, e) =>
{
xyCalibrationData.Quality = XyCalibrationData.QualityType.Fine;
xyCalibrationData.Offset = printer.Settings.GetValue<double>(SettingsKey.nozzle_diameter) / 9.0;
calibrationWizard.Quality = QualityType.Fine;
calibrationWizard.Offset = printer.Settings.GetValue<double>(SettingsKey.nozzle_diameter) / 9.0;
};
}
}

View file

@ -37,17 +37,15 @@ using MatterHackers.MatterControl.Library;
using MatterHackers.MatterControl.PrinterCommunication;
using MatterHackers.MatterControl.SlicerConfiguration;
using MatterHackers.VectorMath;
using static MatterHackers.MatterControl.ConfigurationPage.PrintLeveling.XyCalibrationWizard;
namespace MatterHackers.MatterControl
{
public class XyCalibrationStartPrintPage : WizardPage
{
private XyCalibrationData xyCalibrationData;
public XyCalibrationStartPrintPage(ISetupWizard setupWizard, PrinterConfig printer, XyCalibrationData xyCalibrationData)
: base(setupWizard)
public XyCalibrationStartPrintPage(XyCalibrationWizard calibrationWizard, PrinterConfig printer)
: base(calibrationWizard)
{
this.xyCalibrationData = xyCalibrationData;
this.WindowTitle = "Nozzle Offset Calibration Wizard".Localize();
this.HeaderText = "Nozzle Offset Calibration".Localize();
this.Name = "Nozzle Offset Calibration Wizard";
@ -71,7 +69,7 @@ namespace MatterHackers.MatterControl
var scene = new Object3D();
// create the calibration objects
IObject3D item = CreateCalibrationObject(printer, xyCalibrationData);
IObject3D item = CreateCalibrationObject(printer, calibrationWizard);
// add the calibration object to the bed
scene.Children.Add(item);
@ -162,33 +160,27 @@ namespace MatterHackers.MatterControl
RestoreBedAndClearPrinterCallbacks();
}
private static IObject3D CreateCalibrationObject(PrinterConfig printer, XyCalibrationData xyCalibrationData)
private static IObject3D CreateCalibrationObject(PrinterConfig printer, XyCalibrationWizard calibrationWizard)
{
IObject3D item;
var layerHeight = printer.Settings.GetValue<double>(SettingsKey.layer_height);
switch (xyCalibrationData.Quality)
{
case XyCalibrationData.QualityType.Coarse:
item = XyCalibrationTabObject3D.Create(1,
Math.Max(printer.Settings.GetValue<double>(SettingsKey.first_layer_height) * 2, layerHeight * 2),
xyCalibrationData.Offset,
printer.Settings.GetValue<double>(SettingsKey.nozzle_diameter)).GetAwaiter().GetResult();
break;
case XyCalibrationData.QualityType.Normal:
case XyCalibrationData.QualityType.Fine:
switch (calibrationWizard.Quality)
{
case QualityType.Coarse:
return XyCalibrationTabObject3D.Create(1,
Math.Max(printer.Settings.GetValue<double>(SettingsKey.first_layer_height) * 2, layerHeight * 2),
calibrationWizard.Offset,
printer.Settings.GetValue<double>(SettingsKey.nozzle_diameter)).GetAwaiter().GetResult();
default:
item = XyCalibrationFaceObject3D.Create(1,
return XyCalibrationFaceObject3D.Create(1,
printer.Settings.GetValue<double>(SettingsKey.first_layer_height) + layerHeight,
layerHeight,
xyCalibrationData.Offset,
calibrationWizard.Offset,
printer.Settings.GetValue<double>(SettingsKey.nozzle_diameter),
printer.Settings.GetValue<double>(SettingsKey.wipe_tower_size),
6).GetAwaiter().GetResult();
break;
}
return item;
}
}
}