diff --git a/MatterControlLib/ApplicationView/EditContext.cs b/MatterControlLib/ApplicationView/EditContext.cs index 4c1e4eb32..33e1af60a 100644 --- a/MatterControlLib/ApplicationView/EditContext.cs +++ b/MatterControlLib/ApplicationView/EditContext.cs @@ -123,7 +123,10 @@ namespace MatterHackers.MatterControl { if (!this.FreezeGCode) { - ApplicationController.Instance.Thumbnails.DeleteCache(this.SourceItem); + if (this.SourceItem != null) + { + ApplicationController.Instance.Thumbnails.DeleteCache(this.SourceItem); + } // Call save on the provider this.ContentStore?.Save(this.SourceItem, scene); diff --git a/MatterControlLib/DesignTools/Primitives/ImageObject3D.cs b/MatterControlLib/DesignTools/Primitives/ImageObject3D.cs index 564200665..9665357ba 100644 --- a/MatterControlLib/DesignTools/Primitives/ImageObject3D.cs +++ b/MatterControlLib/DesignTools/Primitives/ImageObject3D.cs @@ -1,5 +1,5 @@ /* -Copyright (c) 2017, Lars Brubaker, John Lewin +Copyright (c) 2022 Lars Brubaker, John Lewin All rights reserved. Redistribution and use in source and binary forms, with or without @@ -143,6 +143,83 @@ namespace MatterHackers.MatterControl.DesignTools } } + public static string GetFileOrAsset(string file) + { + if (!File.Exists(file)) + { + var path = Path.Combine(ApplicationDataStorage.Instance.LibraryAssetsPath, file); + if (File.Exists(path)) + { + return path; + } + + // can't find a real file + return null; + } + + return file; + } + + + public static bool FilesAreEqual(string first, string second) + { + if (string.IsNullOrEmpty(first) + || string.IsNullOrEmpty(second)) + { + return false; + } + + var diskFirst = GetFileOrAsset(first); + var diskSecond = GetFileOrAsset(second); + if (File.Exists(diskFirst) && File.Exists(diskSecond)) + { + return FilesAreEqual(new FileInfo(diskFirst), new FileInfo(diskSecond)); + } + + return false; + } + + public static bool FilesAreEqual(FileInfo first, FileInfo second) + { + if (first.Length != second.Length) + { + return false; + } + + if (string.Equals(first.FullName, second.FullName, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + int readSize = 1 << 16; + int numReads = (int)Math.Ceiling((double)first.Length / readSize); + + using (var firstFs = first.OpenRead()) + { + using (var secondFs = second.OpenRead()) + { + byte[] one = new byte[readSize]; + byte[] two = new byte[readSize]; + + for (int i = 0; i < numReads; i++) + { + firstFs.Read(one, 0, readSize); + secondFs.Read(two, 0, readSize); + + for (int j = 0; j < readSize; j++) + { + if (one[j] != two[j]) + { + return false; + } + } + } + } + } + + return true; + } + [DisplayName("Open new image")] [Description("Open")] @@ -153,12 +230,15 @@ namespace MatterHackers.MatterControl.DesignTools { if (_assetPath != value) { + var oldAsset = _assetPath; _assetPath = value; _image = null; - InitMesh(this.Image); - - this.Invalidate(InvalidateType.DisplayValues); + if (!FilesAreEqual(oldAsset, value)) + { + InitMesh(this.Image); + this.Invalidate(InvalidateType.DisplayValues); + } } } } diff --git a/Submodules/MatterSlice b/Submodules/MatterSlice index a86abaeaa..aaaaa7db0 160000 --- a/Submodules/MatterSlice +++ b/Submodules/MatterSlice @@ -1 +1 @@ -Subproject commit a86abaeaad60171fa523ffca733dbbbca639cf5a +Subproject commit aaaaa7db0cef2489fd36f6443381de919d0756ca diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 37a06c821..609f985e9 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 37a06c821f9ca9c8c3312082360b92cf7b631aed +Subproject commit 609f985e9b15b6ef778869290d10e9cacfda2695