Merge pull request #5286 from larsbrubaker/main

main
This commit is contained in:
Lars Brubaker 2022-03-26 17:22:55 -07:00 committed by GitHub
commit b16c2a26e6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 289 additions and 163 deletions

View file

@ -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;

View file

@ -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;
}
}
}

View file

@ -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;

View file

@ -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);

View file

@ -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,

View file

@ -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),
@ -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()
{

View file

@ -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,

View file

@ -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);

View file

@ -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<bool>(SettingsKey.has_heated_bed)
|| !printer.Settings.GetValue<bool>(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

View file

@ -48,21 +48,21 @@ namespace MatterHackers.MatterControl
/// </summary>
/// <param name="printer">The printer to validate.</param>
/// <returns>A list of all warnings and errors.</returns>
public static List<ValidationError> ValidateSettings(this PrinterConfig printer, SettingsContext settings = null, bool validatePrintBed = true)
public static List<ValidationError> 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<ValidationError>();
var extruderCount = settings.GetValue<int>(SettingsKey.extruder_count);
var extruderCount = settingsContext.GetValue<int>(SettingsKey.extruder_count);
// Check to see if supports are required
if (!settings.GetValue<bool>(SettingsKey.create_per_layer_support))
if (!settingsContext.GetValue<bool>(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<bool>(SettingsKey.extruder_offset))
if (!settingsContext.GetValue<bool>(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<double>(SettingsKey.extruder_offset),
settingsContext.GetValue<double>(SettingsKey.extruder_offset),
GetSettingsName(SettingsKey.extruder_offset),
settings.GetValue<double>(SettingsKey.extruder_offset)),
settingsContext.GetValue<double>(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<bool>(SettingsKey.validate_layer_height))
if (settingsContext.GetValue<bool>(SettingsKey.validate_layer_height))
{
if (settings.GetValue<double>(SettingsKey.layer_height) > settings.GetValue<double>(SettingsKey.nozzle_diameter))
if (settingsContext.GetValue<double>(SettingsKey.layer_height) > settingsContext.GetValue<double>(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<double>(SettingsKey.layer_height),
settingsContext.GetValue<double>(SettingsKey.layer_height),
GetSettingsName(SettingsKey.nozzle_diameter),
settings.GetValue<double>(SettingsKey.nozzle_diameter)),
settingsContext.GetValue<double>(SettingsKey.nozzle_diameter)),
});
}
else if (settings.GetValue<double>(SettingsKey.layer_height) <= 0)
else if (settingsContext.GetValue<double>(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<double>(SettingsKey.first_layer_height) > settings.GetValue<double>(SettingsKey.nozzle_diameter))
if (settingsContext.GetValue<double>(SettingsKey.first_layer_height) > settingsContext.GetValue<double>(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<double>(SettingsKey.first_layer_height),
settingsContext.GetValue<double>(SettingsKey.first_layer_height),
GetSettingsName(SettingsKey.nozzle_diameter),
settings.GetValue<double>(SettingsKey.nozzle_diameter)),
settingsContext.GetValue<double>(SettingsKey.nozzle_diameter)),
});
}
// make sure the first layer height is not too small
else if (settings.GetValue<double>(SettingsKey.first_layer_height) < settings.GetValue<double>(SettingsKey.nozzle_diameter) / 2)
else if (settingsContext.GetValue<double>(SettingsKey.first_layer_height) < settingsContext.GetValue<double>(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<double>(SettingsKey.first_layer_height),
settingsContext.GetValue<double>(SettingsKey.first_layer_height),
GetSettingsName(SettingsKey.nozzle_diameter),
settings.GetValue<double>(SettingsKey.nozzle_diameter) / 2),
settingsContext.GetValue<double>(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<bool>(SettingsKey.recover_is_enabled)
&& !settings.GetValue<bool>(SettingsKey.has_hardware_leveling))
if (settingsContext.GetValue<bool>(SettingsKey.recover_is_enabled)
&& !settingsContext.GetValue<bool>(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<bool>(SettingsKey.print_leveling_enabled) & !settings.GetValue<bool>(SettingsKey.has_hardware_leveling);
var levelingRequired = printer.Settings.GetValue<bool>(SettingsKey.print_leveling_required_to_print);
var levelingEnabled = settingsContext.GetValue<bool>(SettingsKey.print_leveling_enabled) & !settingsContext.GetValue<bool>(SettingsKey.has_hardware_leveling);
var levelingRequired = settingsContext.GetValue<bool>(SettingsKey.print_leveling_required_to_print);
if (levelingEnabled || levelingRequired)
{
@ -269,7 +269,7 @@ namespace MatterHackers.MatterControl
}
}
bool heatedBed = printer.Settings.GetValue<bool>(SettingsKey.has_heated_bed);
bool heatedBed = settingsContext.GetValue<bool>(SettingsKey.has_heated_bed);
double bedTemperature = printer.Settings.Helpers.ActiveBedTemperature;
@ -306,14 +306,14 @@ namespace MatterHackers.MatterControl
}
if (levelingEnabled
&& !settings.GetValue<bool>(SettingsKey.has_hardware_leveling)
&& settings.GetValue<bool>(SettingsKey.has_z_probe)
&& settings.GetValue<bool>(SettingsKey.use_z_probe)
&& settings.GetValue<bool>(SettingsKey.validate_leveling)
&& (settings.GetValue<double>(SettingsKey.validation_threshold) < .001
|| settings.GetValue<double>(SettingsKey.validation_threshold) > .5))
&& !settingsContext.GetValue<bool>(SettingsKey.has_hardware_leveling)
&& settingsContext.GetValue<bool>(SettingsKey.has_z_probe)
&& settingsContext.GetValue<bool>(SettingsKey.use_z_probe)
&& settingsContext.GetValue<bool>(SettingsKey.validate_leveling)
&& (settingsContext.GetValue<double>(SettingsKey.validation_threshold) < .001
|| settingsContext.GetValue<double>(SettingsKey.validation_threshold) > .5))
{
var threshold = settings.GetValue<double>(SettingsKey.validation_threshold);
var threshold = settingsContext.GetValue<double>(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<double>(SettingsKey.nozzle_diameter) * 10;
var maxDelta = settingsContext.GetValue<double>(SettingsKey.nozzle_diameter) * 10;
if (delta > maxDelta)
{
errors.Add(
@ -383,7 +383,7 @@ namespace MatterHackers.MatterControl
}
});
if (settings.GetValue<double>(SettingsKey.first_layer_extrusion_width) > settings.GetValue<double>(SettingsKey.nozzle_diameter) * 4)
if (settingsContext.GetValue<double>(SettingsKey.first_layer_extrusion_width) > settingsContext.GetValue<double>(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<double>(SettingsKey.first_layer_extrusion_width),
settingsContext.GetValue<double>(SettingsKey.first_layer_extrusion_width),
GetSettingsName(SettingsKey.nozzle_diameter),
settings.GetValue<double>(SettingsKey.nozzle_diameter) * 4)
settingsContext.GetValue<double>(SettingsKey.nozzle_diameter) * 4)
});
}
if (settings.GetValue<double>(SettingsKey.first_layer_extrusion_width) <= 0)
if (settingsContext.GetValue<double>(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<double>(SettingsKey.first_layer_extrusion_width)),
settingsContext.GetValue<double>(SettingsKey.first_layer_extrusion_width)),
});
}
if (settings.GetValue<double>(SettingsKey.fill_density) <= 0)
if (settingsContext.GetValue<double>(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<double>(SettingsKey.fill_density)),
settingsContext.GetValue<double>(SettingsKey.fill_density)),
});
}
if (settings.GetValue<double>(SettingsKey.perimeters) <= 0)
if (settingsContext.GetValue<double>(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<double>(SettingsKey.perimeters)),
settingsContext.GetValue<double>(SettingsKey.perimeters)),
});
}
if (settings.GetValue<int>(SettingsKey.extruder_count) > 1
&& settings.GetValue<double>(SettingsKey.wipe_tower_perimeters_per_extruder) < 3)
if (settingsContext.GetValue<int>(SettingsKey.extruder_count) > 1
&& settingsContext.GetValue<double>(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<double>(SettingsKey.wipe_tower_perimeters_per_extruder)),
settingsContext.GetValue<double>(SettingsKey.wipe_tower_perimeters_per_extruder)),
});
}
if (settings.GetValue<double>(SettingsKey.infill_overlap_perimeter) < -settings.GetValue<double>(SettingsKey.nozzle_diameter)
|| settings.GetValue<double>(SettingsKey.infill_overlap_perimeter) > settings.GetValue<double>(SettingsKey.nozzle_diameter))
if (settingsContext.GetValue<double>(SettingsKey.infill_overlap_perimeter) < -settingsContext.GetValue<double>(SettingsKey.nozzle_diameter)
|| settingsContext.GetValue<double>(SettingsKey.infill_overlap_perimeter) > settingsContext.GetValue<double>(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<double>(SettingsKey.infill_overlap_perimeter),
settingsContext.GetValue<double>(SettingsKey.infill_overlap_perimeter),
GetSettingsName(SettingsKey.nozzle_diameter),
settings.GetValue<double>(SettingsKey.nozzle_diameter)),
settingsContext.GetValue<double>(SettingsKey.nozzle_diameter)),
});
}
@ -496,7 +496,7 @@ namespace MatterHackers.MatterControl
});
}
if (settings.GetValue<double>(SettingsKey.external_perimeter_extrusion_width) <= 0)
if (settingsContext.GetValue<double>(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<double>(SettingsKey.external_perimeter_extrusion_width)),
settingsContext.GetValue<double>(SettingsKey.external_perimeter_extrusion_width)),
});
}
if (settings.GetValue<double>(SettingsKey.min_fan_speed) > 100)
if (settingsContext.GetValue<double>(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<double>(SettingsKey.min_fan_speed)),
settingsContext.GetValue<double>(SettingsKey.min_fan_speed)),
});
}
if (settings.GetValue<double>(SettingsKey.max_fan_speed) > 100)
if (settingsContext.GetValue<double>(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<double>(SettingsKey.max_fan_speed)),
settingsContext.GetValue<double>(SettingsKey.max_fan_speed)),
});
}
@ -544,7 +544,7 @@ namespace MatterHackers.MatterControl
});
}
if (settings.GetValue<double>(SettingsKey.fill_density) < 0 || settings.GetValue<double>(SettingsKey.fill_density) > 1)
if (settingsContext.GetValue<double>(SettingsKey.fill_density) < 0 || settingsContext.GetValue<double>(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<double>(SettingsKey.fill_density)),
settingsContext.GetValue<double>(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<bool>(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<bool>(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<bool>(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<bool>(SettingsKey.has_swappable_bed)
&& settings.GetValue(SettingsKey.bed_surface) != "Default"
&& settings.GetValue(printer.Settings.Helpers.ActiveBedTemperatureSetting) == "NC")
{
errors.Add(new ValidationError(ValidationErrors.IncompatableBedSurfaceAndMaterial)
{
Error = "Selected Material and Bed Surface are Incompatable".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<ValidationError> errors)
private static bool ValidateGCodeLinesShortEnough(string settingsKey, SettingsContext settingsContext, List<ValidationError> 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<ValidationError> errors)
private static void ValidateGoodSpeedSettingGreaterThan0(string settingsKey, SettingsContext settingsContext, List<ValidationError> 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(

View file

@ -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)
{

View file

@ -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);

View file

@ -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)
@ -683,8 +680,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:

View file

@ -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)
{
}

View file

@ -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
@ -5011,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
@ -5074,6 +5086,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.

@ -1 +1 @@
Subproject commit dec590da7530f63c5bbaea1ff75eacc78b34a994
Subproject commit b5824a2309f04f710250bd75dfb2f5cfada5a7bc