From a0cd7eee527d8caae29f1a3a0251245999e04909 Mon Sep 17 00:00:00 2001 From: John Lewin Date: Sun, 25 Nov 2018 06:57:23 -0800 Subject: [PATCH 1/2] Skip fields during merge that already equal target value - Issue MatterHackers/MCCentral#4627 PrinterSettings merge pushes every imported value into target layer --- .../Settings/PrinterSettings.cs | 2 +- .../MatterControl/ImportSettingsTests.cs | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/MatterControlLib/SlicerConfiguration/Settings/PrinterSettings.cs b/MatterControlLib/SlicerConfiguration/Settings/PrinterSettings.cs index e7307bbba..18020526c 100644 --- a/MatterControlLib/SlicerConfiguration/Settings/PrinterSettings.cs +++ b/MatterControlLib/SlicerConfiguration/Settings/PrinterSettings.cs @@ -287,7 +287,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration string importValue = settingsToImport.GetValue(keyName, sourceFilter).Trim(); if (!string.IsNullOrEmpty(importValue) - && currentValue != keyName + && currentValue != importValue && !skipKeys.Contains(keyName)) { destinationLayer[keyName] = importValue; diff --git a/Tests/MatterControl.Tests/MatterControl/ImportSettingsTests.cs b/Tests/MatterControl.Tests/MatterControl/ImportSettingsTests.cs index 94a49e33e..bdc1f40a4 100644 --- a/Tests/MatterControl.Tests/MatterControl/ImportSettingsTests.cs +++ b/Tests/MatterControl.Tests/MatterControl/ImportSettingsTests.cs @@ -38,5 +38,41 @@ namespace MatterControl.Tests.MatterControl Assert.AreEqual(printerSettings.GetValue(SettingsKey.cancel_gcode), newValue, "Imported setting applied"); Assert.IsEmpty(printerSettings.GetValue(notAnExistingKey), "Invalid settings keys should be skipped"); } + + [Test] + public void MergeDropsFieldsIfValueAlreadySet() + { + // Validates that field are dropped during import if they are already set in a base layer + // + AggContext.StaticData = new FileSystemStaticData(TestContext.CurrentContext.ResolveProjectPath(4, "StaticData")); + MatterControlUtilities.OverrideAppDataLocation(TestContext.CurrentContext.ResolveProjectPath(4)); + + var printerSettings = new PrinterSettings(); + printerSettings.SetValue(SettingsKey.cancel_gcode, "cancel gcode"); + printerSettings.SetValue(SettingsKey.start_gcode, "start gcode"); + + // Ensure layer_height of a given value + printerSettings.BaseLayer[SettingsKey.layer_height] = "0.25"; + + string newValue = "----- cancel gcode ----"; + string notAnExistingKey = "NotAnExistingKey"; + + var toImport = new PrinterSettings(); + toImport.SetValue(SettingsKey.cancel_gcode, newValue); + toImport.SetValue(SettingsKey.layer_height, "0.25"); + toImport.SetValue(notAnExistingKey, "------------------"); + + var sourceFilter = new List() + { + toImport.UserLayer + }; + + printerSettings.Merge(printerSettings.UserLayer, toImport, sourceFilter, false); + + Assert.AreEqual(printerSettings.GetValue(SettingsKey.cancel_gcode), newValue, "Imported setting applied"); + Assert.IsEmpty(printerSettings.GetValue(notAnExistingKey), "Invalid settings keys should be skipped"); + Assert.IsFalse(printerSettings.UserLayer.ContainsKey(SettingsKey.layer_height), "User layer should not contain layer_height after merge"); + Assert.AreEqual(2, printerSettings.UserLayer.Count, "User layer should contain two items after import (start_gcode, cancel_gcode)"); + } } } From 26781b454b38e4789ea2613ad0822bcba5ad443d Mon Sep 17 00:00:00 2001 From: John Lewin Date: Sun, 25 Nov 2018 07:13:22 -0800 Subject: [PATCH 2/2] Ensure content is on disk before slicing - Issue MatterHackers/MCCentral#4628 GCodeExport should wait for PersistAssets before continuing --- MatterControlLib/Library/Export/GCodeExport.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MatterControlLib/Library/Export/GCodeExport.cs b/MatterControlLib/Library/Export/GCodeExport.cs index 29eda889c..712f9fab1 100644 --- a/MatterControlLib/Library/Export/GCodeExport.cs +++ b/MatterControlLib/Library/Export/GCodeExport.cs @@ -163,8 +163,8 @@ namespace MatterHackers.MatterControl.Library.Export if (loadedItem != null) { - // Necessary to ensure scene or non-persisted ILibraryObject3D content is on disk before slicing - loadedItem.PersistAssets(null); + // Ensure content is on disk before slicing + await loadedItem.PersistAssets(null); try {