From a2aaaf671559ec85eb08fd6b4454cabb7e87d3ce Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Wed, 2 Feb 2022 10:52:42 -0800 Subject: [PATCH] Save to compressed mcx is working Don't call save twice --- .../ApplicationView/ApplicationController.cs | 10 ++- .../Library/Export/GCodeExport.cs | 2 +- .../FileSystem/FileSystemContainer.cs | 83 +++++++++++++++++-- .../Widgets/ListView/LibraryListView.cs | 7 +- .../PartPreviewWindow/SaveAsPage.cs | 2 + MatterControlLib/PartPreviewWindow/Tabs.cs | 2 +- .../EngineMappingsMatterSlice.cs | 4 +- StaticData/Translations/Master.txt | 53 ++++-------- Submodules/agg-sharp | 2 +- 9 files changed, 109 insertions(+), 56 deletions(-) diff --git a/MatterControlLib/ApplicationView/ApplicationController.cs b/MatterControlLib/ApplicationView/ApplicationController.cs index 85dfc737b..a60b2da6a 100644 --- a/MatterControlLib/ApplicationView/ApplicationController.cs +++ b/MatterControlLib/ApplicationView/ApplicationController.cs @@ -2167,11 +2167,13 @@ namespace MatterHackers.MatterControl if (settingsFilePath != null) { using (var file = File.OpenWrite(archivePath)) - using (var zip = new ZipArchive(file, ZipArchiveMode.Create)) { - zip.CreateEntryFromFile(sourcePath, "PrinterPlate.mcx"); - zip.CreateEntryFromFile(settingsFilePath, printer.PrinterName + ".printer"); - zip.CreateEntryFromFile(gcodeFilePath, "sliced.gcode"); + using (var zip = new ZipArchive(file, ZipArchiveMode.Create)) + { + zip.CreateEntryFromFile(sourcePath, "PrinterPlate.mcx"); + zip.CreateEntryFromFile(settingsFilePath, printer.PrinterName + ".printer"); + zip.CreateEntryFromFile(gcodeFilePath, "sliced.gcode"); + } } } } diff --git a/MatterControlLib/Library/Export/GCodeExport.cs b/MatterControlLib/Library/Export/GCodeExport.cs index 24d2b8428..78d7b5a62 100644 --- a/MatterControlLib/Library/Export/GCodeExport.cs +++ b/MatterControlLib/Library/Export/GCodeExport.cs @@ -194,7 +194,7 @@ namespace MatterHackers.MatterControl.Library.Export { status.Progress0To1 = percentComplete; progress.Report(status); - }, publishAssets: false); + }, forceIntoCache: false); } else if (assetStream != null) { diff --git a/MatterControlLib/Library/Providers/FileSystem/FileSystemContainer.cs b/MatterControlLib/Library/Providers/FileSystem/FileSystemContainer.cs index 9f1aaed31..c5e738290 100644 --- a/MatterControlLib/Library/Providers/FileSystem/FileSystemContainer.cs +++ b/MatterControlLib/Library/Providers/FileSystem/FileSystemContainer.cs @@ -30,6 +30,7 @@ either expressed or implied, of the FreeBSD Project. using System; using System.Collections.Generic; using System.IO; +using System.IO.Compression; using System.Linq; using System.Threading.Tasks; using MatterHackers.Agg; @@ -37,6 +38,7 @@ using MatterHackers.Agg.Image; using MatterHackers.Agg.Platform; using MatterHackers.Agg.UI; using MatterHackers.DataConverters3D; +using MatterHackers.Localizations; using MatterHackers.MatterControl.DataStorage; namespace MatterHackers.MatterControl.Library @@ -84,18 +86,83 @@ namespace MatterHackers.MatterControl.Library { if (item is FileSystemFileItem fileItem) { - if (fileItem.FilePath.Contains(ApplicationDataStorage.Instance.LibraryAssetsPath)) - { + if (fileItem.FilePath.Contains(ApplicationDataStorage.Instance.ApplicationLibraryDataPath)) + { // save using the normal uncompressed mcx file base.Save(item, content); - } + } else - { - // save to a binary mcx file (a zip with a scene.mcx and an assets folder) + { + ApplicationController.Instance.Tasks.Execute( + "Saving Changes".Localize(), + null, + async (reporter, cancellationTokenSource) => + { + var status = new ProgressStatus() + { + Status = "Saving Asset".Localize() + }; - // Serialize the scene to disk using a modified Json.net pipeline with custom ContractResolvers and JsonConverters - File.WriteAllText(fileItem.FilePath, content.ToJson()); - this.OnItemContentChanged(new LibraryItemChangedEventArgs(fileItem)); + // make sure we have all the mesh items in the cache for saving to the archive + await content.PersistAssets((percentComplete, text) => + { + status.Progress0To1 = percentComplete * .9; + reporter.Report(status); + }, forceIntoCache: true); + + var backupName = ""; + // rename any existing file + if (File.Exists(fileItem.FilePath)) + { + var directory = Path.GetDirectoryName(fileItem.FilePath); + var filename = Path.GetFileNameWithoutExtension(fileItem.FilePath); + backupName = Path.Combine(directory, Path.ChangeExtension(filename + "_bak", ".mcx")); + File.Move(fileItem.FilePath, backupName); + } + + var persistableItems = content.GetPersistable(true); + var persistCount = persistableItems.Count(); + var savedCount = 0; + + // save to a binary mcx file (a zip with a scene.mcx and an assets folder) + using (var file = File.OpenWrite(fileItem.FilePath)) + { + using (var zip = new ZipArchive(file, ZipArchiveMode.Create)) + { + using (var writer = new StreamWriter(zip.CreateEntry("scene.mcx").Open())) + { + writer.Write(content.ToJson()); + } + + foreach (var persistMeshItem in persistableItems) + { + var sourcePath = persistMeshItem.MeshPath; + if (!File.Exists(sourcePath)) + { + sourcePath = Path.Combine(ApplicationDataStorage.Instance.LibraryAssetsPath, Path.GetFileName(persistMeshItem.MeshPath)); + } + if (File.Exists(sourcePath)) + { + var assetName = Path.Combine("Assets", Path.GetFileName(sourcePath)); + zip.CreateEntryFromFile(sourcePath, assetName); + } + + savedCount++; + status.Progress0To1 = .9 + .1 * (savedCount / persistCount); + reporter.Report(status); + } + } + } + + // Serialize the scene to disk using a modified Json.net pipeline with custom ContractResolvers and JsonConverters + this.OnItemContentChanged(new LibraryItemChangedEventArgs(fileItem)); + + // remove the existing file after a successfull save + if (!string.IsNullOrEmpty(backupName)) + { + File.Delete(backupName); + } + }); } } } diff --git a/MatterControlLib/Library/Widgets/ListView/LibraryListView.cs b/MatterControlLib/Library/Widgets/ListView/LibraryListView.cs index 88d1eb3cf..039be877e 100644 --- a/MatterControlLib/Library/Widgets/ListView/LibraryListView.cs +++ b/MatterControlLib/Library/Widgets/ListView/LibraryListView.cs @@ -550,7 +550,12 @@ namespace MatterHackers.MatterControl.CustomWidgets } else { - ApplicationController.Instance.OpenIntoNewTab(new[] { itemModel }); + void OpenNewTab() + { + _ = ApplicationController.Instance.OpenIntoNewTab(new[] { itemModel }); + } + + OpenNewTab(); } } else diff --git a/MatterControlLib/PartPreviewWindow/SaveAsPage.cs b/MatterControlLib/PartPreviewWindow/SaveAsPage.cs index 5fa3e4951..668de53ed 100644 --- a/MatterControlLib/PartPreviewWindow/SaveAsPage.cs +++ b/MatterControlLib/PartPreviewWindow/SaveAsPage.cs @@ -70,6 +70,8 @@ namespace MatterHackers.MatterControl if (librarySelectorWidget.ActiveContainer is ILibraryWritableContainer) { acceptButton.InvokeClick(); + // And disable it so there are not multiple fires. No need to re-enable, the dialog is going to close. + this.AcceptButton.Enabled = false; } }; contentRow.AddChild(itemNameWidget); diff --git a/MatterControlLib/PartPreviewWindow/Tabs.cs b/MatterControlLib/PartPreviewWindow/Tabs.cs index 81ee9386c..4c1af2a1c 100644 --- a/MatterControlLib/PartPreviewWindow/Tabs.cs +++ b/MatterControlLib/PartPreviewWindow/Tabs.cs @@ -486,7 +486,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { this.CloseClicked?.Invoke(this, null); // Must be called after CloseClicked otherwise listeners are cleared before event is invoked - this.parentTabControl.CloseTab(this); + this.parentTabControl?.CloseTab(this); }); break; } diff --git a/MatterControlLib/SlicerConfiguration/EngineMappingsMatterSlice.cs b/MatterControlLib/SlicerConfiguration/EngineMappingsMatterSlice.cs index 2feb45f7b..6ffc7fcf8 100644 --- a/MatterControlLib/SlicerConfiguration/EngineMappingsMatterSlice.cs +++ b/MatterControlLib/SlicerConfiguration/EngineMappingsMatterSlice.cs @@ -603,8 +603,6 @@ namespace MatterHackers.MatterControl.SlicerConfiguration mergeString += ","; } - // TODO: Use existing AssetsPath property - string assetsDirectory = Path.Combine(ApplicationDataStorage.Instance.ApplicationLibraryDataPath, "Assets"); var itemWorldMatrix = item.WorldMatrix(); if (item is GeneratedSupportObject3D generatedSupportObject3D && item.Mesh != null) @@ -616,7 +614,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration itemWorldMatrix = itemWorldMatrix.ApplyAtPosition(aabbForCenter.Center.Transform(itemWorldMatrix), Matrix4X4.CreateScale(xyScale, xyScale, 1)); } - outputItems.Add((itemWorldMatrix, Path.Combine(assetsDirectory, item.MeshPath))); + outputItems.Add((itemWorldMatrix, Path.Combine(ApplicationDataStorage.Instance.LibraryAssetsPath, item.MeshPath))); mergeString += $"({savedStlCount++}"; first = false; } diff --git a/StaticData/Translations/Master.txt b/StaticData/Translations/Master.txt index 4136778ed..754a753bc 100644 --- a/StaticData/Translations/Master.txt +++ b/StaticData/Translations/Master.txt @@ -28,12 +28,6 @@ Translated:% English:(Press 'Skip' to setup connection later) Translated:(Press 'Skip' to setup connection later) -English:\nBelow you can find a list of each setting that has changed. -Translated:\nBelow you can find a list of each setting that has changed. - -English:\nUpdating a default setting will not change any override that you have applied. -Translated:\nUpdating a default setting will not change any override that you have applied. - English:{0} (Update Available) Translated:{0} (Update Available) @@ -322,8 +316,8 @@ Translated:Anchor English:and ensure that no filament is stuck to your nozzle. Translated:and ensure that no filament is stuck to your nozzle. -English:and the hotend to heat to -Translated:and the hotend to heat to +English:and the hotend to heat to +Translated:and the hotend to heat to English:Angle Translated:Angle @@ -367,9 +361,6 @@ Translated:Are you sure you want to delete printer '{0}'? English:Are you sure you want to exit while a print is running from SD Card?\n\nNote: If you exit, it is recommended you wait until the print is completed before running MatterControl again. Translated:Are you sure you want to exit while a print is running from SD Card?\n\nNote: If you exit, it is recommended you wait until the print is completed before running MatterControl again. -English:Are you sure you want to exit while a print is running from SD Card?\n\nNote: If you exit, it is recommended you wait until the print is completed before running MatterControl again. -Translated:Are you sure you want to exit while a print is running from SD Card?\n\nNote: If you exit, it is recommended you wait until the print is completed before running MatterControl again. - English:Are you sure you want to remove the currently selected items? Translated:Are you sure you want to remove the currently selected items? @@ -1495,8 +1486,8 @@ Translated:Error: Below Conductive Probe Min Z English:Error: Could not create file for saving. Original error Translated:Error: Could not create file for saving. Original error -English:Error: Could not read file from disk. Original error: -Translated:Error: Could not read file from disk. Original error: +English:Error: Could not read file from disk. Original error: +Translated:Error: Could not read file from disk. Original error: English:Estimated Cost Translated:Estimated Cost @@ -2332,9 +2323,6 @@ Translated:IP Finder English:It appears your last print failed to complete.\n\nWould your like to attempt to recover from the last know position? Translated:It appears your last print failed to complete.\n\nWould your like to attempt to recover from the last know position? -English:It appears your last print failed to complete.\n\nWould your like to attempt to recover from the last know position? -Translated:It appears your last print failed to complete.\n\nWould your like to attempt to recover from the last know position? - English:It is currently set to {0}. Translated:It is currently set to {0}. @@ -2584,6 +2572,9 @@ Translated:Macro Presets English:Macros Translated:Macros +English:Maintain Proportions +Translated:Maintain Proportions + English:Maintain Surface Translated:Maintain Surface @@ -3172,6 +3163,9 @@ Translated:Open Settings View Options English:OpenSCAD not installed Translated:OpenSCAD not installed +English:Operation +Translated:Operation + English:Optional Translated:Optional @@ -3886,9 +3880,6 @@ Translated:Reset View English:Resetting to default values will remove your current overrides and restore your original printer settings.\nAre you sure you want to continue? Translated:Resetting to default values will remove your current overrides and restore your original printer settings.\nAre you sure you want to continue? -English:Resetting to default values will remove your current overrides and restore your original printer settings.\nAre you sure you want to continue? -Translated:Resetting to default values will remove your current overrides and restore your original printer settings.\nAre you sure you want to continue? - English:Reshape Translated:Reshape @@ -4120,6 +4111,9 @@ Translated:SCAD Script English:Scale Translated:Scale +English:Scale About +Translated:Scale About + English:Scale Offset Translated:Scale Offset @@ -4885,9 +4879,6 @@ Translated:The extra distance the raft will extend around the edge of the part. English:The extruder is currently heating and its target temperature cannot be changed until it reaches {0}°C.\n\nYou can set the starting extruder temperature in 'Slice Settings' -> 'Filament'.\n\n{1} Translated:The extruder is currently heating and its target temperature cannot be changed until it reaches {0}°C.\n\nYou can set the starting extruder temperature in 'Slice Settings' -> 'Filament'.\n\n{1} -English:The extruder is currently heating and its target temperature cannot be changed until it reaches {0}°C.\n\nYou can set the starting extruder temperature in 'Slice Settings' -> 'Filament'.\n\n{1} -Translated:The extruder is currently heating and its target temperature cannot be changed until it reaches {0}°C.\n\nYou can set the starting extruder temperature in 'Slice Settings' -> 'Filament'.\n\n{1} - English:The extruder to use for support material. Default will use whichever extruder active at the time. Translated:The extruder to use for support material. Default will use whichever extruder active at the time. @@ -4915,9 +4906,6 @@ Translated:The height of the printer's printable volume, in millimeters. Control English:The inset amount for each side of the bed.\n- As a % of the width or depth\n- Ordered: Left, Front, Right, Back\n- NOTE: The probe offset is added on top of this Translated:The inset amount for each side of the bed.\n- As a % of the width or depth\n- Ordered: Left, Front, Right, Back\n- NOTE: The probe offset is added on top of this -English:The inset amount for each side of the bed.\n- As a % of the width or depth\n- Ordered: Left, Front, Right, Back\n- NOTE: The probe offset is added on top of this -Translated:The inset amount for each side of the bed.\n- As a % of the width or depth\n- Ordered: Left, Front, Right, Back\n- NOTE: The probe offset is added on top of this - English:The inset amount for nozzle 1 from the bed (Left, Front, Right, Back). Translated:The inset amount for nozzle 1 from the bed (Left, Front, Right, Back). @@ -5128,9 +5116,6 @@ Translated:The serial port communication speed of the printers firmware. English:The 'Serial Port' section lists all available serial\nports on your device. Changing which USB port the printer\nis connected to may change the associated serial port.\n\nTip: If you are uncertain, unplug/plug in your printer\nand hit refresh. The new port that appears should be\nyour printer. Translated:The 'Serial Port' section lists all available serial\nports on your device. Changing which USB port the printer\nis connected to may change the associated serial port.\n\nTip: If you are uncertain, unplug/plug in your printer\nand hit refresh. The new port that appears should be\nyour printer. -English:The 'Serial Port' section lists all available serial\nports on your device. Changing which USB port the printer\nis connected to may change the associated serial port.\n\nTip: If you are uncertain, unplug/plug in your printer\nand hit refresh. The new port that appears should be\nyour printer. -Translated:The 'Serial Port' section lists all available serial\nports on your device. Changing which USB port the printer\nis connected to may change the associated serial port.\n\nTip: If you are uncertain, unplug/plug in your printer\nand hit refresh. The new port that appears should be\nyour printer. - English:The serial port to use while connecting to this printer. Translated:The serial port to use while connecting to this printer. @@ -5680,6 +5665,9 @@ Translated:Use G0 for moves rather than G1. English:Use Grade 2 Translated:Use Grade 2 +English:Use Percentage +Translated:Use Percentage + English:Use Relative E Distances Translated:Use Relative E Distances @@ -5842,12 +5830,6 @@ Translated:Warning, very short print English:WARNING: Disconnecting will stop the current print.\n\nAre you sure you want to disconnect? Translated:WARNING: Disconnecting will stop the current print.\n\nAre you sure you want to disconnect? -English:WARNING: Disconnecting will stop the current print.\n\nAre you sure you want to disconnect? -Translated:WARNING: Disconnecting will stop the current print.\n\nAre you sure you want to disconnect? - -English:WARNING: In order to perform print recovery, your printer must move down to reach its home position.\nIf your print is too large, part of your printer may collide with it when moving down.\nMake sure it is safe to perform this operation before proceeding. -Translated:WARNING: In order to perform print recovery, your printer must move down to reach its home position.\nIf your print is too large, part of your printer may collide with it when moving down.\nMake sure it is safe to perform this operation before proceeding. - English:WARNING: In order to perform print recovery, your printer must move down to reach its home position.\nIf your print is too large, part of your printer may collide with it when moving down.\nMake sure it is safe to perform this operation before proceeding. Translated:WARNING: In order to perform print recovery, your printer must move down to reach its home position.\nIf your print is too large, part of your printer may collide with it when moving down.\nMake sure it is safe to perform this operation before proceeding. @@ -6025,9 +6007,6 @@ Translated:You should have at least 3 top layers for this calibration to measure English:Your 3D print has been auto-paused.\n\nLayer {0} reached. Translated:Your 3D print has been auto-paused.\n\nLayer {0} reached. -English:Your 3D print has been auto-paused.\n\nLayer {0} reached. -Translated:Your 3D print has been auto-paused.\n\nLayer {0} reached. - English:Your 3D print has been paused.\n\nOut of filament, or jam, detected. Please load more filament or clear the jam. Translated:Your 3D print has been paused.\n\nOut of filament, or jam, detected. Please load more filament or clear the jam. diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 944f9897b..fc5991cdc 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 944f9897b7e2adaa9b1de88960d1fbaff24669ad +Subproject commit fc5991cdcc86cef219b6a4215f3551f98904f065