diff --git a/AboutPage/HTMLParser/HtmlWidget.cs b/AboutPage/HTMLParser/HtmlWidget.cs index 2462a9008..b7399b7c8 100644 --- a/AboutPage/HTMLParser/HtmlWidget.cs +++ b/AboutPage/HTMLParser/HtmlWidget.cs @@ -184,7 +184,7 @@ namespace MatterHackers.MatterControl // put the image into the widget when it is done downloading. var image = new ImageBuffer(Math.Max(elementState.SizeFixed.x, 1), Math.Max(elementState.SizeFixed.y, 1)); var imageWidget = new ImageWidget(image); - imageWidget.Load += (s, e) => ApplicationController.Instance.DownloadToImageAsync(image, elementState.src, elementState.SizeFixed.x == 0); + imageWidget.Load += (s, e) => ApplicationController.Instance.DownloadToImageAsync(image, elementState.src, elementState.SizeFixed.x != 0); if (elementsUnderConstruction.Peek().Name == "a") { diff --git a/ApplicationView/MainApplicationWidget.cs b/ApplicationView/MainApplicationWidget.cs index 3a89fcb20..c9a8ea625 100644 --- a/ApplicationView/MainApplicationWidget.cs +++ b/ApplicationView/MainApplicationWidget.cs @@ -692,7 +692,7 @@ namespace MatterHackers.MatterControl byte[] raw = e.Result; Stream stream = new MemoryStream(raw); ImageBuffer unScaledImage = new ImageBuffer(10, 10); - if (!scaleImage) + if (scaleImage) { StaticData.Instance.LoadImageData(stream, unScaledImage); // If the source image (the one we downloaded) is more than twice as big as our dest image. diff --git a/ConfigurationPage/RunningMacroPage.cs b/ConfigurationPage/RunningMacroPage.cs index d1d7fbb03..5e8dfb068 100644 --- a/ConfigurationPage/RunningMacroPage.cs +++ b/ConfigurationPage/RunningMacroPage.cs @@ -30,6 +30,8 @@ either expressed or implied, of the FreeBSD Project. using System; using System.Collections.Generic; using MatterHackers.Agg; +using MatterHackers.Agg.Image; +using MatterHackers.Agg.PlatformAbstract; using MatterHackers.Agg.UI; using MatterHackers.Localizations; using MatterHackers.MatterControl.CustomWidgets; @@ -50,15 +52,12 @@ namespace MatterHackers.MatterControl.PrinterControls List startingExtruderTemps = new List(); double startingBedTemp = 0; - public RunningMacroPage(string message, bool showOkButton, bool showMaterialSelector, double expectedSeconds, double expectedTemperature) + public RunningMacroPage(string message, bool showOkButton, bool showMaterialSelector, double expectedSeconds, double expectedTemperature, ImageBuffer imageBuffer) : base("Cancel", "Macro Feedback") { TextWidget syncingText = new TextWidget(message, textColor: ActiveTheme.Instance.PrimaryTextColor); contentRow.AddChild(syncingText); - footerRow.AddChild(new HorizontalSpacer()); - footerRow.AddChild(cancelButton); - int extruderCount = ActiveSliceSettings.Instance.GetValue(SettingsKey.extruder_count); for (int i = 0; i < extruderCount; i++) { @@ -72,25 +71,46 @@ namespace MatterHackers.MatterControl.PrinterControls cancelButton.Click += (s, e) => { - for (int i = 0; i < startingExtruderTemps.Count; i++) - { - PrinterConnectionAndCommunication.Instance.SetTargetExtruderTemperature(i, startingExtruderTemps[i]); - } - - if (ActiveSliceSettings.Instance.GetValue(SettingsKey.has_heated_bed)) - { - PrinterConnectionAndCommunication.Instance.TargetBedTemperature = startingBedTemp; - } - - PrinterConnectionAndCommunication.Instance.MacroCancel(); + CancelScript(); }; if (showMaterialSelector) { int extruderIndex = 0; - contentRow.AddChild(new PresetSelectorWidget(string.Format($"{"Material".Localize()} {extruderIndex + 1}"), RGBA_Bytes.Orange, NamedSettingsLayers.Material, extruderIndex)); + var materialSelector = new PresetSelectorWidget(string.Format($"{"Material".Localize()} {extruderIndex + 1}"), RGBA_Bytes.Transparent, NamedSettingsLayers.Material, extruderIndex); + materialSelector.BackgroundColor = RGBA_Bytes.Transparent; + materialSelector.Margin = new BorderDouble(0, 0, 0, 15); + contentRow.AddChild(materialSelector); } + PrinterConnectionAndCommunication.Instance.WroteLine.RegisterEvent(LookForTempRequest, ref unregisterEvents); + + if (showOkButton) + { + Button okButton = textImageButtonFactory.Generate("Continue".Localize()); + + okButton.Click += (s, e) => + { + PrinterConnectionAndCommunication.Instance.MacroContinue(); + UiThread.RunOnIdle(() => WizardWindow?.Close()); + }; + + footerRow.AddChild(okButton); + } + + if (imageBuffer != null) + { + var imageWidget = new ImageWidget(imageBuffer) + { + HAnchor = HAnchor.ParentCenter, + Margin = new BorderDouble(5,15), + }; + + contentRow.AddChild(imageWidget); + } + + contentRow.AddChild(new VerticalSpacer()); + var holder = new FlowLayoutWidget(); progressBar = new ProgressBar((int)(150 * GuiWidget.DeviceScale), (int)(15 * GuiWidget.DeviceScale)) { @@ -117,34 +137,34 @@ namespace MatterHackers.MatterControl.PrinterControls progressBar.Visible = true; } - PrinterConnectionAndCommunication.Instance.WroteLine.RegisterEvent(LookForTempRequest, ref unregisterEvents); + footerRow.AddChild(new HorizontalSpacer()); + footerRow.AddChild(cancelButton); + } - if (showOkButton) + private void CancelScript() + { + for (int i = 0; i < startingExtruderTemps.Count; i++) { - Button okButton = textImageButtonFactory.Generate("Continue".Localize()); - okButton.Margin = new BorderDouble(0, 0, 0, 25); - okButton.HAnchor = HAnchor.ParentCenter; - - okButton.Click += (s, e) => - { - PrinterConnectionAndCommunication.Instance.MacroContinue(); - UiThread.RunOnIdle(() => WizardWindow?.Close()); - }; - - contentRow.AddChild(okButton); + PrinterConnectionAndCommunication.Instance.SetTargetExtruderTemperature(i, startingExtruderTemps[i]); } + + if (ActiveSliceSettings.Instance.GetValue(SettingsKey.has_heated_bed)) + { + PrinterConnectionAndCommunication.Instance.TargetBedTemperature = startingBedTemp; + } + + PrinterConnectionAndCommunication.Instance.MacroCancel(); } private EventHandler unregisterEvents; - public static void Show(string message, bool showOkButton = false, bool showMaterialSelector = false, double expectedSeconds = 0, double expectedTemperature = 0) + public static void Show(string message, bool showOkButton = false, bool showMaterialSelector = false, double expectedSeconds = 0, double expectedTemperature = 0, ImageBuffer image = null) { - WizardWindow.Show("Macro", "Running Macro", new RunningMacroPage(message, showOkButton, showMaterialSelector, expectedSeconds, expectedTemperature)); + WizardWindow.Show("Macro", "Running Macro", new RunningMacroPage(message, showOkButton, showMaterialSelector, expectedSeconds, expectedTemperature, image)); } public override void OnClosed(EventArgs e) { - PrinterConnectionAndCommunication.Instance.MacroContinue(); unregisterEvents?.Invoke(this, null); base.OnClosed(e); diff --git a/CustomWidgets/DisableableWidget.cs b/CustomWidgets/DisableableWidget.cs index 09f592958..691e1a645 100644 --- a/CustomWidgets/DisableableWidget.cs +++ b/CustomWidgets/DisableableWidget.cs @@ -21,16 +21,22 @@ namespace MatterHackers.MatterControl.CustomWidgets && Parent.Height > 0 && Parent.Children.Count > 1) { - - var childBounds = GetChildrenBoundsIncludingMargins(considerChild: (parent, child) => - { - if (child == disableOverlay) + if(Children.IndexOf(disableOverlay) != Children.Count-1) { - return false; + Children.RemoveAt(Children.IndexOf(disableOverlay)); + disableOverlay.ClearRemovedFlag(); + Children.Add(disableOverlay); } - return true; - }); + var childBounds = GetChildrenBoundsIncludingMargins(considerChild: (parent, child) => + { + if (child == disableOverlay) + { + return false; + } + + return true; + }); if (childBounds != RectangleDouble.ZeroIntersection) { diff --git a/PrinterCommunication/Io/QueuedCommandsStream.cs b/PrinterCommunication/Io/QueuedCommandsStream.cs index 73926dbf6..9a6c9da85 100644 --- a/PrinterCommunication/Io/QueuedCommandsStream.cs +++ b/PrinterCommunication/Io/QueuedCommandsStream.cs @@ -29,8 +29,11 @@ either expressed or implied, of the FreeBSD Project. using System.Collections.Generic; using System.Diagnostics; +using System.IO; using System.Text.RegularExpressions; using System.Threading; +using MatterHackers.Agg.Image; +using MatterHackers.Agg.PlatformAbstract; using MatterHackers.Agg.UI; using MatterHackers.GCodeVisualizer; using MatterHackers.MatterControl.PrinterControls; @@ -45,7 +48,8 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io private object locker = new object(); private bool waitingForUserInput = false; private double maxTimeToWaitForOk = 0; - private string commandToRepeat = ""; + private int repeatCommandIndex = 0; + private List commandsToRepeat = new List(); private Stopwatch timeHaveBeenWaiting = new Stopwatch(); public QueuedCommandsStream(GCodeStream internalStream) @@ -72,7 +76,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io waitingForUserInput = false; timeHaveBeenWaiting.Reset(); maxTimeToWaitForOk = 0; - commandToRepeat = ""; + commandsToRepeat.Clear(); } public override string ReadLine() @@ -85,16 +89,26 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io Thread.Sleep(100); if(timeHaveBeenWaiting.IsRunning - && timeHaveBeenWaiting.Elapsed.TotalSeconds < maxTimeToWaitForOk) + && timeHaveBeenWaiting.Elapsed.TotalSeconds > maxTimeToWaitForOk) { - Continue(); + if(commandsToRepeat.Count > 0) + { + // We timed out without the user responding. Cancel the operation. + Reset(); + } + else + { + // everything normal continue after time waited + Continue(); + } } if (maxTimeToWaitForOk > 0 && timeHaveBeenWaiting.Elapsed.TotalSeconds < maxTimeToWaitForOk - && commandToRepeat != "") + && commandsToRepeat.Count > 0) { - lineToSend = commandToRepeat; + lineToSend = commandsToRepeat[repeatCommandIndex % commandsToRepeat.Count]; + repeatCommandIndex++; } } else @@ -132,6 +146,9 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io messages.Add(matchString.Substring(1, matchString.Length - 2)); } + var macroMatch = Regex.Match(lineToSend, "MacroImage:([^\\s]+)\\s*"); + var macroImage = macroMatch.Success ? LoadImageAsset(macroMatch.Groups[1].Value) : null; + switch (command) { case "ChooseMaterial": @@ -150,18 +167,30 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io GCodeFile.GetFirstNumberAfter("ExpectedSeconds:", lineToSend, ref seconds); double temperature = 0; GCodeFile.GetFirstNumberAfter("ExpectedTemperature:", lineToSend, ref temperature); - UiThread.RunOnIdle(() => RunningMacroPage.Show(messages[0], expectedSeconds: seconds, expectedTemperature: temperature)); + UiThread.RunOnIdle(() => RunningMacroPage.Show(messages[0], expectedSeconds: seconds, expectedTemperature: temperature, image: macroImage)); } break; case "RepeatUntil": // Repeat a command until the user clicks or or the max time elapses. - waitingForUserInput = true; - UiThread.RunOnIdle(() => RunningMacroPage.Show(messages.Count > 0 ? messages[0] : "", true)); + if(messages.Count > 1) + { + double seconds = 10; + GCodeFile.GetFirstNumberAfter("ExpectedSeconds:", lineToSend, ref seconds); + timeHaveBeenWaiting.Restart(); + maxTimeToWaitForOk = seconds; + waitingForUserInput = true; + for (int i = 1; i < messages.Count; i++) + { + commandsToRepeat.Add(messages[i]); + } + + UiThread.RunOnIdle(() => RunningMacroPage.Show(messages[0], true, expectedSeconds: seconds, image: macroImage)); + } break; case "WaitOK": waitingForUserInput = true; - UiThread.RunOnIdle(() => RunningMacroPage.Show(messages.Count > 0 ? messages[0] : "", true)); + UiThread.RunOnIdle(() => RunningMacroPage.Show(messages.Count > 0 ? messages[0] : "", true, image: macroImage)); break; default: @@ -179,6 +208,26 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io return lineToSend; } + public ImageBuffer LoadImageAsset(string fileName) + { + string filePath = Path.Combine("Images", "Macros", fileName); + if (StaticData.Instance.FileExists(filePath)) + { + return StaticData.Instance.LoadImage(filePath); + } + else + { + var imageBuffer = new ImageBuffer(); + + ApplicationController.Instance.DownloadToImageAsync(imageBuffer, "http://sync-dot-mattercontrol-test.appspot.com/static/macros/" + fileName, false); + + return imageBuffer; + } + + return null; + } + + public void Reset() { lock (locker) @@ -187,6 +236,9 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io } waitingForUserInput = false; + timeHaveBeenWaiting.Reset(); + maxTimeToWaitForOk = 0; + UiThread.RunOnIdle(() => WizardWindow.Close("Macro")); } } } \ No newline at end of file diff --git a/StaticData/Images/Macros/PulseBondTechLoadFilament.jpg b/StaticData/Images/Macros/PulseBondTechLoadFilament.jpg new file mode 100644 index 000000000..7dfdfde37 Binary files /dev/null and b/StaticData/Images/Macros/PulseBondTechLoadFilament.jpg differ diff --git a/StaticData/Translations/Master.txt b/StaticData/Translations/Master.txt index 8c89e9861..a08198aa9 100644 --- a/StaticData/Translations/Master.txt +++ b/StaticData/Translations/Master.txt @@ -5881,3 +5881,15 @@ Translated:The starting height (z) of the print head before probing each print l English:Probe Start Height Translated:Probe Start Height +English:Controls the speed of printer moves +Translated:Controls the speed of printer moves + +English:Controls the amount of extrusion +Translated:Controls the amount of extrusion + +English:feedrate_ratio +Translated:feedrate_ratio + +English:extrusion_ratio +Translated:extrusion_ratio + diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 94b1d7d36..2662bb283 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 94b1d7d360e70b19ed2a0a97e2e913985a12dc71 +Subproject commit 2662bb28359665783d511e5d79fab63dfe7f3968