Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/sn4k3/UVtools.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTiago Conceição <Tiago_caza@hotmail.com>2020-07-17 02:44:32 +0300
committerTiago Conceição <Tiago_caza@hotmail.com>2020-07-17 02:44:32 +0300
commit9b9438dd4033dff62f88f2c4d7be3060587d3702 (patch)
tree18c692378aab7933ab2d51588dab366be5cec239
parentfc83672a760334ba128abbba3c8f20b2942adefe (diff)
v0.6.2.3v0.6.2.3
* (Add) Issue: EmptyLayer - Detects empty layers were image is all black with 0 pixels to cure * (Add) Toolbar and pushed layer information to bottom * (Add) Information: Cure pixel count per layer and percentage against total lcd pixels * (Add) Information: Bounds per layer * (Add) Zip: Compability with Formware zip files
-rw-r--r--CHANGELOG.md8
-rw-r--r--UVtools.Core/FileFormats/ChituboxZipFile.cs20
-rw-r--r--UVtools.Core/Layer/Layer.cs2
-rw-r--r--UVtools.Core/Layer/LayerIssue.cs1
-rw-r--r--UVtools.Core/Layer/LayerManager.cs224
-rw-r--r--UVtools.Core/UVtools.Core.csproj2
-rw-r--r--UVtools.GUI/FrmMain.Designer.cs221
-rw-r--r--UVtools.GUI/FrmMain.cs31
-rw-r--r--UVtools.GUI/FrmMain.resx177
-rw-r--r--UVtools.GUI/Images/cursor-16x16.pngbin0 -> 507 bytes
-rw-r--r--UVtools.GUI/Properties/AssemblyInfo.cs4
-rw-r--r--UVtools.GUI/Properties/Resources.Designer.cs10
-rw-r--r--UVtools.GUI/Properties/Resources.resx75
-rw-r--r--UVtools.GUI/UVtools.GUI.csproj1
14 files changed, 476 insertions, 300 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a950ed7..1a848b8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## 17/07/2020 - v0.6.2.3
+
+* (Add) Issue: EmptyLayer - Detects empty layers were image is all black with 0 pixels to cure
+* (Add) Toolbar and pushed layer information to bottom
+* (Add) Information: Cure pixel count per layer and percentage against total lcd pixels
+* (Add) Information: Bounds per layer
+* (Add) Zip: Compability with Formware zip files
+
## 14/07/2020 - v0.6.2.2
* (Add) cbddlp, photon and ctb version 3 compability (Chitubox >= 1.6.5)
diff --git a/UVtools.Core/FileFormats/ChituboxZipFile.cs b/UVtools.Core/FileFormats/ChituboxZipFile.cs
index f2ec085..afddf40 100644
--- a/UVtools.Core/FileFormats/ChituboxZipFile.cs
+++ b/UVtools.Core/FileFormats/ChituboxZipFile.cs
@@ -241,6 +241,17 @@ namespace UVtools.Core.FileFormats
tr.Close();
}
+ if (HeaderSettings.LayerCount == 0)
+ {
+ foreach (var zipEntry in inputFile.Entries)
+ {
+ if(!zipEntry.Name.EndsWith(".png")) continue;
+ var filename = Path.GetFileNameWithoutExtension(zipEntry.Name);
+ if (!filename.All(char.IsDigit)) continue;
+ if (!uint.TryParse(filename, out var layerIndex)) continue;
+ HeaderSettings.LayerCount = Math.Max(HeaderSettings.LayerCount, layerIndex);
+ }
+ }
LayerManager = new LayerManager(HeaderSettings.LayerCount);
@@ -282,6 +293,15 @@ namespace UVtools.Core.FileFormats
progress++;
}
+ if (HeaderSettings.LayerCount > 0 && ResolutionX == 0)
+ {
+ using (var mat = this[0].LayerMat)
+ {
+ HeaderSettings.ResolutionX = (uint)mat.Width;
+ HeaderSettings.ResolutionY = (uint)mat.Height;
+ }
+ }
+
entry = inputFile.GetEntry("preview.png");
if (!ReferenceEquals(entry, null))
{
diff --git a/UVtools.Core/Layer/Layer.cs b/UVtools.Core/Layer/Layer.cs
index 8d84864..205e925 100644
--- a/UVtools.Core/Layer/Layer.cs
+++ b/UVtools.Core/Layer/Layer.cs
@@ -242,7 +242,7 @@ namespace UVtools.Core
using (var nonZeroMat = new Mat())
{
CvInvoke.FindNonZero(mat, nonZeroMat);
- NonZeroPixelCount = (uint)nonZeroMat.Rows / 2;
+ NonZeroPixelCount = (uint)nonZeroMat.Height;
BoundingRectangle = CvInvoke.BoundingRectangle(nonZeroMat);
}
diff --git a/UVtools.Core/Layer/LayerIssue.cs b/UVtools.Core/Layer/LayerIssue.cs
index 949d897..0a28c56 100644
--- a/UVtools.Core/Layer/LayerIssue.cs
+++ b/UVtools.Core/Layer/LayerIssue.cs
@@ -85,6 +85,7 @@ namespace UVtools.Core
Island,
ResinTrap,
TouchingBound,
+ EmptyLayer,
//HoleSandwich,
}
diff --git a/UVtools.Core/Layer/LayerManager.cs b/UVtools.Core/Layer/LayerManager.cs
index 666a7ee..8efaa9e 100644
--- a/UVtools.Core/Layer/LayerManager.cs
+++ b/UVtools.Core/Layer/LayerManager.cs
@@ -684,149 +684,163 @@ namespace UVtools.Core
islandsFinished = true;
return;
}
+
// Detect contours
Parallel.ForEach(this,
//new ParallelOptions{MaxDegreeOfParallelism = 1},
layer =>
{
if (progress.Token.IsCancellationRequested) return;
- using (var image = layer.LayerMat)
+ if (layer.NonZeroPixelCount > 0)
{
- int step = image.Step;
- var span = image.GetPixelSpan<byte>();
-
- // TouchingBounds Checker
- List<Point> pixels = new List<Point>();
- for (int x = 0; x < image.Width; x++) // Check Top and Bottom bounds
+ using (var image = layer.LayerMat)
{
- if (span[x] >= minTouchingBondsPixelColor) // Top
- {
- pixels.Add(new Point(x, 0));
- }
+ int step = image.Step;
+ var span = image.GetPixelSpan<byte>();
- if (span[step * image.Height - step + x] >= minTouchingBondsPixelColor) // Bottom
+ // TouchingBounds Checker
+ List<Point> pixels = new List<Point>();
+ for (int x = 0; x < image.Width; x++) // Check Top and Bottom bounds
{
- pixels.Add(new Point(x, image.Height - 1));
+ if (span[x] >= minTouchingBondsPixelColor) // Top
+ {
+ pixels.Add(new Point(x, 0));
+ }
+
+ if (span[step * image.Height - step + x] >= minTouchingBondsPixelColor) // Bottom
+ {
+ pixels.Add(new Point(x, image.Height - 1));
+ }
}
- }
- for (int y = 0; y < image.Height; y++) // Check Left and Right bounds
- {
- if (span[y * step] >= minTouchingBondsPixelColor) // Left
+ for (int y = 0; y < image.Height; y++) // Check Left and Right bounds
{
- pixels.Add(new Point(0, y));
+ if (span[y * step] >= minTouchingBondsPixelColor) // Left
+ {
+ pixels.Add(new Point(0, y));
+ }
+
+ if (span[y * step + step - 1] >= minTouchingBondsPixelColor) // Right
+ {
+ pixels.Add(new Point(step - 1, y));
+ }
}
- if (span[y * step + step - 1] >= minTouchingBondsPixelColor) // Right
+ if (pixels.Count > 0)
{
- pixels.Add(new Point(step - 1, y));
+ result.TryAdd(layer.Index, new List<LayerIssue>
+ {
+ new LayerIssue(layer, LayerIssue.IssueType.TouchingBound, pixels.ToArray())
+ });
}
- }
- if (pixels.Count > 0)
- {
- result.TryAdd(layer.Index, new List<LayerIssue>
- {
- new LayerIssue(layer, LayerIssue.IssueType.TouchingBound, pixels.ToArray())
- });
- }
+ if (layer.Index == 0) return; // No islands for layer 0
-
- if (layer.Index == 0) return; // No islands for layer 0
+ VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
+ Mat hierarchy = new Mat();
- VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
- Mat hierarchy = new Mat();
-
- if (islandConfig.BinaryThreshold > 0)
- {
- using (var thresholdImage = new Mat())
+ if (islandConfig.BinaryThreshold > 0)
{
- CvInvoke.Threshold(image, thresholdImage, 1, 255, ThresholdType.Binary);
- CvInvoke.FindContours(thresholdImage, contours, hierarchy, RetrType.Ccomp,
- ChainApproxMethod.ChainApproxSimple);
+ using (var thresholdImage = new Mat())
+ {
+ CvInvoke.Threshold(image, thresholdImage, 1, 255, ThresholdType.Binary);
+ CvInvoke.FindContours(thresholdImage, contours, hierarchy, RetrType.Ccomp,
+ ChainApproxMethod.ChainApproxSimple);
+ }
}
- }
- else
- {
- CvInvoke.FindContours(image, contours, hierarchy, RetrType.Ccomp,
- ChainApproxMethod.ChainApproxSimple);
- }
-
- var arr = hierarchy.GetData();
- //
- //hierarchy[i][0]: the index of the next contour of the same level
- //hierarchy[i][1]: the index of the previous contour of the same level
- //hierarchy[i][2]: the index of the first child
- //hierarchy[i][3]: the index of the parent
- //
-
- Mat previousImage = null;
- Span<byte> previousSpan = null;
- for (int i = 0; i < contours.Size; i++)
- {
-
- if ((int) arr.GetValue(0, i, 2) == -1 && (int) arr.GetValue(0, i, 3) != -1) continue;
- var rect = CvInvoke.BoundingRectangle(contours[i]);
- if (rect.GetArea() < islandConfig.RequiredAreaToProcessCheck)
- continue;
-
- if (ReferenceEquals(previousImage, null))
+ else
{
- previousImage = this[layer.Index - 1].LayerMat;
- previousSpan = previousImage.GetPixelSpan<byte>();
+ CvInvoke.FindContours(image, contours, hierarchy, RetrType.Ccomp,
+ ChainApproxMethod.ChainApproxSimple);
}
-
- List<Point> points = new List<Point>();
- uint pixelsSupportingIsland = 0;
- using (Mat contourImage = image.CloneBlank())
+ var arr = hierarchy.GetData();
+ //
+ //hierarchy[i][0]: the index of the next contour of the same level
+ //hierarchy[i][1]: the index of the previous contour of the same level
+ //hierarchy[i][2]: the index of the first child
+ //hierarchy[i][3]: the index of the parent
+ //
+
+ Mat previousImage = null;
+ Span<byte> previousSpan = null;
+ for (int i = 0; i < contours.Size; i++)
{
- CvInvoke.DrawContours(contourImage, contours, i, new MCvScalar(255), -1);
- var contourImageSpan = contourImage.GetPixelSpan<byte>();
- for (int y = rect.Y; y < rect.Bottom; y++)
+ if ((int) arr.GetValue(0, i, 2) == -1 && (int) arr.GetValue(0, i, 3) != -1)
+ continue;
+ var rect = CvInvoke.BoundingRectangle(contours[i]);
+ if (rect.GetArea() < islandConfig.RequiredAreaToProcessCheck)
+ continue;
+
+ if (ReferenceEquals(previousImage, null))
{
- for (int x = rect.X; x < rect.Right; x++)
- {
- int pixel = step * y + x;
- if (span[pixel] < islandConfig.RequiredPixelBrightnessToProcessCheck)
- continue; // Low brightness, ignore
- if (contourImageSpan[pixel] != 255)
- continue; // Not inside contour, ignore
+ previousImage = this[layer.Index - 1].LayerMat;
+ previousSpan = previousImage.GetPixelSpan<byte>();
+ }
- //if (CvInvoke.PointPolygonTest(contours[i], new PointF(x, y), false) < 0) continue; // Out of contour SLOW!
- //Debug.WriteLine($"Layer: {layer.Index}, Coutour: {i}, X:{x} Y:{y}");
- points.Add(new Point(x, y));
+ List<Point> points = new List<Point>();
+ uint pixelsSupportingIsland = 0;
- if (previousSpan[pixel] >= islandConfig.RequiredPixelBrightnessToSupport)
+ using (Mat contourImage = image.CloneBlank())
+ {
+ CvInvoke.DrawContours(contourImage, contours, i, new MCvScalar(255), -1);
+ var contourImageSpan = contourImage.GetPixelSpan<byte>();
+
+ for (int y = rect.Y; y < rect.Bottom; y++)
+ {
+ for (int x = rect.X; x < rect.Right; x++)
{
- pixelsSupportingIsland++;
+ int pixel = step * y + x;
+ if (span[pixel] < islandConfig.RequiredPixelBrightnessToProcessCheck)
+ continue; // Low brightness, ignore
+ if (contourImageSpan[pixel] != 255)
+ continue; // Not inside contour, ignore
+
+ //if (CvInvoke.PointPolygonTest(contours[i], new PointF(x, y), false) < 0) continue; // Out of contour SLOW!
+ //Debug.WriteLine($"Layer: {layer.Index}, Coutour: {i}, X:{x} Y:{y}");
+ points.Add(new Point(x, y));
+
+ if (previousSpan[pixel] >=
+ islandConfig.RequiredPixelBrightnessToSupport)
+ {
+ pixelsSupportingIsland++;
+ }
}
}
}
- }
-
- if (points.Count == 0) continue;
- if (pixelsSupportingIsland >= islandConfig.RequiredPixelsToSupport)
- continue; // Not a island, bounding is strong, i think...
- if (pixelsSupportingIsland > 0 && points.Count < islandConfig.RequiredPixelsToSupport &&
- pixelsSupportingIsland >= Math.Max(1, points.Count / 2))
- continue; // Not a island, but maybe weak bounding...
+ if (points.Count == 0) continue;
+ if (pixelsSupportingIsland >= islandConfig.RequiredPixelsToSupport)
+ continue; // Not a island, bounding is strong, i think...
+ if (pixelsSupportingIsland > 0 &&
+ points.Count < islandConfig.RequiredPixelsToSupport &&
+ pixelsSupportingIsland >= Math.Max(1, points.Count / 2))
+ continue; // Not a island, but maybe weak bounding...
- var issue = new LayerIssue(layer, LayerIssue.IssueType.Island, points.ToArray(), rect);
- result.AddOrUpdate(layer.Index, new List<LayerIssue> {issue},
- (layerIndex, list) =>
- {
- list.Add(issue);
- return list;
- });
- }
- contours.Dispose();
- hierarchy.Dispose();
- previousImage?.Dispose();
+ var issue = new LayerIssue(layer, LayerIssue.IssueType.Island, points.ToArray(),
+ rect);
+ result.AddOrUpdate(layer.Index, new List<LayerIssue> {issue},
+ (layerIndex, list) =>
+ {
+ list.Add(issue);
+ return list;
+ });
+ }
+
+ contours.Dispose();
+ hierarchy.Dispose();
+ previousImage?.Dispose();
+ }
+ }
+ else
+ {
+ result.TryAdd(layer.Index, new List<LayerIssue>
+ {
+ new LayerIssue(layer, LayerIssue.IssueType.EmptyLayer)
+ });
}
lock (progress.Mutex)
diff --git a/UVtools.Core/UVtools.Core.csproj b/UVtools.Core/UVtools.Core.csproj
index b08c03a..aa7f870 100644
--- a/UVtools.Core/UVtools.Core.csproj
+++ b/UVtools.Core/UVtools.Core.csproj
@@ -10,7 +10,7 @@
<RepositoryUrl>https://github.com/sn4k3/UVtools</RepositoryUrl>
<PackageProjectUrl>https://github.com/sn4k3/UVtools</PackageProjectUrl>
<Description>MSLA/DLP, file analysis, repair, conversion and manipulation</Description>
- <Version>0.6.2.2</Version>
+ <Version>0.6.2.3</Version>
<Copyright>Copyright © 2020 PTRTECH</Copyright>
<PackageIcon>UVtools.png</PackageIcon>
<Platforms>AnyCPU;x64</Platforms>
diff --git a/UVtools.GUI/FrmMain.Designer.cs b/UVtools.GUI/FrmMain.Designer.cs
index b306950..8a46ebb 100644
--- a/UVtools.GUI/FrmMain.Designer.cs
+++ b/UVtools.GUI/FrmMain.Designer.cs
@@ -62,16 +62,26 @@
this.mainTable = new System.Windows.Forms.TableLayoutPanel();
this.scCenter = new System.Windows.Forms.SplitContainer();
this.pbLayer = new Cyotek.Windows.Forms.ImageBox();
+ this.tsLayerInfo = new System.Windows.Forms.ToolStrip();
+ this.tsLayerPreviewTime = new System.Windows.Forms.ToolStripLabel();
+ this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
+ this.tsLayerResolution = new System.Windows.Forms.ToolStripLabel();
+ this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator();
+ this.tsLayerImageZoom = new System.Windows.Forms.ToolStripLabel();
+ this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator();
+ this.tsLayerImagePanLocation = new System.Windows.Forms.ToolStripLabel();
+ this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator();
+ this.tsLayerImageMouseLocation = new System.Windows.Forms.ToolStripLabel();
+ this.tsLayerImagePixelCount = new System.Windows.Forms.ToolStripLabel();
+ this.toolStripSeparator17 = new System.Windows.Forms.ToolStripSeparator();
+ this.tsLayerBounds = new System.Windows.Forms.ToolStripLabel();
this.tsLayer = new System.Windows.Forms.ToolStrip();
this.tsLayerImageExport = new System.Windows.Forms.ToolStripSplitButton();
this.tsLayerImageExportFile = new System.Windows.Forms.ToolStripMenuItem();
this.tsLayerImageExportClipboard = new System.Windows.Forms.ToolStripMenuItem();
- this.tsLayerResolution = new System.Windows.Forms.ToolStripLabel();
this.tsLayerImageRotate = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
this.tsLayerImageLayerDifference = new System.Windows.Forms.ToolStripButton();
- this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
- this.tsLayerPreviewTime = new System.Windows.Forms.ToolStripLabel();
this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator();
this.tsLayerImageHighlightIssues = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();
@@ -82,10 +92,6 @@
this.tsLayerImageLayerOutlineEdgeDetection = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator();
this.tsLayerImagePixelEdit = new System.Windows.Forms.ToolStripButton();
- this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator();
- this.tsLayerImageZoom = new System.Windows.Forms.ToolStripLabel();
- this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator();
- this.tsLayerImageMouseLocation = new System.Windows.Forms.ToolStripLabel();
this.pbLayers = new System.Windows.Forms.ProgressBar();
this.tabControlLeft = new System.Windows.Forms.TabControl();
this.tbpThumbnailsAndInfo = new System.Windows.Forms.TabPage();
@@ -189,6 +195,7 @@
this.scCenter.Panel1.SuspendLayout();
this.scCenter.Panel2.SuspendLayout();
this.scCenter.SuspendLayout();
+ this.tsLayerInfo.SuspendLayout();
this.tsLayer.SuspendLayout();
this.tabControlLeft.SuspendLayout();
this.tbpThumbnailsAndInfo.SuspendLayout();
@@ -521,6 +528,7 @@
// scCenter.Panel1
//
this.scCenter.Panel1.Controls.Add(this.pbLayer);
+ this.scCenter.Panel1.Controls.Add(this.tsLayerInfo);
this.scCenter.Panel1.Controls.Add(this.tsLayer);
//
// scCenter.Panel2
@@ -540,34 +548,144 @@
this.pbLayer.Name = "pbLayer";
this.pbLayer.PanMode = Cyotek.Windows.Forms.ImageBoxPanMode.Left;
this.pbLayer.ShowPixelGrid = true;
- this.pbLayer.Size = new System.Drawing.Size(1228, 700);
+ this.pbLayer.Size = new System.Drawing.Size(1228, 675);
this.pbLayer.TabIndex = 7;
+ this.pbLayer.PanEnd += new System.EventHandler(this.pbLayer_PanEnd);
this.pbLayer.Zoomed += new System.EventHandler<Cyotek.Windows.Forms.ImageBoxZoomEventArgs>(this.pbLayer_Zoomed);
this.pbLayer.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.EventMouseDoubleClick);
this.pbLayer.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pbLayer_MouseMove);
this.pbLayer.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pbLayer_MouseUp);
//
+ // tsLayerInfo
+ //
+ this.tsLayerInfo.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.tsLayerInfo.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
+ this.tsLayerInfo.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.tsLayerPreviewTime,
+ this.toolStripSeparator6,
+ this.tsLayerResolution,
+ this.toolStripSeparator11,
+ this.tsLayerImageZoom,
+ this.toolStripSeparator8,
+ this.tsLayerImagePanLocation,
+ this.toolStripSeparator16,
+ this.tsLayerImageMouseLocation,
+ this.tsLayerImagePixelCount,
+ this.toolStripSeparator17,
+ this.tsLayerBounds});
+ this.tsLayerInfo.Location = new System.Drawing.Point(0, 700);
+ this.tsLayerInfo.Name = "tsLayerInfo";
+ this.tsLayerInfo.Size = new System.Drawing.Size(1228, 25);
+ this.tsLayerInfo.TabIndex = 8;
+ this.tsLayerInfo.Text = "tsLayerInfo";
+ //
+ // tsLayerPreviewTime
+ //
+ this.tsLayerPreviewTime.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.tsLayerPreviewTime.Name = "tsLayerPreviewTime";
+ this.tsLayerPreviewTime.Size = new System.Drawing.Size(77, 22);
+ this.tsLayerPreviewTime.Text = "Preview Time";
+ this.tsLayerPreviewTime.ToolTipText = "Layer preview computation time";
+ //
+ // toolStripSeparator6
+ //
+ this.toolStripSeparator6.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.toolStripSeparator6.Name = "toolStripSeparator6";
+ this.toolStripSeparator6.Size = new System.Drawing.Size(6, 25);
+ //
+ // tsLayerResolution
+ //
+ this.tsLayerResolution.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.tsLayerResolution.Image = global::UVtools.GUI.Properties.Resources.resize_16x16;
+ this.tsLayerResolution.Name = "tsLayerResolution";
+ this.tsLayerResolution.Size = new System.Drawing.Size(79, 22);
+ this.tsLayerResolution.Text = "Resolution";
+ this.tsLayerResolution.ToolTipText = "Layer Resolution";
+ //
+ // toolStripSeparator11
+ //
+ this.toolStripSeparator11.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.toolStripSeparator11.Name = "toolStripSeparator11";
+ this.toolStripSeparator11.Size = new System.Drawing.Size(6, 25);
+ //
+ // tsLayerImageZoom
+ //
+ this.tsLayerImageZoom.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.tsLayerImageZoom.Image = global::UVtools.GUI.Properties.Resources.search_16x16;
+ this.tsLayerImageZoom.Name = "tsLayerImageZoom";
+ this.tsLayerImageZoom.Size = new System.Drawing.Size(89, 22);
+ this.tsLayerImageZoom.Text = "Zoom: 100%";
+ this.tsLayerImageZoom.ToolTipText = "Layer image zoom level, use mouse scroll to zoom in/out into image\r\nCtrl + 0 to s" +
+ "cale to fit";
+ //
+ // toolStripSeparator8
+ //
+ this.toolStripSeparator8.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.toolStripSeparator8.Name = "toolStripSeparator8";
+ this.toolStripSeparator8.Size = new System.Drawing.Size(6, 25);
+ this.toolStripSeparator8.Visible = false;
+ //
+ // tsLayerImagePanLocation
+ //
+ this.tsLayerImagePanLocation.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.tsLayerImagePanLocation.Image = global::UVtools.GUI.Properties.Resources.cursor_16x16;
+ this.tsLayerImagePanLocation.Name = "tsLayerImagePanLocation";
+ this.tsLayerImagePanLocation.Size = new System.Drawing.Size(79, 22);
+ this.tsLayerImagePanLocation.Text = "{X=0, Y=0}";
+ this.tsLayerImagePanLocation.ToolTipText = "Image pan location";
+ this.tsLayerImagePanLocation.Visible = false;
+ //
+ // toolStripSeparator16
+ //
+ this.toolStripSeparator16.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.toolStripSeparator16.Name = "toolStripSeparator16";
+ this.toolStripSeparator16.Size = new System.Drawing.Size(6, 25);
+ //
+ // tsLayerImageMouseLocation
+ //
+ this.tsLayerImageMouseLocation.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.tsLayerImageMouseLocation.Image = global::UVtools.GUI.Properties.Resources.pointer_16x16;
+ this.tsLayerImageMouseLocation.Name = "tsLayerImageMouseLocation";
+ this.tsLayerImageMouseLocation.Size = new System.Drawing.Size(79, 22);
+ this.tsLayerImageMouseLocation.Text = "{X=0, Y=0}";
+ this.tsLayerImageMouseLocation.ToolTipText = "Mouse over pixel location and pixel brightness";
+ //
+ // tsLayerImagePixelCount
+ //
+ this.tsLayerImagePixelCount.Image = global::UVtools.GUI.Properties.Resources.pixel_16x16;
+ this.tsLayerImagePixelCount.Name = "tsLayerImagePixelCount";
+ this.tsLayerImagePixelCount.Size = new System.Drawing.Size(65, 22);
+ this.tsLayerImagePixelCount.Text = "Pixels: 0";
+ this.tsLayerImagePixelCount.ToolTipText = "Number of pixels to cure on this layer image and the percetange of them against t" +
+ "otal lcd pixels";
+ //
+ // toolStripSeparator17
+ //
+ this.toolStripSeparator17.Name = "toolStripSeparator17";
+ this.toolStripSeparator17.Size = new System.Drawing.Size(6, 25);
+ //
+ // tsLayerBounds
+ //
+ this.tsLayerBounds.Image = global::UVtools.GUI.Properties.Resources.resize_16x16;
+ this.tsLayerBounds.Name = "tsLayerBounds";
+ this.tsLayerBounds.Size = new System.Drawing.Size(66, 22);
+ this.tsLayerBounds.Text = "Bounds:";
+ this.tsLayerBounds.ToolTipText = "Image bounds for this layer only, position and size";
+ //
// tsLayer
//
this.tsLayer.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
this.tsLayer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tsLayerImageExport,
- this.tsLayerResolution,
this.tsLayerImageRotate,
this.toolStripSeparator5,
this.tsLayerImageLayerDifference,
- this.toolStripSeparator6,
- this.tsLayerPreviewTime,
this.toolStripSeparator14,
this.tsLayerImageHighlightIssues,
this.toolStripSeparator7,
this.tsLayerImageLayerOutline,
this.toolStripSeparator9,
- this.tsLayerImagePixelEdit,
- this.toolStripSeparator8,
- this.tsLayerImageZoom,
- this.toolStripSeparator11,
- this.tsLayerImageMouseLocation});
+ this.tsLayerImagePixelEdit});
this.tsLayer.Location = new System.Drawing.Point(0, 0);
this.tsLayer.Name = "tsLayer";
this.tsLayer.Size = new System.Drawing.Size(1228, 25);
@@ -605,14 +723,6 @@
this.tsLayerImageExportClipboard.Text = "To &Clipboard";
this.tsLayerImageExportClipboard.Click += new System.EventHandler(this.EventClick);
//
- // tsLayerResolution
- //
- this.tsLayerResolution.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
- this.tsLayerResolution.Name = "tsLayerResolution";
- this.tsLayerResolution.Size = new System.Drawing.Size(63, 22);
- this.tsLayerResolution.Text = "Resolution";
- this.tsLayerResolution.ToolTipText = "Layer Resolution";
- //
// tsLayerImageRotate
//
this.tsLayerImageRotate.Checked = true;
@@ -644,20 +754,6 @@
" the white pixels the difference between previous and current layer.";
this.tsLayerImageLayerDifference.Click += new System.EventHandler(this.EventClick);
//
- // toolStripSeparator6
- //
- this.toolStripSeparator6.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
- this.toolStripSeparator6.Name = "toolStripSeparator6";
- this.toolStripSeparator6.Size = new System.Drawing.Size(6, 25);
- //
- // tsLayerPreviewTime
- //
- this.tsLayerPreviewTime.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
- this.tsLayerPreviewTime.Name = "tsLayerPreviewTime";
- this.tsLayerPreviewTime.Size = new System.Drawing.Size(77, 22);
- this.tsLayerPreviewTime.Text = "Preview Time";
- this.tsLayerPreviewTime.ToolTipText = "Layer Resolution";
- //
// toolStripSeparator14
//
this.toolStripSeparator14.Name = "toolStripSeparator14";
@@ -744,33 +840,6 @@
"e pixel)\r\nRed pixels are removed pixels\r\nGreen pixels are added pixels";
this.tsLayerImagePixelEdit.Click += new System.EventHandler(this.EventClick);
//
- // toolStripSeparator8
- //
- this.toolStripSeparator8.Name = "toolStripSeparator8";
- this.toolStripSeparator8.Size = new System.Drawing.Size(6, 25);
- //
- // tsLayerImageZoom
- //
- this.tsLayerImageZoom.Image = global::UVtools.GUI.Properties.Resources.search_16x16;
- this.tsLayerImageZoom.Name = "tsLayerImageZoom";
- this.tsLayerImageZoom.Size = new System.Drawing.Size(89, 22);
- this.tsLayerImageZoom.Text = "Zoom: 100%";
- this.tsLayerImageZoom.ToolTipText = "Layer image zoom level, use mouse scroll to zoom in/out into image\r\nCtrl + 0 to s" +
- "cale to fit";
- //
- // toolStripSeparator11
- //
- this.toolStripSeparator11.Name = "toolStripSeparator11";
- this.toolStripSeparator11.Size = new System.Drawing.Size(6, 25);
- //
- // tsLayerImageMouseLocation
- //
- this.tsLayerImageMouseLocation.Image = global::UVtools.GUI.Properties.Resources.pointer_16x16;
- this.tsLayerImageMouseLocation.Name = "tsLayerImageMouseLocation";
- this.tsLayerImageMouseLocation.Size = new System.Drawing.Size(79, 22);
- this.tsLayerImageMouseLocation.Text = "{X=0, Y=0}";
- this.tsLayerImageMouseLocation.ToolTipText = "Mouse over pixel location and pixel brightness";
- //
// pbLayers
//
this.pbLayers.Dock = System.Windows.Forms.DockStyle.Fill;
@@ -1892,6 +1961,8 @@
this.scCenter.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.scCenter)).EndInit();
this.scCenter.ResumeLayout(false);
+ this.tsLayerInfo.ResumeLayout(false);
+ this.tsLayerInfo.PerformLayout();
this.tsLayer.ResumeLayout(false);
this.tsLayer.PerformLayout();
this.tabControlLeft.ResumeLayout(false);
@@ -1972,7 +2043,6 @@
private System.Windows.Forms.ToolStripMenuItem menuFileSave;
private System.Windows.Forms.ToolStripMenuItem menuFileSaveAs;
private System.Windows.Forms.ToolStrip tsLayer;
- private System.Windows.Forms.ToolStripLabel tsLayerResolution;
private System.Windows.Forms.TabControl tabControlLeft;
private System.Windows.Forms.TabPage tbpThumbnailsAndInfo;
private System.Windows.Forms.SplitContainer scLeft;
@@ -2002,13 +2072,9 @@
private System.Windows.Forms.ToolStripButton tsLayerImageRotate;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
private System.Windows.Forms.ToolStripButton tsLayerImageLayerDifference;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator6;
- private System.Windows.Forms.ToolStripLabel tsLayerPreviewTime;
private Cyotek.Windows.Forms.ImageBox pbLayer;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator7;
- private System.Windows.Forms.ToolStripLabel tsLayerImageZoom;
private System.Windows.Forms.ToolStripButton tsLayerImagePixelEdit;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator8;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator9;
private System.Windows.Forms.ToolStripMenuItem menuMutate;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator10;
@@ -2022,8 +2088,6 @@
private System.Windows.Forms.ColumnHeader lvIssuesCount;
private System.Windows.Forms.ColumnHeader lvIssuesXY;
private System.Windows.Forms.ColumnHeader lvIssuesPixels;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator11;
- private System.Windows.Forms.ToolStripLabel tsLayerImageMouseLocation;
private System.Windows.Forms.ColumnHeader lvIssuesLayerHeader;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator12;
private System.Windows.Forms.ToolStripButton tsIssueRemove;
@@ -2102,6 +2166,19 @@
private System.Windows.Forms.NumericUpDown nmPixelEditorDrainHoleDiameter;
private System.Windows.Forms.Label label14;
private System.Windows.Forms.ToolStripButton btnPixelHistoryRemove;
+ private System.Windows.Forms.ToolStrip tsLayerInfo;
+ private System.Windows.Forms.ToolStripLabel tsLayerImageMouseLocation;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator11;
+ private System.Windows.Forms.ToolStripLabel tsLayerImageZoom;
+ private System.Windows.Forms.ToolStripLabel tsLayerPreviewTime;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator6;
+ private System.Windows.Forms.ToolStripLabel tsLayerResolution;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator8;
+ private System.Windows.Forms.ToolStripLabel tsLayerImagePanLocation;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator16;
+ private System.Windows.Forms.ToolStripLabel tsLayerImagePixelCount;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator17;
+ private System.Windows.Forms.ToolStripLabel tsLayerBounds;
}
}
diff --git a/UVtools.GUI/FrmMain.cs b/UVtools.GUI/FrmMain.cs
index cd3b2cb..8f7e77e 100644
--- a/UVtools.GUI/FrmMain.cs
+++ b/UVtools.GUI/FrmMain.cs
@@ -1503,6 +1503,7 @@ namespace UVtools.GUI
private void pbLayer_Zoomed(object sender, Cyotek.Windows.Forms.ImageBoxZoomEventArgs e)
{
tsLayerImageZoom.Text = $"Zoom: {e.NewZoom}% ({e.NewZoom/100f}x)";
+ pbLayer_PanEnd(pbLayer, null);
}
private void pbLayer_MouseUp(object sender, MouseEventArgs e)
@@ -1563,7 +1564,7 @@ namespace UVtools.GUI
ShowLayer(issue.Layer.Index);
}
- if (issue.Type == LayerIssue.IssueType.TouchingBound)
+ if (issue.Type == LayerIssue.IssueType.TouchingBound || issue.Type == LayerIssue.IssueType.EmptyLayer || (issue.X == -1 && issue.Y == -1))
{
ZoomToFit();
}
@@ -1579,7 +1580,7 @@ namespace UVtools.GUI
x = ActualLayerImage.Height - 1 - issue.Y;
y = issue.X;
}
-
+
pbLayer.ZoomToRegion(x, y, 5, 5);
pbLayer.ZoomOut(true);
}
@@ -1679,6 +1680,10 @@ namespace UVtools.GUI
{
item.Enabled = false;
}
+ foreach (ToolStripItem item in tsLayerInfo.Items)
+ {
+ item.Enabled = false;
+ }
foreach (ToolStripItem item in tsProperties.Items)
{
item.Enabled = false;
@@ -1688,6 +1693,10 @@ namespace UVtools.GUI
item.Enabled = false;
}
+ tsLayerImagePixelCount.Text = "Pixels: 0";
+ tsLayerBounds.Text = "Bounds:";
+ tsLayerImageMouseLocation.Text = "{X=0, Y=0}";
+
tsThumbnailsResolution.Text =
tsLayerPreviewTime.Text =
tsLayerResolution.Text =
@@ -1887,6 +1896,10 @@ namespace UVtools.GUI
{
item.Enabled = true;
}
+ foreach (ToolStripItem item in tsLayerInfo.Items)
+ {
+ item.Enabled = true;
+ }
foreach (ToolStripItem item in tsProperties.Items)
{
item.Enabled = true;
@@ -2312,6 +2325,15 @@ namespace UVtools.GUI
byte percent = (byte)((layerNum + 1) * 100 / SlicerFile.LayerCount);
+ float pixelPercent = (float) Math.Round(layer.NonZeroPixelCount * 100f / (SlicerFile.ResolutionX * SlicerFile.ResolutionY), 2);
+ tsLayerImagePixelCount.Text = $"Pixels: {layer.NonZeroPixelCount} ({pixelPercent}%)";
+ tsLayerBounds.Text = $"Bounds: {layer.BoundingRectangle}";
+ tsLayerImagePixelCount.Invalidate();
+ tsLayerBounds.Invalidate();
+ tsLayerInfo.Update();
+ tsLayerInfo.Refresh();
+
+
watch.Stop();
tsLayerPreviewTime.Text = $"{watch.ElapsedMilliseconds}ms";
@@ -3082,5 +3104,10 @@ namespace UVtools.GUI
MaximumPixelBrightnessToDrain = Settings.Default.ResinTrapMaximumPixelBrightnessToDrain
};
}
+
+ private void pbLayer_PanEnd(object sender, EventArgs e)
+ {
+ //tsLayerImagePanLocation.Text = $"{pbLayer.AutoScrollPosition}";
+ }
}
}
diff --git a/UVtools.GUI/FrmMain.resx b/UVtools.GUI/FrmMain.resx
index 977692d..22e5515 100644
--- a/UVtools.GUI/FrmMain.resx
+++ b/UVtools.GUI/FrmMain.resx
@@ -123,15 +123,12 @@
<metadata name="statusBar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>100, 17</value>
</metadata>
+ <metadata name="tsLayerInfo.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>1312, 17</value>
+ </metadata>
<metadata name="tsLayer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>201, 17</value>
</metadata>
- <metadata name="tsThumbnails.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
- <value>291, 17</value>
- </metadata>
- <metadata name="tsProperties.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
- <value>649, 17</value>
- </metadata>
<metadata name="tsGCode.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>551, 17</value>
</metadata>
@@ -148,83 +145,101 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
- ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA+
- EQAAAk1TRnQBSQFMAgEBBQEAAVgBBQFYAQUBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
- AwABIAMAAQEBAAEgBgABIC4AAxgBIgMwAUsDMAFMAzIBUOgAAyIBMQNWAbkDXQHiARoBHQEYAf8BGgEd
- ARgB/wEqAS0BKAH+A1MBrANNAZUDAAEB2AADIQEwA1kB7AErAS4BKQH6AkQBQgH3AUoBTAFIAfQDUwHx
- AUMBRQFBAfYDQQH5ARoBHQEYAf8DTwGbAwABAdAAAxwBKANZAesBKgEtASgB/gNWAbYDTAGSA0gBhQNI
- AYUDRgGAA0gBhQEqAS0BKAH+ARoBHQEYAf8DTgGU0AADJgE4ASoBLQEoAf4DTAGTA0sBkANNAZYDSgGL
- A0UBfwNDAXgDQwF4A0cBggM+AfgDUwGw0AADXAHUARoBHQEYAf8DUQGgA04BmANQAZ8DOgFhAzgBXQNC
- AXQDRgGAA0gBhANMAZMDWAHjAzABTMgAAzYBWQNAAXADWQHXA0cBggNMAZMDSQGJAwEBAgQAAzABSwNE
- AXkDSAGHA0sBkANXAegDMAFMyAADLQFGAzgBXgNKAY0DEgEYA1ABoxAAAykBPgNLAZADTQGVA1kB7AMw
- AUzIAAMUARwDMAFNA08BnANRAaIDUwGwEAADKwFDA08BmwNQAZ4DVgG7AxUBHcgAA0QBeQM/AW4DKgFA
- Ax4BKwMqAUADVQGxAwQBBQQAAzkBYANMAZIDTgGUA1YBtgNWAbjIAAM/AW0DLgFIAxoBJAMlATcDIQEw
- ASsBLAErAUMDLAFEA0gBiANIAYUDSAGHA0kBiQNQAZoDWAHpAycBOsgAAwYBCAMKAQ0DUwGwAyoBQANC
- AXUDFAEcAzUBWANEAXwDTgGUA0QBfANIAYgDTgHwAycBO8gAAwcBCQNVAbQDCQEMBAADQQFzAyoBQQNC
- AXYDPAFnA1EBpwNaAcoDWwHWAyQBNgMfAS3QAAMBAQIDUwGsAw4BEwM7AWUEAAMwAU0DBwEJAwQBBeQA
- Az8BbgMGAQgDMQFPAwMBBANTAbDsAAMxAU8DAQEC/wA1AANQAaMDUgGpA1IBqQNSAakDUgGpA1IBqQNS
- AakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUAGjXAADFQEdAUICWQH1AVECbQH3A0MBdwNbAcgCQgFZ
- AfUCWAFfAeMDSgGMAwoBDQQAA1UBtANZAccDLwFJAwABAQMbASYDHAEnAxwBJwMcAScDHAEnAxwBJwMc
- AScDHAEnAxwBJwMcAScDHAEnAwIBAwQAA1IBqTAAA1IBqRAAAycBOgMwAUwDMAFMAzABTAMwAUwDMAFM
- AzABTAMwAUwDMAFMAycBOhQAAwUBBwNMAZIBVgJYAcEDFQEdAz0BaQEAAcgB8wH/AQABkAHmAf8CBgHc
- Af8CBgHdAf8COwHjAf8CEQHeAf8CBgHdAf8CWAFbAcsDBgEIAwAB/wMAAf8DQwF3AykBPgMAAf8DAAH/
- AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AzIBUQQAA1IBqQQAA1ABnQNTAaoDUwGq
- A1MBqgNTAaoDUwGqA1MBqgNQAZ0MAANSAakQAANOAfsDAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/
- AwAB/wNOAfsUAAEwAjEBTQEAAckB8wH/AQAByQH0Af8BWQJgAesBWwJeAdkBAAHAAfEB/wEHAQ8B3wH/
- AgkB4AH/AgkB4AH/AkIB6QH/AhQB4gH/AgkB4AH/AgkB4AH/A0ABcQNRAaIDVgG2AyoBQAQAAxABFQMR
- ARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMQARYIAANSAakEAANQAZ0DUwGqA1MBqgMf
- ASwcAANSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/FAADBwEKAVkCZwHy
- AQABygH0Af8BAAHKAfQB/wEAAcoB9AH/AQABoQHuAf8CDAHjAf8CDAHjAf8CDAHjAf8CqQHvAf8CEwHj
- Af8CDAHjAf8CDAHjAf8CVgFYAbkDCgEOAxEBFwMAAQE4AANSAakwAANSAakTAAH/AwAB/wMAAf8DAAH/
- AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/DAADFQEdAz0BaQM6AWIBXAJgAdQBAAHLAfUB/wEAAcsB9QH/
- AQABywH1Af8BAAGgAfAB/wIPAeYB/wIPAeYB/wIPAeYB/wLCAfYB/wInAegB/wIPAeYB/wIPAeYB/wJX
- AVkBvwNSAfQDAAH/Az4BbAMOARMDQgF2A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3
- A0IBdgMUARsEAANSAakDIgEyA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQMi
- ATIDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wwAAUsCTAGQAQABywH2
- Af8BAAHLAfYB/wEAAcsB9gH/AQABywH2Af8BKQFWAWYB+gNDAXgDIgEyAksBYAH7AhIB6QH/AhIB6QH/
- As0B+AH/AjYB7QH/AhIB6QH/AhIB6QH/A1ABngMAAf4DAAH/A0MBdwMeASsDVwHFA1kBxwNZAccDWQHH
- A1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1gBxgMmATkEAANSAakDNAFVAzQBVSAAAzQBVQM0AVUDUgGp
- EwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wwAA1EBoAEAAcwB9wH/AQABzAH3
- Af8BAAHMAfcB/wEAAcwB9wH/A0MBdwgAA0oBjQIVAewB/wIVAewB/wIxAe8B/wIZAewB/wIVAewB/wER
- ASIB7QH/AVICUwGoAzMBUwM8AWcDFAEcOAADUgGpAzQBVQM0AVUDRgGAA1IBqQNSAakDUgGpA1IBqQNS
- AakDUgGpA0UBfwM0AVUDNAFVA1IBqRMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
- Af8PAAEBAT8CQAFvAT4CXAH4AQABzQH3Af8BAAHNAfcB/wMSARgIAAMBAQIDRgF+AlIBXQHwAhgB7gH/
- ARgBGQHuAf8CQAGoAf0BRQJGAX4DAwEEAzMBUwM8AWcDFAEcOAADUgGpAzQBVQM0AVUDPwFuAzIBUBAA
- AycBOwNEAXwDNAFVAzQBVQNSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/
- DwABAQE/AkABbwE+AlwB+AEAAc4B+AH/AQABzgH4Af8DEgEYEAADFwEgAQABvAH3Af8BAAHEAfcB/wFA
- AqgB/QFFAkYBfgMDAQQDAAH+AwAB/wNDAXcDHwEsA1cBxQNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNZ
- AccDWQHHA1kBxwNYAcYDJgE5BAADUgGpAzQBVQM0AVUDBQEHA1UBtQMRARcDUgGpAykBPgQAA1ABnwMR
- ARcDNAFVAzQBVQNSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/DAADUQGg
- AQABzgH4Af8BAAHPAfkB/wEAAc8B+QH/AQABzwH5Af8DQwF3EAADRAF6AQABzwH5Af8BAAHPAfkB/wEA
- Ac8B+QH/AQABzgH4Af8BUgJTAagDUgH0AwAB/wM+AWwDDgETA0IBdQNDAXcDQwF3A0MBdwNDAXcDQwF3
- A0MBdwNDAXcDQwF3A0MBdwNDAXcDFAEbBAADUgGpAzQBVQM0AVUEAAM8AWgDVgG+AyMBNANVAbUDEgEZ
- A1EBoAQAAzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A1wB3wwA
- AUsCTAGQAQAB0AH6Af8BAAHQAfoB/wEAAdAB+gH/AQAB0AH6Af8BKQFWAWYB+gNDAXgDEgEZAxMBGgNE
- AXoBKAFfAWcB+wEAAdAB+gH/AQAB0AH6Af8BAAHQAfoB/wEAAdAB+gH/A0oBjAMKAQ4DEQEXAwABATgA
- A1IBqQM0AVUDNAFVAwABAQMtAUYDCgEOBAADOQFfA1wBzgMoATwEAAM0AVUDNAFVA1IBqRMAAf8DggH/
- AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A1wB3wMXASAMAAMVAR0DPQFpAzoBYgFcAmAB1AEAAdEB+gH/
- AQAB0QH6Af8BAAHQAfoB/wEAAcsB8wH/AQABywHzAf8BAAHQAfoB/wEAAdEB+gH/AQAB0QH6Af8BXQJh
- AeIDOgFiAz0BaQMUARwDUQGiA1YBtgMqAUAEAAMQARUDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEX
- AxEBFwMRARcDEAEWCAADUgGpAzQBVQM0AVUDMwFTA1IBpgNKAYwHAAEBA0cBgwgAAzQBVQM0AVUDUgGp
- EwAB/wOZAf8DhQH/AwAB/wMAAf8DAAH/AwAB/wNcAd8DFwEgGAADBwEKAVkCZwHyAQAB0gH7Af8BAAHS
- AfsB/wEAAdIB+wH/AQAB0gH7Af8BAAHSAfsB/wEAAdIB+wH/AQAB0gH7Af8BAAHSAfsB/wErAV8BZwH7
- AxEBFwsAAf8DAAH/A0MBdwMpAT4DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/
- AwAB/wMyAVEEAANSAakDNAFVAzQBVQMRARcDUAGeAyQBNhQAAzQBVQM0AVUDUgGpEAADUAH7AwAB/wMA
- Af8DAAH/AwAB/wMAAf8DXAHfAxcBIBwAATACMQFNAQAB0gH8Af8BAAHSAfwB/wFZAmAB6wFbAl4B2QEA
- AdIB/AH/AQAB0gH8Af8BWwJhAeEBXQJhAeIBAAHSAfwB/wEAAdIB/AH/AzgBXggAA1UBtANZAccDLwFJ
- AwABAQMbASYDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAwIBAwQAA1IBqQMi
- ATIDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpAyIBMgNSAakQAAMgAS4DKQE/
- AykBPwMpAT8DKQE/AykBPwMRARcgAAMFAQcDTAGSAVYCWAHBAxUBHQM9AWkBAAHTAfwB/wEAAdMB/AH/
- AUUCRgF/AxABFQNWAbMBSwJMAY8DBAEGTAADUAGjA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNS
- AakDUgGpA1IBqQNSAakDUgGpA1ABo1wAAxUBHQFCAlkB9QFRAm0B9wMgAS8YAAFCAU0BPgcAAT4DAAEo
- AwABQAMAASADAAEBAQABAQYAAQEWAAP/AQAB/gEfBgAB+AEDBgAB8AEBBgAB4AEBBgAB4AEBBgAB4AcA
- AcABQAYAAcEB4AYAAcEB4AYAAcABQQYAAYABAQYAAYABAwYAARABBwYAAYQBfwYAAcEB/wYAAc8B/wYA
- Av8BgAEBAv8B/AEBAgABvwH9AeABBwHAAwABoAEdAeABBwHAAQABEAEBAaEB/QHgAQcBwAEAAR8B/wG/
- Af0B4AEHBAABgAEBAeABBwQAAY8B8QHgAQcBAwEAAR8B/wGAAQEB4AEHAQMBAAEfAf8BgwHBAeABBwED
- AcACAAGAAUEB4AEHAQMBwAIAAYgBEQHgAQcCAAEfAf8BgQERAeABBwIAARABAQGBATEB4AEPAcABAwIA
- AYEB8QHgAR8BwAEDAgABgAEBAeABPwHAAQMC/wGAAQEC/wH8AT8L
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAw
+ EQAAAk1TRnQBSQFMAgEBBQEAAagBBQGoAQUBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+ AwABIAMAAQEBAAEgBgABIC4AAxgBIgMwAUsDMAFMAzIBUOgAAyIBMQNWAbkDXQHiARABEwEOAf8BEAET
+ AQ4B/wEqAS0BKAH+A1MBrANNAZUDAAEB2AADIQEwA1kB7AErAS4BKQH6A1EB9wNSAfQDUwHxA0gB9gNB
+ AfkBEAETAQ4B/wNPAZsDAAEB0AADHAEoA1kB6wEqAS0BKAH+A1YBtgNMAZIDSAGFA0gBhQNGAYADSAGF
+ ASoBLQEoAf4BEAETAQ4B/wNOAZTQAAMmATgBKgEtASgB/gNMAZMDSwGQA00BlgNKAYsDRQF/A0MBeAND
+ AXgDRwGCAz4B+ANTAbDQAANcAdQBEAETAQ4B/wNRAaADTgGYA1ABnwM6AWEDOAFdA0IBdANGAYADSAGE
+ A0wBkwNYAeMDMAFMyAADNgFZA0ABcANZAdcDRwGCA0wBkwNJAYkDAQECBAADMAFLA0QBeQNIAYcDSwGQ
+ A1cB6AMwAUzIAAMtAUYDOAFeA0oBjQMSARgDUAGjEAADKQE+A0sBkANNAZUDWQHsAzABTMgAAxQBHAMw
+ AU0DTwGcA1EBogNTAbAQAAMrAUMDTwGbA1ABngNWAbsDFQEdyAADRAF5Az8BbgMqAUADHgErAyoBQANV
+ AbEDBAEFBAADOQFgA0wBkgNOAZQDVgG2A1YBuMgAAz8BbQMuAUgDGgEkAyUBNwMhATABKwEsASsBQwMs
+ AUQDSAGIA0gBhQNIAYcDSQGJA1ABmgNYAekDJwE6yAADBgEIAwoBDQNTAbADKgFAA0IBdQMUARwDNQFY
+ A0QBfANOAZQDRAF8A0gBiANOAfADJwE7yAADBwEJA1UBtAMJAQwEAANBAXMDKgFBA0IBdgM8AWcDUQGn
+ A1oBygNbAdYDJAE2Ax8BLdAAAwEBAgNTAawDDgETAzsBZQQAAzABTQMHAQkDBAEF5AADPwFuAwYBCAMx
+ AU8DAwEEA1MBsOwAAzEBTwMBAQL/ADUAA1ABowNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGp
+ A1IBqQNSAakDUgGpA1IBqQNQAaNcAAMVAR0BQgJZAfUBUQJtAfcDQwF3A1sByAJCAVkB9QJYAV8B4wNK
+ AYwDCgENBAADVQG0A1kBxwMvAUkDAAEBAxsBJgMcAScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDHAEn
+ AxwBJwMcAScDAgEDBAADUgGpMAADUgGpEAADJwE6AzABTAMwAUwDMAFMAzABTAMwAUwDMAFMAzABTAMw
+ AUwDJwE6FAADBQEHA0wBkgFWAlgBwQMVAR0DPQFpAQAByAHzAf8BAAGQAeYB/wIAAdwB/wIAAd0B/wIx
+ AeMB/wIHAd4B/wIAAd0B/wJYAVsBywMGAQgDAAH/AwAB/wNDAXcDKQE+AwAB/wMAAf8DAAH/AwAB/wMA
+ Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DMgFRBAADUgGpBAADUAGdA1MBqgNTAaoDUwGqA1MBqgNT
+ AaoDUwGqA1ABnQwAA1IBqRAAA04B+wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A04B+xQA
+ ATACMQFNAQAByQHzAf8BAAHJAfQB/wFZAmAB6wFbAl4B2QEAAcAB8QH/AQABBQHfAf8CAAHgAf8CAAHg
+ Af8COAHpAf8CCgHiAf8CAAHgAf8CAAHgAf8DQAFxA1EBogNWAbYDKgFABAADEAEVAxEBFwMRARcDEQEX
+ AxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxABFggAA1IBqQQAA1ABnQNTAaoDUwGqAx8BLBwAA1IBqRMA
+ Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8UAAMHAQoBWQJnAfIBAAHKAfQB/wEA
+ AcoB9AH/AQABygH0Af8BAAGhAe4B/wICAeMB/wICAeMB/wICAeMB/wKpAe8B/wIJAeMB/wICAeMB/wIC
+ AeMB/wJWAVgBuQMKAQ4DEQEXAwABATgAA1IBqTAAA1IBqRMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
+ Af8DAAH/AwAB/wMAAf8MAAMVAR0DPQFpAzoBYgFcAmAB1AEAAcsB9QH/AQABywH1Af8BAAHLAfUB/wEA
+ AaAB8AH/AgUB5gH/AgUB5gH/AgUB5gH/AsIB9gH/Ah0B6AH/AgUB5gH/AgUB5gH/AlcBWQG/A1IB9AMA
+ Af8DPgFsAw4BEwNCAXYDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQgF2AxQBGwQA
+ A1IBqQMiATIDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpAyIBMgNSAakTAAH/
+ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/DAABSwJMAZABAAHLAfYB/wEAAcsB9gH/
+ AQABywH2Af8BAAHLAfYB/wEpAU0BUwH6A0MBeAMiATICSwFfAfsCCAHpAf8CCAHpAf8CzQH4Af8CLAHt
+ Af8CCAHpAf8CCAHpAf8DUAGeAwAB/gMAAf8DQwF3Ax4BKwNXAcUDWQHHA1kBxwNZAccDWQHHA1kBxwNZ
+ AccDWQHHA1kBxwNZAccDWAHGAyYBOQQAA1IBqQM0AVUDNAFVIAADNAFVAzQBVQNSAakTAAH/AwAB/wMA
+ Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/DAADUQGgAQABzAH3Af8BAAHMAfcB/wEAAcwB9wH/
+ AQABzAH3Af8DQwF3CAADSgGNAgsB7AH/AgsB7AH/AicB7wH/Ag8B7AH/AgsB7AH/AQcBGAHtAf8BUgJT
+ AagDMwFTAzwBZwMUARw4AANSAakDNAFVAzQBVQNGAYADUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDRQF/
+ AzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/w8AAQEBPwJA
+ AW8BPgJcAfgBAAHNAfcB/wEAAc0B9wH/AxIBGAgAAwEBAgNGAX4CUgFdAfACDgHuAf8BDgEPAe4B/wJA
+ AagB/QFFAkYBfgMDAQQDMwFTAzwBZwMUARw4AANSAakDNAFVAzQBVQM/AW4DMgFQEAADJwE7A0QBfAM0
+ AVUDNAFVA1IBqRMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8PAAEBAT8CQAFv
+ AT4CXAH4AQABzgH4Af8BAAHOAfgB/wMSARgQAAMXASABAAG8AfcB/wEAAcQB9wH/AUACqAH9AUUCRgF+
+ AwMBBAMAAf4DAAH/A0MBdwMfASwDVwHFA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHH
+ A1gBxgMmATkEAANSAakDNAFVAzQBVQMFAQcDVQG1AxEBFwNSAakDKQE+BAADUAGfAxEBFwM0AVUDNAFV
+ A1IBqRMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8MAANRAaABAAHOAfgB/wEA
+ Ac8B+QH/AQABzwH5Af8BAAHPAfkB/wNDAXcQAANEAXoBAAHPAfkB/wEAAc8B+QH/AQABzwH5Af8BAAHO
+ AfgB/wFSAlMBqANSAfQDAAH/Az4BbAMOARMDQgF1A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwND
+ AXcDQwF3A0MBdwMUARsEAANSAakDNAFVAzQBVQQAAzwBaANWAb4DIwE0A1UBtQMSARkDUQGgBAADNAFV
+ AzQBVQNSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DXAHfDAABSwJMAZABAAHQ
+ AfoB/wEAAdAB+gH/AQAB0AH6Af8BAAHQAfoB/wEpAU0BUwH6A0MBeAMSARkDEwEaA0QBegEoAl8B+wEA
+ AdAB+gH/AQAB0AH6Af8BAAHQAfoB/wEAAdAB+gH/A0oBjAMKAQ4DEQEXAwABATgAA1IBqQM0AVUDNAFV
+ AwABAQMtAUYDCgEOBAADOQFfA1wBzgMoATwEAAM0AVUDNAFVA1IBqRMAAf8DggH/AwAB/wMAAf8DAAH/
+ AwAB/wMAAf8DAAH/A1wB3wMXASAMAAMVAR0DPQFpAzoBYgFcAmAB1AEAAdEB+gH/AQAB0QH6Af8BAAHQ
+ AfoB/wEAAcsB8wH/AQABywHzAf8BAAHQAfoB/wEAAdEB+gH/AQAB0QH6Af8BXQJhAeIDOgFiAz0BaQMU
+ ARwDUQGiA1YBtgMqAUAEAAMQARUDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEAEW
+ CAADUgGpAzQBVQM0AVUDMwFTA1IBpgNKAYwHAAEBA0cBgwgAAzQBVQM0AVUDUgGpEwAB/wOZAf8DhQH/
+ AwAB/wMAAf8DAAH/AwAB/wNcAd8DFwEgGAADBwEKAVkCZwHyAQAB0gH7Af8BAAHSAfsB/wEAAdIB+wH/
+ AQAB0gH7Af8BAAHSAfsB/wEAAdIB+wH/AQAB0gH7Af8BAAHSAfsB/wErAl8B+wMRARcLAAH/AwAB/wND
+ AXcDKQE+AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DMgFRBAADUgGp
+ AzQBVQM0AVUDEQEXA1ABngMkATYUAAM0AVUDNAFVA1IBqRAAA1AB+wMAAf8DAAH/AwAB/wMAAf8DAAH/
+ A1wB3wMXASAcAAEwAjEBTQEAAdIB/AH/AQAB0gH8Af8BWQJgAesBWwJeAdkBAAHSAfwB/wEAAdIB/AH/
+ AVsCYQHhAV0CYQHiAQAB0gH8Af8BAAHSAfwB/wM4AV4IAANVAbQDWQHHAy8BSQMAAQEDGwEmAxwBJwMc
+ AScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAxwBJwMCAQMEAANSAakDIgEyA1IBqQNSAakDUgGp
+ A1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQMiATIDUgGpEAADIAEuAykBPwMpAT8DKQE/AykBPwMp
+ AT8DEQEXIAADBQEHA0wBkgFWAlgBwQMVAR0DPQFpAQAB0wH8Af8BAAHTAfwB/wFFAkYBfwMQARUDVgGz
+ AUsCTAGPAwQBBkwAA1ABowNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGp
+ A1IBqQNQAaNcAAMVAR0BQgJZAfUBUQJtAfcDIAEvGAABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEA
+ AQEGAAEBFgAD/wEAAf4BHwYAAfgBAwYAAfABAQYAAeABAQYAAeABAQYAAeAHAAHAAUAGAAHBAeAGAAHB
+ AeAGAAHAAUEGAAGAAQEGAAGAAQMGAAEQAQcGAAGEAX8GAAHBAf8GAAHPAf8GAAL/AYABAQL/AfwBAQIA
+ Ab8B/QHgAQcBwAMAAaABHQHgAQcBwAEAARABAQGhAf0B4AEHAcABAAEfAf8BvwH9AeABBwQAAYABAQHg
+ AQcEAAGPAfEB4AEHAQMBAAEfAf8BgAEBAeABBwEDAQABHwH/AYMBwQHgAQcBAwHAAgABgAFBAeABBwED
+ AcACAAGIAREB4AEHAgABHwH/AYEBEQHgAQcCAAEQAQEBgQExAeABDwHAAQMCAAGBAfEB4AEfAcABAwIA
+ AYABAQHgAT8BwAEDAv8BgAEBAv8B/AE/Cw==
</value>
</data>
+ <metadata name="tsThumbnails.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>291, 17</value>
+ </metadata>
+ <metadata name="tsProperties.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>649, 17</value>
+ </metadata>
+ <metadata name="tsGCode.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>551, 17</value>
+ </metadata>
+ <metadata name="tsIssues.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>765, 17</value>
+ </metadata>
+ <metadata name="tsPixelEditorHistory.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>1155, 17</value>
+ </metadata>
+ <metadata name="toolTipInformation.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>863, 17</value>
+ </metadata>
<metadata name="toolTipInformation.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>863, 17</value>
</metadata>
diff --git a/UVtools.GUI/Images/cursor-16x16.png b/UVtools.GUI/Images/cursor-16x16.png
new file mode 100644
index 0000000..b0eeaa0
--- /dev/null
+++ b/UVtools.GUI/Images/cursor-16x16.png
Binary files differ
diff --git a/UVtools.GUI/Properties/AssemblyInfo.cs b/UVtools.GUI/Properties/AssemblyInfo.cs
index b3f0298..cb57eb9 100644
--- a/UVtools.GUI/Properties/AssemblyInfo.cs
+++ b/UVtools.GUI/Properties/AssemblyInfo.cs
@@ -35,5 +35,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.6.2.2")]
-[assembly: AssemblyFileVersion("0.6.2.2")]
+[assembly: AssemblyVersion("0.6.2.3")]
+[assembly: AssemblyFileVersion("0.6.2.3")]
diff --git a/UVtools.GUI/Properties/Resources.Designer.cs b/UVtools.GUI/Properties/Resources.Designer.cs
index 584adf6..7ed314f 100644
--- a/UVtools.GUI/Properties/Resources.Designer.cs
+++ b/UVtools.GUI/Properties/Resources.Designer.cs
@@ -223,6 +223,16 @@ namespace UVtools.GUI.Properties {
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
+ internal static System.Drawing.Bitmap cursor_16x16 {
+ get {
+ object obj = ResourceManager.GetObject("cursor-16x16", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ /// </summary>
internal static System.Drawing.Bitmap delete_16x16 {
get {
object obj = ResourceManager.GetObject("delete-16x16", resourceCulture);
diff --git a/UVtools.GUI/Properties/Resources.resx b/UVtools.GUI/Properties/Resources.resx
index 28be07b..ed99437 100644
--- a/UVtools.GUI/Properties/Resources.resx
+++ b/UVtools.GUI/Properties/Resources.resx
@@ -118,20 +118,23 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
- <data name="SaveAs-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\SaveAs-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="layers-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\layers-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Error-128x128" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Error-128x128.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="Cancel-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\Cancel-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="search-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\search-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="resize-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\resize-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="arrow-top-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\arrow-top-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="mutation_solidify" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\gui\mutation_solidify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="mutation_closing" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\gui\mutation_closing.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="eye-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\eye-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -166,12 +169,12 @@
<data name="warning-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\warning-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
+ <data name="checkbox-marked-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\checkbox-marked-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
<data name="Wrench-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Wrench-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="pattern-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\pattern-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
<data name="arrow-down-double-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\arrow-down-double-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -181,15 +184,15 @@
<data name="arrow-up" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\arrow-up.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="Convert-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\Convert-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
<data name="Ok-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Ok-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Button-Info-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Button-Info-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
+ <data name="arrow-down-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\arrow-down-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
<data name="Next-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Next-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -202,14 +205,14 @@
<data name="Open-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Open-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="pointer-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\pointer-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="checkbox-unmarked-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\checkbox-unmarked-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="File-Close-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\File-Close-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="search-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\search-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="SaveAs-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\SaveAs-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Cancel-32x32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Cancel-32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -217,23 +220,20 @@
<data name="eye-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\eye-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="mutation_tophat" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\gui\mutation_tophat.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
<data name="Geometry-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Geometry-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="CNCMachine-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\CNCMachine-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="mutation_tophat" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\gui\mutation_tophat.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\plus.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="UVtools" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\UVtools.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="Convert-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\Convert-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="layers-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\layers-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="pattern-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\pattern-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="mutation_dilation" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\gui\mutation_dilation.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -253,23 +253,26 @@
<data name="arrow-end-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\arrow-end-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="checkbox-unmarked-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\checkbox-unmarked-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
- <data name="arrow-down-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\arrow-down-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="UVtools" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\UVtools.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="delete-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\delete-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="checkbox-marked-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\checkbox-marked-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="CNCMachine-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\CNCMachine-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="pointer-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\pointer-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="mutation_solidify" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\gui\mutation_solidify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="mutation_blackhat" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\gui\mutation_blackhat.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="mutation_closing" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\gui\mutation_closing.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="Cancel-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\Cancel-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="clipboard-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\clipboard-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -283,7 +286,7 @@
<data name="island-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\island-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="resize-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\resize-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="cursor-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\cursor-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root> \ No newline at end of file
diff --git a/UVtools.GUI/UVtools.GUI.csproj b/UVtools.GUI/UVtools.GUI.csproj
index 5661f2a..03ede66 100644
--- a/UVtools.GUI/UVtools.GUI.csproj
+++ b/UVtools.GUI/UVtools.GUI.csproj
@@ -323,6 +323,7 @@
<None Include="Images\settings-16x16.png" />
<None Include="Images\pattern-16x16.png" />
<None Include="Images\resize-16x16.png" />
+ <None Include="Images\cursor-16x16.png" />
<Content Include="UVtools.ico" />
<None Include="UVtools.png" />
<None Include="Images\Exit-16x16.png" />