From 3edcb6914040b343984262fd273b773ab5aa2bac Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Thu, 2 Feb 2017 16:38:48 -0800 Subject: [PATCH 1/2] Made load filament macro work. --- AboutPage/HTMLParser/HtmlWidget.cs | 2 +- ApplicationView/MainApplicationWidget.cs | 2 +- ConfigurationPage/RunningMacroPage.cs | 84 +++++++++++------- .../Io/QueuedCommandsStream.cs | 72 ++++++++++++--- .../Macros/PulseBondTechLoadFilament.jpg | Bin 0 -> 30461 bytes Submodules/agg-sharp | 2 +- 6 files changed, 117 insertions(+), 45 deletions(-) create mode 100644 StaticData/Images/Macros/PulseBondTechLoadFilament.jpg 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/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 0000000000000000000000000000000000000000..7dfdfde37ed3b79e119d2aa611177b9a675f8645 GIT binary patch literal 30461 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 F2>`1xr?~(C literal 0 HcmV?d00001 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 From c3f0957eed09b3cf8eeef2d1a9beb5ebadfe50eb Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Thu, 2 Feb 2017 17:06:01 -0800 Subject: [PATCH 2/2] Make sure we keep the disable widget on top --- CustomWidgets/DisableableWidget.cs | 20 +++++++++++++------- StaticData/Translations/Master.txt | 12 ++++++++++++ 2 files changed, 25 insertions(+), 7 deletions(-) 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/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 +