Part settings working much better

This commit is contained in:
Lars Brubaker 2022-09-16 14:01:27 -07:00
parent a0324468a6
commit 67fcc953b0
5 changed files with 85 additions and 70 deletions

View file

@ -1317,6 +1317,11 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
layerCascade = DefaultLayerCascade; layerCascade = DefaultLayerCascade;
} }
if (settingsKey == "external_perimeters_first")
{
var a = 0;
}
string settingsValue = null; string settingsValue = null;
foreach (PrinterSettingsLayer layer in layerCascade) foreach (PrinterSettingsLayer layer in layerCascade)

View file

@ -449,12 +449,25 @@ namespace MatterHackers.MatterControl
public event EventHandler ReloadSettingsTriggered; public event EventHandler ReloadSettingsTriggered;
public void ReloadSettings(PrinterConfig printer) public void UpdateAllSettingsStyles(PrinterConfig printer)
{ {
var printerTabPage = this.MainView.Descendants<PrinterTabPage>().Where(page => page.Printer == printer).FirstOrDefault(); var printerTabPage = this.MainView.Descendants<PrinterTabPage>().Where(page => page.Printer == printer).FirstOrDefault();
if (printerTabPage != null) if (printerTabPage != null)
{ {
ApplicationController.Instance.IsReloading = true; var sliceSettingsWidget = printerTabPage.Descendants<SliceSettingsWidget>().FirstOrDefault();
if (sliceSettingsWidget != null)
{
sliceSettingsWidget.UpdateAllStyles();
}
}
}
public void ReloadSettings(PrinterConfig printer)
{
var printerTabPage = this.MainView.Descendants<PrinterTabPage>().Where(page => page.Printer == printer).FirstOrDefault();
if (printerTabPage != null)
{
Instance.IsReloading = true;
var settingsContext = new SettingsContext( var settingsContext = new SettingsContext(
printer, printer,
null, null,
@ -475,7 +488,7 @@ namespace MatterHackers.MatterControl
} }
sideBar.ReplacePage("Slice Settings", new SliceSettingsWidget(printer, settingsContext, Theme)); sideBar.ReplacePage("Slice Settings", new SliceSettingsWidget(printer, settingsContext, Theme));
ApplicationController.Instance.IsReloading = false; Instance.IsReloading = false;
} }
ReloadSettingsTriggered?.Invoke(null, null); ReloadSettingsTriggered?.Invoke(null, null);
@ -1069,13 +1082,15 @@ namespace MatterHackers.MatterControl
{ {
if (printer != null || this.ActivePrinters.Count() == 1) if (printer != null || this.ActivePrinters.Count() == 1)
{ {
// If unspecified but count is one, select the one active printer // If unspecified but count is one, select the one active printer
if (printer == null) if (printer == null)
{ {
printer = this.ActivePrinters.First(); printer = this.ActivePrinters.First();
} }
DialogWindow.Show( printer.ForceSceneSettingsUpdate();
DialogWindow.Show(
new ExportPrintItemPage(libraryItems, centerOnBed, printer)); new ExportPrintItemPage(libraryItems, centerOnBed, printer));
} }
else else
@ -2020,7 +2035,7 @@ namespace MatterHackers.MatterControl
var gcodeFilePath = await editContext.GCodeFilePath(printerConfig); var gcodeFilePath = await editContext.GCodeFilePath(printerConfig);
var printItemName = editContext.SourceItem.Name; var printItemName = editContext.SourceItem.Name;
printerConfig.StartingNewPrint(); printerConfig.ForceSceneSettingsUpdate();
// Exit if called in a non-applicable state // Exit if called in a non-applicable state
if (printerConfig.Connection.CommunicationState != CommunicationStates.Connected if (printerConfig.Connection.CommunicationState != CommunicationStates.Connected

View file

@ -57,10 +57,10 @@ namespace MatterHackers.MatterControl
private double heatDistance = 0; private double heatDistance = 0;
private double heatStart = 0; private double heatStart = 0;
private PrinterConfig() // Hide the default constructor
private PrinterConfig()
{ {
this.Connection = new PrinterConnection(this); }
}
public bool PrintButtonEnabled() public bool PrintButtonEnabled()
{ {
@ -71,37 +71,39 @@ namespace MatterHackers.MatterControl
private PrinterSettingsLayer sceneOverrides = new PrinterSettingsLayer(); private PrinterSettingsLayer sceneOverrides = new PrinterSettingsLayer();
private RunningInterval checkForSceneLayer;
private object locker = new object(); private object locker = new object();
private ulong undoBufferHashCode = ulong.MaxValue; private ulong undoBufferHashCode = ulong.MaxValue;
private int sceneChildrenCount = 0; private int sceneChildrenCount = 0;
private RunningInterval sceneLayerUpdateInterval;
public void StartingNewPrint() /// <summary>
/// Make sure any settings object that has been added to the scene is processed right away
/// </summary>
public void ForceSceneSettingsUpdate()
{ {
undoBufferHashCode = ulong.MaxValue; undoBufferHashCode = ulong.MaxValue;
UpdateSceneLayer();
} }
private PrinterSettingsLayer GetSceneLayer() private void UpdateSceneLayer()
{ {
var scene = Bed?.Scene; var scene = Bed?.Scene;
if (scene != null) if (scene != null)
{ {
var undoBuffer = scene.UndoBuffer; var undoBuffer = scene.UndoBuffer;
if (sceneOverrides != null if (scene.Children.Count == 0
&& undoBuffer != null || (undoBuffer != null
&& undoBufferHashCode == undoBuffer.GetLongHashCode() && undoBufferHashCode == undoBuffer.GetLongHashCode()
&& sceneChildrenCount == scene.Children.Count) && sceneChildrenCount == scene.Children.Count))
{ {
return sceneOverrides; return;
} }
var foundPartSettings = false;
var newSceneOverrides = new PrinterSettingsLayer(); var newSceneOverrides = new PrinterSettingsLayer();
// accumulate all the scene overrides ordered by their names, which is the order they will be in the design tree // accumulate all the scene overrides ordered by their names, which is the order they will be in the design tree
foreach (var partSettingsObject in scene.DescendantsAndSelf().Where(c => c is PartSettingsObject3D && c.Parent?.WorldPrintable() == true).OrderBy(i => i.Name)) foreach (var partSettingsObject in scene.DescendantsAndSelf().Where(c => c is PartSettingsObject3D && c.Parent?.WorldPrintable() == true).OrderBy(i => i.Name))
{ {
foundPartSettings = true;
var settings = ((PartSettingsObject3D)partSettingsObject).Overrides; var settings = ((PartSettingsObject3D)partSettingsObject).Overrides;
foreach (var setting in settings) foreach (var setting in settings)
{ {
@ -110,7 +112,7 @@ namespace MatterHackers.MatterControl
} }
var same = newSceneOverrides.Count == sceneOverrides.Count && !newSceneOverrides.Except(sceneOverrides).Any(); var same = newSceneOverrides.Count == sceneOverrides.Count && !newSceneOverrides.Except(sceneOverrides).Any();
// if settings count and keys the same, check the value of the settings // if settings count and keys are the same, check the value of the settings
if (same && sceneOverrides.Count > 0) if (same && sceneOverrides.Count > 0)
{ {
// check each setting if it is the same // check each setting if it is the same
@ -126,66 +128,54 @@ namespace MatterHackers.MatterControl
// if they are different // if they are different
if (!same) if (!same)
{ {
var settingsToUpdate = new HashSet<string>(); var settingsToRevert = new PrinterSettingsLayer();
var settingsToSet = new PrinterSettingsLayer();
foreach (var kvp in sceneOverrides) foreach (var kvp in sceneOverrides)
{ {
settingsToUpdate.Add(kvp.Key); if (!newSceneOverrides.ContainsKey(kvp.Key))
} {
settingsToRevert[kvp.Key] = kvp.Value;
}
}
foreach (var kvp in newSceneOverrides) foreach (var kvp in newSceneOverrides)
{ {
settingsToUpdate.Add(kvp.Key); if (newSceneOverrides[kvp.Key] != kvp.Value)
} {
settingsToSet[kvp.Key] = newSceneOverrides[kvp.Key];
}
}
// store that current set // store that current set
sceneOverrides = newSceneOverrides; sceneOverrides = newSceneOverrides;
// we are about to update settings but they are stored in the scene not the profile so we don't have to save anything
var updateList = settingsToUpdate.ToList();
ProfileManager.SaveOnSingleSettingChange = false; ProfileManager.SaveOnSingleSettingChange = false;
for (int i = 0; i < updateList.Count; i++) Settings.RestoreConflictingUserOverrides(settingsToRevert);
{ foreach(var setting in newSceneOverrides)
Settings.OnSettingChanged(updateList[i]); {
} Settings.SetValue(setting.Key, setting.Value, sceneOverrides);
ProfileManager.SaveOnSingleSettingChange = true; }
} ProfileManager.SaveOnSingleSettingChange = true;
ApplicationController.Instance.UpdateAllSettingsStyles(this);
if (foundPartSettings)
{
lock (locker)
{
if (checkForSceneLayer == null)
{
checkForSceneLayer = UiThread.SetInterval(() =>
{
GetSceneLayer();
}, .5);
}
}
} }
else if (checkForSceneLayer != null)
{
lock (locker)
{
// we don't have a scene layer so remove the interval
UiThread.ClearInterval(checkForSceneLayer);
checkForSceneLayer = null;
}
}
// return the current set // return the current set
if (undoBuffer != null) if (undoBuffer != null)
{ {
undoBufferHashCode = undoBuffer.GetLongHashCode(); undoBufferHashCode = undoBuffer.GetLongHashCode();
} }
sceneChildrenCount = scene.Children.Count; sceneChildrenCount = scene.Children.Count;
return sceneOverrides;
} }
return null;
} }
public PrinterConfig(PrinterSettings settings) private PrinterSettingsLayer GetSceneLayer()
{
return sceneOverrides;
}
public PrinterConfig(PrinterSettings settings)
{ {
this.Settings = settings; this.Settings = settings;
@ -211,6 +201,11 @@ namespace MatterHackers.MatterControl
this.Bed.InvalidateBedMesh(); this.Bed.InvalidateBedMesh();
this.Settings.SettingChanged += Printer_SettingChanged; this.Settings.SettingChanged += Printer_SettingChanged;
sceneLayerUpdateInterval = UiThread.SetInterval(() =>
{
UpdateSceneLayer();
}, .5);
} }
@ -478,8 +473,11 @@ namespace MatterHackers.MatterControl
public void Dispose() public void Dispose()
{ {
// Unregister listeners UiThread.ClearInterval(sceneLayerUpdateInterval);
this.Settings.SettingChanged -= Printer_SettingChanged; sceneLayerUpdateInterval = null;
// Unregister listeners
this.Settings.SettingChanged -= Printer_SettingChanged;
this.Connection.CommunicationStateChanged -= Connection_CommunicationStateChanged; this.Connection.CommunicationStateChanged -= Connection_CommunicationStateChanged;
this.Connection.DetailedPrintingStateChanged -= Connection_CommunicationStateChanged; this.Connection.DetailedPrintingStateChanged -= Connection_CommunicationStateChanged;
this.Connection.PrintFinished -= Connection_PrintFinished; this.Connection.PrintFinished -= Connection_PrintFinished;

View file

@ -30,7 +30,6 @@ either expressed or implied, of the FreeBSD Project.
using MatterHackers.Agg; using MatterHackers.Agg;
using MatterHackers.Agg.UI; using MatterHackers.Agg.UI;
using MatterHackers.Localizations; using MatterHackers.Localizations;
using MatterHackers.MatterControl.CustomWidgets;
using MatterHackers.MatterControl.SlicerConfiguration; using MatterHackers.MatterControl.SlicerConfiguration;
using System; using System;

View file

@ -28,8 +28,6 @@ either expressed or implied, of the FreeBSD Project.
*/ */
using MatterHackers.Agg.UI; using MatterHackers.Agg.UI;
using MatterHackers.DataConverters3D;
using MatterHackers.MatterControl.DesignTools;
namespace MatterHackers.MatterControl.SlicerConfiguration namespace MatterHackers.MatterControl.SlicerConfiguration
{ {