diff --git a/MatterControlLib/CustomWidgets/ExportPrintItemPage.cs b/MatterControlLib/CustomWidgets/ExportPrintItemPage.cs index 53f65337b..0d63fc141 100644 --- a/MatterControlLib/CustomWidgets/ExportPrintItemPage.cs +++ b/MatterControlLib/CustomWidgets/ExportPrintItemPage.cs @@ -156,7 +156,7 @@ namespace MatterHackers.MatterControl if (plugin is IExportWithOptions pluginWithOptions) { - var optionPanel = pluginWithOptions.GetOptionsPanel(); + var optionPanel = pluginWithOptions.GetOptionsPanel(libraryItems); if (optionPanel != null) { optionPanel.HAnchor = HAnchor.Stretch; diff --git a/MatterControlLib/Library/Export/AmfExport.cs b/MatterControlLib/Library/Export/AmfExport.cs index a8061b881..89d5dc7a3 100644 --- a/MatterControlLib/Library/Export/AmfExport.cs +++ b/MatterControlLib/Library/Export/AmfExport.cs @@ -57,7 +57,7 @@ namespace MatterHackers.MatterControl.Library.Export var firstItem = libraryItems.OfType().FirstOrDefault(); if (firstItem is ILibraryAsset libraryItem) { - bool exportSuccessful = await MeshExport.ExportMesh(libraryItem, outputPath, progress); + bool exportSuccessful = await MeshExport.ExportMesh(libraryItem, outputPath, true, progress); if (exportSuccessful) { return null; diff --git a/MatterControlLib/Library/Export/GCodeExport.cs b/MatterControlLib/Library/Export/GCodeExport.cs index 039192934..c4bfced15 100644 --- a/MatterControlLib/Library/Export/GCodeExport.cs +++ b/MatterControlLib/Library/Export/GCodeExport.cs @@ -110,7 +110,7 @@ namespace MatterHackers.MatterControl.Library.Export public virtual bool ExportPossible(ILibraryAsset libraryItem) => true; - public GuiWidget GetOptionsPanel() + public GuiWidget GetOptionsPanel(IEnumerable libraryItems) { var container = new FlowLayoutWidget() { @@ -132,7 +132,7 @@ namespace MatterHackers.MatterControl.Library.Export } else { - spiralVaseOverride = SpiralVaseOptions.FORCE_ON; + spiralVaseOverride = SpiralVaseOptions.USE_SETTINGS; } }; container.AddChild(spiralVaseCheckbox); diff --git a/MatterControlLib/Library/Export/IExportPlugin.cs b/MatterControlLib/Library/Export/IExportPlugin.cs index 958e4beba..2410b66c8 100644 --- a/MatterControlLib/Library/Export/IExportPlugin.cs +++ b/MatterControlLib/Library/Export/IExportPlugin.cs @@ -62,6 +62,6 @@ namespace MatterHackers.MatterControl public interface IExportWithOptions : IExportPlugin { - GuiWidget GetOptionsPanel(); + GuiWidget GetOptionsPanel(IEnumerable libraryItems); } } diff --git a/MatterControlLib/Library/Export/MeshExport.cs b/MatterControlLib/Library/Export/MeshExport.cs index abcd5d6ff..0a0d2ca31 100644 --- a/MatterControlLib/Library/Export/MeshExport.cs +++ b/MatterControlLib/Library/Export/MeshExport.cs @@ -40,7 +40,7 @@ namespace MatterHackers.MatterControl.Library.Export { public static class MeshExport { - public static async Task ExportMesh(ILibraryItem source, string filePathToSave, IProgress progress) + public static async Task ExportMesh(ILibraryItem source, string filePathToSave, bool mergeMeshes, IProgress progress) { try { @@ -53,7 +53,7 @@ namespace MatterHackers.MatterControl.Library.Export { // If the content is an IObject3D, then we need to load it and MeshFileIO save to the target path var content = await contentItem.GetObject3D(null); - return Object3D.Save(content, filePathToSave, CancellationToken.None, reportProgress: (ratio, name) => + return Object3D.Save(content, filePathToSave, mergeMeshes, CancellationToken.None, reportProgress: (ratio, name) => { status.Progress0To1 = ratio; progress.Report(status); @@ -82,7 +82,7 @@ namespace MatterHackers.MatterControl.Library.Export IObject3D item = Object3D.Load(result.Stream, Path.GetExtension(streamContent.FileName), CancellationToken.None); if (item != null) { - return Object3D.Save(item, filePathToSave, CancellationToken.None, reportProgress: (ratio, name) => + return Object3D.Save(item, filePathToSave, mergeMeshes, CancellationToken.None, reportProgress: (ratio, name) => { status.Progress0To1 = ratio; progress.Report(status); diff --git a/MatterControlLib/Library/Export/StlExport.cs b/MatterControlLib/Library/Export/StlExport.cs index 0c3c4c0a9..af841920d 100644 --- a/MatterControlLib/Library/Export/StlExport.cs +++ b/MatterControlLib/Library/Export/StlExport.cs @@ -37,13 +37,16 @@ using MatterHackers.Agg; using MatterHackers.Agg.Image; using MatterHackers.Agg.Platform; using MatterHackers.Agg.UI; +using MatterHackers.DataConverters3D; using MatterHackers.Localizations; namespace MatterHackers.MatterControl.Library.Export { - public class StlExport : IExportPlugin + public class StlExport : IExportPlugin, IExportWithOptions { - public int Priority => 2; + private bool mergeMeshes = true; + + public int Priority => 2; public string ButtonText => "STL File".Localize(); @@ -79,7 +82,7 @@ namespace MatterHackers.MatterControl.Library.Export first = false; } - if (!await MeshExport.ExportMesh(item, filename, progress)) + if (!await MeshExport.ExportMesh(item, filename, mergeMeshes, progress)) { badExports.Add(item.Name); } @@ -99,5 +102,44 @@ namespace MatterHackers.MatterControl.Library.Export } }; } + + public GuiWidget GetOptionsPanel(IEnumerable libraryItems) + { + var exportMeshCount = 0; + foreach (var item in libraryItems.OfType()) + { + if (item is ILibraryObject3D contentItem) + { + var object3D = contentItem.GetObject3D(null).Result; + exportMeshCount += object3D.VisibleMeshes().Count(); + } + } + + if (exportMeshCount < 2) + { + return null; + } + + var container = new FlowLayoutWidget() + { + Margin = new BorderDouble(left: 40, bottom: 10), + }; + + var theme = AppContext.Theme; + + var unionAllPartsCheckbox = new CheckBox("Merge faces into single mesh".Localize(), theme.TextColor, 10) + { + Checked = true, + Cursor = Cursors.Hand, + ToolTipText = "Disable to expart all faces without merging".Localize() + }; + unionAllPartsCheckbox.CheckedStateChanged += (s, e) => + { + mergeMeshes = unionAllPartsCheckbox.Checked; + }; + container.AddChild(unionAllPartsCheckbox); + + return container; + } } } diff --git a/StaticData/Translations/Master.txt b/StaticData/Translations/Master.txt index ce8fb208a..b7ad410ca 100644 --- a/StaticData/Translations/Master.txt +++ b/StaticData/Translations/Master.txt @@ -1327,6 +1327,9 @@ Translated:Direction English:Disable Fan For The First Translated:Disable Fan For The First +English:Disable to expart all faces without merging +Translated:Disable to expart all faces without merging + English:Disabled: {0} Translated:Disabled: {0} @@ -2887,6 +2890,9 @@ Translated:Medium Precision English:Merge Translated:Merge +English:Merge faces into single mesh +Translated:Merge faces into single mesh + English:Merge Overlapping Lines Translated:Merge Overlapping Lines diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 837ccc782..0fee6ab0d 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 837ccc782954724ae26d080a9b063112a70a527b +Subproject commit 0fee6ab0d2d61107717114258b06182815bc11d7