From 774452c509646e9f9485c8ec2cf0613eb9da852c Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Fri, 25 Mar 2022 11:10:03 -0700 Subject: [PATCH 1/3] fix spelling error --- .../Settings/SliceSettingData.cs | 2 +- .../Settings/SliceSettingsFields.cs | 14 +++++++------- MatterControl.Printing/Settings/ValidationError.cs | 2 +- .../ApplicationView/SettingsValidation.cs | 4 ++-- .../SlicerConfiguration/SliceSettingsWidget.cs | 4 ++-- ...leOrIncompatable.cs => DoubleOrIncompatible.cs} | 4 ++-- Submodules/agg-sharp | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) rename MatterControlLib/SlicerConfiguration/UIFields/{DoubleOrIncompatable.cs => DoubleOrIncompatible.cs} (95%) diff --git a/MatterControl.Printing/Settings/SliceSettingData.cs b/MatterControl.Printing/Settings/SliceSettingData.cs index 4bc31f18c..94fb1a977 100644 --- a/MatterControl.Printing/Settings/SliceSettingData.cs +++ b/MatterControl.Printing/Settings/SliceSettingData.cs @@ -63,7 +63,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration OFFSET, OFFSET3, POSITIVE_DOUBLE, - POSITIVE_DOUBLE_OR_INCOMPATABLE, + POSITIVE_DOUBLE_OR_INCOMPATIBLE, READONLY_STRING, SLICE_ENGINE, STRING, diff --git a/MatterControl.Printing/Settings/SliceSettingsFields.cs b/MatterControl.Printing/Settings/SliceSettingsFields.cs index c574991e3..82a4158ee 100644 --- a/MatterControl.Printing/Settings/SliceSettingsFields.cs +++ b/MatterControl.Printing/Settings/SliceSettingsFields.cs @@ -140,7 +140,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration SlicerConfigName = SettingsKey.bed_temperature_blue_tape, PresentationName = "Blue Tape Bed Temperature".Localize(), HelpText = "The temperature to print when the bed is coverd with blue tape. Set to 0 to disable or 'NC' if Not Compatible.".Localize(), - DataEditType = DataEditTypes.POSITIVE_DOUBLE_OR_INCOMPATABLE, + DataEditType = DataEditTypes.POSITIVE_DOUBLE_OR_INCOMPATIBLE, Units = "°C".Localize(), Show = (settings) => settings.GetBool(SettingsKey.has_heated_bed) && settings.GetBool(SettingsKey.has_swappable_bed), @@ -151,7 +151,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration SlicerConfigName = SettingsKey.bed_temperature_buildtak, PresentationName = "BuildTak Bed Temperature".Localize(), HelpText = "The temperature to print when the bed is using BuildTak. Set to 0 to disable or 'NC' if Not Compatible.".Localize(), - DataEditType = DataEditTypes.POSITIVE_DOUBLE_OR_INCOMPATABLE, + DataEditType = DataEditTypes.POSITIVE_DOUBLE_OR_INCOMPATIBLE, Units = "°C".Localize(), Show = (settings) => settings.GetBool(SettingsKey.has_heated_bed) && settings.GetBool(SettingsKey.has_swappable_bed), @@ -162,7 +162,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration SlicerConfigName = SettingsKey.bed_temperature_garolite, PresentationName = "Garolite Bed Temperature".Localize(), HelpText = "The temperature to print when the bed is using garolite. Set to 0 to disable or 'NC' if Not Compatible.".Localize(), - DataEditType = DataEditTypes.POSITIVE_DOUBLE_OR_INCOMPATABLE, + DataEditType = DataEditTypes.POSITIVE_DOUBLE_OR_INCOMPATIBLE, Units = "°C".Localize(), Show = (settings) => settings.GetBool(SettingsKey.has_heated_bed) && settings.GetBool(SettingsKey.has_swappable_bed), @@ -173,7 +173,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration SlicerConfigName = SettingsKey.bed_temperature_glass, PresentationName = "Glass Bed Temperature".Localize(), HelpText = "The temperature to print when the bed is using glass. Set to 0 to disable or 'NC' if Not Compatible.".Localize(), - DataEditType = DataEditTypes.POSITIVE_DOUBLE_OR_INCOMPATABLE, + DataEditType = DataEditTypes.POSITIVE_DOUBLE_OR_INCOMPATIBLE, Units = "°C".Localize(), Show = (settings) => settings.GetBool(SettingsKey.has_heated_bed) && settings.GetBool(SettingsKey.has_swappable_bed), @@ -184,7 +184,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration SlicerConfigName = SettingsKey.bed_temperature_kapton, PresentationName = "Kapton Bed Temperature".Localize(), HelpText = "The temperature to print when the bed is coverd in kapton tape. Set to 0 to disable or 'NC' if Not Compatible.".Localize(), - DataEditType = DataEditTypes.POSITIVE_DOUBLE_OR_INCOMPATABLE, + DataEditType = DataEditTypes.POSITIVE_DOUBLE_OR_INCOMPATIBLE, Units = "°C".Localize(), Show = (settings) => settings.GetBool(SettingsKey.has_heated_bed) && settings.GetBool(SettingsKey.has_swappable_bed), @@ -195,7 +195,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration SlicerConfigName = SettingsKey.bed_temperature_pei, PresentationName = "PEI Bed Temperature".Localize(), HelpText = "The temperature to print when the bed is using PEI. Set to 0 to disable or 'NC' if Not Compatible.".Localize(), - DataEditType = DataEditTypes.POSITIVE_DOUBLE_OR_INCOMPATABLE, + DataEditType = DataEditTypes.POSITIVE_DOUBLE_OR_INCOMPATIBLE, Units = "°C".Localize(), Show = (settings) => settings.GetBool(SettingsKey.has_heated_bed) && settings.GetBool(SettingsKey.has_swappable_bed), @@ -206,7 +206,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration SlicerConfigName = SettingsKey.bed_temperature_pp, PresentationName = "Polypropylene Bed Temperature".Localize(), HelpText = "The temperature to print when the bed is polypropylene. Set to 0 to disable or 'NC' if Not Compatible.".Localize(), - DataEditType = DataEditTypes.POSITIVE_DOUBLE_OR_INCOMPATABLE, + DataEditType = DataEditTypes.POSITIVE_DOUBLE_OR_INCOMPATIBLE, Units = "°C".Localize(), Show = (settings) => settings.GetBool(SettingsKey.has_heated_bed) && settings.GetBool(SettingsKey.has_swappable_bed), diff --git a/MatterControl.Printing/Settings/ValidationError.cs b/MatterControl.Printing/Settings/ValidationError.cs index f5aeab25b..71d980424 100644 --- a/MatterControl.Printing/Settings/ValidationError.cs +++ b/MatterControl.Printing/Settings/ValidationError.cs @@ -63,7 +63,7 @@ namespace MatterHackers.MatterControl public static readonly string BedLevelingTemperature = nameof(BedLevelingTemperature); public static readonly string BedSurfaceNotSelected = nameof(BedSurfaceNotSelected); public static readonly string ExceptionDuringSliceSettingsValidation = nameof(ExceptionDuringSliceSettingsValidation); - public static readonly string IncompatableBedSurfaceAndMaterial = nameof(IncompatableBedSurfaceAndMaterial); + public static readonly string IncompatibleBedSurfaceAndMaterial = nameof(IncompatibleBedSurfaceAndMaterial); public static readonly string ItemCannotBeExported = nameof(ItemCannotBeExported); public static readonly string ItemToAMFExportInvalid = nameof(ItemToAMFExportInvalid); public static readonly string ItemToSTLExportInvalid = nameof(ItemToSTLExportInvalid); diff --git a/MatterControlLib/ApplicationView/SettingsValidation.cs b/MatterControlLib/ApplicationView/SettingsValidation.cs index 488c59253..c12bf4564 100644 --- a/MatterControlLib/ApplicationView/SettingsValidation.cs +++ b/MatterControlLib/ApplicationView/SettingsValidation.cs @@ -614,9 +614,9 @@ namespace MatterHackers.MatterControl && settings.GetValue(SettingsKey.bed_surface) != "Default" && settings.GetValue(printer.Settings.Helpers.ActiveBedTemperatureSetting) == "NC") { - errors.Add(new ValidationError(ValidationErrors.IncompatableBedSurfaceAndMaterial) + errors.Add(new ValidationError(ValidationErrors.IncompatibleBedSurfaceAndMaterial) { - Error = "Selected Material and Bed Surface are Incompatable".Localize(), + Error = "Selected Material and Bed Surface are Incompatible".Localize(), Details = "The 'Material' you have selected is incompatible with the 'Bed Surface' you have selected. You may get poor bed adhesion or printing results. Changing the 'Bed Surface' is recommended. You can change it in the 'Bed Temperature' menu on the top right of your screen.".Localize(), ErrorLevel = ValidationErrorLevel.Warning, }); diff --git a/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs b/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs index 39e104658..a2d612419 100644 --- a/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs +++ b/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs @@ -683,8 +683,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration uiField = new DoubleOrPercentField(theme); break; - case SliceSettingData.DataEditTypes.POSITIVE_DOUBLE_OR_INCOMPATABLE: - uiField = new DoubleOrIncompatable(theme); + case SliceSettingData.DataEditTypes.POSITIVE_DOUBLE_OR_INCOMPATIBLE: + uiField = new DoubleOrIncompatible(theme); break; case SliceSettingData.DataEditTypes.INT_OR_MM: diff --git a/MatterControlLib/SlicerConfiguration/UIFields/DoubleOrIncompatable.cs b/MatterControlLib/SlicerConfiguration/UIFields/DoubleOrIncompatible.cs similarity index 95% rename from MatterControlLib/SlicerConfiguration/UIFields/DoubleOrIncompatable.cs rename to MatterControlLib/SlicerConfiguration/UIFields/DoubleOrIncompatible.cs index 96ccadf23..99287926c 100644 --- a/MatterControlLib/SlicerConfiguration/UIFields/DoubleOrIncompatable.cs +++ b/MatterControlLib/SlicerConfiguration/UIFields/DoubleOrIncompatible.cs @@ -31,9 +31,9 @@ using System; namespace MatterHackers.MatterControl.SlicerConfiguration { - public class DoubleOrIncompatable : TextField + public class DoubleOrIncompatible : TextField { - public DoubleOrIncompatable(ThemeConfig theme) + public DoubleOrIncompatible(ThemeConfig theme) : base(theme) { } diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index dec590da7..b5824a230 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit dec590da7530f63c5bbaea1ff75eacc78b34a994 +Subproject commit b5824a2309f04f710250bd75dfb2f5cfada5a7bc From d5fd0fabbbe1b0c9261033ca816061a024ad5e5d Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Fri, 25 Mar 2022 19:25:04 -0700 Subject: [PATCH 2/3] added in a max printing speed setting --- .../AsPercentOfReferenceOrDirect.cs | 2 +- .../MappingClasses/ClampToMinValue.cs | 60 ++++ .../Settings/PrinterSettings.cs | 2 + .../Settings/SettingsKey.cs | 1 + .../Settings/SliceSettingsFields.cs | 37 ++- .../Settings/SliceSettingsLayouts.cs | 4 + .../ApplicationView/SettingsValidation.cs | 260 +++++++++--------- .../SliceSettingsWidget.cs | 3 - StaticData/Translations/Master.txt | 12 + 9 files changed, 234 insertions(+), 147 deletions(-) create mode 100644 MatterControl.Printing/MappingClasses/ClampToMinValue.cs diff --git a/MatterControl.Printing/MappingClasses/AsPercentOfReferenceOrDirect.cs b/MatterControl.Printing/MappingClasses/AsPercentOfReferenceOrDirect.cs index 646e4618e..2377226b1 100644 --- a/MatterControl.Printing/MappingClasses/AsPercentOfReferenceOrDirect.cs +++ b/MatterControl.Printing/MappingClasses/AsPercentOfReferenceOrDirect.cs @@ -29,7 +29,7 @@ either expressed or implied, of the FreeBSD Project. namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { - public class AsPercentOfReferenceOrDirect : ValueConverter + public class AsPercentOfReferenceOrDirect : ValueConverter { private readonly bool change0ToReference; private readonly double scale; diff --git a/MatterControl.Printing/MappingClasses/ClampToMinValue.cs b/MatterControl.Printing/MappingClasses/ClampToMinValue.cs new file mode 100644 index 000000000..692e98f57 --- /dev/null +++ b/MatterControl.Printing/MappingClasses/ClampToMinValue.cs @@ -0,0 +1,60 @@ +/* +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; + +namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses +{ + public class ClampToMinValue : ValueConverter + { + private ValueConverter valueConverter; + + public ClampToMinValue(string referencedSetting, ValueConverter valueConverter) + { + this.valueConverter = valueConverter; + this.ReferencedSetting = referencedSetting; + } + + public string ReferencedSetting { get; } + + public override string Convert(string value, PrinterSettings settings) + { + var maxValue = ParseDouble(settings.GetValue(this.ReferencedSetting)); + + var convertedValue = valueConverter.Convert(value, settings); + if (maxValue > 0) + { + var valueDouble = ParseDouble(convertedValue); + return Math.Min(maxValue, valueDouble).ToString(); + } + + return convertedValue; + } + } +} \ No newline at end of file diff --git a/MatterControl.Printing/Settings/PrinterSettings.cs b/MatterControl.Printing/Settings/PrinterSettings.cs index cc06e9f0b..afb2bed09 100644 --- a/MatterControl.Printing/Settings/PrinterSettings.cs +++ b/MatterControl.Printing/Settings/PrinterSettings.cs @@ -170,6 +170,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration SettingsKey.material_color_2, SettingsKey.material_color_3, SettingsKey.material_sku, + SettingsKey.max_print_speed, SettingsKey.measure_probe_offset_conductively, SettingsKey.model, SettingsKey.number_of_first_layers, @@ -242,6 +243,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration SettingsKey.support_material_speed, SettingsKey.travel_speed, SettingsKey.load_filament_speed, + SettingsKey.max_print_speed, }; private PrinterSettingsLayer _baseLayer; diff --git a/MatterControl.Printing/Settings/SettingsKey.cs b/MatterControl.Printing/Settings/SettingsKey.cs index 9011c7f62..e3a62d5b8 100644 --- a/MatterControl.Printing/Settings/SettingsKey.cs +++ b/MatterControl.Printing/Settings/SettingsKey.cs @@ -168,6 +168,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration public const string max_acceleration = nameof(max_acceleration); public const string max_fan_speed = nameof(max_fan_speed); public const string max_fan_speed_layer_time = nameof(max_fan_speed_layer_time); + public const string max_print_speed = nameof(max_print_speed); public const string max_velocity = nameof(max_velocity); public const string measure_probe_offset_conductively = nameof(measure_probe_offset_conductively); public const string merge_overlapping_lines = nameof(merge_overlapping_lines); diff --git a/MatterControl.Printing/Settings/SliceSettingsFields.cs b/MatterControl.Printing/Settings/SliceSettingsFields.cs index 82a4158ee..828dc09be 100644 --- a/MatterControl.Printing/Settings/SliceSettingsFields.cs +++ b/MatterControl.Printing/Settings/SliceSettingsFields.cs @@ -481,7 +481,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "mm/s".Localize(), DefaultValue = "3", - Converter = new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed), + Converter = new ClampToMinValue(SettingsKey.max_print_speed, new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed)), }, new SliceSettingData() { @@ -492,7 +492,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration RequiredDisplayDetail = DisplayDetailRequired.Advanced, Units = "mm/s".Localize(), DefaultValue = "15", - Converter = new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed), + Converter = new ClampToMinValue(SettingsKey.max_print_speed, new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed)), }, new SliceSettingData() { @@ -502,7 +502,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, Units = "mm/s or %".Localize(), DefaultValue = "0", - Converter = new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed), + Converter = new ClampToMinValue(SettingsKey.max_print_speed, new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed)), }, new SliceSettingData() { @@ -612,7 +612,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration RequiredDisplayDetail = DisplayDetailRequired.Advanced, Units = "mm/s or %".Localize(), DefaultValue = "100%", - Converter = new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed), + Converter = new ClampToMinValue(SettingsKey.max_print_speed, new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed)), }, new SliceSettingData() { @@ -642,7 +642,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, Units = "mm/s or %".Localize(), DefaultValue = "70%", - Converter = new AsPercentOfReferenceOrDirect(SettingsKey.perimeter_speed), + Converter = new ClampToMinValue(SettingsKey.max_print_speed, new AsPercentOfReferenceOrDirect(SettingsKey.perimeter_speed)), }, new SliceSettingData() { @@ -870,7 +870,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, Units = "mm/s or %".Localize(), DefaultValue = "30%", - Converter = new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed), + Converter = new ClampToMinValue(SettingsKey.max_print_speed, new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed)), }, new SliceSettingData() { @@ -1160,7 +1160,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "mm/s".Localize(), DefaultValue = "60", - Converter = new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed), + Converter = new ClampToMinValue(SettingsKey.max_print_speed, new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed)), }, new SliceSettingData() { @@ -1642,6 +1642,17 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "mm/s".Localize(), DefaultValue = "10", + Converter = new ClampToMinValue(SettingsKey.max_print_speed, new ValueConverter()), + }, + new SliceSettingData() + { + SlicerConfigName = SettingsKey.max_print_speed, + PresentationName = "Maximum Print Speed".Localize(), + HelpText = "The maximum speed the printer will extrude filament. All extrusion speeds will be clamped to this amount. Set to 0 to have no effect.".Localize(), + DataEditType = DataEditTypes.POSITIVE_DOUBLE, + Units = "mm/s".Localize(), + RequiredDisplayDetail = DisplayDetailRequired.Advanced, + DefaultValue = "0", Converter = new ValueConverter(), }, new SliceSettingData() @@ -1750,7 +1761,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "mm/s".Localize(), DefaultValue = "30", - Converter = new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed), + Converter = new ClampToMinValue(SettingsKey.max_print_speed, new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed)), }, new SliceSettingData() { @@ -2070,7 +2081,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, Units = "mm/s or %".Localize(), DefaultValue = "30", - Converter = new AsPercentOfReferenceOrDirect(SettingsKey.perimeter_speed) + Converter = new ClampToMinValue(SettingsKey.max_print_speed, new AsPercentOfReferenceOrDirect(SettingsKey.perimeter_speed)) }, new SliceSettingData() { @@ -2090,7 +2101,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, Units = "mm/s or %".Localize(), DefaultValue = "60", - Converter = new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed) + Converter = new ClampToMinValue(SettingsKey.max_print_speed, new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed)) }, new SliceSettingData() { @@ -2329,7 +2340,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "mm/s".Localize(), DefaultValue = "60", - Converter = new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed), + Converter = new ClampToMinValue(SettingsKey.max_print_speed, new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed)), }, new SliceSettingData() { @@ -2339,7 +2350,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "mm/s".Localize(), DefaultValue = "60", - Converter = new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed), + Converter = new ClampToMinValue(SettingsKey.max_print_speed, new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed)), }, new SliceSettingData() { @@ -2623,7 +2634,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, Units = "mm/s or %".Localize(), DefaultValue = "50", - Converter = new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed), + Converter = new ClampToMinValue(SettingsKey.max_print_speed, new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed)), }, new SliceSettingData() { diff --git a/MatterControl.Printing/Settings/SliceSettingsLayouts.cs b/MatterControl.Printing/Settings/SliceSettingsLayouts.cs index 92162c75a..d5c58b347 100644 --- a/MatterControl.Printing/Settings/SliceSettingsLayouts.cs +++ b/MatterControl.Printing/Settings/SliceSettingsLayouts.cs @@ -133,6 +133,10 @@ namespace MatterHackers.MatterControl.SlicerConfiguration SettingsKey.bridge_over_infill, SettingsKey.t1_extrusion_move_speed_multiplier, }), + ("Speed Overrides", new [] + { + SettingsKey.max_print_speed, + }), ("Cooling", new[] { SettingsKey.slowdown_below_layer_time, diff --git a/MatterControlLib/ApplicationView/SettingsValidation.cs b/MatterControlLib/ApplicationView/SettingsValidation.cs index c12bf4564..6932de9d5 100644 --- a/MatterControlLib/ApplicationView/SettingsValidation.cs +++ b/MatterControlLib/ApplicationView/SettingsValidation.cs @@ -48,21 +48,21 @@ namespace MatterHackers.MatterControl /// /// The printer to validate. /// A list of all warnings and errors. - public static List ValidateSettings(this PrinterConfig printer, SettingsContext settings = null, bool validatePrintBed = true) + public static List ValidateSettings(this PrinterConfig printer, SettingsContext settingsContext = null, bool validatePrintBed = true) { var fffPrinter = printer.Settings.Slicer.PrinterType == PrinterType.FFF; - if (settings == null) + if (settingsContext == null) { - settings = new SettingsContext(printer, null, NamedSettingsLayers.All); + settingsContext = new SettingsContext(printer, null, NamedSettingsLayers.All); } var errors = new List(); - var extruderCount = settings.GetValue(SettingsKey.extruder_count); + var extruderCount = settingsContext.GetValue(SettingsKey.extruder_count); // Check to see if supports are required - if (!settings.GetValue(SettingsKey.create_per_layer_support)) + if (!settingsContext.GetValue(SettingsKey.create_per_layer_support)) { var supportGenerator = new SupportGenerator(printer.Bed.Scene, .05); if (supportGenerator.RequiresSupport()) @@ -90,7 +90,7 @@ namespace MatterHackers.MatterControl } } - if (!settings.GetValue(SettingsKey.extruder_offset)) + if (!settingsContext.GetValue(SettingsKey.extruder_offset)) { var t0Offset = printer.Settings.Helpers.ExtruderOffset(0); if (t0Offset != Vector3.Zero) @@ -101,9 +101,9 @@ namespace MatterHackers.MatterControl Error = "Nozzle 1 should have offsets set to 0.".Localize(), ValueDetails = "{0} = {1}\n{2} = {3}".FormatWith( GetSettingsName(SettingsKey.extruder_offset), - settings.GetValue(SettingsKey.extruder_offset), + settingsContext.GetValue(SettingsKey.extruder_offset), GetSettingsName(SettingsKey.extruder_offset), - settings.GetValue(SettingsKey.extruder_offset)), + settingsContext.GetValue(SettingsKey.extruder_offset)), ErrorLevel = ValidationErrorLevel.Warning, }); } @@ -111,7 +111,7 @@ namespace MatterHackers.MatterControl // Check to see if current OEM layer matches downloaded OEM layer { - if (printer.Settings.GetValue(SettingsKey.make) != "Other" + if (settingsContext.GetValue(SettingsKey.make) != "Other" && ProfileManager.GetOemSettingsNeedingUpdate(printer).Any()) { errors.Add(new ValidationError(ValidationErrors.SettingsUpdateAvailable) @@ -147,9 +147,9 @@ namespace MatterHackers.MatterControl try { - if (settings.GetValue(SettingsKey.validate_layer_height)) + if (settingsContext.GetValue(SettingsKey.validate_layer_height)) { - if (settings.GetValue(SettingsKey.layer_height) > settings.GetValue(SettingsKey.nozzle_diameter)) + if (settingsContext.GetValue(SettingsKey.layer_height) > settingsContext.GetValue(SettingsKey.nozzle_diameter)) { errors.Add( new SettingsValidationError(SettingsKey.layer_height) @@ -159,12 +159,12 @@ namespace MatterHackers.MatterControl GetSettingsName(SettingsKey.nozzle_diameter)), ValueDetails = "{0} = {1}\n{2} = {3}".FormatWith( GetSettingsName(SettingsKey.layer_height), - settings.GetValue(SettingsKey.layer_height), + settingsContext.GetValue(SettingsKey.layer_height), GetSettingsName(SettingsKey.nozzle_diameter), - settings.GetValue(SettingsKey.nozzle_diameter)), + settingsContext.GetValue(SettingsKey.nozzle_diameter)), }); } - else if (settings.GetValue(SettingsKey.layer_height) <= 0) + else if (settingsContext.GetValue(SettingsKey.layer_height) <= 0) { errors.Add( new SettingsValidationError(SettingsKey.layer_height) @@ -174,7 +174,7 @@ namespace MatterHackers.MatterControl } // make sure the first layer height is not too big - if (settings.GetValue(SettingsKey.first_layer_height) > settings.GetValue(SettingsKey.nozzle_diameter)) + if (settingsContext.GetValue(SettingsKey.first_layer_height) > settingsContext.GetValue(SettingsKey.nozzle_diameter)) { errors.Add( new SettingsValidationError(SettingsKey.first_layer_height) @@ -184,13 +184,13 @@ namespace MatterHackers.MatterControl GetSettingsName(SettingsKey.nozzle_diameter)), ValueDetails = "{0} = {1}\n{2} = {3}".FormatWith( GetSettingsName(SettingsKey.first_layer_height), - settings.GetValue(SettingsKey.first_layer_height), + settingsContext.GetValue(SettingsKey.first_layer_height), GetSettingsName(SettingsKey.nozzle_diameter), - settings.GetValue(SettingsKey.nozzle_diameter)), + settingsContext.GetValue(SettingsKey.nozzle_diameter)), }); } // make sure the first layer height is not too small - else if (settings.GetValue(SettingsKey.first_layer_height) < settings.GetValue(SettingsKey.nozzle_diameter) / 2) + else if (settingsContext.GetValue(SettingsKey.first_layer_height) < settingsContext.GetValue(SettingsKey.nozzle_diameter) / 2) { errors.Add( new SettingsValidationError(SettingsKey.first_layer_height) @@ -200,20 +200,20 @@ namespace MatterHackers.MatterControl GetSettingsName(SettingsKey.nozzle_diameter)), ValueDetails = "{0} = {1}\n1/2 {2} = {3}".FormatWith( GetSettingsName(SettingsKey.first_layer_height), - settings.GetValue(SettingsKey.first_layer_height), + settingsContext.GetValue(SettingsKey.first_layer_height), GetSettingsName(SettingsKey.nozzle_diameter), - settings.GetValue(SettingsKey.nozzle_diameter) / 2), + settingsContext.GetValue(SettingsKey.nozzle_diameter) / 2), ErrorLevel = ValidationErrorLevel.Warning, }); } } - string[] startGCode = settings.GetValue(SettingsKey.start_gcode).Replace("\\n", "\n").Split('\n'); + string[] startGCode = settingsContext.GetValue(SettingsKey.start_gcode).Replace("\\n", "\n").Split('\n'); // Print recovery is incompatible with firmware leveling - ensure not enabled in startGCode - if (settings.GetValue(SettingsKey.recover_is_enabled) - && !settings.GetValue(SettingsKey.has_hardware_leveling)) + if (settingsContext.GetValue(SettingsKey.recover_is_enabled) + && !settingsContext.GetValue(SettingsKey.has_hardware_leveling)) { // Ensure we don't have hardware leveling commands in the start gcode. foreach (string startGCodeLine in startGCode) @@ -240,8 +240,8 @@ namespace MatterHackers.MatterControl } } - var levelingEnabled = printer.Settings.GetValue(SettingsKey.print_leveling_enabled) & !settings.GetValue(SettingsKey.has_hardware_leveling); - var levelingRequired = printer.Settings.GetValue(SettingsKey.print_leveling_required_to_print); + var levelingEnabled = settingsContext.GetValue(SettingsKey.print_leveling_enabled) & !settingsContext.GetValue(SettingsKey.has_hardware_leveling); + var levelingRequired = settingsContext.GetValue(SettingsKey.print_leveling_required_to_print); if (levelingEnabled || levelingRequired) { @@ -269,7 +269,7 @@ namespace MatterHackers.MatterControl } } - bool heatedBed = printer.Settings.GetValue(SettingsKey.has_heated_bed); + bool heatedBed = settingsContext.GetValue(SettingsKey.has_heated_bed); double bedTemperature = printer.Settings.Helpers.ActiveBedTemperature; @@ -306,14 +306,14 @@ namespace MatterHackers.MatterControl } if (levelingEnabled - && !settings.GetValue(SettingsKey.has_hardware_leveling) - && settings.GetValue(SettingsKey.has_z_probe) - && settings.GetValue(SettingsKey.use_z_probe) - && settings.GetValue(SettingsKey.validate_leveling) - && (settings.GetValue(SettingsKey.validation_threshold) < .001 - || settings.GetValue(SettingsKey.validation_threshold) > .5)) + && !settingsContext.GetValue(SettingsKey.has_hardware_leveling) + && settingsContext.GetValue(SettingsKey.has_z_probe) + && settingsContext.GetValue(SettingsKey.use_z_probe) + && settingsContext.GetValue(SettingsKey.validate_leveling) + && (settingsContext.GetValue(SettingsKey.validation_threshold) < .001 + || settingsContext.GetValue(SettingsKey.validation_threshold) > .5)) { - var threshold = settings.GetValue(SettingsKey.validation_threshold); + var threshold = settingsContext.GetValue(SettingsKey.validation_threshold); errors.Add( new SettingsValidationError(SettingsKey.validation_threshold) { @@ -334,7 +334,7 @@ namespace MatterHackers.MatterControl } var delta = maxLevelZ - minLevelZ; - var maxDelta = printer.Settings.GetValue(SettingsKey.nozzle_diameter) * 10; + var maxDelta = settingsContext.GetValue(SettingsKey.nozzle_diameter) * 10; if (delta > maxDelta) { errors.Add( @@ -383,7 +383,7 @@ namespace MatterHackers.MatterControl } }); - if (settings.GetValue(SettingsKey.first_layer_extrusion_width) > settings.GetValue(SettingsKey.nozzle_diameter) * 4) + if (settingsContext.GetValue(SettingsKey.first_layer_extrusion_width) > settingsContext.GetValue(SettingsKey.nozzle_diameter) * 4) { errors.Add( new SettingsValidationError(SettingsKey.first_layer_extrusion_width) @@ -393,13 +393,13 @@ namespace MatterHackers.MatterControl GetSettingsName(SettingsKey.nozzle_diameter)), ValueDetails = "{0} = {1}\n{2} * 4 = {3}".FormatWith( GetSettingsName(SettingsKey.first_layer_extrusion_width), - settings.GetValue(SettingsKey.first_layer_extrusion_width), + settingsContext.GetValue(SettingsKey.first_layer_extrusion_width), GetSettingsName(SettingsKey.nozzle_diameter), - settings.GetValue(SettingsKey.nozzle_diameter) * 4) + settingsContext.GetValue(SettingsKey.nozzle_diameter) * 4) }); } - if (settings.GetValue(SettingsKey.first_layer_extrusion_width) <= 0) + if (settingsContext.GetValue(SettingsKey.first_layer_extrusion_width) <= 0) { errors.Add( new SettingsValidationError(SettingsKey.first_layer_extrusion_width) @@ -408,11 +408,11 @@ namespace MatterHackers.MatterControl GetSettingsName(SettingsKey.first_layer_extrusion_width)), ValueDetails = "{0} = {1}".FormatWith( GetSettingsName(SettingsKey.first_layer_extrusion_width), - settings.GetValue(SettingsKey.first_layer_extrusion_width)), + settingsContext.GetValue(SettingsKey.first_layer_extrusion_width)), }); } - if (settings.GetValue(SettingsKey.fill_density) <= 0) + if (settingsContext.GetValue(SettingsKey.fill_density) <= 0) { errors.Add( new SettingsValidationError(SettingsKey.fill_density) @@ -422,11 +422,11 @@ namespace MatterHackers.MatterControl ErrorLevel = ValidationErrorLevel.Warning, ValueDetails = "{0} = {1}".FormatWith( GetSettingsName(SettingsKey.fill_density), - settings.GetValue(SettingsKey.fill_density)), + settingsContext.GetValue(SettingsKey.fill_density)), }); } - if (settings.GetValue(SettingsKey.perimeters) <= 0) + if (settingsContext.GetValue(SettingsKey.perimeters) <= 0) { errors.Add( new SettingsValidationError(SettingsKey.perimeters) @@ -436,12 +436,12 @@ namespace MatterHackers.MatterControl ErrorLevel = ValidationErrorLevel.Warning, ValueDetails = "{0} = {1}".FormatWith( GetSettingsName(SettingsKey.perimeters), - settings.GetValue(SettingsKey.perimeters)), + settingsContext.GetValue(SettingsKey.perimeters)), }); } - if (settings.GetValue(SettingsKey.extruder_count) > 1 - && settings.GetValue(SettingsKey.wipe_tower_perimeters_per_extruder) < 3) + if (settingsContext.GetValue(SettingsKey.extruder_count) > 1 + && settingsContext.GetValue(SettingsKey.wipe_tower_perimeters_per_extruder) < 3) { errors.Add( new SettingsValidationError(SettingsKey.wipe_tower_perimeters_per_extruder) @@ -451,12 +451,12 @@ namespace MatterHackers.MatterControl ErrorLevel = ValidationErrorLevel.Warning, ValueDetails = "{0} = {1}".FormatWith( GetSettingsName(SettingsKey.wipe_tower_perimeters_per_extruder), - settings.GetValue(SettingsKey.wipe_tower_perimeters_per_extruder)), + settingsContext.GetValue(SettingsKey.wipe_tower_perimeters_per_extruder)), }); } - if (settings.GetValue(SettingsKey.infill_overlap_perimeter) < -settings.GetValue(SettingsKey.nozzle_diameter) - || settings.GetValue(SettingsKey.infill_overlap_perimeter) > settings.GetValue(SettingsKey.nozzle_diameter)) + if (settingsContext.GetValue(SettingsKey.infill_overlap_perimeter) < -settingsContext.GetValue(SettingsKey.nozzle_diameter) + || settingsContext.GetValue(SettingsKey.infill_overlap_perimeter) > settingsContext.GetValue(SettingsKey.nozzle_diameter)) { errors.Add( new SettingsValidationError(SettingsKey.infill_overlap_perimeter) @@ -465,9 +465,9 @@ namespace MatterHackers.MatterControl GetSettingsName(SettingsKey.infill_overlap_perimeter)), ValueDetails = "{0} = {1}, {2} = {3}".FormatWith( GetSettingsName(SettingsKey.infill_overlap_perimeter), - settings.GetValue(SettingsKey.infill_overlap_perimeter), + settingsContext.GetValue(SettingsKey.infill_overlap_perimeter), GetSettingsName(SettingsKey.nozzle_diameter), - settings.GetValue(SettingsKey.nozzle_diameter)), + settingsContext.GetValue(SettingsKey.nozzle_diameter)), }); } @@ -496,7 +496,7 @@ namespace MatterHackers.MatterControl }); } - if (settings.GetValue(SettingsKey.external_perimeter_extrusion_width) <= 0) + if (settingsContext.GetValue(SettingsKey.external_perimeter_extrusion_width) <= 0) { errors.Add( new SettingsValidationError(SettingsKey.external_perimeter_extrusion_width) @@ -505,11 +505,11 @@ namespace MatterHackers.MatterControl GetSettingsName(SettingsKey.external_perimeter_extrusion_width)), ValueDetails = "{0} = {1}".FormatWith( GetSettingsName(SettingsKey.external_perimeter_extrusion_width), - settings.GetValue(SettingsKey.external_perimeter_extrusion_width)), + settingsContext.GetValue(SettingsKey.external_perimeter_extrusion_width)), }); } - if (settings.GetValue(SettingsKey.min_fan_speed) > 100) + if (settingsContext.GetValue(SettingsKey.min_fan_speed) > 100) { errors.Add( new SettingsValidationError(SettingsKey.min_fan_speed) @@ -517,11 +517,11 @@ namespace MatterHackers.MatterControl Error = "The {0} can only go as high as 100%.".Localize().FormatWith( GetSettingsName(SettingsKey.min_fan_speed)), ValueDetails = "It is currently set to {0}.".Localize().FormatWith( - settings.GetValue(SettingsKey.min_fan_speed)), + settingsContext.GetValue(SettingsKey.min_fan_speed)), }); } - if (settings.GetValue(SettingsKey.max_fan_speed) > 100) + if (settingsContext.GetValue(SettingsKey.max_fan_speed) > 100) { errors.Add( new SettingsValidationError(SettingsKey.max_fan_speed) @@ -529,7 +529,7 @@ namespace MatterHackers.MatterControl Error = "The {0} can only go as high as 100%.".Localize().FormatWith( GetSettingsName(SettingsKey.max_fan_speed)), ValueDetails = "It is currently set to {0}.".Localize().FormatWith( - settings.GetValue(SettingsKey.max_fan_speed)), + settingsContext.GetValue(SettingsKey.max_fan_speed)), }); } @@ -544,7 +544,7 @@ namespace MatterHackers.MatterControl }); } - if (settings.GetValue(SettingsKey.fill_density) < 0 || settings.GetValue(SettingsKey.fill_density) > 1) + if (settingsContext.GetValue(SettingsKey.fill_density) < 0 || settingsContext.GetValue(SettingsKey.fill_density) > 1) { errors.Add( new SettingsValidationError(SettingsKey.fill_density) @@ -552,32 +552,80 @@ namespace MatterHackers.MatterControl Error = "The {0} must be between 0 and 1.".Localize().FormatWith( GetSettingsName(SettingsKey.fill_density)), ValueDetails = "It is currently set to {0}.".Localize().FormatWith( - settings.GetValue(SettingsKey.fill_density)), + settingsContext.GetValue(SettingsKey.fill_density)), }); } // marlin firmware can only take a max of 128 bytes in a single instruction, make sure no lines are longer than that - ValidateGCodeLinesShortEnough(SettingsKey.cancel_gcode, printer, errors); - ValidateGCodeLinesShortEnough(SettingsKey.connect_gcode, printer, errors); - ValidateGCodeLinesShortEnough(SettingsKey.end_gcode, printer, errors); - ValidateGCodeLinesShortEnough(SettingsKey.layer_gcode, printer, errors); - ValidateGCodeLinesShortEnough(SettingsKey.pause_gcode, printer, errors); - ValidateGCodeLinesShortEnough(SettingsKey.resume_gcode, printer, errors); - ValidateGCodeLinesShortEnough(SettingsKey.start_gcode, printer, errors); + ValidateGCodeLinesShortEnough(SettingsKey.cancel_gcode, settingsContext, errors); + ValidateGCodeLinesShortEnough(SettingsKey.connect_gcode, settingsContext, errors); + ValidateGCodeLinesShortEnough(SettingsKey.end_gcode, settingsContext, errors); + ValidateGCodeLinesShortEnough(SettingsKey.layer_gcode, settingsContext, errors); + ValidateGCodeLinesShortEnough(SettingsKey.pause_gcode, settingsContext, errors); + ValidateGCodeLinesShortEnough(SettingsKey.resume_gcode, settingsContext, errors); + ValidateGCodeLinesShortEnough(SettingsKey.start_gcode, settingsContext, errors); // If the given speed is part of the current slice engine then check that it is greater than 0. - ValidateGoodSpeedSettingGreaterThan0(SettingsKey.bridge_speed, printer, errors); - ValidateGoodSpeedSettingGreaterThan0(SettingsKey.air_gap_speed, printer, errors); - ValidateGoodSpeedSettingGreaterThan0(SettingsKey.external_perimeter_speed, printer, errors); - ValidateGoodSpeedSettingGreaterThan0(SettingsKey.first_layer_speed, printer, errors); - ValidateGoodSpeedSettingGreaterThan0(SettingsKey.infill_speed, printer, errors); - ValidateGoodSpeedSettingGreaterThan0(SettingsKey.perimeter_speed, printer, errors); - ValidateGoodSpeedSettingGreaterThan0(SettingsKey.small_perimeter_speed, printer, errors); - ValidateGoodSpeedSettingGreaterThan0(SettingsKey.solid_infill_speed, printer, errors); - ValidateGoodSpeedSettingGreaterThan0(SettingsKey.support_material_speed, printer, errors); - ValidateGoodSpeedSettingGreaterThan0(SettingsKey.top_solid_infill_speed, printer, errors); - ValidateGoodSpeedSettingGreaterThan0(SettingsKey.travel_speed, printer, errors); - ValidateGoodSpeedSettingGreaterThan0(SettingsKey.retract_speed, printer, errors); + ValidateGoodSpeedSettingGreaterThan0(SettingsKey.bridge_speed, settingsContext, errors); + ValidateGoodSpeedSettingGreaterThan0(SettingsKey.air_gap_speed, settingsContext, errors); + ValidateGoodSpeedSettingGreaterThan0(SettingsKey.external_perimeter_speed, settingsContext, errors); + ValidateGoodSpeedSettingGreaterThan0(SettingsKey.first_layer_speed, settingsContext, errors); + ValidateGoodSpeedSettingGreaterThan0(SettingsKey.infill_speed, settingsContext, errors); + ValidateGoodSpeedSettingGreaterThan0(SettingsKey.perimeter_speed, settingsContext, errors); + ValidateGoodSpeedSettingGreaterThan0(SettingsKey.small_perimeter_speed, settingsContext, errors); + ValidateGoodSpeedSettingGreaterThan0(SettingsKey.solid_infill_speed, settingsContext, errors); + ValidateGoodSpeedSettingGreaterThan0(SettingsKey.support_material_speed, settingsContext, errors); + ValidateGoodSpeedSettingGreaterThan0(SettingsKey.top_solid_infill_speed, settingsContext, errors); + ValidateGoodSpeedSettingGreaterThan0(SettingsKey.travel_speed, settingsContext, errors); + ValidateGoodSpeedSettingGreaterThan0(SettingsKey.retract_speed, settingsContext, errors); + + if (printer.Connection.IsConnected + && !PrinterSetupRequired(printer) + && validatePrintBed + && errors.Count(e => e.ErrorLevel == ValidationErrorLevel.Error) == 0 + && printer.PrintableItems(printer.Bed.Scene).Any() + && settingsContext.GetValue(SettingsKey.has_swappable_bed) + && settingsContext.GetValue(SettingsKey.bed_surface) == "Default") + { + errors.Add(new ValidationError(ValidationErrors.BedSurfaceNotSelected) + { + Error = "Bed Surface Needs to be Selected".Localize(), + Details = "You need to select your printer's 'Bed Surface' under the 'Bed Temperature' menu on the top right of your screen.".Localize(), + ErrorLevel = ValidationErrorLevel.Error, + }); + } + + if (printer.Connection.IsConnected + && !PrinterSetupRequired(printer) + && validatePrintBed + && errors.Count(e => e.ErrorLevel == ValidationErrorLevel.Error) == 0 + && printer.PrintableItems(printer.Bed.Scene).Any() + && settingsContext.GetValue(SettingsKey.has_swappable_bed) + && settingsContext.GetValue(SettingsKey.bed_surface) != "Default" + && settingsContext.GetValue(printer.Settings.Helpers.ActiveBedTemperatureSetting) == "NC") + { + errors.Add(new ValidationError(ValidationErrors.IncompatibleBedSurfaceAndMaterial) + { + Error = "Selected Material and Bed Surface are Incompatible".Localize(), + Details = "The 'Material' you have selected is incompatible with the 'Bed Surface' you have selected. You may get poor bed adhesion or printing results. Changing the 'Bed Surface' is recommended. You can change it in the 'Bed Temperature' menu on the top right of your screen.".Localize(), + ErrorLevel = ValidationErrorLevel.Warning, + }); + } + + if (printer.Connection.IsConnected + && !PrinterSetupRequired(printer) + && validatePrintBed + && errors.Count(e => e.ErrorLevel == ValidationErrorLevel.Error) == 0 + && printer.PrintableItems(printer.Bed.Scene).Any() + && string.IsNullOrEmpty(settingsContext.GetValue(SettingsKey.active_material_key))) + { + errors.Add(new ValidationError(ValidationErrors.MaterialNotSelected) + { + Error = "A Material Should be Selected".Localize(), + Details = "You should select the 'Material' your are printing with under the 'Hotend Temperature' menu on the top right of your screen.".Localize(), + ErrorLevel = ValidationErrorLevel.Warning, + }); + } } catch (Exception e) { @@ -589,54 +637,6 @@ namespace MatterHackers.MatterControl }); } - if (printer.Connection.IsConnected - && !PrinterSetupRequired(printer) - && validatePrintBed - && errors.Count(e => e.ErrorLevel == ValidationErrorLevel.Error) == 0 - && printer.PrintableItems(printer.Bed.Scene).Any() - && settings.GetValue(SettingsKey.has_swappable_bed) - && settings.GetValue(SettingsKey.bed_surface) == "Default") - { - errors.Add(new ValidationError(ValidationErrors.BedSurfaceNotSelected) - { - Error = "Bed Surface Needs to be Selected".Localize(), - Details = "You need to select your printer's 'Bed Surface' under the 'Bed Temperature' menu on the top right of your screen.".Localize(), - ErrorLevel = ValidationErrorLevel.Error, - }); - } - - if (printer.Connection.IsConnected - && !PrinterSetupRequired(printer) - && validatePrintBed - && errors.Count(e => e.ErrorLevel == ValidationErrorLevel.Error) == 0 - && printer.PrintableItems(printer.Bed.Scene).Any() - && settings.GetValue(SettingsKey.has_swappable_bed) - && settings.GetValue(SettingsKey.bed_surface) != "Default" - && settings.GetValue(printer.Settings.Helpers.ActiveBedTemperatureSetting) == "NC") - { - errors.Add(new ValidationError(ValidationErrors.IncompatibleBedSurfaceAndMaterial) - { - Error = "Selected Material and Bed Surface are Incompatible".Localize(), - Details = "The 'Material' you have selected is incompatible with the 'Bed Surface' you have selected. You may get poor bed adhesion or printing results. Changing the 'Bed Surface' is recommended. You can change it in the 'Bed Temperature' menu on the top right of your screen.".Localize(), - ErrorLevel = ValidationErrorLevel.Warning, - }); - } - - if (printer.Connection.IsConnected - && !PrinterSetupRequired(printer) - && validatePrintBed - && errors.Count(e => e.ErrorLevel == ValidationErrorLevel.Error) == 0 - && printer.PrintableItems(printer.Bed.Scene).Any() - && string.IsNullOrEmpty(settings.GetValue(SettingsKey.active_material_key))) - { - errors.Add(new ValidationError(ValidationErrors.MaterialNotSelected) - { - Error = "A Material Should be Selected".Localize(), - Details = "You should select the 'Material' your are printing with under the 'Hotend Temperature' menu on the top right of your screen.".Localize(), - ErrorLevel = ValidationErrorLevel.Warning, - }); - } - return errors; } @@ -707,10 +707,10 @@ namespace MatterHackers.MatterControl return settingData.PresentationName.Localize(); } - private static bool ValidateGCodeLinesShortEnough(string settingsKey, PrinterConfig printer, List errors) + private static bool ValidateGCodeLinesShortEnough(string settingsKey, SettingsContext settingsContext, List errors) { // make sure the custom gcode does not have lines too long to print - foreach (string line in printer.Settings.GetValue(settingsKey).Replace("\\n", "\n").Split('\n')) + foreach (string line in settingsContext.GetValue(settingsKey).Replace("\\n", "\n").Split('\n')) { var trimedLine = line.Split(';')[0].Trim(); var length = trimedLine.Length; @@ -732,9 +732,9 @@ namespace MatterHackers.MatterControl return true; } - private static void ValidateGoodSpeedSettingGreaterThan0(string settingsKey, PrinterConfig printer, List errors) + private static void ValidateGoodSpeedSettingGreaterThan0(string settingsKey, SettingsContext settingsContext, List errors) { - var actualSpeedValueString = printer.Settings.GetValue(settingsKey); + var actualSpeedValueString = settingsContext.GetValue(settingsKey); var speedValueString = actualSpeedValueString; if (speedValueString.EndsWith("%")) { @@ -749,7 +749,7 @@ namespace MatterHackers.MatterControl } if (!valueWasNumber - || (printer.Settings.IsActive(settingsKey) + || (settingsContext.Printer?.Settings?.IsActive(settingsKey) == true && speedToCheck <= 0)) { errors.Add( diff --git a/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs b/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs index a2d612419..142684f93 100644 --- a/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs +++ b/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs @@ -47,12 +47,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration public SettingsContext SettingsContext { get; private set; } - private readonly PrinterConfig printer; - public SliceSettingsWidget(PrinterConfig printer, SettingsContext settingsContext, ThemeConfig theme) : base(FlowDirection.TopToBottom) { - this.printer = printer; this.SettingsContext = settingsContext; settingsControlBar = new PresetsToolbar(printer, theme) diff --git a/StaticData/Translations/Master.txt b/StaticData/Translations/Master.txt index 9baaa8444..c7ef045f0 100644 --- a/StaticData/Translations/Master.txt +++ b/StaticData/Translations/Master.txt @@ -2731,6 +2731,9 @@ Translated:Maximum E jerk [mm/s] English:Maximum feedrates [mm/s] Translated:Maximum feedrates [mm/s] +English:Maximum Print Speed +Translated:Maximum Print Speed + English:Maximum Speed Translated:Maximum Speed @@ -4282,6 +4285,9 @@ Translated:Select What to Import English:Selected Material and Bed Surface are Incompatable Translated:Selected Material and Bed Surface are Incompatable +English:Selected Material and Bed Surface are Incompatible +Translated:Selected Material and Bed Surface are Incompatible + English:Selected Object Options Translated:Selected Object Options @@ -4624,6 +4630,9 @@ Translated:Speed English:Speed Multiplier Translated:Speed Multiplier +English:Speed Overrides +Translated:Speed Overrides + English:Speeds Translated:Speeds @@ -5074,6 +5083,9 @@ Translated:The maximum speed that the printer treats as 0 and changes direction English:The maximum speed the printer can move. Uused for print time estimation. Translated:The maximum speed the printer can move. Uused for print time estimation. +English:The maximum speed the printer will extrude filament. All extrusion speeds will be clamped to this amount. Set to 0 to have no effect. +Translated:The maximum speed the printer will extrude filament. All extrusion speeds will be clamped to this amount. Set to 0 to have no effect. + English:The minimum amount of time a layer must take to print. If a layer will take less than this amount of time, the movement speed is reduced so the layer print time will match this value, down to the minimum print speed at the slowest. Translated:The minimum amount of time a layer must take to print. If a layer will take less than this amount of time, the movement speed is reduced so the layer print time will match this value, down to the minimum print speed at the slowest. From 11ab09da2122bfa23e4dbfa790618b87c3609eed Mon Sep 17 00:00:00 2001 From: LarsBrubaker Date: Sat, 26 Mar 2022 16:50:28 -0700 Subject: [PATCH 3/3] Improve load filament feedback when swappable bed Improve paper calibration message --- .../ActionBar/TemperatureWidgetBed.cs | 36 +++++++++++++++++++ .../PrintLeveling/LevelingStrings.cs | 2 +- .../WizardPages/SelectMaterialPage.cs | 2 +- StaticData/Translations/Master.txt | 3 ++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/MatterControlLib/ActionBar/TemperatureWidgetBed.cs b/MatterControlLib/ActionBar/TemperatureWidgetBed.cs index c3a21c013..c4fe50a0e 100644 --- a/MatterControlLib/ActionBar/TemperatureWidgetBed.cs +++ b/MatterControlLib/ActionBar/TemperatureWidgetBed.cs @@ -196,6 +196,42 @@ namespace MatterHackers.MatterControl.ActionBar return surfaceSelector; } + public static GuiWidget CreateAdvancedBedSurfaceSelector(PrinterConfig printer, ThemeConfig theme, ref int tabIndex) + { + if (!printer.Settings.GetValue(SettingsKey.has_heated_bed) + || !printer.Settings.GetValue(SettingsKey.has_swappable_bed)) + { + return null; + } + + var bedSelectorContainer = new FlowLayoutWidget(FlowDirection.TopToBottom) + { + HAnchor = HAnchor.Stretch + }; + + var selectBedSurfaceMessage = new TextWidget("And your printers bed surface.", pointSize: theme.DefaultFontSize, textColor: theme.TextColor) + { + Margin = new BorderDouble(15, 7, 0, 13), + HAnchor = HAnchor.Left + }; + bedSelectorContainer.AddChild(selectBedSurfaceMessage); + + var surfaceSelector = CreateBedSurfaceSelector(printer, theme, ref tabIndex); + bedSelectorContainer.AddChild(surfaceSelector); + + void SetSelectMessageVisibility(object s, EventArgs e) + { + selectBedSurfaceMessage.Visible = printer.Settings.GetValue(SettingsKey.bed_surface) == "Default"; + }; + + SetSelectMessageVisibility(null, null); + + printer.Settings.SettingChanged += SetSelectMessageVisibility; + bedSelectorContainer.Closed += (s, e) => printer.Settings.SettingChanged -= SetSelectMessageVisibility; + + return bedSelectorContainer; + } + public override void OnClosed(EventArgs e) { // Unregister listeners diff --git a/MatterControlLib/ConfigurationPage/PrintLeveling/LevelingStrings.cs b/MatterControlLib/ConfigurationPage/PrintLeveling/LevelingStrings.cs index 01c15aada..64b4a4da5 100644 --- a/MatterControlLib/ConfigurationPage/PrintLeveling/LevelingStrings.cs +++ b/MatterControlLib/ConfigurationPage/PrintLeveling/LevelingStrings.cs @@ -72,7 +72,7 @@ namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling public static string BelowControlsUltraFineInstructions => string.Format( "\t• {0}\n\t• {1}", "Press [Z-] until there is resistance to moving the paper".Localize(), - "The ideal resistance is when the paper first begins to bend".Localize()); + "The ideal resistance is when the paper first begins to bend, but can still be moved\n".Localize()); public string GetStepString(int totalSteps) { diff --git a/MatterControlLib/ConfigurationPage/PrintLeveling/WizardPages/SelectMaterialPage.cs b/MatterControlLib/ConfigurationPage/PrintLeveling/WizardPages/SelectMaterialPage.cs index ad12f3468..ec5694b03 100644 --- a/MatterControlLib/ConfigurationPage/PrintLeveling/WizardPages/SelectMaterialPage.cs +++ b/MatterControlLib/ConfigurationPage/PrintLeveling/WizardPages/SelectMaterialPage.cs @@ -51,7 +51,7 @@ namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling if (showLoadFilamentButton) { int tabIndex = 0; - var bedSurfaceChanger = TemperatureWidgetBed.CreateBedSurfaceSelector(printer, theme, ref tabIndex); + var bedSurfaceChanger = TemperatureWidgetBed.CreateAdvancedBedSurfaceSelector(printer, theme, ref tabIndex); if (bedSurfaceChanger != null) { contentRow.AddChild(bedSurfaceChanger); diff --git a/StaticData/Translations/Master.txt b/StaticData/Translations/Master.txt index c7ef045f0..9e327dd7e 100644 --- a/StaticData/Translations/Master.txt +++ b/StaticData/Translations/Master.txt @@ -5020,6 +5020,9 @@ Translated:The height of the printer's printable volume, in millimeters. Control English:The ideal resistance is when the paper first begins to bend Translated:The ideal resistance is when the paper first begins to bend +English:The ideal resistance is when the paper first begins to bend, but can still be moved\n +Translated:The ideal resistance is when the paper first begins to bend, but can still be moved\n + English:The inset amount for each side of the bed.\n- As a % of the width or depth\n- Ordered: Left, Front, Right, Back\n- NOTE: The probe offset is added on top of this Translated:The inset amount for each side of the bed.\n- As a % of the width or depth\n- Ordered: Left, Front, Right, Back\n- NOTE: The probe offset is added on top of this