From d97be92d21674f6570e8a7aa282307655e31bfca Mon Sep 17 00:00:00 2001 From: jlewin Date: Wed, 26 Jun 2019 12:43:44 -0700 Subject: [PATCH] Refactor EngineMappingMatterSlice Changes - Move ApplicationSettings to PrinterSettings readonly static - Add Resolver to SliceSettingsData - Move Resolvers from EngineMapping to PrinterSettings - Move macro replacements from Printer to PrinterSettings - Change macro replacements to token definitions only - Change EngineMapping to define Exports with optional conversion --- .../MappingClasses/AsCountOrDistance.cs | 26 +- .../AsPercentOfReferenceOrDirect.cs | 51 ++- .../MappingClasses/AsPercentOrDirect.cs | 29 +- .../MappingClasses/ConditionalField.cs | 32 +- .../MappingClasses/FanTranslator.cs | 15 +- .../MappingClasses/GCodeForSlicer.cs | 12 +- .../MappingClasses/InfillTranslator.cs | 23 +- .../MappingClasses/InjectGCodeCommands.cs | 5 - .../MappingClasses/MapFirstValue.cs | 6 +- .../MappingClasses/MapLayerChangeGCode.cs | 26 +- .../MappingClasses/MapStartGCode.cs | 73 ++--- .../MappingClasses/MappedBrimLoopsSetting.cs | 17 +- .../MappingClasses/MappedFanSpeedSetting.cs | 18 +- .../MappingClasses/MappedSetting.cs | 18 +- .../MappingClasses/MappedToBoolString.cs | 6 +- .../OverrideSpeedOnSlaPrinters.cs | 61 ++++ .../MappingClasses/ReplaceWithSetting.cs | 12 +- .../MappingClasses/RetractionLength.cs | 22 +- .../MappingClasses/ScaledSingleNumber.cs | 31 +- .../MappingClasses/SkirtLengthMapping.cs | 21 +- .../MappingClasses/Slice3rBedShape.cs | 79 +++++ .../UnescapeNewlineCharacters.cs | 10 +- .../MappingClasses/ValuePlusConstant.cs | 8 +- .../Settings/PrinterSettings.cs | 184 ++++++++++- .../Settings/SliceSettingData.cs | 3 + .../Settings/SliceSettingsFields.cs | 246 ++++++++++----- .../ApplicationView/PrinterConfig.cs | 69 ---- .../Io/PauseHandlingStream.cs | 2 +- .../Io/QueuedCommandsStream.cs | 2 +- .../Io/ToolChangeStream.cs | 4 +- .../EngineMappingsMatterSlice.cs | 298 ++++++------------ .../SlicerConfiguration/ExportField.cs | 49 +++ .../OverrideSpeedOnSlaPrinters.cs | 63 ---- .../MappingClasses/Slice3rBedShape.cs | 86 ----- .../SlicerConfiguration/SliceSettingsRow.cs | 66 ++-- .../SlicerConfiguration/Slicer.cs | 13 +- .../MatterControl/GCodeProcessingTests.cs | 2 +- .../MatterControl/PrinterSettingsTests.cs | 12 +- 38 files changed, 889 insertions(+), 811 deletions(-) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/AsCountOrDistance.cs (71%) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/AsPercentOfReferenceOrDirect.cs (67%) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/AsPercentOrDirect.cs (77%) rename MatterControlLib/SlicerConfiguration/MappingClasses/InfillTranslator.cs => MatterControl.Printing/MappingClasses/ConditionalField.cs (71%) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/FanTranslator.cs (81%) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/GCodeForSlicer.cs (85%) rename MatterControlLib/SlicerConfiguration/MappingClasses/MappedSkirtLoopsSetting.cs => MatterControl.Printing/MappingClasses/InfillTranslator.cs (78%) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/InjectGCodeCommands.cs (92%) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/MapFirstValue.cs (86%) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/MapLayerChangeGCode.cs (77%) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/MapStartGCode.cs (78%) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/MappedBrimLoopsSetting.cs (81%) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/MappedFanSpeedSetting.cs (83%) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/MappedSetting.cs (78%) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/MappedToBoolString.cs (87%) create mode 100644 MatterControl.Printing/MappingClasses/OverrideSpeedOnSlaPrinters.cs rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/ReplaceWithSetting.cs (84%) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/RetractionLength.cs (82%) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/ScaledSingleNumber.cs (77%) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/SkirtLengthMapping.cs (69%) create mode 100644 MatterControl.Printing/MappingClasses/Slice3rBedShape.cs rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/UnescapeNewlineCharacters.cs (86%) rename {MatterControlLib/SlicerConfiguration => MatterControl.Printing}/MappingClasses/ValuePlusConstant.cs (86%) create mode 100644 MatterControlLib/SlicerConfiguration/ExportField.cs delete mode 100644 MatterControlLib/SlicerConfiguration/MappingClasses/OverrideSpeedOnSlaPrinters.cs delete mode 100644 MatterControlLib/SlicerConfiguration/MappingClasses/Slice3rBedShape.cs diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/AsCountOrDistance.cs b/MatterControl.Printing/MappingClasses/AsCountOrDistance.cs similarity index 71% rename from MatterControlLib/SlicerConfiguration/MappingClasses/AsCountOrDistance.cs rename to MatterControl.Printing/MappingClasses/AsCountOrDistance.cs index c30b5fd25..feae8397a 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/AsCountOrDistance.cs +++ b/MatterControl.Printing/MappingClasses/AsCountOrDistance.cs @@ -33,29 +33,25 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { private string keyToUseAsDenominatorForCount; - public AsCountOrDistance(PrinterConfig printer, string canonicalSettingsName, string exportedName, string keyToUseAsDenominatorForCount) - : base(printer, canonicalSettingsName, exportedName) + public AsCountOrDistance(string keyToUseAsDenominatorForCount) { this.keyToUseAsDenominatorForCount = keyToUseAsDenominatorForCount; } - public override string Value + public override string Resolve(string value, PrinterSettings settings) { - get + // When the state is store in mm, determine and use the value in (counted) units i.e. round distance up to layer count + if (value.Contains("mm")) { - // When the state is store in mm, determine and use the value in (counted) units i.e. round distance up to layer count - if (base.Value.Contains("mm")) - { - string withoutMm = base.Value.Replace("mm", ""); - string distanceString = printer.Settings.GetValue(keyToUseAsDenominatorForCount); - double denominator = ParseDouble(distanceString, 1); + string withoutMm = value.Replace("mm", ""); + string distanceString = settings.GetValue(keyToUseAsDenominatorForCount); + double denominator = ParseDouble(distanceString, 1); - int layers = (int)(ParseDouble(withoutMm) / denominator + .5); - return layers.ToString(); - } - - return base.Value; + int layers = (int)(ParseDouble(withoutMm) / denominator + .5); + return layers.ToString(); } + + return value; } } } \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/AsPercentOfReferenceOrDirect.cs b/MatterControl.Printing/MappingClasses/AsPercentOfReferenceOrDirect.cs similarity index 67% rename from MatterControlLib/SlicerConfiguration/MappingClasses/AsPercentOfReferenceOrDirect.cs rename to MatterControl.Printing/MappingClasses/AsPercentOfReferenceOrDirect.cs index 0255f6cf9..1b97ce471 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/AsPercentOfReferenceOrDirect.cs +++ b/MatterControl.Printing/MappingClasses/AsPercentOfReferenceOrDirect.cs @@ -34,8 +34,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses private bool change0ToReference; private double scale; - public AsPercentOfReferenceOrDirect(PrinterConfig printer, string canonicalSettingsName, string exportedName, string referencedSetting, double scale = 1, bool change0ToReference = true) - : base(printer, canonicalSettingsName, exportedName) + public AsPercentOfReferenceOrDirect(string referencedSetting, double scale = 1, bool change0ToReference = true) { this.change0ToReference = change0ToReference; this.scale = scale; @@ -44,34 +43,32 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses public string ReferencedSetting { get; } - public override string Value + public override string Resolve(string value, PrinterSettings settings) { - get + double finalValue = 0; + + if (value.Contains("%")) { - double finalValue = 0; - if (base.Value.Contains("%")) - { - string withoutPercent = base.Value.Replace("%", ""); - double ratio = ParseDouble(withoutPercent) / 100.0; - string originalReferenceString = printer.Settings.GetValue(this.ReferencedSetting); - double valueToModify = ParseDouble(originalReferenceString); - finalValue = valueToModify * ratio; - } - else - { - finalValue = ParseDouble(base.Value); - } - - if (change0ToReference - && finalValue == 0) - { - finalValue = ParseDouble(printer.Settings.GetValue(ReferencedSetting)); - } - - finalValue *= scale; - - return finalValue.ToString(); + string withoutPercent = value.Replace("%", ""); + double ratio = ParseDouble(withoutPercent) / 100.0; + string originalReferenceString = settings.GetValue(this.ReferencedSetting); + double valueToModify = ParseDouble(originalReferenceString); + finalValue = valueToModify * ratio; } + else + { + finalValue = ParseDouble(value); + } + + if (change0ToReference + && finalValue == 0) + { + finalValue = ParseDouble(settings.GetValue(ReferencedSetting)); + } + + finalValue *= scale; + + return finalValue.ToString(); } } } \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/AsPercentOrDirect.cs b/MatterControl.Printing/MappingClasses/AsPercentOrDirect.cs similarity index 77% rename from MatterControlLib/SlicerConfiguration/MappingClasses/AsPercentOrDirect.cs rename to MatterControl.Printing/MappingClasses/AsPercentOrDirect.cs index be4ede055..c9b1407b2 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/AsPercentOrDirect.cs +++ b/MatterControl.Printing/MappingClasses/AsPercentOrDirect.cs @@ -31,28 +31,21 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { public class AsPercentOrDirect : MappedSetting { - public AsPercentOrDirect(PrinterConfig printer, string canonicalSettingsName, string exportedName) - : base(printer, canonicalSettingsName, exportedName) + public override string Resolve(string value, PrinterSettings settings) { - } + double finalValue = 0; - public override string Value - { - get + if (value.Contains("%")) { - double finalValue = 0; - if (base.Value.Contains("%")) - { - string withoutPercent = base.Value.Replace("%", ""); - finalValue = ParseDouble(withoutPercent) / 100.0; - } - else - { - finalValue = ParseDouble(base.Value); - } - - return finalValue.ToString(); + string withoutPercent = value.Replace("%", ""); + finalValue = ParseDouble(withoutPercent) / 100.0; } + else + { + finalValue = ParseDouble(value); + } + + return finalValue.ToString(); } } } \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/InfillTranslator.cs b/MatterControl.Printing/MappingClasses/ConditionalField.cs similarity index 71% rename from MatterControlLib/SlicerConfiguration/MappingClasses/InfillTranslator.cs rename to MatterControl.Printing/MappingClasses/ConditionalField.cs index 284553978..52995d254 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/InfillTranslator.cs +++ b/MatterControl.Printing/MappingClasses/ConditionalField.cs @@ -1,5 +1,5 @@ /* -Copyright (c) 2016, Lars Brubaker +Copyright (c) 2019, Lars Brubaker, John Lewin All rights reserved. Redistribution and use in source and binary forms, with or without @@ -29,29 +29,27 @@ either expressed or implied, of the FreeBSD Project. namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { - public class InfillTranslator : MappedSetting + public class ConditionalField : MappedSetting { - public InfillTranslator(PrinterConfig printer, string canonicalSettingsName, string exportedName) - : base(printer, canonicalSettingsName, exportedName) + private string defaultValue; + private string enableOnKey; + private MappedSetting sourceField; + + public ConditionalField(string enableOnKey, MappedSetting sourceField, string defaultValue = "0") { + this.defaultValue = defaultValue; + this.enableOnKey = enableOnKey; + this.sourceField = sourceField; } - public override string Value + public override string Resolve(string value, PrinterSettings settings) { - get + if (settings.GetValue(enableOnKey)) { - double infillRatio0To1 = ParseDouble(base.Value); - // 400 = solid (extruder width) - - double nozzle_diameter = printer.Settings.GetValue(SettingsKey.nozzle_diameter); - double linespacing = 1000; - if (infillRatio0To1 > .01) - { - linespacing = nozzle_diameter / infillRatio0To1; - } - - return ((int)(linespacing * 1000)).ToString(); + return sourceField.Resolve(value, settings); } + + return defaultValue; } } } \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/FanTranslator.cs b/MatterControl.Printing/MappingClasses/FanTranslator.cs similarity index 81% rename from MatterControlLib/SlicerConfiguration/MappingClasses/FanTranslator.cs rename to MatterControl.Printing/MappingClasses/FanTranslator.cs index 91b039ae0..17c2ba598 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/FanTranslator.cs +++ b/MatterControl.Printing/MappingClasses/FanTranslator.cs @@ -31,19 +31,12 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { public class FanTranslator : MappedSetting { - public FanTranslator(PrinterConfig printer, string canonicalSettingsName, string exportedName) - : base(printer, canonicalSettingsName, exportedName) + public override string Resolve(string value, PrinterSettings settings) { - } + int numLayersFanIsDisabledOn = int.Parse(value); + int layerToEnableFanOn = numLayersFanIsDisabledOn + 1; - public override string Value - { - get - { - int numLayersFanIsDisabledOn = int.Parse(base.Value); - int layerToEnableFanOn = numLayersFanIsDisabledOn + 1; - return layerToEnableFanOn.ToString(); - } + return layerToEnableFanOn.ToString(); } } } \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/GCodeForSlicer.cs b/MatterControl.Printing/MappingClasses/GCodeForSlicer.cs similarity index 85% rename from MatterControlLib/SlicerConfiguration/MappingClasses/GCodeForSlicer.cs rename to MatterControl.Printing/MappingClasses/GCodeForSlicer.cs index 9927b9879..82f26b83a 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/GCodeForSlicer.cs +++ b/MatterControl.Printing/MappingClasses/GCodeForSlicer.cs @@ -31,11 +31,17 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { public class GCodeForSlicer : InjectGCodeCommands { - public GCodeForSlicer(PrinterConfig printer, string canonicalSettingsName, string exportedName) - : base(printer, canonicalSettingsName, exportedName) + public GCodeForSlicer() { + // TODO: GCodeForSlicer? + System.Diagnostics.Debugger.Break(); } - public override string Value => printer.ReplaceMacroValues(base.Value.Replace("\n", "\\n")); + public override string Resolve(string value, PrinterSettings settings) + { + value = base.Resolve(value, settings); + + return settings.ReplaceMacroValues(value.Replace("\n", "\\n")); + } } } \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/MappedSkirtLoopsSetting.cs b/MatterControl.Printing/MappingClasses/InfillTranslator.cs similarity index 78% rename from MatterControlLib/SlicerConfiguration/MappingClasses/MappedSkirtLoopsSetting.cs rename to MatterControl.Printing/MappingClasses/InfillTranslator.cs index 5a879adaa..8e880c898 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/MappedSkirtLoopsSetting.cs +++ b/MatterControl.Printing/MappingClasses/InfillTranslator.cs @@ -29,24 +29,21 @@ either expressed or implied, of the FreeBSD Project. namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { - public class MappedSkirtLoopsSetting : AsCountOrDistance + public class InfillTranslator : MappedSetting { - public MappedSkirtLoopsSetting(PrinterConfig printer, string canonicalSettingsName, string exportedName, string keyToUseAsDenominatorForCount) - : base(printer, canonicalSettingsName, exportedName, keyToUseAsDenominatorForCount) + public override string Resolve(string value, PrinterSettings settings) { - } + double infillRatio0To1 = ParseDouble(value); + // 400 = solid (extruder width) - public override string Value - { - get + double nozzle_diameter = settings.GetValue(SettingsKey.nozzle_diameter); + double linespacing = 1000; + if (infillRatio0To1 > .01) { - if (printer.Settings.GetValue(SettingsKey.create_skirt)) - { - return base.Value; - } - - return "0"; + linespacing = nozzle_diameter / infillRatio0To1; } + + return ((int)(linespacing * 1000)).ToString(); } } } \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/InjectGCodeCommands.cs b/MatterControl.Printing/MappingClasses/InjectGCodeCommands.cs similarity index 92% rename from MatterControlLib/SlicerConfiguration/MappingClasses/InjectGCodeCommands.cs rename to MatterControl.Printing/MappingClasses/InjectGCodeCommands.cs index 4fad50165..d245a159a 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/InjectGCodeCommands.cs +++ b/MatterControl.Printing/MappingClasses/InjectGCodeCommands.cs @@ -33,11 +33,6 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { public class InjectGCodeCommands : UnescapeNewlineCharacters { - public InjectGCodeCommands(PrinterConfig printer, string canonicalSettingsName, string exportedName) - : base(printer, canonicalSettingsName, exportedName) - { - } - protected void AddDefaultIfNotPresent(List linesAdded, string commandToAdd, string[] lines, string comment) { string command = commandToAdd.Split(' ')[0].Trim(); diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/MapFirstValue.cs b/MatterControl.Printing/MappingClasses/MapFirstValue.cs similarity index 86% rename from MatterControlLib/SlicerConfiguration/MappingClasses/MapFirstValue.cs rename to MatterControl.Printing/MappingClasses/MapFirstValue.cs index 461956e6d..c54d9abff 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/MapFirstValue.cs +++ b/MatterControl.Printing/MappingClasses/MapFirstValue.cs @@ -31,11 +31,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { public class MapFirstValue : MappedSetting { - public MapFirstValue(PrinterConfig printer, string canonicalSettingsName, string exportedName) - : base(printer, canonicalSettingsName, exportedName) + public override string Resolve(string value, PrinterSettings settings) { + return value.Contains(",") ? value.Split(',')[0] : value; } - - public override string Value => base.Value.Contains(",") ? base.Value.Split(',')[0] : base.Value; } } \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/MapLayerChangeGCode.cs b/MatterControl.Printing/MappingClasses/MapLayerChangeGCode.cs similarity index 77% rename from MatterControlLib/SlicerConfiguration/MappingClasses/MapLayerChangeGCode.cs rename to MatterControl.Printing/MappingClasses/MapLayerChangeGCode.cs index 476179ba1..24898599f 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/MapLayerChangeGCode.cs +++ b/MatterControl.Printing/MappingClasses/MapLayerChangeGCode.cs @@ -31,26 +31,18 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { public class MapLayerChangeGCode : InjectGCodeCommands { - public MapLayerChangeGCode(PrinterConfig printer, string canonicalSettingsName, string exportedName) - : base(printer, canonicalSettingsName, exportedName) + public override string Resolve(string value, PrinterSettings settings) { - } - - public override string Value - { - get + string macroReplaced = base.Resolve(value, settings); + if (!macroReplaced.Contains("; LAYER:") + && !macroReplaced.Contains(";LAYER:")) { - string macroReplaced = base.Value; - if (!macroReplaced.Contains("; LAYER:") - && !macroReplaced.Contains(";LAYER:")) - { - macroReplaced += "; LAYER:[layer_num]\n"; - } - - macroReplaced = printer.ReplaceMacroValues(macroReplaced.Replace("\n", "\\n")); - - return macroReplaced; + macroReplaced += "; LAYER:[layer_num]\n"; } + + macroReplaced = settings.ReplaceMacroValues(macroReplaced.Replace("\n", "\\n")); + + return macroReplaced; } } } \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/MapStartGCode.cs b/MatterControl.Printing/MappingClasses/MapStartGCode.cs similarity index 78% rename from MatterControlLib/SlicerConfiguration/MappingClasses/MapStartGCode.cs rename to MatterControl.Printing/MappingClasses/MapStartGCode.cs index c63b37b56..9944d3a32 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/MapStartGCode.cs +++ b/MatterControl.Printing/MappingClasses/MapStartGCode.cs @@ -38,42 +38,43 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { private readonly bool escapeNewlineCharacters; - public MapStartGCode(PrinterConfig printer, string canonicalSettingsName, string exportedName, bool escapeNewlineCharacters) - : base(printer, canonicalSettingsName, exportedName) + public MapStartGCode(bool escapeNewlineCharacters) { this.escapeNewlineCharacters = escapeNewlineCharacters; } - public override string Value + public override string Resolve(string value, PrinterSettings settings) { - get + System.Diagnostics.Debugger.Break(); + + var newStartGCode = new StringBuilder(); + + //foreach (string line in PreStartGCode(Slicer.ExtrudersUsed)) + //{ + // newStartGCode.Append(line + "\n"); + //} + + value = base.Resolve(value, settings); + + newStartGCode.Append(settings.ReplaceMacroValues(value)); + + //foreach (string line in PostStartGCode(Slicer.ExtrudersUsed)) + //{ + // newStartGCode.Append("\n"); + // newStartGCode.Append(line); + //} + + if (escapeNewlineCharacters) { - var newStartGCode = new StringBuilder(); - foreach (string line in PreStartGCode(Slicer.ExtrudersUsed)) - { - newStartGCode.Append(line + "\n"); - } - - newStartGCode.Append(printer.ReplaceMacroValues(base.Value)); - - foreach (string line in PostStartGCode(Slicer.ExtrudersUsed)) - { - newStartGCode.Append("\n"); - newStartGCode.Append(line); - } - - if (escapeNewlineCharacters) - { - return newStartGCode.ToString().Replace("\n", "\\n"); - } - - return newStartGCode.ToString(); + return newStartGCode.ToString().Replace("\n", "\\n"); } + + return newStartGCode.ToString(); } - public List PreStartGCode(List extrudersUsed) + public List PreStartGCode(PrinterSettings settings, List extrudersUsed) { - string startGCode = printer.Settings.GetValue(SettingsKey.start_gcode); + string startGCode = settings.GetValue(SettingsKey.start_gcode); string[] startGCodeLines = startGCode.Split(new string[] { "\\n" }, StringSplitOptions.RemoveEmptyEntries); var preStartGCode = new List @@ -82,14 +83,14 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses }; AddDefaultIfNotPresent(preStartGCode, "G21", startGCodeLines, "set units to millimeters"); AddDefaultIfNotPresent(preStartGCode, "M107", startGCodeLines, "fan off"); - double bed_temperature = printer.Settings.GetValue(SettingsKey.bed_temperature); + double bed_temperature = settings.GetValue(SettingsKey.bed_temperature); if (bed_temperature > 0) { string setBedTempString = string.Format("M140 S{0}", bed_temperature); AddDefaultIfNotPresent(preStartGCode, setBedTempString, startGCodeLines, "start heating the bed"); } - int numberOfHeatedExtruders = printer.Settings.Helpers.HotendCount(); + int numberOfHeatedExtruders = settings.Helpers.HotendCount(); // Start heating all the extruder that we are going to use. for (int hotendIndex = 0; hotendIndex < numberOfHeatedExtruders; hotendIndex++) @@ -97,7 +98,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses if (extrudersUsed.Count > hotendIndex && extrudersUsed[hotendIndex]) { - double materialTemperature = printer.Settings.Helpers.ExtruderTargetTemperature(hotendIndex); + double materialTemperature = settings.Helpers.ExtruderTargetTemperature(hotendIndex); if (materialTemperature != 0) { string setTempString = "M104 T{0} S{1}".FormatWith(hotendIndex, materialTemperature); @@ -107,14 +108,14 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses } // If we need to wait for the heaters to heat up before homing then set them to M109 (heat and wait). - if (printer.Settings.GetValue(SettingsKey.heat_extruder_before_homing)) + if (settings.GetValue(SettingsKey.heat_extruder_before_homing)) { for (int hotendIndex = 0; hotendIndex < numberOfHeatedExtruders; hotendIndex++) { if (extrudersUsed.Count > hotendIndex && extrudersUsed[hotendIndex]) { - double materialTemperature = printer.Settings.Helpers.ExtruderTargetTemperature(hotendIndex); + double materialTemperature = settings.Helpers.ExtruderTargetTemperature(hotendIndex); if (materialTemperature != 0) { string setTempString = "M109 T{0} S{1}".FormatWith(hotendIndex, materialTemperature); @@ -139,9 +140,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses return preStartGCode; } - public List PostStartGCode(List extrudersUsed) + public List PostStartGCode(PrinterSettings settings, List extrudersUsed) { - string startGCode = printer.Settings.GetValue(SettingsKey.start_gcode); + string startGCode = settings.GetValue(SettingsKey.start_gcode); string[] startGCodeLines = startGCode.Split(new string[] { "\\n" }, StringSplitOptions.RemoveEmptyEntries); var postStartGCode = new List @@ -149,7 +150,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses "; automatic settings after start_gcode" }; - double bed_temperature = printer.Settings.GetValue(SettingsKey.bed_temperature); + double bed_temperature = settings.GetValue(SettingsKey.bed_temperature); if (bed_temperature > 0 && !startGCode.Contains("M109")) { @@ -157,14 +158,14 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses AddDefaultIfNotPresent(postStartGCode, setBedTempString, startGCodeLines, "wait for bed temperature to be reached"); } - int numberOfHeatedExtruders = printer.Settings.GetValue(SettingsKey.extruder_count); + int numberOfHeatedExtruders = settings.GetValue(SettingsKey.extruder_count); // wait for them to finish for (int hotendIndex = 0; hotendIndex < numberOfHeatedExtruders; hotendIndex++) { if (hotendIndex < extrudersUsed.Count && extrudersUsed[hotendIndex]) { - double materialTemperature = printer.Settings.Helpers.ExtruderTargetTemperature(hotendIndex); + double materialTemperature = settings.Helpers.ExtruderTargetTemperature(hotendIndex); if (materialTemperature != 0) { if (!(hotendIndex == 0 && LineStartsWith(startGCodeLines, "M109 S")) diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/MappedBrimLoopsSetting.cs b/MatterControl.Printing/MappingClasses/MappedBrimLoopsSetting.cs similarity index 81% rename from MatterControlLib/SlicerConfiguration/MappingClasses/MappedBrimLoopsSetting.cs rename to MatterControl.Printing/MappingClasses/MappedBrimLoopsSetting.cs index 8e300e936..3b3b045e6 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/MappedBrimLoopsSetting.cs +++ b/MatterControl.Printing/MappingClasses/MappedBrimLoopsSetting.cs @@ -31,22 +31,19 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { public class MappedBrimLoopsSetting : AsCountOrDistance { - public MappedBrimLoopsSetting(PrinterConfig printer, string canonicalSettingsName, string exportedName, string keyToUseAsDenominatorForCount) - : base(printer, canonicalSettingsName, exportedName, keyToUseAsDenominatorForCount) + public MappedBrimLoopsSetting(string keyToUseAsDenominatorForCount) + : base(keyToUseAsDenominatorForCount) { } - public override string Value + public override string Resolve(string value, PrinterSettings settings) { - get + if (settings.GetValue(SettingsKey.create_brim)) { - if (printer.Settings.GetValue(SettingsKey.create_brim)) - { - return base.Value; - } - - return "0"; + return value; } + + return "0"; } } } \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/MappedFanSpeedSetting.cs b/MatterControl.Printing/MappingClasses/MappedFanSpeedSetting.cs similarity index 83% rename from MatterControlLib/SlicerConfiguration/MappingClasses/MappedFanSpeedSetting.cs rename to MatterControl.Printing/MappingClasses/MappedFanSpeedSetting.cs index 589dc80b2..402812963 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/MappedFanSpeedSetting.cs +++ b/MatterControl.Printing/MappingClasses/MappedFanSpeedSetting.cs @@ -31,22 +31,14 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { public class MappedFanSpeedSetting : MappedSetting { - public MappedFanSpeedSetting(PrinterConfig printer, string canonicalSettingsName, string exportedName) - : base(printer, canonicalSettingsName, exportedName) + public override string Resolve(string value, PrinterSettings settings) { - } - - public override string Value - { - get + if (settings.GetValue(SettingsKey.enable_fan)) { - if (printer.Settings.GetValue(SettingsKey.enable_fan)) - { - return base.Value; - } - - return "0"; + return value; } + + return "0"; } } } \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/MappedSetting.cs b/MatterControl.Printing/MappingClasses/MappedSetting.cs similarity index 78% rename from MatterControlLib/SlicerConfiguration/MappingClasses/MappedSetting.cs rename to MatterControl.Printing/MappingClasses/MappedSetting.cs index 3e6fdaaa0..59a6489ac 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/MappedSetting.cs +++ b/MatterControl.Printing/MappingClasses/MappedSetting.cs @@ -31,25 +31,13 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { public class MappedSetting { - protected PrinterConfig printer; - - public MappedSetting(PrinterConfig printer, string canonicalSettingsName, string exportedName) + public virtual string Resolve(string value, PrinterSettings settings) { - this.printer = printer; - this.CanonicalSettingsName = canonicalSettingsName; - this.ExportedName = exportedName; + return value; } - - public string CanonicalSettingsName { get; } - - public string ExportedName { get; } - - public virtual string Value => printer.Settings.GetValue(CanonicalSettingsName); - public double ParseDouble(string textValue, double valueOnError = 0) { - double value; - if (!double.TryParse(textValue, out value)) + if (!double.TryParse(textValue, out double value)) { return valueOnError; } diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/MappedToBoolString.cs b/MatterControl.Printing/MappingClasses/MappedToBoolString.cs similarity index 87% rename from MatterControlLib/SlicerConfiguration/MappingClasses/MappedToBoolString.cs rename to MatterControl.Printing/MappingClasses/MappedToBoolString.cs index 7fbc2ab87..8f28cb2bc 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/MappedToBoolString.cs +++ b/MatterControl.Printing/MappingClasses/MappedToBoolString.cs @@ -31,11 +31,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { public class MappedToBoolString : MappedSetting { - public MappedToBoolString(PrinterConfig printer, string canonicalSettingsName, string exportedName) - : base(printer, canonicalSettingsName, exportedName) + public override string Resolve(string value, PrinterSettings settings) { + return value == "1" ? "True" : "False"; } - - public override string Value => (base.Value == "1") ? "True" : "False"; } } \ No newline at end of file diff --git a/MatterControl.Printing/MappingClasses/OverrideSpeedOnSlaPrinters.cs b/MatterControl.Printing/MappingClasses/OverrideSpeedOnSlaPrinters.cs new file mode 100644 index 000000000..77c0bdcf1 --- /dev/null +++ b/MatterControl.Printing/MappingClasses/OverrideSpeedOnSlaPrinters.cs @@ -0,0 +1,61 @@ +/* +Copyright (c) 2016, Lars Brubaker +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses +{ + public class OverrideSpeedOnSlaPrinters : AsPercentOfReferenceOrDirect + { + public OverrideSpeedOnSlaPrinters(string originalReference, double scale = 1) + : base(originalReference, scale) + { + } + + public override string Resolve(string value, PrinterSettings settings) + { + if (settings.GetValue(SettingsKey.sla_printer)) + { + // return the speed based on the layer height + var speedAt025 = settings.GetValue(SettingsKey.laser_speed_025); + var speedAt100 = settings.GetValue(SettingsKey.laser_speed_100); + var deltaSpeed = speedAt100 - speedAt025; + + var layerHeight = settings.GetValue(SettingsKey.layer_height); + var deltaHeight = .1 - .025; + var heightRatio = (layerHeight - .025) / deltaHeight; + var ajustedSpeed = speedAt025 + deltaSpeed * heightRatio; + + return ajustedSpeed.ToString(); + } + else + { + return base.Resolve(value, settings); + } + } + } +} \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/ReplaceWithSetting.cs b/MatterControl.Printing/MappingClasses/ReplaceWithSetting.cs similarity index 84% rename from MatterControlLib/SlicerConfiguration/MappingClasses/ReplaceWithSetting.cs rename to MatterControl.Printing/MappingClasses/ReplaceWithSetting.cs index 1fbda0f5e..9de265f04 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/ReplaceWithSetting.cs +++ b/MatterControl.Printing/MappingClasses/ReplaceWithSetting.cs @@ -31,14 +31,18 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { public class ReplaceWithSetting : MappedSetting { - string replaceSettingsName; + private string replaceSettingsName; - public ReplaceWithSetting(PrinterConfig printer, string canonicalSettingsName, string replaceSettingsName, string exportedName) - : base(printer, canonicalSettingsName, exportedName) + public ReplaceWithSetting(string replaceSettingsName) { + // TODO: What role does this type have? + System.Diagnostics.Debugger.Break(); this.replaceSettingsName = replaceSettingsName; } - public override string Value => printer.Settings.GetValue(replaceSettingsName); + public override string Resolve(string value, PrinterSettings settings) + { + return settings.GetValue(replaceSettingsName); + } } } \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/RetractionLength.cs b/MatterControl.Printing/MappingClasses/RetractionLength.cs similarity index 82% rename from MatterControlLib/SlicerConfiguration/MappingClasses/RetractionLength.cs rename to MatterControl.Printing/MappingClasses/RetractionLength.cs index 351d01214..7ac81e2fb 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/RetractionLength.cs +++ b/MatterControl.Printing/MappingClasses/RetractionLength.cs @@ -31,23 +31,21 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { public class RetractionLength : MappedSetting { - public RetractionLength(PrinterConfig printer, string canonicalSettingsName, string exportedName) - : base(printer, canonicalSettingsName, exportedName) + public RetractionLength() { + // TODO: lookd like conditional field + System.Diagnostics.Debugger.Break(); } - public override string Value + public override string Resolve(string value, PrinterSettings settings) { - get + if (settings.GetValue(SettingsKey.enable_retractions)) { - if (printer.Settings.GetValue(SettingsKey.enable_retractions)) - { - return base.Value; - } - else - { - return 0.ToString(); - } + return value; + } + else + { + return "0"; } } } diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/ScaledSingleNumber.cs b/MatterControl.Printing/MappingClasses/ScaledSingleNumber.cs similarity index 77% rename from MatterControlLib/SlicerConfiguration/MappingClasses/ScaledSingleNumber.cs rename to MatterControl.Printing/MappingClasses/ScaledSingleNumber.cs index ea3796125..2f2abfd14 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/ScaledSingleNumber.cs +++ b/MatterControl.Printing/MappingClasses/ScaledSingleNumber.cs @@ -31,31 +31,28 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { public class ScaledSingleNumber : MapFirstValue { - internal double scale; + private double scale; - internal ScaledSingleNumber(PrinterConfig printer, string matterControlName, string exportedName, double scale = 1) - : base(printer, matterControlName, exportedName) + public ScaledSingleNumber(double scale = 1) { this.scale = scale; } - public override string Value + public override string Resolve(string value, PrinterSettings settings) { - get - { - double ratio = 0; - if (base.Value.Contains("%")) - { - string withoutPercent = base.Value.Replace("%", ""); - ratio = ParseDouble(withoutPercent) / 100.0; - } - else - { - ratio = ParseDouble(base.Value); - } + double ratio = 0; - return (ratio * scale).ToString(); + if (value.Contains("%")) + { + string withoutPercent = value.Replace("%", ""); + ratio = ParseDouble(withoutPercent) / 100.0; } + else + { + ratio = ParseDouble(value); + } + + return (ratio * scale).ToString(); } } } \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/SkirtLengthMapping.cs b/MatterControl.Printing/MappingClasses/SkirtLengthMapping.cs similarity index 69% rename from MatterControlLib/SlicerConfiguration/MappingClasses/SkirtLengthMapping.cs rename to MatterControl.Printing/MappingClasses/SkirtLengthMapping.cs index a6c1568a3..566334940 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/SkirtLengthMapping.cs +++ b/MatterControl.Printing/MappingClasses/SkirtLengthMapping.cs @@ -33,23 +33,16 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { public class SkirtLengthMapping : MappedSetting { - public SkirtLengthMapping(PrinterConfig printer, string canonicalSettingsName, string exportedName) - : base(printer, canonicalSettingsName, exportedName) + public override string Resolve(string value, PrinterSettings settings) { - } + double lengthToExtrudeMm = ParseDouble(value); - public override string Value - { - get - { - double lengthToExtrudeMm = ParseDouble(base.Value); - // we need to convert mm of filament to mm of extrusion path - double amountOfFilamentCubicMms = printer.Settings.GetValue(SettingsKey.filament_diameter) * MathHelper.Tau * lengthToExtrudeMm; - double extrusionSquareSize = printer.Settings.GetValue(SettingsKey.first_layer_height) * printer.Settings.GetValue(SettingsKey.nozzle_diameter); - double lineLength = amountOfFilamentCubicMms / extrusionSquareSize; + // we need to convert mm of filament to mm of extrusion path + double amountOfFilamentCubicMms = settings.GetValue(SettingsKey.filament_diameter) * MathHelper.Tau * lengthToExtrudeMm; + double extrusionSquareSize = settings.GetValue(SettingsKey.first_layer_height) * settings.GetValue(SettingsKey.nozzle_diameter); + double lineLength = amountOfFilamentCubicMms / extrusionSquareSize; - return lineLength.ToString(); - } + return lineLength.ToString(); } } } \ No newline at end of file diff --git a/MatterControl.Printing/MappingClasses/Slice3rBedShape.cs b/MatterControl.Printing/MappingClasses/Slice3rBedShape.cs new file mode 100644 index 000000000..3a50f968e --- /dev/null +++ b/MatterControl.Printing/MappingClasses/Slice3rBedShape.cs @@ -0,0 +1,79 @@ +/* +Copyright (c) 2016, Lars Brubaker +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 MatterHackers.VectorMath; +using System; + +namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses +{ + public class Slice3rBedShape : MappedSetting + { + public override string Resolve(string value, PrinterSettings settings) + { + Vector2 printCenter = settings.GetValue(SettingsKey.print_center); + Vector2 bedSize = settings.GetValue(SettingsKey.bed_size); + + switch (settings.GetValue(SettingsKey.bed_shape)) + { + case BedShape.Circular: + { + int numPoints = 10; + double angle = MathHelper.Tau / numPoints; + string bedString = ""; + bool first = true; + for (int i = 0; i < numPoints; i++) + { + if (!first) + { + bedString += ","; + } + double x = Math.Cos(angle * i); + double y = Math.Sin(angle * i); + bedString += $"{printCenter.X + x * bedSize.X / 2:0.####}x{printCenter.Y + y * bedSize.Y / 2:0.####}"; + first = false; + } + return bedString; + } + //bed_shape = 99.4522x10.4528,97.8148x20.7912,95.1057x30.9017,91.3545x40.6737,86.6025x50,80.9017x58.7785,74.3145x66.9131,66.9131x74.3145,58.7785x80.9017,50x86.6025,40.6737x91.3545,30.9017x95.1057,20.7912x97.8148,10.4528x99.4522,0x100,-10.4528x99.4522,-20.7912x97.8148,-30.9017x95.1057,-40.6737x91.3545,-50x86.6025,-58.7785x80.9017,-66.9131x74.3145,-74.3145x66.9131,-80.9017x58.7785,-86.6025x50,-91.3545x40.6737,-95.1057x30.9017,-97.8148x20.7912,-99.4522x10.4528,-100x0,-99.4522x - 10.4528,-97.8148x - 20.7912,-95.1057x - 30.9017,-91.3545x - 40.6737,-86.6025x - 50,-80.9017x - 58.7785,-74.3145x - 66.9131,-66.9131x - 74.3145,-58.7785x - 80.9017,-50x - 86.6025,-40.6737x - 91.3545,-30.9017x - 95.1057,-20.7912x - 97.8148,-10.4528x - 99.4522,0x - 100,10.4528x - 99.4522,20.7912x - 97.8148,30.9017x - 95.1057,40.6737x - 91.3545,50x - 86.6025,58.7785x - 80.9017,66.9131x - 74.3145,74.3145x - 66.9131,80.9017x - 58.7785,86.6025x - 50,91.3545x - 40.6737,95.1057x - 30.9017,97.8148x - 20.7912,99.4522x - 10.4528,100x0 + + case BedShape.Rectangular: + default: + { + //bed_shape = 0x0,200x0,200x200,0x200 + string bedString = $"{printCenter.X - bedSize.X / 2}x{printCenter.Y - bedSize.Y / 2}"; + bedString += $",{printCenter.X + bedSize.X / 2}x{printCenter.Y - bedSize.Y / 2}"; + bedString += $",{printCenter.X + bedSize.X / 2}x{printCenter.Y + bedSize.Y / 2}"; + bedString += $",{printCenter.X - bedSize.X / 2}x{printCenter.Y + bedSize.Y / 2}"; + + return bedString; + } + } + } + } +} \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/UnescapeNewlineCharacters.cs b/MatterControl.Printing/MappingClasses/UnescapeNewlineCharacters.cs similarity index 86% rename from MatterControlLib/SlicerConfiguration/MappingClasses/UnescapeNewlineCharacters.cs rename to MatterControl.Printing/MappingClasses/UnescapeNewlineCharacters.cs index 476a8053c..e734f1d7c 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/UnescapeNewlineCharacters.cs +++ b/MatterControl.Printing/MappingClasses/UnescapeNewlineCharacters.cs @@ -32,11 +32,15 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses // Replaces escaped newline characters with unescaped newline characters public class UnescapeNewlineCharacters : MappedSetting { - public UnescapeNewlineCharacters(PrinterConfig printer, string canonicalSettingsName, string exportedName) - : base(printer, canonicalSettingsName, exportedName) + public UnescapeNewlineCharacters() { + // TODO: This type has no role. Collapse into utility function in consumer + System.Diagnostics.Debugger.Break(); } - public override string Value => base.Value.Replace("\\n", "\n"); + public override string Resolve(string value, PrinterSettings settings) + { + return value.Replace("\\n", "\n"); + } } } \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/ValuePlusConstant.cs b/MatterControl.Printing/MappingClasses/ValuePlusConstant.cs similarity index 86% rename from MatterControlLib/SlicerConfiguration/MappingClasses/ValuePlusConstant.cs rename to MatterControl.Printing/MappingClasses/ValuePlusConstant.cs index 62bee106f..2a1a36535 100644 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/ValuePlusConstant.cs +++ b/MatterControl.Printing/MappingClasses/ValuePlusConstant.cs @@ -33,12 +33,14 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses { private double constant; - public ValuePlusConstant(PrinterConfig printer, string canonicalSettingsName, string exportedName, double constant) - : base(printer, canonicalSettingsName, exportedName) + public ValuePlusConstant(double constant) { this.constant = constant; } - public override string Value => (ParseDouble(base.Value) + constant).ToString(); + public override string Resolve(string value, PrinterSettings settings) + { + return $"{ParseDouble(value) + constant}"; + } } } \ No newline at end of file diff --git a/MatterControl.Printing/Settings/PrinterSettings.cs b/MatterControl.Printing/Settings/PrinterSettings.cs index 371be3c1f..da38fd08c 100644 --- a/MatterControl.Printing/Settings/PrinterSettings.cs +++ b/MatterControl.Printing/Settings/PrinterSettings.cs @@ -33,6 +33,7 @@ using System.IO; using System.Linq; using System.Text; using MatterHackers.Agg; +using MatterHackers.MatterControl.SlicerConfiguration.MappingClasses; using MatterHackers.VectorMath; using Newtonsoft.Json; using Newtonsoft.Json.Converters; @@ -83,6 +84,118 @@ namespace MatterHackers.MatterControl.SlicerConfiguration public event EventHandler SettingChanged; + private static HashSet knownSettings; + + private HashSet replacementTerms; + + /// + /// Application level settings control MatterControl behaviors but aren't used or passed through to the slice engine. Putting settings + /// in this list ensures they show up for all slice engines and the lack of a MappedSetting for the engine guarantees that it won't pass + /// through into the slicer config file. + /// + public static readonly HashSet ApplicationLevelSettings = new HashSet() + { + SettingsKey.enable_fan, + SettingsKey.extruder_wipe_temperature, + SettingsKey.extruders_share_temperature, + SettingsKey.first_layer_bed_temperature, + SettingsKey.g0, + SettingsKey.layer_to_pause, + SettingsKey.selector_ip_address, + SettingsKey.solid_shell, + SettingsKey.z_homes_to_max, + // TODO: merge the items below into the list above after some validation - setting that weren't previously mapped to Cura but probably should be. + SettingsKey.auto_connect, + SettingsKey.auto_release_motors, + SettingsKey.backup_firmware_before_update, + SettingsKey.baud_rate, + SettingsKey.bed_remove_part_temperature, + SettingsKey.bed_shape, + SettingsKey.bed_size, + SettingsKey.bed_temperature, + SettingsKey.before_toolchange_gcode, + SettingsKey.before_toolchange_gcode_1, + SettingsKey.toolchange_gcode, + SettingsKey.toolchange_gcode_1, + SettingsKey.build_height, + SettingsKey.cancel_gcode, + SettingsKey.com_port, + SettingsKey.connect_gcode, + SettingsKey.created_date, + SettingsKey.emulate_endstops, + SettingsKey.enable_line_splitting, + SettingsKey.enable_network_printing, + SettingsKey.enable_retractions, + SettingsKey.enable_sailfish_communication, + SettingsKey.filament_cost, + SettingsKey.filament_density, + SettingsKey.filament_has_been_loaded, + SettingsKey.filament_1_has_been_loaded, + SettingsKey.filament_runout_sensor, + SettingsKey.has_fan, + SettingsKey.has_hardware_leveling, + SettingsKey.has_heated_bed, + SettingsKey.has_power_control, + SettingsKey.has_sd_card_reader, + SettingsKey.has_z_probe, + SettingsKey.has_z_servo, + SettingsKey.heat_extruder_before_homing, + SettingsKey.inactive_cool_down, + SettingsKey.include_firmware_updater, + SettingsKey.insert_filament_markdown2, + SettingsKey.insert_filament_1_markdown, + SettingsKey.ip_address, + SettingsKey.ip_port, + SettingsKey.laser_speed_025, + SettingsKey.laser_speed_100, + SettingsKey.leveling_sample_points, + SettingsKey.load_filament_length, + SettingsKey.load_filament_speed, + SettingsKey.make, + SettingsKey.model, + SettingsKey.t0_inset, + SettingsKey.t1_inset, + SettingsKey.number_of_first_layers, + SettingsKey.extruder_offset, + SettingsKey.pause_gcode, + SettingsKey.print_center, + SettingsKey.print_leveling_probe_start, + SettingsKey.print_leveling_required_to_print, + SettingsKey.print_leveling_solution, + SettingsKey.print_time_estimate_multiplier, + SettingsKey.printer_name, + SettingsKey.probe_has_been_calibrated, + SettingsKey.probe_offset, + SettingsKey.probe_offset_sample_point, + SettingsKey.progress_reporting, + SettingsKey.read_regex, + SettingsKey.recover_first_layer_speed, + SettingsKey.recover_is_enabled, + SettingsKey.recover_position_before_z_home, + SettingsKey.resume_gcode, + SettingsKey.running_clean_markdown2, + SettingsKey.running_clean_1_markdown, + SettingsKey.seconds_to_reheat, + SettingsKey.send_with_checksum, + SettingsKey.show_reset_connection, + SettingsKey.sla_printer, + SettingsKey.t1_extrusion_move_speed_multiplier, + SettingsKey.temperature, + SettingsKey.temperature1, + SettingsKey.temperature2, + SettingsKey.temperature3, + SettingsKey.trim_filament_markdown, + SettingsKey.unload_filament_length, + SettingsKey.use_z_probe, + SettingsKey.validate_layer_height, + SettingsKey.write_regex, + SettingsKey.xy_offsets_have_been_calibrated, + SettingsKey.z_offset, + SettingsKey.z_probe_samples, + SettingsKey.z_servo_depolyed_angle, + SettingsKey.z_servo_retracted_angle, + }; + public void OnSettingChanged(string slicerConfigName) { if (slicerConfigName == SettingsKey.t0_inset @@ -129,6 +242,41 @@ namespace MatterHackers.MatterControl.SlicerConfiguration public PrinterSettings() { this.Helpers = new SettingsHelpers(this); + + replacementTerms = new HashSet() + { + SettingsKey.first_layer_speed, + SettingsKey.external_perimeter_speed, + SettingsKey.raft_print_speed, + SettingsKey.bed_remove_part_temperature, + SettingsKey.bridge_fan_speed, + SettingsKey.bridge_speed, + SettingsKey.air_gap_speed, + SettingsKey.extruder_wipe_temperature, + SettingsKey.filament_diameter, + SettingsKey.first_layer_bed_temperature, + SettingsKey.first_layer_temperature, + SettingsKey.max_fan_speed, + SettingsKey.min_fan_speed, + SettingsKey.retract_length, + SettingsKey.temperature, + SettingsKey.bed_temperature, + SettingsKey.temperature1, + SettingsKey.temperature2, + SettingsKey.temperature3, + SettingsKey.infill_speed, + SettingsKey.min_print_speed, + SettingsKey.perimeter_speed, + SettingsKey.retract_speed, + SettingsKey.support_material_speed, + SettingsKey.travel_speed, + SettingsKey.load_filament_speed, + SettingsKey.trim_filament_markdown, + SettingsKey.insert_filament_markdown2, + SettingsKey.insert_filament_1_markdown, + SettingsKey.running_clean_markdown2, + SettingsKey.running_clean_1_markdown, + }; } public List Macros { get; set; } = new List(); @@ -149,6 +297,25 @@ namespace MatterHackers.MatterControl.SlicerConfiguration } } + public string ReplaceMacroValues(string gcodeWithMacros) + { + foreach (string replacementTerm in replacementTerms) + { + // first check if this setting is anywhere in the line + if (gcodeWithMacros.Contains(replacementTerm)) + { + // Acquire the replacement value + string value = this.ResolveValue(replacementTerm); + + // braces then brackets replacement + gcodeWithMacros = gcodeWithMacros.Replace("{" + replacementTerm + "}", value); + gcodeWithMacros = gcodeWithMacros.Replace("[" + replacementTerm + "]", value); + } + } + + return gcodeWithMacros; + } + private void RestoreUserOverride(PrinterSettingsLayer settingsLayer, string settingsKey) { if (StagedUserSettings.TryGetValue(settingsKey, out string stagedUserOverride)) @@ -770,6 +937,21 @@ namespace MatterHackers.MatterControl.SlicerConfiguration } } + public string ResolveValue(string settingsKey) + { + string value = this.GetValue(settingsKey); + + if (SettingsData.TryGetValue(settingsKey, out SliceSettingData settingsData) + && settingsData.Resolver is MappedSetting resolver) + { + + return resolver.Resolve(value, this); + } + + // TODO: Consider if acceptable - should we throw when no resolver exists? + return value; + } + /// ///Returns the first matching value discovered while enumerating the settings layers /// @@ -950,8 +1132,6 @@ namespace MatterHackers.MatterControl.SlicerConfiguration #endregion - private static HashSet knownSettings; - [JsonIgnore] public static HashSet KnownSettings { diff --git a/MatterControl.Printing/Settings/SliceSettingData.cs b/MatterControl.Printing/Settings/SliceSettingData.cs index 369c7f54e..c430f6369 100644 --- a/MatterControl.Printing/Settings/SliceSettingData.cs +++ b/MatterControl.Printing/Settings/SliceSettingData.cs @@ -28,6 +28,7 @@ either expressed or implied, of the FreeBSD Project. */ using System.Collections.Generic; +using MatterHackers.MatterControl.SlicerConfiguration.MappingClasses; using Newtonsoft.Json; using Newtonsoft.Json.Converters; @@ -75,5 +76,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration public bool ReloadUiWhenChanged { get; set; } = false; public SettingsLayout.SubGroup OrganizerSubGroup { get; set; } + + public MappedSetting Resolver { get; set; } } } \ No newline at end of file diff --git a/MatterControl.Printing/Settings/SliceSettingsFields.cs b/MatterControl.Printing/Settings/SliceSettingsFields.cs index 50f651d50..c5c07864e 100644 --- a/MatterControl.Printing/Settings/SliceSettingsFields.cs +++ b/MatterControl.Printing/Settings/SliceSettingsFields.cs @@ -30,6 +30,7 @@ either expressed or implied, of the FreeBSD Project. using System.Collections.Generic; using MatterHackers.Agg; using MatterHackers.Localizations; +using MatterHackers.MatterControl.SlicerConfiguration.MappingClasses; using static MatterHackers.MatterControl.SlicerConfiguration.SliceSettingData; namespace MatterHackers.MatterControl.SlicerConfiguration @@ -62,7 +63,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration public static IEnumerable AllSettings() { - return new [] + return new[] { new SliceSettingData() { @@ -71,7 +72,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "Forces the slicer to attempt to avoid having the perimeter line cross over existing perimeter lines. This can help with oozing or strings.".Localize(), DataEditType = DataEditTypes.CHECK_BOX, ShowIfSet = "!sla_printer", - DefaultValue = "1" + DefaultValue = "1", + Resolver = new MappedToBoolString(), }, new SliceSettingData() { @@ -214,7 +216,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "The number of layers or the distance in millimeters to solid fill on the bottom surface(s) of the object. Add mm to the end of the number to specify distance in millimeters.".Localize(), DataEditType = DataEditTypes.INT_OR_MM, Units = "count or mm".Localize(), - DefaultValue = "1mm" + DefaultValue = "1mm", + Resolver = new AsCountOrDistance(SettingsKey.layer_height), }, new SliceSettingData() { @@ -234,7 +237,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "mm/s".Localize(), ShowIfSet = "!sla_printer", - DefaultValue = "20" + DefaultValue = "20", + Resolver = new OverrideSpeedOnSlaPrinters(SettingsKey.infill_speed), }, new SliceSettingData() { @@ -244,7 +248,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "mm/s".Localize(), ShowIfSet = "!sla_printer", - DefaultValue = "15" + DefaultValue = "15", + Resolver = new OverrideSpeedOnSlaPrinters(SettingsKey.infill_speed), }, new SliceSettingData() { @@ -254,7 +259,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, Units = "mm/s or %".Localize(), ShowIfSet = "!sla_printer", - DefaultValue = "0" + DefaultValue = "0", + Resolver = new OverrideSpeedOnSlaPrinters(SettingsKey.infill_speed), }, new SliceSettingData() { @@ -320,7 +326,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.CHECK_BOX, ShowIfSet = "NEVER_SHOW", DefaultValue = "0", - ReloadUiWhenChanged = true + ReloadUiWhenChanged = true, + Resolver = new MappedToBoolString(), }, new SliceSettingData() { @@ -331,7 +338,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration Units = "mm".Localize(), ShowIfSet = "!sla_printer", EnableIfSet = "create_raft", - DefaultValue = "5" + DefaultValue = "5", + Resolver = new AsCountOrDistance(SettingsKey.nozzle_diameter), }, new SliceSettingData() { @@ -342,7 +350,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration Units = "mm".Localize(), ShowIfSet = "!sla_printer", EnableIfSet = "create_raft", - DefaultValue = ".2" + DefaultValue = ".2", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -352,7 +361,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, Units = "mm/s or %".Localize(), ShowIfSet = "!sla_printer", - DefaultValue = "100%" + DefaultValue = "100%", + Resolver = new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed), }, new SliceSettingData() { @@ -360,7 +370,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration PresentationName = "End G-Code".Localize(), HelpText = "G-Code to be run at the end of all automatic output (the very end of the G-Code commands).".Localize(), DataEditType = DataEditTypes.MULTI_LINE_TEXT, - DefaultValue = "M104 S0 ; turn off temperature\\nG28 X0 ; home X axis\\nM84 ; disable motors" + DefaultValue = "M104 S0 ; turn off temperature\\nG28 X0 ; home X axis\\nM84 ; disable motors", + Resolver = new GCodeForSlicer(), }, new SliceSettingData() { @@ -370,7 +381,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, ShowIfSet = "!sla_printer", Units = "mm/s or %".Localize(), - DefaultValue = "70%" + DefaultValue = "70%", + Resolver = new OverrideSpeedOnSlaPrinters(SettingsKey.perimeter_speed), }, new SliceSettingData() { @@ -379,7 +391,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "Forces external perimeters to be printed first. By default, they will print last.".Localize(), DataEditType = DataEditTypes.CHECK_BOX, ShowIfSet = "!sla_printer", - DefaultValue = "0" + DefaultValue = "0", + Resolver = new MappedToBoolString(), }, new SliceSettingData() { @@ -389,7 +402,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.INT, DefaultValue = "1", ShowIfSet = "!sla_printer", - ReloadUiWhenChanged = true + ReloadUiWhenChanged = true, + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -438,7 +452,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "Detect perimeters that cross over themselves and combine them.".Localize(), DataEditType = DataEditTypes.CHECK_BOX, ShowIfSet = "!sla_printer", - DefaultValue = "1" + DefaultValue = "1", + Resolver = new MappedToBoolString(), }, new SliceSettingData() { @@ -447,7 +462,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "Detects sections of the model that would be too thin to print and expands them to make them printable.".Localize(), DataEditType = DataEditTypes.CHECK_BOX, ShowIfSet = "!sla_printer", - DefaultValue = "1" + DefaultValue = "1", + Resolver = new MappedToBoolString(), }, new SliceSettingData() { @@ -457,7 +473,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, Units = "Ratio or %".Localize(), ShowIfSet = "!sla_printer", - DefaultValue = "100%" + DefaultValue = "100%", + Resolver = new AsPercentOrDirect(), }, new SliceSettingData() { @@ -488,7 +505,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, ShowIfSet = "!sla_printer", Units = "mm".Localize(), - DefaultValue = "3" + DefaultValue = "3", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -497,7 +515,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "The angle of the infill, measured from the X axis. Not used when bridging.".Localize(), DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "°".Localize(), - DefaultValue = "45" + DefaultValue = "45", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -506,7 +525,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration PresentationName = "Fill Density".Localize(), HelpText = "The amount of infill material to generate, expressed as a ratio or a percentage.".Localize(), DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, - DefaultValue = "0.4" + DefaultValue = "0.4", + Resolver = new ScaledSingleNumber(100), }, new SliceSettingData() { @@ -524,7 +544,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "Detect gaps between perimeters that are too thin to fill with normal infill and attempt to fill them.".Localize(), DataEditType = DataEditTypes.CHECK_BOX, ShowIfSet = "!sla_printer", - DefaultValue = "1" + DefaultValue = "1", + Resolver = new MappedToBoolString(), }, new SliceSettingData() { @@ -534,7 +555,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, Units = "mm or %".Localize(), ShowIfSet = "!sla_printer", - DefaultValue = "100%" + DefaultValue = "100%", + Resolver = new AsPercentOfReferenceOrDirect(SettingsKey.nozzle_diameter), }, new SliceSettingData() { @@ -544,6 +566,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, Units = "mm or %".Localize(), DefaultValue = "0.3", + Resolver = new AsPercentOfReferenceOrDirect(SettingsKey.layer_height), }, new SliceSettingData() { @@ -552,7 +575,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "The speed at which the nozzle will move when printing the initial layers. If expressed as a percentage the Infill speed is modified.".Localize(), DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, Units = "mm/s or %".Localize(), - DefaultValue = "30%" + DefaultValue = "30%", + Resolver = new AsPercentOfReferenceOrDirect(SettingsKey.infill_speed), }, new SliceSettingData() { @@ -562,7 +586,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.INT_OR_MM, Units = "layers or mm".Localize(), ShowIfSet = "sla_printer", - DefaultValue = "1" + DefaultValue = "1", + Resolver = new AsCountOrDistance(SettingsKey.layer_height), }, new SliceSettingData() { @@ -784,6 +809,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, Units = "mm or %".Localize(), DefaultValue = "25%", + Resolver = new AsPercentOfReferenceOrDirect(SettingsKey.nozzle_diameter, change0ToReference: false), QuickMenuSettings = { { "Light", "20%" }, { "Standard", "35%" }, { "Heavy", "75%" } } }, new SliceSettingData() @@ -814,7 +840,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, ShowIfSet = "!sla_printer", Units = "mm/s".Localize(), - DefaultValue = "60" + DefaultValue = "60", + Resolver = new OverrideSpeedOnSlaPrinters(SettingsKey.infill_speed), }, new SliceSettingData() { @@ -824,7 +851,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.LIST, ShowIfSet = "!sla_printer", ListValues = "GRID,TRIANGLES,HEXAGON,LINES,CONCENTRIC", - DefaultValue = "TRIANGLES" + DefaultValue = "TRIANGLES", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1006,7 +1034,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration PresentationName = "Layer Change G-Code".Localize(), HelpText = "G-Code to be run after the change in Z height for the next layer.".Localize(), DataEditType = DataEditTypes.MULTI_LINE_TEXT, - DefaultValue = "; LAYER:[layer_num]" + DefaultValue = "; LAYER:[layer_num]", + Resolver = new MapLayerChangeGCode(), }, new SliceSettingData() { @@ -1016,7 +1045,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "The thickness of each layer of the print, except the first layer. A smaller number will create more layers and more vertical accuracy but also a slower print.".Localize(), DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "mm".Localize(), - DefaultValue = "0.4" + DefaultValue = "0.4", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1055,7 +1085,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration Units = "mm".Localize(), EnableIfSet = SettingsKey.enable_retractions, ShowIfSet = "!sla_printer", - DefaultValue = ".1" + DefaultValue = ".1", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1086,7 +1117,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration Units = "seconds".Localize(), ShowIfSet = "has_fan", EnableIfSet = SettingsKey.enable_fan, - DefaultValue = "60" + DefaultValue = "60", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1097,7 +1129,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration Units = "seconds".Localize(), ShowIfSet = "has_fan", EnableIfSet = SettingsKey.enable_fan, - DefaultValue = "30" + DefaultValue = "30", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1108,7 +1141,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration Units = "%".Localize(), ShowIfSet = "has_fan", EnableIfSet = SettingsKey.enable_fan, - DefaultValue = "35" + DefaultValue = "35", + Resolver = new ConditionalField(SettingsKey.enable_fan, new MappedSetting()), }, new SliceSettingData() { @@ -1119,7 +1153,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration Units = "%".Localize(), ShowIfSet = "has_fan", EnableIfSet = SettingsKey.enable_fan, - DefaultValue = "100" + DefaultValue = "100", + Resolver = new ConditionalField(SettingsKey.enable_fan, new MappedSetting()), }, new SliceSettingData() { @@ -1130,7 +1165,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration Units = "%".Localize(), ShowIfSet = "has_fan", EnableIfSet = SettingsKey.enable_fan, - DefaultValue = "100" + DefaultValue = "100", + Resolver = new ConditionalField(SettingsKey.enable_fan, new MappedSetting()), }, new SliceSettingData() { @@ -1141,7 +1177,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration Units = "layers".Localize(), ShowIfSet = "has_fan", EnableIfSet = SettingsKey.enable_fan, - DefaultValue = "1" + DefaultValue = "1", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1151,7 +1188,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "mm/s".Localize(), ShowIfSet = "!sla_printer", - DefaultValue = "10" + DefaultValue = "10", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1162,7 +1200,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration ShowIfSet = "!sla_printer", EnableIfSet = SettingsKey.create_skirt, Units = "mm".Localize(), - DefaultValue = "0" + DefaultValue = "0", + Resolver = new SkirtLengthMapping(), }, new SliceSettingData() { @@ -1171,7 +1210,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "The diameter of the extruder's nozzle.".Localize(), DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "mm".Localize(), - DefaultValue = "0.5" + DefaultValue = "0.5", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1212,7 +1252,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "Output only the first layer of the print. Especially useful for outputting gcode data for applications like engraving or cutting.".Localize(), DataEditType = DataEditTypes.CHECK_BOX, ShowIfSet = "!sla_printer", - DefaultValue = "0" + DefaultValue = "0", + Resolver = new MappedToBoolString(), }, new SliceSettingData() { @@ -1241,7 +1282,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, Units = "mm or %".Localize(), ShowIfSet = "!sla_printer", - DefaultValue = "100%" + DefaultValue = "100%", + Resolver = new AsPercentOfReferenceOrDirect(SettingsKey.nozzle_diameter), }, new SliceSettingData() { @@ -1251,7 +1293,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, ShowIfSet = "!sla_printer", Units = "mm/s".Localize(), - DefaultValue = "30" + DefaultValue = "30", + Resolver = new OverrideSpeedOnSlaPrinters(SettingsKey.infill_speed), }, new SliceSettingData() { @@ -1261,6 +1304,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "%".Localize(), DefaultValue = "90", + Resolver = new ScaledSingleNumber(.01), QuickMenuSettings = { { "Light", "20" }, { "Standard", "80" }, { "Heavy", "100" } } }, new SliceSettingData() @@ -1270,7 +1314,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "The number, or total width, of external shells to create. Add mm to the end of the number to specify width in millimeters.".Localize(), DataEditType = DataEditTypes.INT_OR_MM, Units = "count or mm".Localize(), - DefaultValue = "3" + DefaultValue = "3", + Resolver = new AsCountOrDistance(SettingsKey.nozzle_diameter), }, new SliceSettingData() { @@ -1317,7 +1362,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration Units = "mm".Localize(), ShowIfSet = "!sla_printer", EnableIfSet = SettingsKey.enable_retractions, - DefaultValue = "20" + DefaultValue = "20", + Resolver = new MapFirstValue(), }, new SliceSettingData() { @@ -1327,7 +1373,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "mm".Localize(), ShowIfSet = "!sla_printer", - DefaultValue = "3" + DefaultValue = "3", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1348,7 +1395,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration Units = "mm".Localize(), DefaultValue = "1", ShowIfSet = "!sla_printer", - EnableIfSet = SettingsKey.enable_retractions + EnableIfSet = SettingsKey.enable_retractions, + Resolver = new RetractionLength(), }, new SliceSettingData() { @@ -1359,7 +1407,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration ShowIfSet = "!sla_printer&extruder_count>1", Units = "mm".Localize(), EnableIfSet = SettingsKey.enable_retractions, - DefaultValue = "10" + DefaultValue = "10", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1369,7 +1418,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.CHECK_BOX, ShowIfSet = "!sla_printer", EnableIfSet = SettingsKey.enable_retractions, - DefaultValue = "1" + DefaultValue = "1", + Resolver = new MappedToBoolString(), }, new SliceSettingData() { @@ -1380,7 +1430,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration Units = "mm".Localize(), ShowIfSet = "!sla_printer", EnableIfSet = SettingsKey.enable_retractions, - DefaultValue = "0" + DefaultValue = "0", + Resolver = new MapFirstValue(), }, new SliceSettingData() { @@ -1391,7 +1442,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration ShowIfSet = "!sla_printer&extruder_count>1", EnableIfSet = SettingsKey.enable_retractions, Units = "mm zero to disable".Localize(), - DefaultValue = "0" + DefaultValue = "0", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1400,7 +1452,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "If the extruder has been running for a long time, it may be reporting values that are too large, this will periodically reset it.".Localize(), DataEditType = DataEditTypes.CHECK_BOX, ShowIfSet = "!sla_printer", - DefaultValue = "1" + DefaultValue = "1", + Resolver = new MappedToBoolString(), }, new SliceSettingData() { @@ -1420,7 +1473,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration Units = "mm".Localize(), ShowIfSet = "!sla_printer", EnableIfSet = SettingsKey.enable_retractions, - DefaultValue = "0" + DefaultValue = "0", + Resolver = new MapFirstValue(), }, new SliceSettingData() { @@ -1431,7 +1485,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration Units = "s".Localize(), ShowIfSet = "!sla_printer", EnableIfSet = SettingsKey.enable_retractions, - DefaultValue = "0" + DefaultValue = "0", + Resolver = new MapFirstValue(), }, new SliceSettingData() { @@ -1442,7 +1497,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration Units = "mm/s".Localize(), ShowIfSet = "!sla_printer", EnableIfSet = SettingsKey.enable_retractions, - DefaultValue = "30" + DefaultValue = "30", + Resolver = new MapFirstValue(), }, new SliceSettingData() { @@ -1479,7 +1535,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration ShowIfSet = "!sla_printer", EnableIfSet = SettingsKey.create_skirt, Units = "mm".Localize(), - DefaultValue = "6" + DefaultValue = "6", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1499,7 +1556,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration ShowIfSet = "!sla_printer", EnableIfSet = SettingsKey.create_skirt, Units = "count or mm".Localize(), - DefaultValue = "1" + DefaultValue = "1", + Resolver = new ConditionalField(SettingsKey.create_skirt, new AsCountOrDistance(SettingsKey.nozzle_diameter)), }, new SliceSettingData() { @@ -1509,7 +1567,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.INT_OR_MM, EnableIfSet = SettingsKey.create_brim, Units = "count or mm".Localize(), - DefaultValue = "8mm" + DefaultValue = "8mm", + Resolver = new ConditionalField(SettingsKey.create_brim, new AsCountOrDistance(SettingsKey.nozzle_diameter)) }, new SliceSettingData() { @@ -1519,7 +1578,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.INT, Units = "seconds".Localize(), ShowIfSet = "!sla_printer", - DefaultValue = "30" + DefaultValue = "30", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1565,7 +1625,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.CHECK_BOX, ShowIfSet = "!sla_printer", ResetAtEndOfPrint = true, - DefaultValue = "0" + DefaultValue = "0", + Resolver = new MappedToBoolString(), }, new SliceSettingData() { @@ -1582,7 +1643,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration PresentationName = "Start G-Code".Localize(), HelpText = "G-Code to be run immediately following the temperature setting commands. Including commands to set temperature in this section will cause them not be generated outside of this section. Will accept Custom G-Code variables.".Localize(), DataEditType = DataEditTypes.MULTI_LINE_TEXT, - DefaultValue = "G28 ; home all axes\\nG1 Z5 F5000 ; lift nozzle" + DefaultValue = "G28 ; home all axes\\nG1 Z5 F5000 ; lift nozzle", + Resolver = new MapStartGCode(true), }, new SliceSettingData() { @@ -1632,7 +1694,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, ShowIfSet = "!sla_printer", Units = "mm".Localize(), - DefaultValue = ".3" + DefaultValue = ".3", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1642,7 +1705,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, ShowIfSet = "!sla_printer", Units = "°".Localize(), - DefaultValue = "45" + DefaultValue = "45", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1651,7 +1715,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "Generates an outline around the support material to improve strength and hold up interface layers.".Localize(), ShowIfSet = "!sla_printer", DataEditType = DataEditTypes.CHECK_BOX, - DefaultValue = "1" + DefaultValue = "1", + Resolver = new MappedToBoolString(), }, new SliceSettingData() { @@ -1660,7 +1725,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration ShowIfSet = "!sla_printer&extruder_count>1", HelpText = "The index of the extruder to use for printing support material. Applicable only when Extruder Count is set to a value more than 1.".Localize(), DataEditType = DataEditTypes.INT, - DefaultValue = "1" + DefaultValue = "1", + Resolver = new ValuePlusConstant(-1), }, new SliceSettingData() { @@ -1670,7 +1736,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration ShowIfSet = "!sla_printer&extruder_count>1", EnableIfSet = "create_raft", DataEditType = DataEditTypes.INT, - DefaultValue = "0" + DefaultValue = "0", + Resolver = new ValuePlusConstant(-1), }, new SliceSettingData() { @@ -1679,7 +1746,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "The index of the extruder to use for support material interface layer(s).".Localize(), ShowIfSet = "!sla_printer&extruder_count>1", DataEditType = DataEditTypes.INT, - DefaultValue = "1" + DefaultValue = "1", + Resolver = new ValuePlusConstant(-1), }, new SliceSettingData() { @@ -1689,7 +1757,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.INT_OR_MM, ShowIfSet = "!sla_printer", Units = "layers or mm".Localize(), - DefaultValue = ".9mm" + DefaultValue = ".9mm", + Resolver = new AsCountOrDistance(SettingsKey.layer_height), }, new SliceSettingData() { @@ -1699,7 +1768,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "mm".Localize(), ShowIfSet = "!sla_printer", - DefaultValue = "2.5" + DefaultValue = "2.5", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1709,7 +1779,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, ShowIfSet = "!sla_printer", Units = "mm/s".Localize(), - DefaultValue = "60" + DefaultValue = "60", + Resolver = new OverrideSpeedOnSlaPrinters(SettingsKey.infill_speed), }, new SliceSettingData() { @@ -1719,7 +1790,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, ShowIfSet = "!sla_printer", Units = "mm/s".Localize(), - DefaultValue = "60" + DefaultValue = "60", + Resolver = new OverrideSpeedOnSlaPrinters(SettingsKey.infill_speed), }, new SliceSettingData() { @@ -1729,7 +1801,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, ShowIfSet = "!sla_printer", Units = "mm".Localize(), - DefaultValue = "0.7" + DefaultValue = "0.7", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1739,7 +1812,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.LIST, ShowIfSet = "!sla_printer", ListValues = "GRID,LINES", - DefaultValue = "LINES" + DefaultValue = "LINES", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1899,7 +1973,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.DOUBLE_OR_PERCENT, Units = "mm/s or %".Localize(), ShowIfSet = "!sla_printer", - DefaultValue = "50" + DefaultValue = "50", + Resolver = new OverrideSpeedOnSlaPrinters(SettingsKey.infill_speed), }, new SliceSettingData() { @@ -1908,7 +1983,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "The number of layers, or the distance in millimeters, to solid fill on the top surface(s) of the object. Add mm to the end of the number to specify distance in millimeters.".Localize(), DataEditType = DataEditTypes.INT_OR_MM, Units = "count or mm".Localize(), - DefaultValue = "1mm" + DefaultValue = "1mm", + Resolver = new AsCountOrDistance(SettingsKey.layer_height), }, new SliceSettingData() { @@ -1917,7 +1993,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "The speed at which the nozzle will move when not extruding material.".Localize(), DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "mm/s".Localize(), - DefaultValue = "130" + DefaultValue = "130", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -1933,7 +2010,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration PresentationName = "Bridge Over Infill".Localize(), HelpText = "Make the first layer on top of partial infill use the speed and fan for bridging.".Localize(), DataEditType = DataEditTypes.CHECK_BOX, - DefaultValue = "0" + DefaultValue = "0", + Resolver = new MappedToBoolString(), }, new SliceSettingData() { @@ -2004,7 +2082,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, ShowIfSet = "!sla_printer&extruder_count>1", Units = "mm".Localize(), - DefaultValue = "0" + DefaultValue = "0", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -2014,7 +2093,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "mm".Localize(), ShowIfSet = "!sla_printer&extruder_count>1", - DefaultValue = "0" + DefaultValue = "0", + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -2153,7 +2233,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "The maximum amount the printer can accelerate on a G-Code move.".Localize(), DataEditType = DataEditTypes.POSITIVE_DOUBLE, DefaultValue = "1000", - Units = "mm/s²".Localize() + Units = "mm/s²".Localize(), + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -2162,7 +2243,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "The maximum speed the printer can move.".Localize(), DataEditType = DataEditTypes.POSITIVE_DOUBLE, DefaultValue = "500", - Units = "mm/s".Localize() + Units = "mm/s".Localize(), + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -2171,7 +2253,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "The maximum speed that the printer treats as 0 and changes direction instantly.".Localize(), DataEditType = DataEditTypes.POSITIVE_DOUBLE, DefaultValue = "8", - Units = "mm/s".Localize() + Units = "mm/s".Localize(), + Resolver = new MappedSetting(), }, new SliceSettingData() { @@ -2180,7 +2263,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration HelpText = "Adjust this to correct differences between expected printing speeds and actual printing speeds.".Localize(), DataEditType = DataEditTypes.POSITIVE_DOUBLE, Units = "%".Localize(), - DefaultValue = "100" + DefaultValue = "100", + Resolver = new ScaledSingleNumber(.01), }, new SliceSettingData() { diff --git a/MatterControlLib/ApplicationView/PrinterConfig.cs b/MatterControlLib/ApplicationView/PrinterConfig.cs index 67ccb662d..21612e6bf 100644 --- a/MatterControlLib/ApplicationView/PrinterConfig.cs +++ b/MatterControlLib/ApplicationView/PrinterConfig.cs @@ -44,8 +44,6 @@ namespace MatterHackers.MatterControl public class PrinterConfig : IDisposable { - private MappedSetting[] macroReplacements = null; - public event EventHandler Disposed; public BedConfig Bed { get; } @@ -63,15 +61,11 @@ namespace MatterHackers.MatterControl { this.Connection = new PrinterConnection(this); - this.InitMacroReplacements(); - EngineMappingsMatterSlice = new EngineMappingsMatterSlice(this); } public PrinterConfig(PrinterSettings settings) { - this.InitMacroReplacements(); - EngineMappingsMatterSlice = new EngineMappingsMatterSlice(this); this.Settings = settings; @@ -97,67 +91,6 @@ namespace MatterHackers.MatterControl this.Settings.SettingChanged += Printer_SettingChanged; } - private void InitMacroReplacements() - { - macroReplacements = new MappedSetting[] - { - // Have a mapping so that MatterSlice while always use a setting that can be set. (the user cannot set first_layer_bedTemperature in MatterSlice) - new AsPercentOfReferenceOrDirect(this, SettingsKey.first_layer_speed, SettingsKey.first_layer_speed, SettingsKey.infill_speed, 60), - new AsPercentOfReferenceOrDirect(this, SettingsKey.external_perimeter_speed,"external_perimeter_speed", SettingsKey.perimeter_speed, 60), - new AsPercentOfReferenceOrDirect(this, SettingsKey.raft_print_speed, "raft_print_speed", SettingsKey.infill_speed, 60), - new MappedSetting(this, SettingsKey.bed_remove_part_temperature,SettingsKey.bed_remove_part_temperature), - new MappedSetting(this, SettingsKey.bridge_fan_speed,"bridge_fan_speed"), - new MappedSetting(this, SettingsKey.bridge_speed,"bridge_speed"), - new MappedSetting(this, SettingsKey.air_gap_speed, "air_gap_speed"), - new MappedSetting(this, SettingsKey.extruder_wipe_temperature,"extruder_wipe_temperature"), - new MappedSetting(this, SettingsKey.filament_diameter,SettingsKey.filament_diameter), - new ReplaceWithSetting(this, SettingsKey.first_layer_bed_temperature, SettingsKey.bed_temperature, SettingsKey.bed_temperature), - new MappedSetting(this, SettingsKey.first_layer_temperature, SettingsKey.temperature), - new MappedSetting(this, SettingsKey.max_fan_speed,"max_fan_speed"), - new MappedSetting(this, SettingsKey.min_fan_speed,"min_fan_speed"), - new MappedSetting(this, SettingsKey.retract_length,"retract_length"), - new MappedSetting(this, SettingsKey.temperature,SettingsKey.temperature), - new MappedSetting(this, SettingsKey.bed_temperature,SettingsKey.bed_temperature), - new MappedSetting(this, SettingsKey.temperature1, SettingsKey.temperature1), - new MappedSetting(this, SettingsKey.temperature2, SettingsKey.temperature2), - new MappedSetting(this, SettingsKey.temperature3, SettingsKey.temperature3), - new ScaledSingleNumber(this, SettingsKey.infill_speed, SettingsKey.infill_speed, 60), - new ScaledSingleNumber(this, SettingsKey.min_print_speed, "min_print_speed", 60), - new ScaledSingleNumber(this, SettingsKey.perimeter_speed,"perimeter_speed", 60), - new ScaledSingleNumber(this, SettingsKey.retract_speed,"retract_speed", 60), - new ScaledSingleNumber(this, SettingsKey.support_material_speed,"support_material_speed", 60), - new ScaledSingleNumber(this, SettingsKey.travel_speed, "travel_speed", 60), - new ScaledSingleNumber(this, SettingsKey.load_filament_speed, SettingsKey.load_filament_speed, 60), - new MappedSetting(this, SettingsKey.trim_filament_markdown, SettingsKey.trim_filament_markdown), - new MappedSetting(this, SettingsKey.insert_filament_markdown2, SettingsKey.insert_filament_markdown2), - new MappedSetting(this, SettingsKey.insert_filament_1_markdown, SettingsKey.insert_filament_1_markdown), - new MappedSetting(this, SettingsKey.running_clean_markdown2, SettingsKey.running_clean_markdown2), - new MappedSetting(this, SettingsKey.running_clean_1_markdown, SettingsKey.running_clean_1_markdown), - }; - } - - public string ReplaceMacroValues(string gcodeWithMacros) - { - foreach (MappedSetting mappedSetting in macroReplacements) - { - // first check if this setting is anywhere in the line - if (gcodeWithMacros.Contains(mappedSetting.CanonicalSettingsName)) - { - { - // do the replacement with {} (curly brackets) - string thingToReplace = "{" + "{0}".FormatWith(mappedSetting.CanonicalSettingsName) + "}"; - gcodeWithMacros = gcodeWithMacros.Replace(thingToReplace, mappedSetting.Value); - } - // do the replacement with [] (square brackets) Slic3r uses only square brackets - { - string thingToReplace = "[" + "{0}".FormatWith(mappedSetting.CanonicalSettingsName) + "]"; - gcodeWithMacros = gcodeWithMacros.Replace(thingToReplace, mappedSetting.Value); - } - } - } - - return gcodeWithMacros; - } public PrinterViewState ViewState { get; } @@ -419,8 +352,6 @@ namespace MatterHackers.MatterControl this.Connection.PrintCanceled -= ApplicationController.Instance.Connection_PrintCanceled; this.Connection.ErrorReported -= ApplicationController.Instance.Connection_ErrorReported; - macroReplacements = null; - // Dispose children this.Connection.Dispose(); diff --git a/MatterControlLib/PrinterCommunication/Io/PauseHandlingStream.cs b/MatterControlLib/PrinterCommunication/Io/PauseHandlingStream.cs index 1260f204e..83e79a5db 100644 --- a/MatterControlLib/PrinterCommunication/Io/PauseHandlingStream.cs +++ b/MatterControlLib/PrinterCommunication/Io/PauseHandlingStream.cs @@ -313,7 +313,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io private void InjectPauseGCode(string codeToInject) { - codeToInject = printer.ReplaceMacroValues(codeToInject); + codeToInject = printer.Settings.ReplaceMacroValues(codeToInject); codeToInject = codeToInject.Replace("\\n", "\n"); string[] lines = codeToInject.Split('\n'); diff --git a/MatterControlLib/PrinterCommunication/Io/QueuedCommandsStream.cs b/MatterControlLib/PrinterCommunication/Io/QueuedCommandsStream.cs index 7e39fbeaa..5a58bee40 100644 --- a/MatterControlLib/PrinterCommunication/Io/QueuedCommandsStream.cs +++ b/MatterControlLib/PrinterCommunication/Io/QueuedCommandsStream.cs @@ -135,7 +135,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io if (commandQueue.Count > 0) { lineToSend = commandQueue[0]; - lineToSend = printer.ReplaceMacroValues(lineToSend); + lineToSend = printer.Settings.ReplaceMacroValues(lineToSend); commandQueue.RemoveAt(0); } } diff --git a/MatterControlLib/PrinterCommunication/Io/ToolChangeStream.cs b/MatterControlLib/PrinterCommunication/Io/ToolChangeStream.cs index 9d631447e..2f388d1de 100644 --- a/MatterControlLib/PrinterCommunication/Io/ToolChangeStream.cs +++ b/MatterControlLib/PrinterCommunication/Io/ToolChangeStream.cs @@ -399,7 +399,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io if (afterGcodeToQueue.Trim().Length > 0) { - gcode.Append(printer.ReplaceMacroValues(afterGcodeToQueue)); + gcode.Append(printer.Settings.ReplaceMacroValues(afterGcodeToQueue)); } // move to selected tool to the last tool position at the travel speed @@ -456,7 +456,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io var gcode = new StringBuilder(); if (beforeGcodeToQueue.Trim().Length > 0) { - gcode.Append(printer.ReplaceMacroValues(beforeGcodeToQueue)); + gcode.Append(printer.Settings.ReplaceMacroValues(beforeGcodeToQueue)); } gcode.Append("\n"); diff --git a/MatterControlLib/SlicerConfiguration/EngineMappingsMatterSlice.cs b/MatterControlLib/SlicerConfiguration/EngineMappingsMatterSlice.cs index af6274ed8..2702051d0 100644 --- a/MatterControlLib/SlicerConfiguration/EngineMappingsMatterSlice.cs +++ b/MatterControlLib/SlicerConfiguration/EngineMappingsMatterSlice.cs @@ -27,236 +27,128 @@ of the authors and should not be interpreted as representing official policies, either expressed or implied, of the FreeBSD Project. */ +using System; using System.Collections.Generic; using System.IO; using System.Linq; -using MatterHackers.Agg; -using MatterHackers.MatterControl.SlicerConfiguration.MappingClasses; namespace MatterHackers.MatterControl.SlicerConfiguration { public class EngineMappingsMatterSlice { - /// - /// Application level settings control MatterControl behaviors but aren't used or passed through to the slice engine. Putting settings - /// in this list ensures they show up for all slice engines and the lack of a MappedSetting for the engine guarantees that it won't pass - /// through into the slicer config file. - /// - private readonly HashSet applicationLevelSettings = new HashSet() - { - SettingsKey.enable_fan, - SettingsKey.extruder_wipe_temperature, - SettingsKey.extruders_share_temperature, - SettingsKey.first_layer_bed_temperature, - SettingsKey.g0, - SettingsKey.layer_to_pause, - SettingsKey.selector_ip_address, - SettingsKey.solid_shell, - SettingsKey.z_homes_to_max, - // TODO: merge the items below into the list above after some validation - setting that weren't previously mapped to Cura but probably should be. - SettingsKey.auto_connect, - SettingsKey.auto_release_motors, - SettingsKey.backup_firmware_before_update, - SettingsKey.baud_rate, - SettingsKey.bed_remove_part_temperature, - SettingsKey.bed_shape, - SettingsKey.bed_size, - SettingsKey.bed_temperature, - SettingsKey.before_toolchange_gcode, - SettingsKey.before_toolchange_gcode_1, - SettingsKey.toolchange_gcode, - SettingsKey.toolchange_gcode_1, - SettingsKey.build_height, - SettingsKey.cancel_gcode, - SettingsKey.com_port, - SettingsKey.connect_gcode, - SettingsKey.created_date, - SettingsKey.emulate_endstops, - SettingsKey.enable_line_splitting, - SettingsKey.enable_network_printing, - SettingsKey.enable_retractions, - SettingsKey.enable_sailfish_communication, - SettingsKey.filament_cost, - SettingsKey.filament_density, - SettingsKey.filament_has_been_loaded, - SettingsKey.filament_1_has_been_loaded, - SettingsKey.filament_runout_sensor, - SettingsKey.has_fan, - SettingsKey.has_hardware_leveling, - SettingsKey.has_heated_bed, - SettingsKey.has_power_control, - SettingsKey.has_sd_card_reader, - SettingsKey.has_z_probe, - SettingsKey.has_z_servo, - SettingsKey.heat_extruder_before_homing, - SettingsKey.inactive_cool_down, - SettingsKey.include_firmware_updater, - SettingsKey.insert_filament_markdown2, - SettingsKey.insert_filament_1_markdown, - SettingsKey.ip_address, - SettingsKey.ip_port, - SettingsKey.laser_speed_025, - SettingsKey.laser_speed_100, - SettingsKey.leveling_sample_points, - SettingsKey.load_filament_length, - SettingsKey.load_filament_speed, - SettingsKey.make, - SettingsKey.model, - SettingsKey.t0_inset, - SettingsKey.t1_inset, - SettingsKey.number_of_first_layers, - SettingsKey.extruder_offset, - SettingsKey.pause_gcode, - SettingsKey.print_center, - SettingsKey.print_leveling_probe_start, - SettingsKey.print_leveling_required_to_print, - SettingsKey.print_leveling_solution, - SettingsKey.print_time_estimate_multiplier, - SettingsKey.printer_name, - SettingsKey.probe_has_been_calibrated, - SettingsKey.probe_offset, - SettingsKey.probe_offset_sample_point, - SettingsKey.progress_reporting, - SettingsKey.read_regex, - SettingsKey.recover_first_layer_speed, - SettingsKey.recover_is_enabled, - SettingsKey.recover_position_before_z_home, - SettingsKey.resume_gcode, - SettingsKey.running_clean_markdown2, - SettingsKey.running_clean_1_markdown, - SettingsKey.seconds_to_reheat, - SettingsKey.send_with_checksum, - SettingsKey.show_reset_connection, - SettingsKey.sla_printer, - SettingsKey.t1_extrusion_move_speed_multiplier, - SettingsKey.temperature, - SettingsKey.temperature1, - SettingsKey.temperature2, - SettingsKey.temperature3, - SettingsKey.trim_filament_markdown, - SettingsKey.unload_filament_length, - SettingsKey.use_z_probe, - SettingsKey.validate_layer_height, - SettingsKey.write_regex, - SettingsKey.xy_offsets_have_been_calibrated, - SettingsKey.z_offset, - SettingsKey.z_probe_samples, - SettingsKey.z_servo_depolyed_angle, - SettingsKey.z_servo_retracted_angle, - }; - - public List MappedSettings { get; private set; } - private readonly HashSet matterSliceSettingNames; + public Dictionary Exports { get; } + // Singleton use only - prevent external construction - public EngineMappingsMatterSlice(PrinterConfig printer) + public EngineMappingsMatterSlice(PrinterConfig printer2) { - MappedSettings = new List() + Exports = new Dictionary() { - new AsCountOrDistance(printer, SettingsKey.bottom_solid_layers, "numberOfBottomLayers", SettingsKey.layer_height), - new AsCountOrDistance(printer, SettingsKey.perimeters, "numberOfPerimeters", SettingsKey.nozzle_diameter), - new AsCountOrDistance(printer, SettingsKey.raft_extra_distance_around_part, "raftExtraDistanceAroundPart", SettingsKey.nozzle_diameter), - new AsCountOrDistance(printer, SettingsKey.support_material_interface_layers, "supportInterfaceLayers", SettingsKey.layer_height), - new AsCountOrDistance(printer, SettingsKey.top_solid_layers, "numberOfTopLayers", SettingsKey.layer_height), - new AsPercentOfReferenceOrDirect(printer, SettingsKey.external_perimeter_extrusion_width, "outsidePerimeterExtrusionWidth", SettingsKey.nozzle_diameter), - new OverrideSpeedOnSlaPrinters(printer, SettingsKey.external_perimeter_speed, "outsidePerimeterSpeed", SettingsKey.perimeter_speed), - new AsPercentOfReferenceOrDirect(printer, SettingsKey.first_layer_speed, "firstLayerSpeed", SettingsKey.infill_speed), - new AsCountOrDistance(printer, SettingsKey.number_of_first_layers, "numberOfFirstLayers", SettingsKey.layer_height), - new AsPercentOfReferenceOrDirect(printer, SettingsKey.raft_print_speed, "raftPrintSpeed", SettingsKey.infill_speed), - new OverrideSpeedOnSlaPrinters(printer, SettingsKey.top_solid_infill_speed, "topInfillSpeed", SettingsKey.infill_speed), - new AsPercentOfReferenceOrDirect(printer, SettingsKey.first_layer_extrusion_width, "firstLayerExtrusionWidth", SettingsKey.nozzle_diameter), - new AsPercentOfReferenceOrDirect(printer, SettingsKey.first_layer_height, "firstLayerThickness", SettingsKey.layer_height), - new GCodeForSlicer(printer, SettingsKey.end_gcode, "endCode"), - new MapFirstValue(printer, SettingsKey.retract_before_travel, "minimumTravelToCauseRetraction"), - new RetractionLength(printer, SettingsKey.retract_length, "retractionOnTravel"), - new MapFirstValue(printer, SettingsKey.retract_lift, "retractionZHop"), - new MapFirstValue(printer, SettingsKey.retract_restart_extra, "unretractExtraExtrusion"), - new MapFirstValue(printer, SettingsKey.retract_restart_extra_time_to_apply, "retractRestartExtraTimeToApply"), - new MapFirstValue(printer, SettingsKey.retract_speed, "retractionSpeed"), - new OverrideSpeedOnSlaPrinters(printer, SettingsKey.bridge_speed, "bridgeSpeed", SettingsKey.infill_speed), - new OverrideSpeedOnSlaPrinters(printer, SettingsKey.air_gap_speed, "airGapSpeed", SettingsKey.infill_speed), - new OverrideSpeedOnSlaPrinters(printer, SettingsKey.bottom_infill_speed, "bottomInfillSpeed", SettingsKey.infill_speed), - new MappedToBoolString(printer, SettingsKey.bridge_over_infill, "bridgeOverInfill"), - new AsPercentOrDirect(printer, SettingsKey.extrusion_multiplier, "extrusionMultiplier"), - new MappedSetting(printer, SettingsKey.fill_angle, "infillStartingAngle"), - new AsPercentOfReferenceOrDirect(printer, SettingsKey.infill_overlap_perimeter, "infillExtendIntoPerimeter", SettingsKey.nozzle_diameter, change0ToReference: false), - new OverrideSpeedOnSlaPrinters(printer, SettingsKey.infill_speed, "infillSpeed", SettingsKey.infill_speed), - new MappedSetting(printer, SettingsKey.infill_type, "infillType"), - new MappedSetting(printer, SettingsKey.min_extrusion_before_retract, "minimumExtrusionBeforeRetraction"), - new MappedSetting(printer, SettingsKey.min_print_speed, "minimumPrintingSpeed"), - new OverrideSpeedOnSlaPrinters(printer, SettingsKey.perimeter_speed, "insidePerimetersSpeed", SettingsKey.infill_speed), - new MappedSetting(printer, SettingsKey.raft_air_gap, "raftAirGap"), - new MappedSetting(printer, SettingsKey.max_acceleration, "maxAcceleration"), - new MappedSetting(printer, SettingsKey.max_velocity, "maxVelocity"), - new MappedSetting(printer, SettingsKey.jerk_velocity, "jerkVelocity"), - new ScaledSingleNumber(printer, SettingsKey.print_time_estimate_multiplier, "printTimeEstimateMultiplier", .01), + [SettingsKey.bottom_solid_layers] = new ExportField("numberOfBottomLayers"), + [SettingsKey.perimeters] = new ExportField("numberOfPerimeters"), + [SettingsKey.raft_extra_distance_around_part] = new ExportField("raftExtraDistanceAroundPart"), + [SettingsKey.support_material_interface_layers] = new ExportField("supportInterfaceLayers"), + [SettingsKey.top_solid_layers] = new ExportField("numberOfTopLayers"), + [SettingsKey.external_perimeter_extrusion_width] = new ExportField("outsidePerimeterExtrusionWidth"), + [SettingsKey.external_perimeter_speed] = new ExportField("outsidePerimeterSpeed"), + [SettingsKey.first_layer_speed] = new ExportField("firstLayerSpeed"), + [SettingsKey.number_of_first_layers] = new ExportField("numberOfFirstLayers"), + [SettingsKey.raft_print_speed] = new ExportField("raftPrintSpeed"), + [SettingsKey.top_solid_infill_speed] = new ExportField("topInfillSpeed"), + [SettingsKey.first_layer_extrusion_width] = new ExportField("firstLayerExtrusionWidth"), + [SettingsKey.first_layer_height] = new ExportField("firstLayerThickness"), + [SettingsKey.end_gcode] = new ExportField("endCode"), + [SettingsKey.retract_before_travel] = new ExportField("minimumTravelToCauseRetraction"), + [SettingsKey.retract_length] = new ExportField("retractionOnTravel"), + [SettingsKey.retract_lift] = new ExportField("retractionZHop"), + [SettingsKey.retract_restart_extra] = new ExportField("unretractExtraExtrusion"), + [SettingsKey.retract_restart_extra_time_to_apply] = new ExportField("retractRestartExtraTimeToApply"), + [SettingsKey.retract_speed] = new ExportField("retractionSpeed"), + [SettingsKey.bridge_speed] = new ExportField("bridgeSpeed"), + [SettingsKey.air_gap_speed] = new ExportField("airGapSpeed"), + [SettingsKey.bottom_infill_speed] = new ExportField("bottomInfillSpeed"), + [SettingsKey.bridge_over_infill] = new ExportField("bridgeOverInfill"), + [SettingsKey.extrusion_multiplier] = new ExportField("extrusionMultiplier"), + [SettingsKey.fill_angle] = new ExportField("infillStartingAngle"), + [SettingsKey.infill_overlap_perimeter] = new ExportField("infillExtendIntoPerimeter"), + [SettingsKey.infill_speed] = new ExportField("infillSpeed"), + [SettingsKey.infill_type] = new ExportField("infillType"), + [SettingsKey.min_extrusion_before_retract] = new ExportField("minimumExtrusionBeforeRetraction"), + [SettingsKey.min_print_speed] = new ExportField("minimumPrintingSpeed"), + [SettingsKey.perimeter_speed] = new ExportField("insidePerimetersSpeed"), + [SettingsKey.raft_air_gap] = new ExportField("raftAirGap"), + [SettingsKey.max_acceleration] = new ExportField("maxAcceleration"), + [SettingsKey.max_velocity] = new ExportField("maxVelocity"), + [SettingsKey.jerk_velocity] = new ExportField("jerkVelocity"), + [SettingsKey.print_time_estimate_multiplier] = new ExportField("printTimeEstimateMultiplier"), // fan settings - new MappedFanSpeedSetting(printer, SettingsKey.min_fan_speed, "fanSpeedMinPercent"), - new MappedSetting(printer, SettingsKey.coast_at_end_distance, "coastAtEndDistance"), - new MappedSetting(printer, SettingsKey.min_fan_speed_layer_time, "minFanSpeedLayerTime"), - new MappedFanSpeedSetting(printer, SettingsKey.max_fan_speed, "fanSpeedMaxPercent"), - new MappedSetting(printer, SettingsKey.max_fan_speed_layer_time, "maxFanSpeedLayerTime"), - new MappedFanSpeedSetting(printer, SettingsKey.bridge_fan_speed, "bridgeFanSpeedPercent"), - new MappedSetting(printer, SettingsKey.disable_fan_first_layers, "firstLayerToAllowFan"), + [SettingsKey.min_fan_speed] = new ExportField("fanSpeedMinPercent"), + [SettingsKey.coast_at_end_distance] = new ExportField("coastAtEndDistance"), + [SettingsKey.min_fan_speed_layer_time] = new ExportField("minFanSpeedLayerTime"), + [SettingsKey.max_fan_speed] = new ExportField("fanSpeedMaxPercent"), + [SettingsKey.max_fan_speed_layer_time] = new ExportField("maxFanSpeedLayerTime"), + [SettingsKey.bridge_fan_speed] = new ExportField("bridgeFanSpeedPercent"), + [SettingsKey.disable_fan_first_layers] = new ExportField("firstLayerToAllowFan"), // end fan - new MappedSetting(printer, SettingsKey.retract_length_tool_change, "retractionOnExtruderSwitch"), - new MappedSetting(printer, SettingsKey.retract_restart_extra_toolchange, "unretractExtraOnExtruderSwitch"), - new MappedToBoolString(printer, SettingsKey.reset_long_extrusion, "resetLongExtrusion"), - new MappedSetting(printer, SettingsKey.slowdown_below_layer_time, "minimumLayerTimeSeconds"), - new MappedSetting(printer, SettingsKey.support_air_gap, "supportAirGap"), - new MappedSetting(printer, SettingsKey.support_material_infill_angle, "supportInfillStartingAngle"), - new MappedSetting(printer, SettingsKey.support_material_spacing, "supportLineSpacing"), - new OverrideSpeedOnSlaPrinters(printer, SettingsKey.support_material_speed, "supportMaterialSpeed", "infill_speed"), - new OverrideSpeedOnSlaPrinters(printer, SettingsKey.interface_layer_speed, "interfaceLayerSpeed", "infill_speed"), - new MappedSetting(printer, SettingsKey.support_material_xy_distance, "supportXYDistanceFromObject"), - new MappedSetting(printer, SettingsKey.support_type, "supportType"), - new MappedSetting(printer, SettingsKey.travel_speed, "travelSpeed"), - new MappedSetting(printer, SettingsKey.wipe_shield_distance, "wipeShieldDistanceFromObject"), - new MappedSetting(printer, SettingsKey.wipe_tower_size, "wipeTowerSize"), - new MappedSetting(printer, SettingsKey.filament_diameter, "filamentDiameter"), - new MappedSetting(printer, SettingsKey.layer_height, "layerThickness"), - new MappedSetting(printer, SettingsKey.nozzle_diameter, "extrusionWidth"), - new MappedSetting(printer, SettingsKey.extruder_count, "extruderCount"), - new MappedToBoolString(printer, SettingsKey.avoid_crossing_perimeters, "avoidCrossingPerimeters"), - new MappedToBoolString(printer, SettingsKey.create_raft, "enableRaft"), - new MappedToBoolString(printer, SettingsKey.external_perimeters_first, "outsidePerimetersFirst"), - new MappedToBoolString(printer, SettingsKey.output_only_first_layer, "outputOnlyFirstLayer"), - new MappedToBoolString(printer, SettingsKey.retract_when_changing_islands, "retractWhenChangingIslands"), - new MappedToBoolString(printer, SettingsKey.support_material_create_perimeter, "generateSupportPerimeter"), - new MappedToBoolString(printer, SettingsKey.expand_thin_walls, "expandThinWalls"), - new MappedToBoolString(printer, SettingsKey.merge_overlapping_lines, "MergeOverlappingLines"), - new MappedToBoolString(printer, SettingsKey.fill_thin_gaps, "fillThinGaps"), - new MappedToBoolString(printer, SettingsKey.spiral_vase, "continuousSpiralOuterPerimeter"), - new MapStartGCode(printer, SettingsKey.start_gcode, "startCode", true), - new MapLayerChangeGCode(printer, SettingsKey.layer_gcode, "layerChangeCode"), - new ScaledSingleNumber(printer, SettingsKey.fill_density, "infillPercent", 100), - new ScaledSingleNumber(printer, SettingsKey.perimeter_start_end_overlap, "perimeterStartEndOverlapRatio", .01), - new ValuePlusConstant(printer, SettingsKey.raft_extruder, "raftExtruder", -1), - new ValuePlusConstant(printer, SettingsKey.support_material_extruder, "supportExtruder", -1), - new ValuePlusConstant(printer, SettingsKey.support_material_interface_extruder, "supportInterfaceExtruder", -1), + [SettingsKey.retract_length_tool_change] = new ExportField("retractionOnExtruderSwitch"), + [SettingsKey.retract_restart_extra_toolchange] = new ExportField("unretractExtraOnExtruderSwitch"), + [SettingsKey.reset_long_extrusion] = new ExportField("resetLongExtrusion"), + [SettingsKey.slowdown_below_layer_time] = new ExportField("minimumLayerTimeSeconds"), + [SettingsKey.support_air_gap] = new ExportField("supportAirGap"), + [SettingsKey.support_material_infill_angle] = new ExportField("supportInfillStartingAngle"), + [SettingsKey.support_material_spacing] = new ExportField("supportLineSpacing"), + [SettingsKey.support_material_speed] = new ExportField("supportMaterialSpeed"), + [SettingsKey.interface_layer_speed] = new ExportField("interfaceLayerSpeed"), + [SettingsKey.support_material_xy_distance] = new ExportField("supportXYDistanceFromObject"), + [SettingsKey.support_type] = new ExportField("supportType"), + [SettingsKey.travel_speed] = new ExportField("travelSpeed"), + [SettingsKey.wipe_shield_distance] = new ExportField("wipeShieldDistanceFromObject"), + [SettingsKey.wipe_tower_size] = new ExportField("wipeTowerSize"), + [SettingsKey.filament_diameter] = new ExportField("filamentDiameter"), + [SettingsKey.layer_height] = new ExportField("layerThickness"), + [SettingsKey.nozzle_diameter] = new ExportField("extrusionWidth"), + [SettingsKey.extruder_count] = new ExportField("extruderCount"), + [SettingsKey.avoid_crossing_perimeters] = new ExportField("avoidCrossingPerimeters"), + [SettingsKey.create_raft] = new ExportField("enableRaft"), + [SettingsKey.external_perimeters_first] = new ExportField("outsidePerimetersFirst"), + [SettingsKey.output_only_first_layer] = new ExportField("outputOnlyFirstLayer"), + [SettingsKey.retract_when_changing_islands] = new ExportField("retractWhenChangingIslands"), + [SettingsKey.support_material_create_perimeter] = new ExportField("generateSupportPerimeter"), + [SettingsKey.expand_thin_walls] = new ExportField("expandThinWalls"), + [SettingsKey.merge_overlapping_lines] = new ExportField("MergeOverlappingLines"), + [SettingsKey.fill_thin_gaps] = new ExportField("fillThinGaps"), + [SettingsKey.spiral_vase] = new ExportField("continuousSpiralOuterPerimeter"), + [SettingsKey.start_gcode] = new ExportField("startCode"), + [SettingsKey.layer_gcode] = new ExportField("layerChangeCode"), + [SettingsKey.fill_density] = new ExportField("infillPercent"), + [SettingsKey.perimeter_start_end_overlap] = new ExportField("perimeterStartEndOverlapRatio"), + [SettingsKey.raft_extruder] = new ExportField("raftExtruder"), + [SettingsKey.support_material_extruder] = new ExportField("supportExtruder"), + [SettingsKey.support_material_interface_extruder] = new ExportField("supportInterfaceExtruder"), // Skirt settings - new MappedSkirtLoopsSetting(printer, SettingsKey.skirts, "numberOfSkirtLoops", SettingsKey.nozzle_diameter), - new MappedSetting(printer, SettingsKey.skirt_distance, "skirtDistanceFromObject"), - new SkirtLengthMapping(printer, SettingsKey.min_skirt_length, "skirtMinLength"), + [SettingsKey.skirts] = new ExportField("numberOfSkirtLoops"), + [SettingsKey.skirt_distance] = new ExportField("skirtDistanceFromObject"), + [SettingsKey.min_skirt_length] = new ExportField("skirtMinLength"), // Brim settings - new MappedBrimLoopsSetting(printer, "brims", "numberOfBrimLoops", SettingsKey.nozzle_diameter), + [SettingsKey.brims] = new ExportField("numberOfBrimLoops") }; - matterSliceSettingNames = new HashSet(MappedSettings.Select(m => m.CanonicalSettingsName)); + matterSliceSettingNames = new HashSet(this.Exports.Select(m => m.Key)); } public string Name => "MatterSlice"; - public void WriteSliceSettingsFile(string outputFilename, IEnumerable rawLines) + public void WriteSliceSettingsFile(string outputFilename, IEnumerable rawLines, PrinterSettings settings) { using (var sliceSettingsFile = new StreamWriter(outputFilename)) { - foreach (MappedSetting mappedSetting in MappedSettings) + foreach (var (key, exportField) in this.Exports.Select(kvp => (kvp.Key, kvp.Value))) { - if (mappedSetting.Value != null) + string result = settings.ResolveValue(key); + if (result != null) { - sliceSettingsFile.WriteLine("{0} = {1}".FormatWith(mappedSetting.ExportedName, mappedSetting.Value)); + sliceSettingsFile.WriteLine("{0} = {1}", key, result); } } @@ -270,7 +162,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration public bool MapContains(string canonicalSettingsName) { return matterSliceSettingNames.Contains(canonicalSettingsName) - || applicationLevelSettings.Contains(canonicalSettingsName); + || PrinterSettings.ApplicationLevelSettings.Contains(canonicalSettingsName); } } } \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/ExportField.cs b/MatterControlLib/SlicerConfiguration/ExportField.cs new file mode 100644 index 000000000..a82b2551a --- /dev/null +++ b/MatterControlLib/SlicerConfiguration/ExportField.cs @@ -0,0 +1,49 @@ +/* +Copyright (c) 2016, Lars Brubaker +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace MatterHackers.MatterControl.SlicerConfiguration +{ + public class ExportField + { + public ExportField(string outputName, Func converter = null) + { + this.OuputName = outputName; + this.Converter = converter; + } + + public string OuputName { get; } + + public Func Converter { get; } + } +} \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/OverrideSpeedOnSlaPrinters.cs b/MatterControlLib/SlicerConfiguration/MappingClasses/OverrideSpeedOnSlaPrinters.cs deleted file mode 100644 index 88d9d4c80..000000000 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/OverrideSpeedOnSlaPrinters.cs +++ /dev/null @@ -1,63 +0,0 @@ -/* -Copyright (c) 2016, Lars Brubaker -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The views and conclusions contained in the software and documentation are those -of the authors and should not be interpreted as representing official policies, -either expressed or implied, of the FreeBSD Project. -*/ - -namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses -{ - public class OverrideSpeedOnSlaPrinters : AsPercentOfReferenceOrDirect - { - public OverrideSpeedOnSlaPrinters(PrinterConfig printer, string canonicalSettingsName, string exportedName, string originalReference, double scale = 1) - : base(printer, canonicalSettingsName, exportedName, originalReference, scale) - { - } - - public override string Value - { - get - { - if (printer.Settings.GetValue(SettingsKey.sla_printer)) - { - // return the speed based on the layer height - var speedAt025 = printer.Settings.GetValue(SettingsKey.laser_speed_025); - var speedAt100 = printer.Settings.GetValue(SettingsKey.laser_speed_100); - var deltaSpeed = speedAt100 - speedAt025; - - var layerHeight = printer.Settings.GetValue(SettingsKey.layer_height); - var deltaHeight = .1 - .025; - var heightRatio = (layerHeight - .025) / deltaHeight; - var ajustedSpeed = speedAt025 + deltaSpeed * heightRatio; - return ajustedSpeed.ToString(); - } - else - { - return base.Value; - } - } - } - } -} \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/MappingClasses/Slice3rBedShape.cs b/MatterControlLib/SlicerConfiguration/MappingClasses/Slice3rBedShape.cs deleted file mode 100644 index d0d62f538..000000000 --- a/MatterControlLib/SlicerConfiguration/MappingClasses/Slice3rBedShape.cs +++ /dev/null @@ -1,86 +0,0 @@ -/* -Copyright (c) 2016, Lars Brubaker -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 MatterHackers.MeshVisualizer; -using MatterHackers.VectorMath; -using System; - -namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses -{ - public class Slice3rBedShape : MappedSetting - { - public Slice3rBedShape(PrinterConfig printer, string canonicalSettingsName) - : base(printer, canonicalSettingsName, canonicalSettingsName) - { - } - - public override string Value - { - get - { - Vector2 printCenter = printer.Settings.GetValue(SettingsKey.print_center); - Vector2 bedSize = printer.Settings.GetValue(SettingsKey.bed_size); - switch (printer.Settings.GetValue(SettingsKey.bed_shape)) - { - case BedShape.Circular: - { - int numPoints = 10; - double angle = MathHelper.Tau / numPoints; - string bedString = ""; - bool first = true; - for (int i = 0; i < numPoints; i++) - { - if (!first) - { - bedString += ","; - } - double x = Math.Cos(angle * i); - double y = Math.Sin(angle * i); - bedString += $"{printCenter.X + x * bedSize.X / 2:0.####}x{printCenter.Y + y * bedSize.Y / 2:0.####}"; - first = false; - } - return bedString; - } - //bed_shape = 99.4522x10.4528,97.8148x20.7912,95.1057x30.9017,91.3545x40.6737,86.6025x50,80.9017x58.7785,74.3145x66.9131,66.9131x74.3145,58.7785x80.9017,50x86.6025,40.6737x91.3545,30.9017x95.1057,20.7912x97.8148,10.4528x99.4522,0x100,-10.4528x99.4522,-20.7912x97.8148,-30.9017x95.1057,-40.6737x91.3545,-50x86.6025,-58.7785x80.9017,-66.9131x74.3145,-74.3145x66.9131,-80.9017x58.7785,-86.6025x50,-91.3545x40.6737,-95.1057x30.9017,-97.8148x20.7912,-99.4522x10.4528,-100x0,-99.4522x - 10.4528,-97.8148x - 20.7912,-95.1057x - 30.9017,-91.3545x - 40.6737,-86.6025x - 50,-80.9017x - 58.7785,-74.3145x - 66.9131,-66.9131x - 74.3145,-58.7785x - 80.9017,-50x - 86.6025,-40.6737x - 91.3545,-30.9017x - 95.1057,-20.7912x - 97.8148,-10.4528x - 99.4522,0x - 100,10.4528x - 99.4522,20.7912x - 97.8148,30.9017x - 95.1057,40.6737x - 91.3545,50x - 86.6025,58.7785x - 80.9017,66.9131x - 74.3145,74.3145x - 66.9131,80.9017x - 58.7785,86.6025x - 50,91.3545x - 40.6737,95.1057x - 30.9017,97.8148x - 20.7912,99.4522x - 10.4528,100x0 - - case BedShape.Rectangular: - default: - { - //bed_shape = 0x0,200x0,200x200,0x200 - string bedString = $"{printCenter.X - bedSize.X / 2}x{printCenter.Y - bedSize.Y / 2}"; - bedString += $",{printCenter.X + bedSize.X / 2}x{printCenter.Y - bedSize.Y / 2}"; - bedString += $",{printCenter.X + bedSize.X / 2}x{printCenter.Y + bedSize.Y / 2}"; - bedString += $",{printCenter.X - bedSize.X / 2}x{printCenter.Y + bedSize.Y / 2}"; - return bedString; - } - } - } - } - } -} \ No newline at end of file diff --git a/MatterControlLib/SlicerConfiguration/SliceSettingsRow.cs b/MatterControlLib/SlicerConfiguration/SliceSettingsRow.cs index ac5332d00..f3206a025 100644 --- a/MatterControlLib/SlicerConfiguration/SliceSettingsRow.cs +++ b/MatterControlLib/SlicerConfiguration/SliceSettingsRow.cs @@ -267,49 +267,53 @@ namespace MatterHackers.MatterControl.SlicerConfiguration { string mapsTo = ""; - if (printer.EngineMappingsMatterSlice.MappedSettings.FirstOrDefault(m => m.CanonicalSettingsName == settingData.SlicerConfigName) is AsPercentOfReferenceOrDirect percentReference) + if (printer.EngineMappingsMatterSlice.Exports.TryGetValue(settingData.SlicerConfigName, out ExportField exportField)) { - mapsTo = " -> " + percentReference.ExportedName; + mapsTo = " -> " + exportField.OuputName; var settings = printer.Settings; - string settingValue = settings.GetValue(percentReference.CanonicalSettingsName); - string referencedSetting = settings.GetValue(percentReference.ReferencedSetting); - - double.TryParse(referencedSetting, out double referencedValue); - - var theme = AppContext.Theme; - - var column = new FlowLayoutWidget(FlowDirection.TopToBottom) + if (settingData.Resolver is MappedSetting mappedSetting + && mappedSetting is AsPercentOfReferenceOrDirect percentReference) { - Margin = new BorderDouble(top: 8), - HAnchor = HAnchor.Stretch - }; + string settingValue = settings.GetValue(settingData.SlicerConfigName); + string referencedSetting = settings.GetValue(percentReference.ReferencedSetting); - if (settingValue.Contains("%") - && PrinterSettings.SettingsData.TryGetValue(percentReference.ReferencedSetting, out SliceSettingData referencedSettingData)) - { - column.AddChild( - new TextWidget( - string.Format("{0}: {1} ({2})", "Percentage of".Localize(), referencedSettingData.PresentationName, referencedSetting), - textColor: theme.TextColor, - pointSize: theme.DefaultFontSize - 1)); + double.TryParse(referencedSetting, out double referencedValue); - settingValue = settingValue.Replace("%", "").Trim(); + var theme = AppContext.Theme; - if (int.TryParse(settingValue, out int percent)) + var column = new FlowLayoutWidget(FlowDirection.TopToBottom) { - double ratio = (double)percent / 100; + Margin = new BorderDouble(top: 8), + HAnchor = HAnchor.Stretch + }; - string line = string.Format( - "{0}% of {1} is {2:0.##}", - percent, - referencedValue, - percentReference.Value); + if (settingValue.Contains("%") + && PrinterSettings.SettingsData.TryGetValue(percentReference.ReferencedSetting, out SliceSettingData referencedSettingData)) + { + column.AddChild( + new TextWidget( + string.Format("{0}: {1} ({2})", "Percentage of".Localize(), referencedSettingData.PresentationName, referencedSetting), + textColor: theme.TextColor, + pointSize: theme.DefaultFontSize - 1)); - column.AddChild(new TextWidget(line, textColor: theme.TextColor, pointSize: theme.DefaultFontSize - 1)); + settingValue = settingValue.Replace("%", "").Trim(); - popover.AddChild(column); + if (int.TryParse(settingValue, out int percent)) + { + double ratio = (double)percent / 100; + + string line = string.Format( + "{0}% of {1} is {2:0.##}", + percent, + referencedValue, + settings.ResolveValue(settingData.SlicerConfigName)); + + column.AddChild(new TextWidget(line, textColor: theme.TextColor, pointSize: theme.DefaultFontSize - 1)); + + popover.AddChild(column); + } } } } diff --git a/MatterControlLib/SlicerConfiguration/Slicer.cs b/MatterControlLib/SlicerConfiguration/Slicer.cs index 8fc02e0b0..6336db487 100644 --- a/MatterControlLib/SlicerConfiguration/Slicer.cs +++ b/MatterControlLib/SlicerConfiguration/Slicer.cs @@ -328,11 +328,14 @@ namespace MatterHackers.MatterControl.SlicerConfiguration matrixAndMeshArgs.Append($" \"{fileName}\" "); } - printer.EngineMappingsMatterSlice.WriteSliceSettingsFile(configFilePath, rawLines: new[] - { - $"booleanOperations = {mergeRules}", - $"additionalArgsToProcess ={matrixAndMeshArgs}" - }); + printer.EngineMappingsMatterSlice.WriteSliceSettingsFile( + configFilePath, + new[] + { + $"booleanOperations = {mergeRules}", + $"additionalArgsToProcess ={matrixAndMeshArgs}" + }, + printer.Settings); commandArgs = $"-v -o \"{gcodeFilePath}\" -c \"{configFilePath}\""; diff --git a/Tests/MatterControl.Tests/MatterControl/GCodeProcessingTests.cs b/Tests/MatterControl.Tests/MatterControl/GCodeProcessingTests.cs index c6ce7a0af..098a0449d 100644 --- a/Tests/MatterControl.Tests/MatterControl/GCodeProcessingTests.cs +++ b/Tests/MatterControl.Tests/MatterControl/GCodeProcessingTests.cs @@ -108,7 +108,7 @@ namespace MatterControl.Tests.MatterControl private void TestMacroReplacement(string inputText, string outputControl) { var printer = new PrinterConfig(new PrinterSettings()); - string outputTest = printer.ReplaceMacroValues(inputText); + string outputTest = printer.Settings.ReplaceMacroValues(inputText); Assert.IsTrue(outputTest == outputControl); } diff --git a/Tests/MatterControl.Tests/MatterControl/PrinterSettingsTests.cs b/Tests/MatterControl.Tests/MatterControl/PrinterSettingsTests.cs index 84d367363..1f404b94c 100644 --- a/Tests/MatterControl.Tests/MatterControl/PrinterSettingsTests.cs +++ b/Tests/MatterControl.Tests/MatterControl/PrinterSettingsTests.cs @@ -5,7 +5,6 @@ using MatterHackers.Agg.Platform; using MatterHackers.MatterControl; using MatterHackers.MatterControl.ConfigurationPage.PrintLeveling; using MatterHackers.MatterControl.SlicerConfiguration; -using MatterHackers.MatterControl.SlicerConfiguration.MappingClasses; using MatterHackers.MatterControl.Tests.Automation; using Newtonsoft.Json.Linq; using NUnit.Framework; @@ -23,16 +22,17 @@ namespace MatterControl.Tests.MatterControl var printer = new PrinterConfig(new PrinterSettings()); - var gcodeMapping = new MapStartGCode(printer, SettingsKey.start_gcode, "startCode", true); - Slicer.ExtrudersUsed = new List { true }; var extruderTemp = printer.Settings.GetValue(SettingsKey.temperature); Assert.IsTrue(extruderTemp > 0); + var bedTemp = printer.Settings.GetValue(SettingsKey.bed_temperature); Assert.IsTrue(bedTemp > 0); - var beforeAndAfter = gcodeMapping.Value.Split(new string[] { "; settings from start_gcode" }, StringSplitOptions.None); + string result = printer.Settings.ResolveValue(SettingsKey.start_gcode); + + var beforeAndAfter = result.Split(new string[] { "; settings from start_gcode" }, StringSplitOptions.None); Assert.AreEqual(2, beforeAndAfter.Length); Assert.IsTrue(beforeAndAfter[0].Contains($"M104 T0 S{extruderTemp}")); @@ -44,7 +44,9 @@ namespace MatterControl.Tests.MatterControl // set mapping when there is an M109 in the start code printer.Settings.SetValue(SettingsKey.start_gcode, "G28\\nM109 S205"); - beforeAndAfter = gcodeMapping.Value.Split(new string[] { "; settings from start_gcode" }, StringSplitOptions.None); + + string result2 = printer.Settings.ResolveValue(SettingsKey.start_gcode); + beforeAndAfter = result2.Split(new string[] { "; settings from start_gcode" }, StringSplitOptions.None); // the main change is there should be an M190 before and not after the start code Assert.AreEqual(2, beforeAndAfter.Length);