diff --git a/MatterControlLib/ConfigurationPage/PrintLeveling/SetupWizards/NozzleXyCalibrationWizard.cs b/MatterControlLib/ConfigurationPage/PrintLeveling/SetupWizards/XyCalibrationWizard.cs similarity index 82% rename from MatterControlLib/ConfigurationPage/PrintLeveling/SetupWizards/NozzleXyCalibrationWizard.cs rename to MatterControlLib/ConfigurationPage/PrintLeveling/SetupWizards/XyCalibrationWizard.cs index 7cdb80bfc..fd47b797b 100644 --- a/MatterControlLib/ConfigurationPage/PrintLeveling/SetupWizards/NozzleXyCalibrationWizard.cs +++ b/MatterControlLib/ConfigurationPage/PrintLeveling/SetupWizards/XyCalibrationWizard.cs @@ -29,15 +29,16 @@ either expressed or implied, of the FreeBSD Project. using System.Collections.Generic; using MatterHackers.Agg.UI; +using MatterHackers.DataConverters3D; using MatterHackers.Localizations; using MatterHackers.MatterControl.SlicerConfiguration; using MatterHackers.VectorMath; namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling { - public class NozzleXyCalibrationWizard : PrinterSetupWizard + public class XyCalibrationWizard : PrinterSetupWizard { - public NozzleXyCalibrationWizard(PrinterConfig printer) + public XyCalibrationWizard(PrinterConfig printer) : base(printer) { this.WindowTitle = $"{ApplicationController.Instance.ProductName} - " + "Nozzle Calibration Wizard".Localize(); @@ -69,18 +70,17 @@ namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling private IEnumerator GetPages() { - yield return new WizardPage( - this, - "Nozzle Offset Calibration".Localize(), - "Offset Calibration required. We'll now print a calibration guide on the printer to tune your nozzle offsets".Localize()) - { - WindowTitle = WindowTitle - }; + var xyCalibrationData = new XyCalibrationData(); - var calibrationPage = new NozzleOffsetCalibrationPrintPage(this, printer); - yield return calibrationPage; + yield return new XyCalibrationSelectPage(this, printer, xyCalibrationData); - yield return new NozzleOffsetCalibrationResultsPage(this, printer, calibrationPage.XOffset, calibrationPage.YOffset); + yield return new XyCalibrationStartPrintPage(this, printer, xyCalibrationData); } } + + public class XyCalibrationData + { + public enum QualityType { Coarse, Normal, Fine } + public QualityType Quality { get; set; } = QualityType.Normal; + } } \ No newline at end of file diff --git a/MatterControlLib/CustomWidgets/NozzleOffsetCalibrationResultsPage.cs b/MatterControlLib/CustomWidgets/NozzleOffsetCalibrationResultsPage.cs index 52d984eab..70bf78a9b 100644 --- a/MatterControlLib/CustomWidgets/NozzleOffsetCalibrationResultsPage.cs +++ b/MatterControlLib/CustomWidgets/NozzleOffsetCalibrationResultsPage.cs @@ -71,26 +71,6 @@ namespace MatterHackers.MatterControl VAnchor = VAnchor.Center, Margin = new BorderDouble(right: 10) }); - - this.NextButton.Visible = false; - - var nextButton = theme.CreateDialogButton("Finish".Localize()); - nextButton.Name = "FinishCalibration"; - nextButton.Click += (s, e) => - { - // TODO: removed fixed index - var hotendOffset = printer.Settings.Helpers.ExtruderOffset(1); - hotendOffset.X += xOffset; - hotendOffset.Y += yOffset; - - printer.Settings.Helpers.SetExtruderOffset(1, hotendOffset); - - this.DialogWindow.CloseOnIdle(); - }; - - theme.ApplyPrimaryActionStyle(nextButton); - - this.AddPageAction(nextButton); } } } diff --git a/MatterControlLib/CustomWidgets/XyCalibrationSelectPage.cs b/MatterControlLib/CustomWidgets/XyCalibrationSelectPage.cs new file mode 100644 index 000000000..df6a19ead --- /dev/null +++ b/MatterControlLib/CustomWidgets/XyCalibrationSelectPage.cs @@ -0,0 +1,154 @@ +/* +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. +*/ + +using System; +using MatterHackers.Agg.UI; +using MatterHackers.DataConverters3D; +using MatterHackers.Localizations; +using MatterHackers.MatterControl.ConfigurationPage.PrintLeveling; +using MatterHackers.MatterControl.DesignTools; +using MatterHackers.MatterControl.SlicerConfiguration; +using MatterHackers.VectorMath; + +namespace MatterHackers.MatterControl +{ + public class XyCalibrationSelectPage : WizardPage + { + private RadioButton coarseCalibration; + private RadioButton normalCalibration; + private RadioButton fineCalibration; + + public XyCalibrationSelectPage(ISetupWizard setupWizard, PrinterConfig printer, XyCalibrationData xyCalibrationData) + : base(setupWizard) + { + this.WindowTitle = "Nozzle Offset Calibration Wizard".Localize(); + this.HeaderText = "Nozzle Offset Calibration".Localize() + ":"; + this.Name = "Nozzle Offset Calibration Wizard"; + + contentRow.Padding = theme.DefaultContainerPadding; + + contentRow.AddChild(new TextWidget("Choose the calibration you would like to perform.".Localize(), textColor: theme.TextColor, pointSize: theme.DefaultFontSize) + { + Margin = new Agg.BorderDouble(0, 15, 0, 0) + }); + + 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 + }); + coarseCalibration.CheckedStateChanged += (s, e) => xyCalibrationData.Quality = XyCalibrationData.QualityType.Coarse; + contentRow.AddChild(normalCalibration = new RadioButton("Normal Calibration: Start here".Localize(), textColor: theme.TextColor, fontSize: theme.DefaultFontSize) + { + Checked = xyCalibrationData.Quality == XyCalibrationData.QualityType.Normal + }); + normalCalibration.CheckedStateChanged += (s, e) => xyCalibrationData.Quality = XyCalibrationData.QualityType.Normal; + 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 + }); + fineCalibration.CheckedStateChanged += (s, e) => xyCalibrationData.Quality = XyCalibrationData.QualityType.Fine; + } + } + + public class XyCalibrationStartPrintPage : WizardPage + { + public XyCalibrationStartPrintPage(ISetupWizard setupWizard, PrinterConfig printer, XyCalibrationData xyCalibrationData) + : base(setupWizard) + { + this.WindowTitle = "Nozzle Offset Calibration Wizard".Localize(); + this.HeaderText = "Nozzle Offset Calibration".Localize(); + this.Name = "Nozzle Offset Calibration Wizard"; + + var content = "Here is what we are going to do:".Localize(); + content += "\n\n • " + "Stash your current bed".Localize(); + content += "\n • " + "Print the calibration object".Localize(); + content += "\n • " + "Collect data".Localize(); + content += "\n • " + "Restore your current bed, after all calibration is complete".Localize(); + + contentRow.AddChild(this.CreateTextField(content)); + + contentRow.Padding = theme.DefaultContainerPadding; + + this.NextButton.Visible = false; + + var startCalibrationPrint = theme.CreateDialogButton("Start Print".Localize()); + startCalibrationPrint.Name = "Start Calibration Print"; + startCalibrationPrint.Click += (s, e) => + { + this.DialogWindow.CloseOnIdle(); + // stash the current bed + var scene = printer.Bed.Scene; + scene.Children.Modify((list) => list.Clear()); + IObject3D item = null; + // add the calibration object to the bed + switch(xyCalibrationData.Quality) + { + case XyCalibrationData.QualityType.Coarse: + item = XyCalibrationTabObject3D.Create(1, + Math.Max(printer.Settings.GetValue(SettingsKey.first_layer_height) * 2, printer.Settings.GetValue(SettingsKey.layer_height) * 2), + .5, + printer.Settings.GetValue(SettingsKey.nozzle_diameter)).GetAwaiter().GetResult(); + break; + + case XyCalibrationData.QualityType.Fine: + item = XyCalibrationFaceObject3D.Create(1, + printer.Settings.GetValue(SettingsKey.first_layer_height) * 2, + printer.Settings.GetValue(SettingsKey.layer_height), + .05, + printer.Settings.GetValue(SettingsKey.nozzle_diameter), + printer.Settings.GetValue(SettingsKey.wipe_tower_size), + 8).GetAwaiter().GetResult(); + break; + + default: + item = XyCalibrationFaceObject3D.Create(1, + printer.Settings.GetValue(SettingsKey.first_layer_height) * 2, + printer.Settings.GetValue(SettingsKey.layer_height), + .1, + printer.Settings.GetValue(SettingsKey.nozzle_diameter), + printer.Settings.GetValue(SettingsKey.wipe_tower_size), + 8).GetAwaiter().GetResult(); + break; + } + + // move the part to the center of the bed + var bedBounds = printer.Bed.Bounds; + var aabb = item.GetAxisAlignedBoundingBox(); + item.Matrix *= Matrix4X4.CreateTranslation(bedBounds.Center.X - aabb.MinXYZ.X - aabb.XSize / 2, bedBounds.Center.Y - aabb.MinXYZ.Y - aabb.YSize / 2, -aabb.MinXYZ.Z); + scene.Children.Add(item); + // switch to 3D view + // start the calibration print + }; + + theme.ApplyPrimaryActionStyle(startCalibrationPrint); + + this.AddPageAction(startCalibrationPrint); + } + } +} diff --git a/MatterControlLib/DesignTools/Primitives/XyCalibrationFaceObject3D.cs b/MatterControlLib/DesignTools/Primitives/XyCalibrationFaceObject3D.cs index 0c1d6491d..33646a5be 100644 --- a/MatterControlLib/DesignTools/Primitives/XyCalibrationFaceObject3D.cs +++ b/MatterControlLib/DesignTools/Primitives/XyCalibrationFaceObject3D.cs @@ -52,6 +52,7 @@ namespace MatterHackers.MatterControl.DesignTools [DisplayName("Material")] public int CalibrationMaterialIndex { get; set; } = 1; + public override bool CanFlatten => true; public double ChangingHeight { get; set; } = .4; public int Layers { get; set; } = 10; public double Offset { get; set; } = .5; @@ -62,7 +63,7 @@ namespace MatterHackers.MatterControl.DesignTools private double TabWidth => NozzleWidth * TabScale * 3; public static async Task Create(int calibrationMaterialIndex = 1, - double baseHeight = 1, double changingHeight = .2, double offset = .5, double nozzleWidth = .4, double wipeTowerSize = 10, int layers = 10) + double baseHeight = 1, double changingHeight = .2, double offset = .5, double nozzleWidth = .4, double wipeTowerSize = 10, int layers = 8) { var item = new XyCalibrationFaceObject3D() { @@ -123,7 +124,7 @@ namespace MatterHackers.MatterControl.DesignTools this.Children.Add(new Object3D() { Mesh = PlatonicSolids.CreateCube(), - Matrix = Matrix4X4.CreateTranslation(1 / 2.0, 1 / 2.0, 1 / 2.0) + Matrix = Matrix4X4.CreateTranslation(1 / 2.0, 1 / 2.0, 1 / 2.0) * Matrix4X4.CreateScale(WipeTowerSize, WipeTowerSize, BaseHeight + Layers * ChangingHeight) * Matrix4X4.CreateTranslation(TabDepth * 1, TabDepth * 2, 0), OutputType = PrintOutputTypes.WipeTower diff --git a/MatterControlLib/DesignTools/Primitives/XyCalibrationTabObject3D.cs b/MatterControlLib/DesignTools/Primitives/XyCalibrationTabObject3D.cs index bcc59e851..665298d5a 100644 --- a/MatterControlLib/DesignTools/Primitives/XyCalibrationTabObject3D.cs +++ b/MatterControlLib/DesignTools/Primitives/XyCalibrationTabObject3D.cs @@ -40,6 +40,8 @@ namespace MatterHackers.MatterControl.DesignTools { public class XyCalibrationTabObject3D : Object3D { + public double NozzleWidth = .4; + public XyCalibrationTabObject3D() { Name = "Calibration Tab".Localize(); @@ -47,16 +49,17 @@ namespace MatterHackers.MatterControl.DesignTools [DisplayName("Material")] public int CalibrationMaterialIndex { get; set; } = 1; + + public override bool CanFlatten => true; public double ChangeHeight { get; set; } = .4; public double Offset { get; set; } = .5; - public double NozzleWidth = .4; public double WipeTowerSize { get; set; } = 10; private double TabDepth => NozzleWidth * TabScale * 5; private double TabScale => 3; private double TabWidth => NozzleWidth * TabScale * 3; - public static async Task Create(int calibrationMaterialIndex = 1, + public static async Task Create(int calibrationMaterialIndex = 1, double changeHeight = .4, double offset = .5, double nozzleWidth = .4) { var item = new XyCalibrationTabObject3D() diff --git a/MatterControlLib/PrinterControls/ControlWidgets/CalibrationControls.cs b/MatterControlLib/PrinterControls/ControlWidgets/CalibrationControls.cs index 4027e2957..eae110f74 100644 --- a/MatterControlLib/PrinterControls/ControlWidgets/CalibrationControls.cs +++ b/MatterControlLib/PrinterControls/ControlWidgets/CalibrationControls.cs @@ -163,7 +163,7 @@ namespace MatterHackers.MatterControl.PrinterControls xyCalibrateButton.Click += (s, e) => UiThread.RunOnIdle(() => { - DialogWindow.Show(new NozzleXyCalibrationWizard(printer)); + DialogWindow.Show(new XyCalibrationWizard(printer)); }); settingsRow.BorderColor = Color.Transparent;