diff --git a/Library/ContentProviders/MeshContentProvider.cs b/Library/ContentProviders/MeshContentProvider.cs index 3c61e00b4..a731d3f20 100644 --- a/Library/ContentProviders/MeshContentProvider.cs +++ b/Library/ContentProviders/MeshContentProvider.cs @@ -39,7 +39,6 @@ namespace MatterHackers.MatterControl using MatterHackers.Agg.Platform; using MatterHackers.DataConverters3D; using MatterHackers.MatterControl.Library; - using MatterHackers.MatterControl.PrinterCommunication; using MatterHackers.PolygonMesh; using MatterHackers.RayTracer; using MatterHackers.VectorMath; diff --git a/Library/Interfaces/LibraryExtensionMethods.cs b/Library/Interfaces/LibraryExtensionMethods.cs new file mode 100644 index 000000000..b30fc09ed --- /dev/null +++ b/Library/Interfaces/LibraryExtensionMethods.cs @@ -0,0 +1,53 @@ +/* +Copyright (c) 2017, John Lewin +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +using System; + +namespace MatterHackers.MatterControl.Library +{ + public static class LibraryExtensionMethods + { + public static ContentResult CreateContent(this ILibraryItem libraryItem, Action progressReporter) + { + if (ApplicationController.Instance.Library.GetContentProvider(libraryItem) is ISceneContentProvider contentProvider) + { + return contentProvider?.CreateItem(libraryItem, progressReporter); + } + + return null; + } + + public static bool IsContentFileType(this ILibraryItem item) + { + return item is ILibraryItem + || (item is ILibraryContentStream contentStream + && ApplicationController.Instance.Library.IsContentFileType(contentStream.FileName)); + } + } +} diff --git a/Library/Widgets/InsertionGroup.cs b/Library/Widgets/InsertionGroup.cs new file mode 100644 index 000000000..70ba8c5b4 --- /dev/null +++ b/Library/Widgets/InsertionGroup.cs @@ -0,0 +1,73 @@ +/* +Copyright (c) 2017, Kevin Pope, John Lewin +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using MatterHackers.DataConverters3D; +using MatterHackers.MatterControl.Library; +using MatterHackers.VectorMath; + +namespace MatterHackers.MatterControl.PrintLibrary +{ + public class InsertionGroup : Object3D + { + // TODO: Figure out how to collapse the InsertionGroup after the load task completes + public InsertionGroup(IEnumerable items) + { + Task.Run(async () => + { + var newItemOffset = Vector2.Zero; + + // Filter to content file types only + foreach (var item in items.Where(item => item.IsContentFileType())) + { + // Acquire + var contentResult = item.CreateContent(null); + if (contentResult != null) + { + // Add the placeholder + var object3D = contentResult.Object3D; + this.Children.Add(object3D); + + // Position at accumulating offset + object3D.Matrix *= Matrix4X4.CreateTranslation(newItemOffset.x, newItemOffset.y, 0); + + // Wait for content to load + await contentResult.MeshLoaded; + + // Adjust next item position + // TODO: do something more interesting than increment in x + newItemOffset.x += contentResult.Object3D.GetAxisAlignedBoundingBox(Matrix4X4.Identity).XSize; + } + } + }); + } + } +} diff --git a/Library/Widgets/PrintLibraryWidget.cs b/Library/Widgets/PrintLibraryWidget.cs index f4b1a45ac..8c9cda45f 100644 --- a/Library/Widgets/PrintLibraryWidget.cs +++ b/Library/Widgets/PrintLibraryWidget.cs @@ -34,15 +34,12 @@ using System.Linq; using MatterHackers.Agg; using MatterHackers.Agg.Platform; using MatterHackers.Agg.UI; -using MatterHackers.Agg.VertexSource; using MatterHackers.DataConverters3D; using MatterHackers.Localizations; using MatterHackers.MatterControl.CustomWidgets; -using MatterHackers.MatterControl.DataStorage; using MatterHackers.MatterControl.Library; using MatterHackers.MatterControl.PartPreviewWindow; using MatterHackers.MatterControl.PrintQueue; -using MatterHackers.VectorMath; namespace MatterHackers.MatterControl.PrintLibrary { @@ -388,42 +385,18 @@ namespace MatterHackers.MatterControl.PrintLibrary var library = ApplicationController.Instance.Library; - foreach (var item in selectedLibraryItems) - { - if (item is ILibraryContentStream contentModel) - { - var contentProvider = library.GetContentProvider(item) as ISceneContentProvider; - - var result = contentProvider?.CreateItem(item, null); - - // Wait for the content to load - await result.MeshLoaded; - - if (result?.Object3D != null) - { - itemsToAdd.Add(result.Object3D); - } - } - else if (item is ILibraryContentItem contentItem) - { - var content = await contentItem.GetContent(null); - if (content != null) - { - itemsToAdd.Add(content); - } - } - } - ApplicationController.Instance.ActiveView3DWidget.partHasBeenEdited = true; var scene = ApplicationController.Instance.DragDropData.Scene; scene.ModifyChildren(children => { - foreach (var sceneItem in itemsToAdd) - { - PlatingHelper.MoveToOpenPosition(sceneItem, children); - children.Add(sceneItem); - } + children.Add(new InsertionGroup(selectedLibraryItems)); + + //foreach (var sceneItem in itemsToAdd) + //{ + // PlatingHelper.MoveToOpenPosition(sceneItem, children); + // children.Add(sceneItem); + //} }); } }); diff --git a/MatterControl.csproj b/MatterControl.csproj index df2b09d0b..cd2454e95 100644 --- a/MatterControl.csproj +++ b/MatterControl.csproj @@ -144,6 +144,8 @@ + + Form