From c3aaf505e1a4bd5958a441fb7cdb3986876a7ff3 Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Fri, 18 Mar 2022 15:58:13 -0700 Subject: [PATCH] Cleaning up default materials --- .../Settings/PrinterSettings.cs | 6 +++ .../DesignTools/Sheets/SheetObject3D.cs | 5 ++- .../Library/Widgets/AddMaterialDialog.cs | 2 +- .../Library/Widgets/AddMaterialWidget.cs | 11 ++++-- .../PresetSelectorWidget.cs | 35 +++++++++++------- .../Settings/ProfileManager.cs | 5 ++- .../SliceSettingsWidget.cs | 10 ++++- .../8315973372694813834-256x256.png | Bin 0 -> 32311 bytes StaticData/Materials/General/ABS.material | 6 --- StaticData/Materials/General/Nylon.material | 7 +--- StaticData/Materials/General/PETg.material | 4 +- StaticData/Materials/General/PLA.material | 6 +-- Submodules/MatterSlice | 2 +- .../MatterControl/OemProfileTests.cs | 6 ++- 14 files changed, 61 insertions(+), 44 deletions(-) create mode 100644 StaticData/Images/Thumbnails/8315973372694813834-256x256.png diff --git a/MatterControl.Printing/Settings/PrinterSettings.cs b/MatterControl.Printing/Settings/PrinterSettings.cs index 54ce406b5..2611978fc 100644 --- a/MatterControl.Printing/Settings/PrinterSettings.cs +++ b/MatterControl.Printing/Settings/PrinterSettings.cs @@ -309,6 +309,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration { SetValue(SettingsKey.active_material_key, value); MaterialLayer = GetMaterialLayer(value); + + // Deactivate conflicting user overrides by iterating the Material preset we've just switched to + this.DeactivateConflictingUserOverrides(this.MaterialLayer); } } } @@ -324,6 +327,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration { SetValue(SettingsKey.active_quality_key, value); QualityLayer = GetQualityLayer(value); + + // Deactivate conflicting user overrides by iterating the Quality preset we've just switched to + this.DeactivateConflictingUserOverrides(this.QualityLayer); } } } diff --git a/MatterControlLib/DesignTools/Sheets/SheetObject3D.cs b/MatterControlLib/DesignTools/Sheets/SheetObject3D.cs index 5b02e262c..3be8dd5a3 100644 --- a/MatterControlLib/DesignTools/Sheets/SheetObject3D.cs +++ b/MatterControlLib/DesignTools/Sheets/SheetObject3D.cs @@ -52,7 +52,7 @@ namespace MatterHackers.MatterControl.DesignTools [HideMeterialAndColor] [WebPageLink("Documentation", "Open", "https://www.matterhackers.com/support/mattercontrol-variable-support")] [MarkDownDescription("[BETA] - Experimental support for variables and equations with a sheets like interface.")] - public class SheetObject3D : Object3D, IObject3DControlsProvider + public class SheetObject3D : Object3D, IObject3DControlsProvider, IStaticThumbnail { private SheetData _sheetData; public SheetData SheetData @@ -84,6 +84,9 @@ namespace MatterHackers.MatterControl.DesignTools return item; } + public string ThumbnailName => "Sheet"; + + private static object loadLock = new object(); private static IObject3D sheetObject; diff --git a/MatterControlLib/Library/Widgets/AddMaterialDialog.cs b/MatterControlLib/Library/Widgets/AddMaterialDialog.cs index 00c23c0ee..92230ccab 100644 --- a/MatterControlLib/Library/Widgets/AddMaterialDialog.cs +++ b/MatterControlLib/Library/Widgets/AddMaterialDialog.cs @@ -94,7 +94,7 @@ namespace MatterHackers.MatterControl.Library.Widgets } nextButton.Name = "Next Button"; - nextButton.Click += (s, e) => UiThread.RunOnIdle(async () => + nextButton.Click += (s, e) => UiThread.RunOnIdle(() => { if (materialPanel.SelectedMaterial is AddMaterialWidget.MaterialInfo selectedMaterial) { diff --git a/MatterControlLib/Library/Widgets/AddMaterialWidget.cs b/MatterControlLib/Library/Widgets/AddMaterialWidget.cs index 8e7f366dd..fd1397361 100644 --- a/MatterControlLib/Library/Widgets/AddMaterialWidget.cs +++ b/MatterControlLib/Library/Widgets/AddMaterialWidget.cs @@ -244,14 +244,17 @@ namespace MatterHackers.MatterControl.Library.Widgets printerDetails.AfterLoad += (s, e2) => { - printerDetails.ProductDataContainer.AddChild(new HorizontalLine(theme.TextColor) + if (printerDetails.ProductDataContainer.Children.Count > 0) { - Margin = new BorderDouble(0, 7) - }); + printerDetails.ProductDataContainer.AddChild(new HorizontalLine(theme.TextColor) + { + Margin = new BorderDouble(0, 7) + }); + } var settingsBackground = new GuiWidget() { - Name = "Bacground", + Name = "Background", HAnchor = HAnchor.Stretch, VAnchor = VAnchor.Fit }; diff --git a/MatterControlLib/SlicerConfiguration/PresetSelectorWidget.cs b/MatterControlLib/SlicerConfiguration/PresetSelectorWidget.cs index 09efdb50e..eb6fa7516 100644 --- a/MatterControlLib/SlicerConfiguration/PresetSelectorWidget.cs +++ b/MatterControlLib/SlicerConfiguration/PresetSelectorWidget.cs @@ -389,11 +389,6 @@ namespace MatterHackers.MatterControl.SlicerConfiguration return dropDownList; } - private void CopyPlateToPrinter(object sceneContext, PrinterConfig printer) - { - throw new NotImplementedException(); - } - private void MenuItem_Selected(object sender, EventArgs e) { // When a preset is selected store the current values of all known settings to compare against after applying the preset @@ -419,9 +414,6 @@ namespace MatterHackers.MatterControl.SlicerConfiguration activeSettings.RestoreConflictingUserOverrides(activeSettings.MaterialLayer); activeSettings.ActiveMaterialKey = item.Value; - - // Deactivate conflicting user overrides by iterating the Material preset we've just switched to - activeSettings.DeactivateConflictingUserOverrides(activeSettings.MaterialLayer); } } else // set the temperature for the given extruder @@ -456,9 +448,6 @@ namespace MatterHackers.MatterControl.SlicerConfiguration activeSettings.ActiveQualityKey = item.Value; nextSelection = activeSettings.QualityLayer; - - // Deactivate conflicting user overrides by iterating the Quality preset we've just switched to - activeSettings.DeactivateConflictingUserOverrides(activeSettings.QualityLayer); } } @@ -492,9 +481,21 @@ namespace MatterHackers.MatterControl.SlicerConfiguration } } - foreach (var keyName in settingsToUpdate) - { - printer.Settings.OnSettingChanged(keyName); + // we are about to change many settings only save on the last one + var updateList = settingsToUpdate.ToList(); + ProfileManager.SaveOnSingleSettingChange = false; + for (int i=0; i< updateList.Count-1; i++) + { + printer.Settings.OnSettingChanged(updateList[i]); + } + ProfileManager.SaveOnSingleSettingChange = true; + printer.Settings.OnSettingChanged(updateList[updateList.Count-1]); + + // update the style of every setting + var sliceSettingsWidget = this.Parents().FirstOrDefault(); + if (sliceSettingsWidget != null) + { + sliceSettingsWidget.UpdateAllStyles(); } }); @@ -505,6 +506,12 @@ namespace MatterHackers.MatterControl.SlicerConfiguration { pullDownContainer.CloseChildren(); pullDownContainer.AddChild(this.NewPulldownContainer()); + + var sliceSettingsWidget = this.Parents().FirstOrDefault(); + if (sliceSettingsWidget != null) + { + sliceSettingsWidget.UpdateAllStyles(); + } } private void SettingsLayers_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) diff --git a/MatterControlLib/SlicerConfiguration/Settings/ProfileManager.cs b/MatterControlLib/SlicerConfiguration/Settings/ProfileManager.cs index 283b3fc9c..09020cde7 100644 --- a/MatterControlLib/SlicerConfiguration/Settings/ProfileManager.cs +++ b/MatterControlLib/SlicerConfiguration/Settings/ProfileManager.cs @@ -474,10 +474,13 @@ namespace MatterHackers.MatterControl.SlicerConfiguration return printerSettings; } + public static bool SaveOnSingleSettingChange { get; set; } = true; + // Settings persistence moved from PrinterSettings into ProfileManager to break dependency around ProfileManager paths/MatterControl specific details private static void PrinterSettings_SettingChanged(object sender, StringEventArgs e) { - if (sender is PrinterSettings settings) + if (SaveOnSingleSettingChange + && sender is PrinterSettings settings) { settings.Save(); } diff --git a/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs b/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs index 04273c2ac..42ecceb3a 100644 --- a/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs +++ b/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs @@ -112,7 +112,15 @@ namespace MatterHackers.MatterControl.SlicerConfiguration showControlBar = value; } } - } + + public void UpdateAllStyles() + { + foreach(var child in this.Descendants()) + { + child.UpdateStyle(); + } + } + } public class SliceSettingsTabView : SimpleTabs { diff --git a/StaticData/Images/Thumbnails/8315973372694813834-256x256.png b/StaticData/Images/Thumbnails/8315973372694813834-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..7e86234f7cadae3af7d9b2452769dbbf12a7f03b GIT binary patch literal 32311 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 uU-+}~KXY8 PrinterSettings.LoadFile(f.FullName)).ToList(); + var allMaterialIds = new HashSet(); + foreach(var profile in profiles) { Assert.AreEqual(1, profile.MaterialLayers.Count, "Each material profile should have 1 material in it"); var material = profile.MaterialLayers[0]; profile.ActiveMaterialKey = material.LayerID; Assert.IsTrue(!string.IsNullOrEmpty(profile.GetValue(SettingsKey.material_sku))); - } + Assert.IsTrue(!allMaterialIds.Contains(material.LayerID), "Every material needs a unique Id"); + allMaterialIds.Add(material.LayerID); + } }