diff --git a/ApplicationView/ApplicationController.cs b/ApplicationView/ApplicationController.cs index 9c0c31925..6a09c5ece 100644 --- a/ApplicationView/ApplicationController.cs +++ b/ApplicationView/ApplicationController.cs @@ -1095,7 +1095,7 @@ namespace MatterHackers.MatterControl private string doNotAskAgainMessage = "Don't remind me again".Localize(); - public async Task PrintPart(PrintItemWrapper printItem, PrinterConfig printer, View3DWidget view3DWidget, SliceProgressReporter reporter, bool overrideAllowGCode = false) + public async Task PrintPart(string partFilePath, string gcodePathAndFileName, string printItemName, PrinterConfig printer, View3DWidget view3DWidget, SliceProgressReporter reporter, bool overrideAllowGCode = false) { // Exit if called in a non-applicable state if (this.ActivePrinter.Connection.CommunicationState != CommunicationStates.Connected @@ -1121,21 +1121,20 @@ namespace MatterHackers.MatterControl // Save any pending changes before starting the print await ApplicationController.Instance.ActiveView3DWidget.PersistPlateIfNeeded(); - if (printItem != null) + if (!string.IsNullOrEmpty(partFilePath) + && File.Exists(partFilePath)) { - this.PrintingItemName = printItem.Name; - string pathAndFile = printItem.FileLocation; + this.PrintingItemName = printItemName; if (ActiveSliceSettings.Instance.IsValid()) { - if (File.Exists(pathAndFile)) { // clear the output cache prior to starting a print this.ActivePrinter.Connection.TerminalLog.Clear(); string hideGCodeWarning = ApplicationSettings.Instance.get(ApplicationSettingsKey.HideGCodeWarning); - if (Path.GetExtension(pathAndFile).ToUpper() == ".GCODE" + if (Path.GetExtension(partFilePath).ToUpper() == ".GCODE" && hideGCodeWarning == null && !overrideAllowGCode) { @@ -1165,7 +1164,7 @@ namespace MatterHackers.MatterControl if (messageBoxResponse) { this.ActivePrinter.Connection.CommunicationState = CommunicationStates.PreparingToPrint; - partToPrint_SliceDone(printItem); + partToPrint_SliceDone(partFilePath, gcodePathAndFileName); } }, "The file you are attempting to print is a GCode file.\n\nIt is recommended that you only print Gcode files known to match your printer's configuration.\n\nAre you sure you want to print this GCode file?".Localize(), @@ -1185,11 +1184,12 @@ namespace MatterHackers.MatterControl await ApplicationController.Instance.SliceFileLoadOutput( printer, - printItem, + printer.Bed.EditContext.PartFilePath, + printer.Bed.EditContext.GCodeFilePath, view3DWidget, reporter); - partToPrint_SliceDone(printItem); + partToPrint_SliceDone(partFilePath, gcodePathAndFileName); } } } @@ -1200,18 +1200,18 @@ namespace MatterHackers.MatterControl } } - private void partToPrint_SliceDone(PrintItemWrapper partToPrint) + private void partToPrint_SliceDone(string partFilePath, string gcodePathAndFileName) { - if (partToPrint != null) + if (!string.IsNullOrEmpty(partFilePath) + && File.Exists(partFilePath)) { - string gcodePathAndFileName = partToPrint.GetGCodePathAndFileName(); if (gcodePathAndFileName != "") { - bool originalIsGCode = Path.GetExtension(partToPrint.FileLocation).ToUpper() == ".GCODE"; + bool originalIsGCode = Path.GetExtension(partFilePath).ToUpper() == ".GCODE"; if (File.Exists(gcodePathAndFileName)) { // Create archive point for printing attempt - if (Path.GetExtension(partToPrint.FileLocation).ToUpper() == ".MCX") + if (Path.GetExtension(partFilePath).ToUpper() == ".MCX") { // TODO: We should zip mcx and settings when starting a print string platingDirectory = Path.Combine(ApplicationDataStorage.Instance.ApplicationLibraryDataPath, "PrintHistory"); @@ -1223,7 +1223,7 @@ namespace MatterHackers.MatterControl using (var file = File.OpenWrite(archivePath)) using (var zip = new ZipArchive(file, ZipArchiveMode.Create)) { - zip.CreateEntryFromFile(partToPrint.FileLocation, "PrinterPlate.mcx"); + zip.CreateEntryFromFile(partFilePath, "PrinterPlate.mcx"); zip.CreateEntryFromFile(ActiveSliceSettings.Instance.DocumentPath, ActiveSliceSettings.Instance.GetValue(SettingsKey.printer_name) + ".printer"); zip.CreateEntryFromFile(gcodePathAndFileName, "sliced.gcode"); } @@ -1260,7 +1260,7 @@ namespace MatterHackers.MatterControl } } - public async Task SliceFileLoadOutput(PrinterConfig printer, PrintItemWrapper printItem, View3DWidget view3DWidget, SliceProgressReporter reporter) + public async Task SliceFileLoadOutput(PrinterConfig printer, string partFilePath, string gcodePathAndFileName, View3DWidget view3DWidget, SliceProgressReporter reporter) { var gcodeLoadCancellationTokenSource = new CancellationTokenSource(); @@ -1269,18 +1269,17 @@ namespace MatterHackers.MatterControl // Slice reporter?.StartReporting(); - await Slicer.SliceFileAsync(printItem, reporter); + await Slicer.SliceFileAsync(partFilePath, gcodePathAndFileName, reporter); reporter?.EndReporting(); // Load printer.Bed.LoadGCode( - printItem.GetGCodePathAndFileName(), + gcodePathAndFileName, gcodeLoadCancellationTokenSource.Token, null); // TODO: use not yet implemented standard processing notification system to report GCode load //view3DWidget.gcodeViewer.LoadProgress_Changed); //SetProcessingMessage(string.Format("{0} {1:0}%...", "Loading G-Code".Localize(), progress0To1 * 100)); - } public class CloudSyncEventArgs : EventArgs diff --git a/ApplicationView/PrinterModels.cs b/ApplicationView/PrinterModels.cs index c300e380e..f01deb09f 100644 --- a/ApplicationView/PrinterModels.cs +++ b/ApplicationView/PrinterModels.cs @@ -58,8 +58,6 @@ namespace MatterHackers.MatterControl public View3DConfig RendererOptions { get; } = new View3DConfig(); - public PrintItemWrapper printItem = null; - public PrinterConfig Printer { get; set; } public EditContext EditContext { get; private set; } @@ -99,8 +97,6 @@ namespace MatterHackers.MatterControl this.LoadedGCode = null; this.GCodeRenderer = null; - this.printItem = new PrintItemWrapper(new PrintItem(now, mcxPath)); - var content = new Object3D(); this.Scene.Load(content); @@ -197,15 +193,6 @@ namespace MatterHackers.MatterControl public GCodeRenderInfo RenderInfo { get; set; } - public string GCodePath - { - get - { - bool isGCode = Path.GetExtension(printItem.FileLocation).ToUpper() == ".GCODE"; - return isGCode ? printItem.FileLocation : printItem.GetGCodePathAndFileName(); - } - } - BedMeshGenerator bedGenerator; private Mesh _bedMesh; @@ -345,10 +332,37 @@ namespace MatterHackers.MatterControl public class EditContext { + private ILibraryItem _sourceItem; + public ILibraryWritableContainer LibraryContainer { get; set; } - public ILibraryItem SourceItem { get; set; } + public ILibraryItem SourceItem + { + get => _sourceItem; + set + { + if (_sourceItem != value) + { + _sourceItem = value; + + if (_sourceItem is FileSystemFileItem fileItem) + { + printItem = new PrintItemWrapper(new PrintItem(fileItem.FileName, fileItem.Path)); + } + } + } + } public IObject3D Content { get; set; } + public string GCodeFilePath => printItem.GetGCodePathAndFileName(); + + public string PartFilePath => printItem.FileLocation; + + /// + /// Short term stop gap that should only be used until GCode path helpers, hash code and print recovery components can be extracted + /// + [Obsolete] + internal PrintItemWrapper printItem { get; set; } + internal void Save() { var thumbnailPath = ApplicationController.Instance.ThumbnailCachePath(this.SourceItem); diff --git a/Library/Export/GCodeExport.cs b/Library/Export/GCodeExport.cs index da6e9aeb2..48a87ea9b 100644 --- a/Library/Export/GCodeExport.cs +++ b/Library/Export/GCodeExport.cs @@ -125,13 +125,13 @@ namespace MatterHackers.MatterControl.Library.Export // - If bedplate, save any pending changes before starting the print await ApplicationController.Instance.ActiveView3DWidget.PersistPlateIfNeeded(); - var printItem = ApplicationController.Instance.ActivePrinter.Bed.printItem; + var context = ApplicationController.Instance.ActivePrinter.Bed.EditContext; // - Slice - await Slicer.SliceFileAsync(printItem, null); + await Slicer.SliceFileAsync(context.PartFilePath, context.GCodeFilePath, null); // - Return - fileToProcess = printItem.GetGCodePathAndFileName(); + fileToProcess = context.GCodeFilePath; } return fileToProcess; diff --git a/Library/Widgets/PrintLibraryWidget.cs b/Library/Widgets/PrintLibraryWidget.cs index f3b4a4888..ab15bb968 100644 --- a/Library/Widgets/PrintLibraryWidget.cs +++ b/Library/Widgets/PrintLibraryWidget.cs @@ -390,8 +390,12 @@ namespace MatterHackers.MatterControl.PrintLibrary AddToPlate(selectedLibraryItems); + var context = printer.Bed.EditContext; + await ApplicationController.Instance.PrintPart( - printer.Bed.printItem, + context.PartFilePath, + context.GCodeFilePath, + context.SourceItem.Name, printer, activeContext.View3DWidget, null); diff --git a/PartPreviewWindow/View3D/PrinterActionsBar.cs b/PartPreviewWindow/View3D/PrinterActionsBar.cs index e74f19eb0..12f3b2afd 100644 --- a/PartPreviewWindow/View3D/PrinterActionsBar.cs +++ b/PartPreviewWindow/View3D/PrinterActionsBar.cs @@ -280,8 +280,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { UiThread.RunOnIdle(async () => { + var context = printer.Bed.EditContext; await ApplicationController.Instance.PrintPart( - printer.Bed.printItem, + context.PartFilePath, + context.GCodeFilePath, + context.SourceItem.Name, printer, printerTabPage.view3DWidget, null); @@ -298,8 +301,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { UiThread.RunOnIdle(async () => { + var context = printer.Bed.EditContext; await ApplicationController.Instance.PrintPart( - printer.Bed.printItem, + context.PartFilePath, + context.GCodeFilePath, + context.SourceItem.Name, printer, printerTabPage.view3DWidget, null); diff --git a/PartPreviewWindow/View3D/SlicePopupMenu.cs b/PartPreviewWindow/View3D/SlicePopupMenu.cs index 6f75112c1..a31d512f5 100644 --- a/PartPreviewWindow/View3D/SlicePopupMenu.cs +++ b/PartPreviewWindow/View3D/SlicePopupMenu.cs @@ -116,7 +116,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow if (printer.Settings.PrinterSelected) { - if (printer.Settings.IsValid() && printer.Bed.printItem != null) + if (printer.Settings.IsValid() && printer.Bed.EditContext.SourceItem != null) { activelySlicing = true; @@ -124,7 +124,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { await ApplicationController.Instance.SliceFileLoadOutput( printer, - printer.Bed.printItem, + printer.Bed.EditContext.PartFilePath, + printer.Bed.EditContext.GCodeFilePath, printerTabPage.view3DWidget, new SliceProgressReporter(this.PopupContent, printer)); } diff --git a/PartPreviewWindow/View3D/View3DWidget.cs b/PartPreviewWindow/View3D/View3DWidget.cs index 5582d00e1..aa3e11556 100644 --- a/PartPreviewWindow/View3D/View3DWidget.cs +++ b/PartPreviewWindow/View3D/View3DWidget.cs @@ -353,7 +353,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow }, new NamedAction() { - Title = "Export".Localize() + "...", + Title = "Export".Localize(), Action = () => { UiThread.RunOnIdle(() => @@ -361,14 +361,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow DialogWindow.Show( new ExportPrintItemPage(new[] { - new FileSystemFileItem(sceneContext.printItem.FileLocation) + new FileSystemFileItem(sceneContext.EditContext.PartFilePath) })); }); } }, new NamedAction() { - Title = "Publish".Localize() + "...", + Title = "Publish".Localize(), Action = () => { UiThread.RunOnIdle(() => DialogWindow.Show()); @@ -2068,7 +2068,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { writableContainer.Add(new[] { - new FileSystemFileItem(sceneContext.printItem.FileLocation) + new FileSystemFileItem(sceneContext.EditContext.PartFilePath) { Name = returnInfo.ItemName } diff --git a/PrinterCommunication/PrinterConnection.cs b/PrinterCommunication/PrinterConnection.cs index 8e09b5542..ce236dfc6 100644 --- a/PrinterCommunication/PrinterConnection.cs +++ b/PrinterCommunication/PrinterConnection.cs @@ -2331,7 +2331,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication case CommunicationStates.PreparingToPrint: { - var activePrintItem = printer.Bed.printItem; + var activePrintItem = printer.Bed.EditContext.printItem; if (activePrintItem.PrintItem.Id == 0) { activePrintItem.PrintItem.Commit(); diff --git a/PrinterEmulator/Emulator.cs b/PrinterEmulator/Emulator.cs index e274c7b73..c56f0aa0a 100644 --- a/PrinterEmulator/Emulator.cs +++ b/PrinterEmulator/Emulator.cs @@ -360,7 +360,10 @@ namespace MatterHackers.PrinterEmulator { // M104 S210 or M109 S[temp] var sIndex = command.IndexOf('S') + 1; - Hotend.TargetTemperature = int.Parse(command.Substring(sIndex)); + var spaceIndex = command.IndexOf(" ", sIndex); + var temp = (spaceIndex < 0) ? command.Substring(sIndex) : command.Substring(sIndex, spaceIndex - sIndex); + + Hotend.TargetTemperature = int.Parse(temp); ExtruderTemperatureChanged?.Invoke(this, null); } catch (Exception e) diff --git a/Queue/OptionsMenu/ExportToFolderProcess.cs b/Queue/OptionsMenu/ExportToFolderProcess.cs index a39ba97a2..6a5e8ac69 100644 --- a/Queue/OptionsMenu/ExportToFolderProcess.cs +++ b/Queue/OptionsMenu/ExportToFolderProcess.cs @@ -99,11 +99,11 @@ namespace MatterHackers.MatterControl.PrintQueue savedGCodeFileNames = new List(); foreach (PrintItem part in allFilesToExport) { - PrintItemWrapper printItemWrapper = new PrintItemWrapper(part); + var printItemWrapper = new PrintItemWrapper(part); string extension = Path.GetExtension(printItemWrapper.FileLocation).ToUpper(); - if ((extension != "" && MeshFileIo.ValidFileExtensions().Contains(extension))) + if (extension != "" && MeshFileIo.ValidFileExtensions().Contains(extension)) { - Slicer.SliceFileAsync(printItemWrapper, null).ContinueWith((task) => + Slicer.SliceFileAsync(printItemWrapper.FileLocation, printItemWrapper.GetGCodePathAndFileName(), null).ContinueWith((task) => { Console.WriteLine("Part Slicing Completed"); }); @@ -183,7 +183,7 @@ namespace MatterHackers.MatterControl.PrintQueue #if DEBUG if (instruction.movementType != PrinterMachineInstruction.MovementTypes.Absolute) { - throw new Exception("radial funcitons can only execute absolute moves."); + throw new Exception("Radial functions can only execute absolute moves."); } #endif Vector3 currentDestination = instruction.Position; diff --git a/Queue/PrintItemWrapper.cs b/Queue/PrintItemWrapper.cs index 5c7b3b985..c78a74bdd 100644 --- a/Queue/PrintItemWrapper.cs +++ b/Queue/PrintItemWrapper.cs @@ -259,8 +259,7 @@ namespace MatterHackers.MatterControl.PrintQueue string engineString = (0).ToString(); string gcodeFileName = this.FileHashCode.ToString() + "_" + engineString + "_" + ActiveSliceSettings.Instance.GetLongHashCode().ToString(); - string gcodePathAndFileName = Path.Combine(ApplicationDataStorage.Instance.GCodeOutputPath, gcodeFileName + ".gcode"); - return gcodePathAndFileName; + return Path.Combine(ApplicationDataStorage.Instance.GCodeOutputPath, gcodeFileName + ".gcode"); } else { diff --git a/SlicerConfiguration/Slicer.cs b/SlicerConfiguration/Slicer.cs index cb127e346..e8d931d25 100644 --- a/SlicerConfiguration/Slicer.cs +++ b/SlicerConfiguration/Slicer.cs @@ -226,13 +226,11 @@ namespace MatterHackers.MatterControl.SlicerConfiguration return filePath; } - public static async Task SliceFileAsync(PrintItemWrapper printItem, IProgress progressReporter) + public static async Task SliceFileAsync(string partFilePath, string gcodeFilePath, IProgress progressReporter) { - string gcodeFilePath = printItem.GetGCodePathAndFileName(); - await Task.Run(() => SliceFile( - printItem.FileLocation, - gcodeFilePath, + partFilePath, + gcodeFilePath, progressReporter)); } diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 80de803ed..a28848a21 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 80de803ed4923a7c6aae1bc121f6ad3b72687060 +Subproject commit a28848a2104dd5534a36ec1598adb0c25789e2b8