diff --git a/CustomWidgets/LibrarySelector/LibrarySelectorWidget.cs b/CustomWidgets/LibrarySelector/LibrarySelectorWidget.cs index a77c41182..832a5a972 100644 --- a/CustomWidgets/LibrarySelector/LibrarySelectorWidget.cs +++ b/CustomWidgets/LibrarySelector/LibrarySelectorWidget.cs @@ -231,7 +231,9 @@ namespace MatterHackers.MatterControl.CustomWidgets.LibrarySelector } // Dispose of all children below this one. - while (currentLibraryProvider != null) + // Dispose of all children below this one. + while (currentLibraryProvider != null + && currentLibraryProvider.ParentLibraryProvider != null) { LibraryProvider parent = currentLibraryProvider.ParentLibraryProvider; currentLibraryProvider.Dispose(); @@ -368,21 +370,24 @@ namespace MatterHackers.MatterControl.CustomWidgets.LibrarySelector var provider = this.CurrentLibraryProvider; - if (provider != null && provider.ProviderKey != "ProviderSelectorKey") + if (provider != null) { - PrintItemCollection parent = new PrintItemCollection("..", provider.ProviderKey); - LibrarySelectorRowItem queueItem = new LibrarySelectorRowItem(parent, -1, this, provider.ParentLibraryProvider, GetThumbnailWidget(provider.ParentLibraryProvider, parent, LibraryProvider.UpFolderImage)); - AddListItemToTopToBottom(queueItem); - } - - for (int i = 0; i < provider.CollectionCount; i++) - { - PrintItemCollection item = provider.GetCollectionItem(i); - if (item.Key != "LibraryProviderPurchasedKey") + if (provider.ProviderKey != "ProviderSelectorKey") { - LibrarySelectorRowItem queueItem = new LibrarySelectorRowItem(item, i, this, null, GetThumbnailWidget(null, item, provider.GetCollectionFolderImage(i))); + PrintItemCollection parent = new PrintItemCollection("..", provider.ProviderKey); + LibrarySelectorRowItem queueItem = new LibrarySelectorRowItem(parent, -1, this, provider.ParentLibraryProvider, GetThumbnailWidget(provider.ParentLibraryProvider, parent, LibraryProvider.UpFolderImage)); AddListItemToTopToBottom(queueItem); } + + for (int i = 0; i < provider.CollectionCount; i++) + { + PrintItemCollection item = provider.GetCollectionItem(i); + if (item.Key != "LibraryProviderPurchasedKey") + { + LibrarySelectorRowItem queueItem = new LibrarySelectorRowItem(item, i, this, null, GetThumbnailWidget(null, item, provider.GetCollectionFolderImage(i))); + AddListItemToTopToBottom(queueItem); + } + } } } diff --git a/CustomWidgets/PartThumbnailWidget.cs b/CustomWidgets/PartThumbnailWidget.cs index 328922644..c71c817fa 100644 --- a/CustomWidgets/PartThumbnailWidget.cs +++ b/CustomWidgets/PartThumbnailWidget.cs @@ -693,33 +693,38 @@ namespace MatterHackers.MatterControl string stlHashCode = this.ItemWrapper.FileHashCode.ToString(); - ImageBuffer bigRender = LoadImageFromDisk(this, stlHashCode); - if (bigRender == null) + if (stlHashCode != "0") { - this.thumbnailImage = new ImageBuffer(buildingThumbnailImage); - return false; + ImageBuffer bigRender = LoadImageFromDisk(this, stlHashCode); + if (bigRender == null) + { + this.thumbnailImage = new ImageBuffer(buildingThumbnailImage); + return false; + } + + ImageBuffer unScaledImage = new ImageBuffer(bigRender.Width, bigRender.Height, 32, new BlenderBGRA()); + unScaledImage.NewGraphics2D().Render(bigRender, 0, 0); + // If the source image (the one we downloaded) is more than twice as big as our dest image. + while (unScaledImage.Width > Width * 2) + { + // The image sampler we use is a 2x2 filter so we need to scale by a max of 1/2 if we want to get good results. + // So we scale as many times as we need to to get the Image to be the right size. + // If this were going to be a non-uniform scale we could do the x and y separatly to get better results. + ImageBuffer halfImage = new ImageBuffer(unScaledImage.Width / 2, unScaledImage.Height / 2, 32, new BlenderBGRA()); + halfImage.NewGraphics2D().Render(unScaledImage, 0, 0, 0, halfImage.Width / (double)unScaledImage.Width, halfImage.Height / (double)unScaledImage.Height); + unScaledImage = halfImage; + } + + this.thumbnailImage = new ImageBuffer((int)Width, (int)Height, 32, new BlenderBGRA()); + this.thumbnailImage.NewGraphics2D().Clear(new RGBA_Bytes(255, 255, 255, 0)); + this.thumbnailImage.NewGraphics2D().Render(unScaledImage, 0, 0, 0, (double)this.thumbnailImage.Width / unScaledImage.Width, (double)this.thumbnailImage.Height / unScaledImage.Height); + + UiThread.RunOnIdle(this.EnsureImageUpdated); + + return true; } - ImageBuffer unScaledImage = new ImageBuffer(bigRender.Width, bigRender.Height, 32, new BlenderBGRA()); - unScaledImage.NewGraphics2D().Render(bigRender, 0, 0); - // If the source image (the one we downloaded) is more than twice as big as our dest image. - while (unScaledImage.Width > Width * 2) - { - // The image sampler we use is a 2x2 filter so we need to scale by a max of 1/2 if we want to get good results. - // So we scale as many times as we need to to get the Image to be the right size. - // If this were going to be a non-uniform scale we could do the x and y separatly to get better results. - ImageBuffer halfImage = new ImageBuffer(unScaledImage.Width / 2, unScaledImage.Height / 2, 32, new BlenderBGRA()); - halfImage.NewGraphics2D().Render(unScaledImage, 0, 0, 0, halfImage.Width / (double)unScaledImage.Width, halfImage.Height / (double)unScaledImage.Height); - unScaledImage = halfImage; - } - - this.thumbnailImage = new ImageBuffer((int)Width, (int)Height, 32, new BlenderBGRA()); - this.thumbnailImage.NewGraphics2D().Clear(new RGBA_Bytes(255, 255, 255, 0)); - this.thumbnailImage.NewGraphics2D().Render(unScaledImage, 0, 0, 0, (double)this.thumbnailImage.Width / unScaledImage.Width, (double)this.thumbnailImage.Height / unScaledImage.Height); - - UiThread.RunOnIdle(this.EnsureImageUpdated); - - return true; + return false; } } } \ No newline at end of file diff --git a/Library/PrintLibraryWidget.cs b/Library/PrintLibraryWidget.cs index 1e7fe326c..2ae4c43a2 100644 --- a/Library/PrintLibraryWidget.cs +++ b/Library/PrintLibraryWidget.cs @@ -392,7 +392,11 @@ namespace MatterHackers.MatterControl.PrintLibrary public override void OnClosed(EventArgs e) { - this.libraryDataView.CurrentLibraryProvider.DataReloaded -= UpdateStatus; + if (this.libraryDataView != null + && this.libraryDataView.CurrentLibraryProvider != null) + { + this.libraryDataView.CurrentLibraryProvider.DataReloaded -= UpdateStatus; + } if (unregisterEvents != null) { diff --git a/Library/Provider/LibraryProvider.cs b/Library/Provider/LibraryProvider.cs index 405b608ab..80ef540f0 100644 --- a/Library/Provider/LibraryProvider.cs +++ b/Library/Provider/LibraryProvider.cs @@ -128,13 +128,13 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider { foreach (PrintItem part in partFiles) { - AddItem(new PrintItemWrapper(part, this)); + AddItem(new PrintItemWrapper(part, this.GetProviderLocator())); } } } else { - AddItem(new PrintItemWrapper(new PrintItem(Path.GetFileNameWithoutExtension(loadedFileName), loadedFileName), this)); + AddItem(new PrintItemWrapper(new PrintItem(Path.GetFileNameWithoutExtension(loadedFileName), loadedFileName), this.GetProviderLocator())); } } } diff --git a/Library/Provider/LibraryProviderFileSystem.cs b/Library/Provider/LibraryProviderFileSystem.cs index 1e0f0840d..80bd57422 100644 --- a/Library/Provider/LibraryProviderFileSystem.cs +++ b/Library/Provider/LibraryProviderFileSystem.cs @@ -205,7 +205,7 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider { string fileName = currentDirectoryFiles[itemIndex]; - return new PrintItemWrapper(new DataStorage.PrintItem(GetPrintItemName(itemIndex), fileName), this); + return new PrintItemWrapper(new DataStorage.PrintItem(GetPrintItemName(itemIndex), fileName), this.GetProviderLocator()); } public override LibraryProvider GetProviderForCollection(PrintItemCollection collection) diff --git a/Library/Provider/LibraryProviderSelector.cs b/Library/Provider/LibraryProviderSelector.cs index ff2e945a5..a8d820069 100644 --- a/Library/Provider/LibraryProviderSelector.cs +++ b/Library/Provider/LibraryProviderSelector.cs @@ -41,6 +41,7 @@ using MatterHackers.Agg.UI; using System.Threading.Tasks; using MatterHackers.Agg.Image; using MatterHackers.Agg.PlatformAbstract; +using System.Threading; namespace MatterHackers.MatterControl.PrintLibrary.Provider { @@ -287,5 +288,49 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider LibraryProvider purchasedProvider = PurchasedLibraryCreator.CreateLibraryProvider(this, SetCurrentLibraryProvider); return purchasedProvider; } + +#if false + public static async Task GetLibraryFromLocator(List libraryProviderLocator) + { + LibraryProviderSelector selector = new LibraryProviderSelector(null, true); + + LibraryProvider lastProvider = null; + + if (libraryProviderLocator.Count > 1) + { + ProviderLocatorNode selectorNode = libraryProviderLocator[1]; + foreach (ILibraryCreator libraryCreator in selector.libraryCreators) + { + if (libraryCreator.ProviderKey == selectorNode.Key) + { + // We found the right creatory, make the library and then iterate through it to get to the correct sub library + lastProvider = libraryCreator.CreateLibraryProvider(null, null); + for (int i = 2; i < libraryProviderLocator.Count; i++) + { + ProviderLocatorNode currentNode = libraryProviderLocator[i]; + + // wait for our current providre to finish loading + while (lastProvider.CollectionCount == 0) + { + Thread.Sleep(100); + } + + // now find the next sub provider and go to it + for (int collectionIndex = 0; collectionIndex < lastProvider.CollectionCount; collectionIndex++) + { + PrintItemCollection collection = lastProvider.GetCollectionItem(collectionIndex); + if (collection.Key == currentNode.Key) + { + lastProvider = lastProvider.GetProviderForCollection(collection); + } + } + } + } + } + } + + return lastProvider; + } +#endif } } \ No newline at end of file diff --git a/Library/Provider/LibraryProviderSqlite.cs b/Library/Provider/LibraryProviderSqlite.cs index 67dc4eb6e..3359e88ab 100644 --- a/Library/Provider/LibraryProviderSqlite.cs +++ b/Library/Provider/LibraryProviderSqlite.cs @@ -312,7 +312,7 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider { if (index >= 0 && index < printItems.Count) { - return new PrintItemWrapper(printItems[index], this); + return new PrintItemWrapper(printItems[index], this.GetProviderLocator()); } return null; @@ -373,23 +373,15 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider metaData = new string[] { "Created By", "MatterControl", "BedPosition", "Absolute" }; } - if (printItemWrapper.FileLocation.Contains(ApplicationDataStorage.Instance.ApplicationLibraryDataPath)) - { - MeshOutputSettings outputInfo = new MeshOutputSettings(MeshOutputSettings.OutputType.Binary, metaData); - MeshFileIo.Save(meshGroups, printItemWrapper.FileLocation, outputInfo); - } - else // save a copy to the library and update this to point at it + // if it is not already in the right location + if (!printItemWrapper.FileLocation.Contains(ApplicationDataStorage.Instance.ApplicationLibraryDataPath)) { + // save a copy to the library and update this to point at it string fileName = Path.ChangeExtension(Path.GetRandomFileName(), ".amf"); printItemWrapper.FileLocation = Path.Combine(ApplicationDataStorage.Instance.ApplicationLibraryDataPath, fileName); MeshOutputSettings outputInfo = new MeshOutputSettings(MeshOutputSettings.OutputType.Binary, metaData); MeshFileIo.Save(meshGroups, printItemWrapper.FileLocation, outputInfo); - - printItemWrapper.PrintItem.Commit(); - - // let the queue know that the item has changed so it load the correct part - QueueData.Instance.SaveDefaultQueue(); } } @@ -409,7 +401,7 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider try { - PrintItemWrapper printItemWrapper = new PrintItemWrapper(printItem, this); + PrintItemWrapper printItemWrapper = new PrintItemWrapper(printItem, this.GetProviderLocator()); SaveToLibraryFolder(printItemWrapper, meshToConvertAndSave, false); } catch (System.UnauthorizedAccessException) @@ -430,7 +422,7 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider } else // it is not a mesh so just add it { - PrintItemWrapper printItemWrapper = new PrintItemWrapper(printItem, this); + PrintItemWrapper printItemWrapper = new PrintItemWrapper(printItem, this.GetProviderLocator()); string sourceFileName = printItem.FileLocation; string newFileName = Path.ChangeExtension(Path.GetRandomFileName(), Path.GetExtension(printItem.FileLocation)); string destFileName = Path.Combine(ApplicationDataStorage.Instance.ApplicationLibraryDataPath, newFileName); diff --git a/PartPreviewWindow/View3D/View3DWidget.cs b/PartPreviewWindow/View3D/View3DWidget.cs index 62df6b0c2..4a52e5f3f 100644 --- a/PartPreviewWindow/View3D/View3DWidget.cs +++ b/PartPreviewWindow/View3D/View3DWidget.cs @@ -1847,7 +1847,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow PrintItem printItem = new PrintItem(); printItem.Name = returnInfo.newName; printItem.FileLocation = Path.GetFullPath(returnInfo.fileNameAndPath); - printItemWrapper = new PrintItemWrapper(printItem, returnInfo.destinationLibraryProvider); + printItemWrapper = new PrintItemWrapper(printItem, returnInfo.destinationLibraryProvider.GetProviderLocator()); } // we sent the data to the asynch lists but we will not pull it back out (only use it as a temp holder). @@ -1881,7 +1881,12 @@ namespace MatterHackers.MatterControl.PartPreviewWindow && returnInfo.destinationLibraryProvider != null) { // save this part to correct library provider - returnInfo.destinationLibraryProvider.AddItem(printItemWrapper); + LibraryProvider libraryToSaveTo = returnInfo.destinationLibraryProvider; + if (libraryToSaveTo != null) + { + libraryToSaveTo.AddItem(printItemWrapper); + libraryToSaveTo.Dispose(); + } } else // we have already save it and the library should pick it up { @@ -2036,9 +2041,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow if (saveAsWindow == null) { List providerLocator = null; - if (printItemWrapper.SourceLibraryProvider != null) + if (printItemWrapper.SourceLibraryProviderLocator != null) { - providerLocator = printItemWrapper.SourceLibraryProvider.GetProviderLocator(); + providerLocator = printItemWrapper.SourceLibraryProviderLocator; } saveAsWindow = new SaveAsWindow(MergeAndSavePartsToNewMeshFile, providerLocator, true, true); saveAsWindow.Closed += new EventHandler(SaveAsWindow_Closed); diff --git a/Queue/PrintItemWrapper.cs b/Queue/PrintItemWrapper.cs index 2fd4bb43d..5fe3898da 100644 --- a/Queue/PrintItemWrapper.cs +++ b/Queue/PrintItemWrapper.cs @@ -34,6 +34,7 @@ using MatterHackers.MatterControl.DataStorage; using MatterHackers.MatterControl.PrintLibrary.Provider; using MatterHackers.MatterControl.SlicerConfiguration; using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; @@ -62,14 +63,14 @@ namespace MatterHackers.MatterControl.PrintQueue private FileSystemWatcher diskFileWatcher = new FileSystemWatcher(); - public PrintItemWrapper(DataStorage.PrintItem printItem, LibraryProvider sourceLibraryProvider = null) + public PrintItemWrapper(DataStorage.PrintItem printItem, List sourceLibraryProviderLocator = null) { this.PrintItem = printItem; UpdateFileTracking(FileLocation); this.fileType = Path.GetExtension(FileLocation).ToUpper(); - SourceLibraryProvider = sourceLibraryProvider; + SourceLibraryProviderLocator = sourceLibraryProviderLocator; } public PrintItemWrapper(int printItemId) @@ -283,7 +284,7 @@ namespace MatterHackers.MatterControl.PrintQueue public bool SlicingHadError { get { return slicingHadError; } } - public LibraryProvider SourceLibraryProvider { get; private set; } + public List SourceLibraryProviderLocator { get; private set; } public void Delete() { diff --git a/Queue/QueueDataWidget.cs b/Queue/QueueDataWidget.cs index a74c54abb..8be871399 100644 --- a/Queue/QueueDataWidget.cs +++ b/Queue/QueueDataWidget.cs @@ -492,10 +492,15 @@ namespace MatterHackers.MatterControl.PrintQueue if (returnInfo != null) { List selectedItems = new List(queueDataView.SelectedItems); - foreach (QueueRowItem queueItem in selectedItems) + LibraryProvider libraryToSaveTo = returnInfo.destinationLibraryProvider; + if (libraryToSaveTo != null) { - PrintItemWrapper printItemWrapper = new PrintItemWrapper(queueItem.PrintItemWrapper.PrintItem, returnInfo.destinationLibraryProvider); - returnInfo.destinationLibraryProvider.AddItem(printItemWrapper); + foreach (QueueRowItem queueItem in selectedItems) + { + PrintItemWrapper printItemWrapper = new PrintItemWrapper(new PrintItem(queueItem.PrintItemWrapper.PrintItem.Name, queueItem.PrintItemWrapper.FileLocation), returnInfo.destinationLibraryProvider.GetProviderLocator()); + libraryToSaveTo.AddItem(printItemWrapper); + } + libraryToSaveTo.Dispose(); } } }