From dec036dbcf94a018268f0bf7aca25eca20b25ef9 Mon Sep 17 00:00:00 2001 From: meelstorm <8780022+TesAnti@users.noreply.github.com> Date: Wed, 15 Oct 2025 13:13:47 +0200 Subject: [PATCH] 2.0.9 --- .../Operations/AI/YoloDetectionOperation.cs | 6 +- .../Forms/MapEditor.Designer.cs | 325 +++++++------- Plugins/CandyboxPlugin/Forms/MapEditor.cs | 40 +- Plugins/CandyboxPlugin/Forms/MapEditor.resx | 403 +++--------------- Plugins/CandyboxPlugin/Forms/MaskControl.cs | 227 +++++----- .../Modules/CandyboxImageProcessingControl.cs | 9 +- .../CandyboxRecognitionControlSettings.cs | 15 +- Plugins/CandyboxPlugin/Recipe/HistoRecipe.cs | 82 +--- VisionBuilder.UI.Common/CommandLineParser.cs | 35 ++ VisionBuilder.UI.Common/Extensions.cs | 4 +- .../Plugins/PluginLoader.cs | 14 +- .../Installer/uno.bat | 26 ++ .../VisionBuilder.UI.Windows.Duo.csproj | 5 +- VisionBuilder.UI.Windows.Test/Program.cs | 8 +- .../Properties/launchSettings.json | 11 + .../VisionBuilder.UI.Windows.Uno.csproj | 2 +- 16 files changed, 534 insertions(+), 678 deletions(-) create mode 100644 VisionBuilder.UI.Common/CommandLineParser.cs create mode 100644 VisionBuilder.UI.Windows.Duo/Installer/uno.bat create mode 100644 VisionBuilder.UI.Windows.Test/Properties/launchSettings.json diff --git a/Hawkeye.VisionBuilder.Workflow/Operations/AI/YoloDetectionOperation.cs b/Hawkeye.VisionBuilder.Workflow/Operations/AI/YoloDetectionOperation.cs index 5c6ba9d..b6ca8a9 100644 --- a/Hawkeye.VisionBuilder.Workflow/Operations/AI/YoloDetectionOperation.cs +++ b/Hawkeye.VisionBuilder.Workflow/Operations/AI/YoloDetectionOperation.cs @@ -20,6 +20,8 @@ public class YoloDetectionOperation:BaseOperation private FilePath _modelFilePath = new FilePath(){ Format = "Onnx format(*.onnx)|*.onnx" }; + public int IgnoreType { get; set; } = -1; + public FilePath ModelFilePath { get => _modelFilePath; @@ -101,9 +103,9 @@ public class YoloDetectionOperation:BaseOperation continue; } - if (box.Class.Id + 1 == 10) + if (box.Class.Id + 1 == IgnoreType) { - + continue; } classes[box.Class.Id + 1] = box.Class.Name; var rect = box.Bounds; diff --git a/Plugins/CandyboxPlugin/Forms/MapEditor.Designer.cs b/Plugins/CandyboxPlugin/Forms/MapEditor.Designer.cs index a151410..6e6d635 100644 --- a/Plugins/CandyboxPlugin/Forms/MapEditor.Designer.cs +++ b/Plugins/CandyboxPlugin/Forms/MapEditor.Designer.cs @@ -1,4 +1,6 @@ -namespace Lindt.Candybox.Demo +using System.Resources; + +namespace Lindt.Candybox.Demo { partial class MapEditor { @@ -28,200 +30,216 @@ /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MapEditor)); + materialRaisedButton1 = new MaterialSkin.Controls.MaterialRaisedButton(); + materialRaisedButton3 = new MaterialSkin.Controls.MaterialRaisedButton(); this.maskControl1 = new Lindt.Candybox.Demo.MaskControl(); - this.materialRaisedButton1 = new MaterialSkin.Controls.MaterialRaisedButton(); - this.materialRaisedButton3 = new MaterialSkin.Controls.MaterialRaisedButton(); - this.label1 = new System.Windows.Forms.Label(); - this.udMemoryBuffer = new System.Windows.Forms.NumericUpDown(); - this.btnBrush = new MaterialSkin.Controls.MaterialRaisedButton(); - this.btnDrawLine = new MaterialSkin.Controls.MaterialRaisedButton(); - this.btnRemoveLine = new MaterialSkin.Controls.MaterialRaisedButton(); - this.btnMoveLine = new MaterialSkin.Controls.MaterialRaisedButton(); - this.btnMoveVertices = new MaterialSkin.Controls.MaterialRaisedButton(); - this.label2 = new System.Windows.Forms.Label(); - ((System.ComponentModel.ISupportInitialize)(this.udMemoryBuffer)).BeginInit(); - this.SuspendLayout(); + label1 = new Label(); + udMemoryBuffer = new NumericUpDown(); + btnBrush = new MaterialSkin.Controls.MaterialRaisedButton(); + btnDrawLine = new MaterialSkin.Controls.MaterialRaisedButton(); + btnRemoveLine = new MaterialSkin.Controls.MaterialRaisedButton(); + btnMoveLine = new MaterialSkin.Controls.MaterialRaisedButton(); + btnMoveVertices = new MaterialSkin.Controls.MaterialRaisedButton(); + label2 = new Label(); + btnRelearnPositions = new MaterialSkin.Controls.MaterialRaisedButton(); + ((System.ComponentModel.ISupportInitialize)udMemoryBuffer).BeginInit(); + SuspendLayout(); // // maskControl1 // this.maskControl1.Location = new System.Drawing.Point(8, 32); - this.maskControl1.Mask = ((System.Drawing.Bitmap)(resources.GetObject("maskControl1.Mask"))); this.maskControl1.Name = "maskControl1"; - this.maskControl1.Original = ((System.Drawing.Bitmap)(resources.GetObject("maskControl1.Original"))); this.maskControl1.Size = new System.Drawing.Size(900, 704); this.maskControl1.TabIndex = 0; // // materialRaisedButton1 // - this.materialRaisedButton1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.materialRaisedButton1.Cursor = System.Windows.Forms.Cursors.Hand; - this.materialRaisedButton1.Depth = 0; - this.materialRaisedButton1.DrawBorder = true; - this.materialRaisedButton1.Icon = null; - this.materialRaisedButton1.Location = new System.Drawing.Point(928, 424); - this.materialRaisedButton1.MouseState = MaterialSkin.MouseState.HOVER; - this.materialRaisedButton1.Name = "materialRaisedButton1"; - this.materialRaisedButton1.Primary = false; - this.materialRaisedButton1.Size = new System.Drawing.Size(128, 64); - this.materialRaisedButton1.TabIndex = 1; - this.materialRaisedButton1.Text = "Cancel"; - this.materialRaisedButton1.UseVisualStyleBackColor = true; - this.materialRaisedButton1.Click += new System.EventHandler(this.materialRaisedButton1_Click); + materialRaisedButton1.AutoSizeMode = AutoSizeMode.GrowAndShrink; + materialRaisedButton1.Cursor = Cursors.Hand; + materialRaisedButton1.Depth = 0; + materialRaisedButton1.DrawBorder = true; + materialRaisedButton1.Icon = null; + materialRaisedButton1.Location = new Point(928, 496); + materialRaisedButton1.MouseState = MaterialSkin.MouseState.HOVER; + materialRaisedButton1.Name = "materialRaisedButton1"; + materialRaisedButton1.Primary = false; + materialRaisedButton1.Size = new Size(128, 64); + materialRaisedButton1.TabIndex = 1; + materialRaisedButton1.Text = "Cancel"; + materialRaisedButton1.UseVisualStyleBackColor = true; + materialRaisedButton1.Click += materialRaisedButton1_Click; // // materialRaisedButton3 // - this.materialRaisedButton3.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.materialRaisedButton3.Cursor = System.Windows.Forms.Cursors.Hand; - this.materialRaisedButton3.Depth = 0; - this.materialRaisedButton3.DrawBorder = true; - this.materialRaisedButton3.Icon = null; - this.materialRaisedButton3.Location = new System.Drawing.Point(928, 352); - this.materialRaisedButton3.MouseState = MaterialSkin.MouseState.HOVER; - this.materialRaisedButton3.Name = "materialRaisedButton3"; - this.materialRaisedButton3.Primary = true; - this.materialRaisedButton3.Size = new System.Drawing.Size(128, 64); - this.materialRaisedButton3.TabIndex = 3; - this.materialRaisedButton3.Text = "Learn"; - this.materialRaisedButton3.UseVisualStyleBackColor = true; - this.materialRaisedButton3.Click += new System.EventHandler(this.materialRaisedButton3_Click); + materialRaisedButton3.AutoSizeMode = AutoSizeMode.GrowAndShrink; + materialRaisedButton3.Cursor = Cursors.Hand; + materialRaisedButton3.Depth = 0; + materialRaisedButton3.DrawBorder = true; + materialRaisedButton3.Icon = null; + materialRaisedButton3.Location = new Point(928, 352); + materialRaisedButton3.MouseState = MaterialSkin.MouseState.HOVER; + materialRaisedButton3.Name = "materialRaisedButton3"; + materialRaisedButton3.Primary = true; + materialRaisedButton3.Size = new Size(128, 64); + materialRaisedButton3.TabIndex = 3; + materialRaisedButton3.Text = "Learn"; + materialRaisedButton3.UseVisualStyleBackColor = true; + materialRaisedButton3.Click += materialRaisedButton3_Click; // // label1 // - this.label1.AutoSize = true; - this.label1.BackColor = System.Drawing.Color.White; - this.label1.Location = new System.Drawing.Point(928, 504); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(90, 15); - this.label1.TabIndex = 4; - this.label1.Text = "Memory buffer:"; + label1.AutoSize = true; + label1.BackColor = Color.White; + label1.Location = new Point(928, 576); + label1.Name = "label1"; + label1.Size = new Size(90, 15); + label1.TabIndex = 4; + label1.Text = "Memory buffer:"; // // udMemoryBuffer // - this.udMemoryBuffer.Location = new System.Drawing.Point(928, 528); - this.udMemoryBuffer.Name = "udMemoryBuffer"; - this.udMemoryBuffer.Size = new System.Drawing.Size(120, 23); - this.udMemoryBuffer.TabIndex = 5; + udMemoryBuffer.Location = new Point(928, 600); + udMemoryBuffer.Name = "udMemoryBuffer"; + udMemoryBuffer.Size = new Size(120, 23); + udMemoryBuffer.TabIndex = 5; // // btnBrush // - this.btnBrush.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.btnBrush.Cursor = System.Windows.Forms.Cursors.Hand; - this.btnBrush.Depth = 0; - this.btnBrush.DrawBorder = true; - this.btnBrush.Icon = null; - this.btnBrush.Location = new System.Drawing.Point(928, 64); - this.btnBrush.MouseState = MaterialSkin.MouseState.HOVER; - this.btnBrush.Name = "btnBrush"; - this.btnBrush.Primary = false; - this.btnBrush.Size = new System.Drawing.Size(128, 32); - this.btnBrush.TabIndex = 6; - this.btnBrush.Text = "Brush"; - this.btnBrush.UseVisualStyleBackColor = true; - this.btnBrush.Click += new System.EventHandler(this.btnBrush_Click); + btnBrush.AutoSizeMode = AutoSizeMode.GrowAndShrink; + btnBrush.Cursor = Cursors.Hand; + btnBrush.Depth = 0; + btnBrush.DrawBorder = true; + btnBrush.Icon = null; + btnBrush.Location = new Point(928, 64); + btnBrush.MouseState = MaterialSkin.MouseState.HOVER; + btnBrush.Name = "btnBrush"; + btnBrush.Primary = false; + btnBrush.Size = new Size(128, 32); + btnBrush.TabIndex = 6; + btnBrush.Text = "Brush"; + btnBrush.UseVisualStyleBackColor = true; + btnBrush.Click += btnBrush_Click; // // btnDrawLine // - this.btnDrawLine.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.btnDrawLine.Cursor = System.Windows.Forms.Cursors.Hand; - this.btnDrawLine.Depth = 0; - this.btnDrawLine.DrawBorder = true; - this.btnDrawLine.Icon = null; - this.btnDrawLine.Location = new System.Drawing.Point(928, 104); - this.btnDrawLine.MouseState = MaterialSkin.MouseState.HOVER; - this.btnDrawLine.Name = "btnDrawLine"; - this.btnDrawLine.Primary = false; - this.btnDrawLine.Size = new System.Drawing.Size(128, 32); - this.btnDrawLine.TabIndex = 7; - this.btnDrawLine.Text = "Draw Line"; - this.btnDrawLine.UseVisualStyleBackColor = true; - this.btnDrawLine.Click += new System.EventHandler(this.btnDrawLine_Click); + btnDrawLine.AutoSizeMode = AutoSizeMode.GrowAndShrink; + btnDrawLine.Cursor = Cursors.Hand; + btnDrawLine.Depth = 0; + btnDrawLine.DrawBorder = true; + btnDrawLine.Icon = null; + btnDrawLine.Location = new Point(928, 104); + btnDrawLine.MouseState = MaterialSkin.MouseState.HOVER; + btnDrawLine.Name = "btnDrawLine"; + btnDrawLine.Primary = false; + btnDrawLine.Size = new Size(128, 32); + btnDrawLine.TabIndex = 7; + btnDrawLine.Text = "Draw Line"; + btnDrawLine.UseVisualStyleBackColor = true; + btnDrawLine.Click += btnDrawLine_Click; // // btnRemoveLine // - this.btnRemoveLine.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.btnRemoveLine.Cursor = System.Windows.Forms.Cursors.Hand; - this.btnRemoveLine.Depth = 0; - this.btnRemoveLine.DrawBorder = true; - this.btnRemoveLine.Icon = null; - this.btnRemoveLine.Location = new System.Drawing.Point(928, 144); - this.btnRemoveLine.MouseState = MaterialSkin.MouseState.HOVER; - this.btnRemoveLine.Name = "btnRemoveLine"; - this.btnRemoveLine.Primary = false; - this.btnRemoveLine.Size = new System.Drawing.Size(128, 32); - this.btnRemoveLine.TabIndex = 8; - this.btnRemoveLine.Text = "Remove Line"; - this.btnRemoveLine.UseVisualStyleBackColor = true; - this.btnRemoveLine.Click += new System.EventHandler(this.btnRemoveLine_Click); + btnRemoveLine.AutoSizeMode = AutoSizeMode.GrowAndShrink; + btnRemoveLine.Cursor = Cursors.Hand; + btnRemoveLine.Depth = 0; + btnRemoveLine.DrawBorder = true; + btnRemoveLine.Icon = null; + btnRemoveLine.Location = new Point(928, 144); + btnRemoveLine.MouseState = MaterialSkin.MouseState.HOVER; + btnRemoveLine.Name = "btnRemoveLine"; + btnRemoveLine.Primary = false; + btnRemoveLine.Size = new Size(128, 32); + btnRemoveLine.TabIndex = 8; + btnRemoveLine.Text = "Remove Line"; + btnRemoveLine.UseVisualStyleBackColor = true; + btnRemoveLine.Click += btnRemoveLine_Click; // // btnMoveLine // - this.btnMoveLine.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.btnMoveLine.Cursor = System.Windows.Forms.Cursors.Hand; - this.btnMoveLine.Depth = 0; - this.btnMoveLine.DrawBorder = true; - this.btnMoveLine.Icon = null; - this.btnMoveLine.Location = new System.Drawing.Point(928, 184); - this.btnMoveLine.MouseState = MaterialSkin.MouseState.HOVER; - this.btnMoveLine.Name = "btnMoveLine"; - this.btnMoveLine.Primary = false; - this.btnMoveLine.Size = new System.Drawing.Size(128, 32); - this.btnMoveLine.TabIndex = 9; - this.btnMoveLine.Text = "Move Line"; - this.btnMoveLine.UseVisualStyleBackColor = true; - this.btnMoveLine.Click += new System.EventHandler(this.btnMoveLine_Click); + btnMoveLine.AutoSizeMode = AutoSizeMode.GrowAndShrink; + btnMoveLine.Cursor = Cursors.Hand; + btnMoveLine.Depth = 0; + btnMoveLine.DrawBorder = true; + btnMoveLine.Icon = null; + btnMoveLine.Location = new Point(928, 184); + btnMoveLine.MouseState = MaterialSkin.MouseState.HOVER; + btnMoveLine.Name = "btnMoveLine"; + btnMoveLine.Primary = false; + btnMoveLine.Size = new Size(128, 32); + btnMoveLine.TabIndex = 9; + btnMoveLine.Text = "Move Line"; + btnMoveLine.UseVisualStyleBackColor = true; + btnMoveLine.Click += btnMoveLine_Click; // // btnMoveVertices // - this.btnMoveVertices.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.btnMoveVertices.Cursor = System.Windows.Forms.Cursors.Hand; - this.btnMoveVertices.Depth = 0; - this.btnMoveVertices.DrawBorder = true; - this.btnMoveVertices.Icon = null; - this.btnMoveVertices.Location = new System.Drawing.Point(928, 224); - this.btnMoveVertices.MouseState = MaterialSkin.MouseState.HOVER; - this.btnMoveVertices.Name = "btnMoveVertices"; - this.btnMoveVertices.Primary = false; - this.btnMoveVertices.Size = new System.Drawing.Size(128, 32); - this.btnMoveVertices.TabIndex = 10; - this.btnMoveVertices.Text = "Move Vertices"; - this.btnMoveVertices.UseVisualStyleBackColor = true; - this.btnMoveVertices.Click += new System.EventHandler(this.btnMoveVertices_Click); + btnMoveVertices.AutoSizeMode = AutoSizeMode.GrowAndShrink; + btnMoveVertices.Cursor = Cursors.Hand; + btnMoveVertices.Depth = 0; + btnMoveVertices.DrawBorder = true; + btnMoveVertices.Icon = null; + btnMoveVertices.Location = new Point(928, 224); + btnMoveVertices.MouseState = MaterialSkin.MouseState.HOVER; + btnMoveVertices.Name = "btnMoveVertices"; + btnMoveVertices.Primary = false; + btnMoveVertices.Size = new Size(128, 32); + btnMoveVertices.TabIndex = 10; + btnMoveVertices.Text = "Move Vertices"; + btnMoveVertices.UseVisualStyleBackColor = true; + btnMoveVertices.Click += btnMoveVertices_Click; // // label2 // - this.label2.AutoSize = true; - this.label2.BackColor = System.Drawing.Color.White; - this.label2.Location = new System.Drawing.Point(928, 32); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(68, 15); - this.label2.TabIndex = 11; - this.label2.Text = "Edit Modes:"; + label2.AutoSize = true; + label2.BackColor = Color.White; + label2.Location = new Point(928, 32); + label2.Name = "label2"; + label2.Size = new Size(69, 15); + label2.TabIndex = 11; + label2.Text = "Edit Modes:"; + // + // btnRelearnPositions + // + btnRelearnPositions.AutoSizeMode = AutoSizeMode.GrowAndShrink; + btnRelearnPositions.Cursor = Cursors.Hand; + btnRelearnPositions.Depth = 0; + btnRelearnPositions.DrawBorder = true; + btnRelearnPositions.Icon = null; + btnRelearnPositions.Location = new Point(928, 424); + btnRelearnPositions.MouseState = MaterialSkin.MouseState.HOVER; + btnRelearnPositions.Name = "btnRelearnPositions"; + btnRelearnPositions.Primary = false; + btnRelearnPositions.Size = new Size(128, 64); + btnRelearnPositions.TabIndex = 13; + btnRelearnPositions.Text = "Relearn positions"; + btnRelearnPositions.UseVisualStyleBackColor = true; + btnRelearnPositions.Click += btnRelearnPositions_Click; // // MapEditor // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1066, 824); - this.Controls.Add(this.label2); - this.Controls.Add(this.btnMoveVertices); - this.Controls.Add(this.btnMoveLine); - this.Controls.Add(this.btnRemoveLine); - this.Controls.Add(this.btnDrawLine); - this.Controls.Add(this.btnBrush); - this.Controls.Add(this.udMemoryBuffer); - this.Controls.Add(this.label1); - this.Controls.Add(this.materialRaisedButton3); - this.Controls.Add(this.materialRaisedButton1); + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1059, 817); + Controls.Add(btnRelearnPositions); + Controls.Add(label2); + Controls.Add(btnMoveVertices); + Controls.Add(btnMoveLine); + Controls.Add(btnRemoveLine); + Controls.Add(btnDrawLine); + Controls.Add(btnBrush); + Controls.Add(udMemoryBuffer); + Controls.Add(label1); + Controls.Add(materialRaisedButton3); + Controls.Add(materialRaisedButton1); this.Controls.Add(this.maskControl1); - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "MapEditor"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "MapEditor"; - ((System.ComponentModel.ISupportInitialize)(this.udMemoryBuffer)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); + MaximizeBox = false; + MinimizeBox = false; + Name = "MapEditor"; + StartPosition = FormStartPosition.CenterScreen; + Text = "MapEditor"; + ((System.ComponentModel.ISupportInitialize)udMemoryBuffer).EndInit(); + ResumeLayout(false); + PerformLayout(); } @@ -238,5 +256,6 @@ private MaterialSkin.Controls.MaterialRaisedButton btnMoveLine; private MaterialSkin.Controls.MaterialRaisedButton btnMoveVertices; private System.Windows.Forms.Label label2; + private MaterialSkin.Controls.MaterialRaisedButton btnRelearnPositions; } } \ No newline at end of file diff --git a/Plugins/CandyboxPlugin/Forms/MapEditor.cs b/Plugins/CandyboxPlugin/Forms/MapEditor.cs index 9fcd076..65667f0 100644 --- a/Plugins/CandyboxPlugin/Forms/MapEditor.cs +++ b/Plugins/CandyboxPlugin/Forms/MapEditor.cs @@ -30,29 +30,29 @@ namespace Lindt.Candybox.Demo _recipe.ProcessImage(original); Mat matContours2; - if (_recipe.LearnedParameters.CandyParameters.Count==0) + if (_recipe.LearnedParameters.CandyParameters.Count == 0) { Mat matContours = new Mat(new OpenCvSharp.Size(512, 512), MatType.CV_8UC3, Scalar.Black); Cv2.DrawContours(matContours, _recipe.LastContours, -1, Scalar.White, -1); - + matContours2 = matContours.Resize(new OpenCvSharp.Size(1800, 1408)); } else { - + Mat matContours = new Mat(new OpenCvSharp.Size(512, 512), MatType.CV_8UC3, Scalar.Black); Cv2.DrawContours(matContours, _recipe.LastContours, -1, Scalar.White, -1); - + matContours2 = matContours.Resize(new OpenCvSharp.Size(1800, 1408)); } udMemoryBuffer.Value = _recipe.LearnedParameters.Configuration.MemoryBuffer; - + maskControl1.Mask = matContours2.ToBitmap(); maskControl1.Original = original.Clone().ToBitmap(); - maskControl1.VectorLines = _recipe.LearnedParameters.Cuts.Select(x=>x.Scale(1800f/512f, 1408f/512f)).ToList(); + maskControl1.VectorLines = _recipe.LearnedParameters.Cuts.Select(x => x.Translate(_recipe.BlisterCenter).Scale(1800f / 512f, 1408f / 512f)).ToList(); // Set default mode to Brush SetMode(EditMode.Brush); } @@ -62,11 +62,11 @@ namespace Lindt.Candybox.Demo maskControl1.CurrentMode = mode; // Reset button colors - btnBrush.Primary = mode==EditMode.Brush; - btnDrawLine.Primary = mode==EditMode.DrawLine; - btnRemoveLine.Primary = mode==EditMode.RemoveLine; - btnMoveLine.Primary = mode==EditMode.MoveLine; - btnMoveVertices.Primary = mode==EditMode.MoveVertices; + btnBrush.Primary = mode == EditMode.Brush; + btnDrawLine.Primary = mode == EditMode.DrawLine; + btnRemoveLine.Primary = mode == EditMode.RemoveLine; + btnMoveLine.Primary = mode == EditMode.MoveLine; + btnMoveVertices.Primary = mode == EditMode.MoveVertices; btnBrush.Invalidate(); btnDrawLine.Invalidate(); btnRemoveLine.Invalidate(); @@ -106,18 +106,32 @@ namespace Lindt.Candybox.Demo List contours = new List(); foreach (Point[] contour in maskControl1.LastContours) { - contours.Add(contour.Select(x => new Point(x.X/1800f*512f, x.Y / 1408f * 512f)).ToArray()); + contours.Add(contour.Select(x => new Point(x.X / 1800f * 512f, x.Y / 1408f * 512f)).ToArray()); } _recipe.LearnedParameters.Configuration.MemoryBuffer = (int)udMemoryBuffer.Value; - _recipe.LearnContours(contours.ToArray(), _original,maskControl1.VectorLines.Select(x=>x.Scale(512f/1800f, 512f/1408f)).ToList()); + _recipe.LearnContours(contours.ToArray(), _original, maskControl1.VectorLines.Select(x => x.Scale(512f / 1800f, 512f / 1408f).Sub(_recipe.BlisterCenter)).ToList(), relearn: false); DialogResult = DialogResult.OK; } + private void btnRelearnPositions_Click(object sender, EventArgs e) + { + List contours = new List(); + foreach (Point[] contour in maskControl1.LastContours) + { + contours.Add(contour.Select(x => new Point(x.X / 1800f * 512f, x.Y / 1408f * 512f)).ToArray()); + } + _recipe.LearnedParameters.Configuration.MemoryBuffer = (int)udMemoryBuffer.Value; + _recipe.LearnContours(contours.ToArray(), _original, maskControl1.VectorLines.Select(x => x.Scale(512f / 1800f, 512f / 1408f).Sub(_recipe.BlisterCenter)).ToList(),relearn:true); + + DialogResult = DialogResult.OK; + } private void materialRaisedButton1_Click(object sender, EventArgs e) { DialogResult = DialogResult.Cancel; } + + } } diff --git a/Plugins/CandyboxPlugin/Forms/MapEditor.resx b/Plugins/CandyboxPlugin/Forms/MapEditor.resx index df23d06..8b2ff64 100644 --- a/Plugins/CandyboxPlugin/Forms/MapEditor.resx +++ b/Plugins/CandyboxPlugin/Forms/MapEditor.resx @@ -1,4 +1,64 @@ - + + + @@ -57,345 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - iVBORw0KGgoAAAANSUhEUgAABwgAAAWACAYAAABN7xIaAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wQAADsEBuJFr7QAAJoVJREFUeF7swQEBAAAAgJD+r+4IAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABuD44JAAAAEAatf2pj+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADATQ2+hgAB2UBGuQAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAABwgAAAWACAYAAABN7xIaAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wQAADsEBuJFr7QAAJoVJREFUeF7swQEBAAAAgJD+r+4IAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABuD44JAAAAEAatf2pj+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADATQ2+hgAB2UBGuQAAAABJRU5ErkJggg== - - \ No newline at end of file diff --git a/Plugins/CandyboxPlugin/Forms/MaskControl.cs b/Plugins/CandyboxPlugin/Forms/MaskControl.cs index 074f48f..71ddc2b 100644 --- a/Plugins/CandyboxPlugin/Forms/MaskControl.cs +++ b/Plugins/CandyboxPlugin/Forms/MaskControl.cs @@ -15,95 +15,6 @@ using Point = System.Drawing.Point; namespace Lindt.Candybox.Demo { - public enum EditMode - { - Brush, - DrawLine, - RemoveLine, - MoveLine, - MoveVertices - } - - public class VectorLine - { - public Point StartPoint { get; set; } - public Point EndPoint { get; set; } - public bool Selected { get; set; } - - public VectorLine() - { - } - - public VectorLine Scale(float sX, float sY) - { - return new VectorLine(new Point((int)(StartPoint.X * sX), (int)(StartPoint.Y * sY)), - new Point((int)(EndPoint.X * sX), (int)(EndPoint.Y * sY))); - } - - public VectorLine(Point start, Point end) - { - StartPoint = start; - EndPoint = end; - Selected = false; - } - - public bool IsPointOnLine(Point point, int tolerance = 10) - { - // Calculate distance from point to line segment - double A = point.X - StartPoint.X; - double B = point.Y - StartPoint.Y; - double C = EndPoint.X - StartPoint.X; - double D = EndPoint.Y - StartPoint.Y; - - double dot = A * C + B * D; - double lenSq = C * C + D * D; - - if (lenSq == 0) return Math.Sqrt(A * A + B * B) <= tolerance; - - double param = dot / lenSq; - - double xx, yy; - if (param < 0) - { - xx = StartPoint.X; - yy = StartPoint.Y; - } - else if (param > 1) - { - xx = EndPoint.X; - yy = EndPoint.Y; - } - else - { - xx = StartPoint.X + param * C; - yy = StartPoint.Y + param * D; - } - - double dx = point.X - xx; - double dy = point.Y - yy; - return Math.Sqrt(dx * dx + dy * dy) <= tolerance; - } - - public bool IsPointNearVertex(Point point, out bool isStartVertex, int tolerance = 15) - { - isStartVertex = false; - double distToStart = Math.Sqrt(Math.Pow(point.X - StartPoint.X, 2) + Math.Pow(point.Y - StartPoint.Y, 2)); - double distToEnd = Math.Sqrt(Math.Pow(point.X - EndPoint.X, 2) + Math.Pow(point.Y - EndPoint.Y, 2)); - - if (distToStart <= tolerance) - { - isStartVertex = true; - return true; - } - if (distToEnd <= tolerance) - { - isStartVertex = false; - return true; - } - return false; - } - } - public partial class MaskControl : UserControl { private Bitmap _backBuffer; @@ -282,12 +193,21 @@ namespace Lindt.Candybox.Demo private Pen _vectorLinePen = new Pen(Color.DeepPink, 12); private Brush _vertexBrush = new SolidBrush(Color.Orange); + protected override void OnPaint(PaintEventArgs e) { + + + + OnPaintInternal(e); + } + + void OnPaintInternal(PaintEventArgs e) + { var mat = Mask.ToMat().CvtColor(ColorConversionCodes.BGR2GRAY); var contours = mat.FindContoursAsArray(RetrievalModes.External, ContourApproximationModes.ApproxNone); LastContours = contours; - + using (Graphics g = Graphics.FromImage(_backBuffer)) { g.Clear(Color.Transparent); @@ -307,11 +227,11 @@ namespace Lindt.Candybox.Demo foreach (var line in _vectorLines) { // Convert coordinates back to display coordinates - var startDisplay = new Point(line.StartPoint.X , line.StartPoint.Y ); - var endDisplay = new Point(line.EndPoint.X , line.EndPoint.Y ); - + var startDisplay = new Point(line.StartPoint.X, line.StartPoint.Y); + var endDisplay = new Point(line.EndPoint.X, line.EndPoint.Y); + g.DrawLine(_vectorLinePen, startDisplay, endDisplay); - + // Draw vertices when in move vertices mode if (_currentMode == EditMode.MoveVertices) { @@ -323,8 +243,8 @@ namespace Lindt.Candybox.Demo // Draw temporary line when drawing if (_currentMode == EditMode.DrawLine && _isDrawingLine) { - var startDisplay = new Point(_lineStartPoint.X , _lineStartPoint.Y ); - var endDisplay = new Point(_lastMouse.X , _lastMouse.Y ); + var startDisplay = new Point(_lineStartPoint.X, _lineStartPoint.Y); + var endDisplay = new Point(_lastMouse.X, _lastMouse.Y); using (var tempPen = new Pen(Color.DeepPink, 12) { DashStyle = System.Drawing.Drawing2D.DashStyle.Dash }) { g.DrawLine(tempPen, startDisplay, endDisplay); @@ -334,11 +254,11 @@ namespace Lindt.Candybox.Demo // Draw mouse cursor indicator for brush mode if (_currentMode == EditMode.Brush) { - var cursorDisplay = new Point(_lastMouse.X , _lastMouse.Y ); + var cursorDisplay = new Point(_lastMouse.X, _lastMouse.Y); g.DrawEllipse(Pens.Gray, cursorDisplay.X - 15, cursorDisplay.Y - 15, 30, 30); } } - + e.Graphics.DrawImage(_backBuffer, 0, 0, Width, Height); } @@ -355,4 +275,115 @@ namespace Lindt.Candybox.Demo base.OnResize(e); } } + public enum EditMode + { + Brush, + DrawLine, + RemoveLine, + MoveLine, + MoveVertices + } + + public class VectorLine + { + public Point StartPoint { get; set; } + public Point EndPoint { get; set; } + public bool Selected { get; set; } + + public VectorLine() + { + } + + public VectorLine Scale(float sX, float sY) + { + return new VectorLine(new Point((int)(StartPoint.X * sX), (int)(StartPoint.Y * sY)), + new Point((int)(EndPoint.X * sX), (int)(EndPoint.Y * sY))); + } + + public VectorLine Translate(int tX, int tY) + { + return new VectorLine(new Point(StartPoint.X + tX, StartPoint.Y + tY), + new Point(EndPoint.X + tX, EndPoint.Y + tY)); + } + + public VectorLine Translate(Point point) + { + return Translate(point.X, point.Y); + } + + public VectorLine Sub(int tX, int tY) + { + return new VectorLine(new Point(StartPoint.X - tX, StartPoint.Y - tY), + new Point(EndPoint.X - tX, EndPoint.Y - tY)); + } + + public VectorLine Sub(Point point) + { + return Sub(point.X, point.Y); + } + + + public VectorLine(Point start, Point end) + { + StartPoint = start; + EndPoint = end; + Selected = false; + } + + public bool IsPointOnLine(Point point, int tolerance = 10) + { + // Calculate distance from point to line segment + double A = point.X - StartPoint.X; + double B = point.Y - StartPoint.Y; + double C = EndPoint.X - StartPoint.X; + double D = EndPoint.Y - StartPoint.Y; + + double dot = A * C + B * D; + double lenSq = C * C + D * D; + + if (lenSq == 0) return Math.Sqrt(A * A + B * B) <= tolerance; + + double param = dot / lenSq; + + double xx, yy; + if (param < 0) + { + xx = StartPoint.X; + yy = StartPoint.Y; + } + else if (param > 1) + { + xx = EndPoint.X; + yy = EndPoint.Y; + } + else + { + xx = StartPoint.X + param * C; + yy = StartPoint.Y + param * D; + } + + double dx = point.X - xx; + double dy = point.Y - yy; + return Math.Sqrt(dx * dx + dy * dy) <= tolerance; + } + + public bool IsPointNearVertex(Point point, out bool isStartVertex, int tolerance = 15) + { + isStartVertex = false; + double distToStart = Math.Sqrt(Math.Pow(point.X - StartPoint.X, 2) + Math.Pow(point.Y - StartPoint.Y, 2)); + double distToEnd = Math.Sqrt(Math.Pow(point.X - EndPoint.X, 2) + Math.Pow(point.Y - EndPoint.Y, 2)); + + if (distToStart <= tolerance) + { + isStartVertex = true; + return true; + } + if (distToEnd <= tolerance) + { + isStartVertex = false; + return true; + } + return false; + } + } } diff --git a/Plugins/CandyboxPlugin/Modules/CandyboxImageProcessingControl.cs b/Plugins/CandyboxPlugin/Modules/CandyboxImageProcessingControl.cs index efdda64..9376b66 100644 --- a/Plugins/CandyboxPlugin/Modules/CandyboxImageProcessingControl.cs +++ b/Plugins/CandyboxPlugin/Modules/CandyboxImageProcessingControl.cs @@ -10,11 +10,13 @@ namespace CandyboxPlugin.Module; public class CandyboxImageProcessingControl : BaseRecognitionControl { + private readonly CandyboxRecognitionControlSettings _settings; private readonly IImageSource _imageSource; private HistoRecipe _histoRecipe; public CandyboxImageProcessingControl(CandyboxRecognitionControlSettings settings, IImageSource imageSource, ILoadingService loadingService) : base(settings, loadingService) { + _settings = settings; _imageSource = imageSource; } @@ -24,7 +26,7 @@ public class CandyboxImageProcessingControl : BaseRecognitionControl public override List GetRecipesData() { var recipes = new List(); - var recipeFiles = Directory.GetFiles(RECIPES_DIR, "*.json"); + var recipeFiles = Directory.GetFiles(RECIPES_DIR, _settings.RecipeNameFilter+".json"); foreach (var file in recipeFiles) { var name = Path.GetFileNameWithoutExtension(file); @@ -99,6 +101,11 @@ public class CandyboxImageProcessingControl : BaseRecognitionControl res.ErrorReason.Where(x=>x != EErrorReason.Good).Select(x=>x.ToString()) ).ToArray(); + if (_settings.AlwaysError) + { + allErrors = allErrors.Concat(new[] { "Always Error" }).ToArray(); + } + return (image, res.ProcessedImage, swTotal.Elapsed, swAcquision.Elapsed, allErrors); } diff --git a/Plugins/CandyboxPlugin/Modules/CandyboxRecognitionControlSettings.cs b/Plugins/CandyboxPlugin/Modules/CandyboxRecognitionControlSettings.cs index 7ed4c9e..5ad029e 100644 --- a/Plugins/CandyboxPlugin/Modules/CandyboxRecognitionControlSettings.cs +++ b/Plugins/CandyboxPlugin/Modules/CandyboxRecognitionControlSettings.cs @@ -1,10 +1,23 @@ -using VisionBuilder.UI.Common.Processing; +using Inspectron.Settings; +using Inspectron.Settings.Attributes; +using VisionBuilder.UI.Common.Processing; namespace CandyboxPlugin.Module; public class CandyboxRecognitionControlSettings : BaseRecognitionControlSettings { + + [SettingDescription("Usefull to learn on good images")] + public bool AlwaysError { get; set; } + public CandyboxRecognitionControlSettings(string cameraName) : base(cameraName) { } + + public override void RegisterSettings(InspectronSettings settings) + { + base.RegisterSettings(settings); + settings.RegisterSimple(this, () => AlwaysError, CameraName + "/" + "Recognition", nameof(AlwaysError)); + + } } \ No newline at end of file diff --git a/Plugins/CandyboxPlugin/Recipe/HistoRecipe.cs b/Plugins/CandyboxPlugin/Recipe/HistoRecipe.cs index 10b3271..0d007a5 100644 --- a/Plugins/CandyboxPlugin/Recipe/HistoRecipe.cs +++ b/Plugins/CandyboxPlugin/Recipe/HistoRecipe.cs @@ -54,12 +54,17 @@ namespace CandyboxPlugin.Recipe } } - public void LearnContours(OpenCvSharp.Point[][] contours, Mat image, List cuts) + public void LearnContours(OpenCvSharp.Point[][] contours, Mat image, List cuts, bool relearn) { lock (_lockObject) { - + _learnedParameters = relearn ? new LearningParameters() : _learnedParameters; + + // Convert cuts to be relative to blister center + + _learnedParameters.Cuts = cuts; + if (_learnedParameters.CandyParameters.Count == 0)//initial learning { _learnedParameters.BlisterAngle = _blisterAngle; @@ -131,6 +136,8 @@ namespace CandyboxPlugin.Recipe return clone; } + public Point BlisterCenter => _blisterCenter; + public ProcessingResult ProcessImage(Mat image) { lock (_lockObject) @@ -166,7 +173,7 @@ namespace CandyboxPlugin.Recipe resBlister.Dispose(); resBlister = blisterOpened; - Cv2.WaitKey(1); + sw1.Stop(); Console.WriteLine("AI Time:" + sw1.ElapsedMilliseconds); @@ -207,44 +214,6 @@ namespace CandyboxPlugin.Recipe )) .ToList()); - //var dbg=triangles.Where(x => x.IsInside(points[15])).ToList(); - //var dbgEdges = Voronoi.Voronoi.GenerateEdgesFromDelaunay(dbg); - //foreach (var triangle in dbg) - //{ - // Cv2.Line( - // numbersOverlay, - // new OpenCvSharp.Point(triangle.Vertices[0].X, triangle.Vertices[0].Y), - // new OpenCvSharp.Point(triangle.Vertices[1].X, triangle.Vertices[1].Y), - // new Scalar(255, 255, 0, 255), // Aqua color in BGR - // 1 // Thickness - // ); - // Cv2.Line( - // numbersOverlay, - // new OpenCvSharp.Point(triangle.Vertices[1].X, triangle.Vertices[1].Y), - // new OpenCvSharp.Point(triangle.Vertices[2].X, triangle.Vertices[2].Y), - // new Scalar(255, 255, 0, 255), // Aqua color in BGR - // 1 // Thickness - // ); - // Cv2.Line( - // numbersOverlay, - // new OpenCvSharp.Point(triangle.Vertices[2].X, triangle.Vertices[2].Y), - // new OpenCvSharp.Point(triangle.Vertices[0].X, triangle.Vertices[0].Y), - // new Scalar(255, 255, 0, 255), // Aqua color in BGR - // 1 // Thickness - // ); - //} - - //foreach (Edge edge in dbgEdges) - //{ - // Cv2.Line( - // numbersOverlay, - // new OpenCvSharp.Point(edge.Point1.X, edge.Point1.Y), - // new OpenCvSharp.Point(edge.Point2.X, edge.Point2.Y), - // new Scalar(255, 255, 255, 255), - // 3 // Thickness - // ); - //} - var edges = Voronoi.Voronoi.GenerateEdgesFromDelaunay(triangles); foreach (Edge edge in edges) @@ -258,31 +227,22 @@ namespace CandyboxPlugin.Recipe ); } - - //foreach (Edge edge in edges) - //{ - // Cv2.Line( - // numbersOverlay, - // new OpenCvSharp.Point(edge.Point1.X, edge.Point1.Y), - // new OpenCvSharp.Point(edge.Point2.X, edge.Point2.Y), - // new Scalar(255, 255, 255, 255), - // 3 // Thickness - // ); - //} } foreach (VectorLine cut in _learnedParameters.Cuts) { - Cv2.Line(res, new OpenCvSharp.Point(cut.StartPoint.X, cut.StartPoint.Y), - new OpenCvSharp.Point(cut.EndPoint.X, cut.EndPoint.Y), new Scalar(0, 0, 0), 3); - + // Convert from relative to absolute coordinates + var absoluteStart = new OpenCvSharp.Point( + cut.StartPoint.X + _blisterCenter.X, + cut.StartPoint.Y + _blisterCenter.Y + ); + var absoluteEnd = new OpenCvSharp.Point( + cut.EndPoint.X + _blisterCenter.X, + cut.EndPoint.Y + _blisterCenter.Y + ); + + Cv2.Line(res, absoluteStart, absoluteEnd, new Scalar(0, 0, 0), 3); } - //foreach (VectorLine cut in _learnedParameters.Cuts) - //{ - // Cv2.Line(numbersOverlay, new OpenCvSharp.Point(cut.StartPoint.X, cut.StartPoint.Y), - // new OpenCvSharp.Point(cut.EndPoint.X, cut.EndPoint.Y), new Scalar(255, 0, 255,255), 3); - - //} var mat = res; Cv2.Threshold(mat, mat, 128, 255, ThresholdTypes.Binary); diff --git a/VisionBuilder.UI.Common/CommandLineParser.cs b/VisionBuilder.UI.Common/CommandLineParser.cs new file mode 100644 index 0000000..f708b17 --- /dev/null +++ b/VisionBuilder.UI.Common/CommandLineParser.cs @@ -0,0 +1,35 @@ +namespace VisionBuilder.UI.Common; + +public class CommandLineParser +{ + private readonly List _args; + + public CommandLineParser(string[] args) + { + _args = args.ToList(); + } + + public string? GetStringArgument(string key, char shortKey) + { + var index = _args.IndexOf("--" + key); + + if (index >= 0 && _args.Count > index) + { + return _args[index + 1]; + } + + index = _args.IndexOf("-" + shortKey); + + if (index >= 0 && _args.Count > index) + { + return _args[index + 1]; + } + + return null; + } + + public bool GetSwitchArgument(bool value, char shortKey) + { + return _args.Contains("--" + value) || _args.Contains("-" + shortKey); + } +} \ No newline at end of file diff --git a/VisionBuilder.UI.Common/Extensions.cs b/VisionBuilder.UI.Common/Extensions.cs index 33c770e..a2eca19 100644 --- a/VisionBuilder.UI.Common/Extensions.cs +++ b/VisionBuilder.UI.Common/Extensions.cs @@ -64,10 +64,10 @@ public static class Extensions } } - public static IKernel UsePlugins(this IKernel self) + public static IKernel UsePlugins(this IKernel self, string pluginsProfile) { self.RegisterModule(); - self.Get().InitializeModule(); + self.Get().InitializeModule(pluginsProfile); return self; } diff --git a/VisionBuilder.UI.Common/Plugins/PluginLoader.cs b/VisionBuilder.UI.Common/Plugins/PluginLoader.cs index 1d51218..e778cff 100644 --- a/VisionBuilder.UI.Common/Plugins/PluginLoader.cs +++ b/VisionBuilder.UI.Common/Plugins/PluginLoader.cs @@ -16,6 +16,18 @@ public class PluginLoader:IVisionBuilderModule public List Plugins { get; } = new List(); private bool _isInitialized; + + + + private string _pluginsProfile = "enabled_plugins.txt"; + + public void InitializeModule(string? pluginsProfile) + { + if (pluginsProfile != null) + _pluginsProfile = pluginsProfile + ".txt"; + InitializeModule(); + } + public void InitializeModule() { if (_isInitialized) @@ -27,7 +39,7 @@ public class PluginLoader:IVisionBuilderModule Log.Information("Loading plugins..."); var pluginsPath = Path.Combine("..", "Data", PLUGINS_DIRECTORY); - var enabledPluginsPath = Path.Combine(pluginsPath, "enabled_plugins.txt"); + var enabledPluginsPath = Path.Combine(pluginsPath, _pluginsProfile); if (!File.Exists(enabledPluginsPath)) { Log.Warning("Enabled plugins file not found: {EnabledPluginsPath}. All discovered plugins will be disabled by default.", enabledPluginsPath); diff --git a/VisionBuilder.UI.Windows.Duo/Installer/uno.bat b/VisionBuilder.UI.Windows.Duo/Installer/uno.bat new file mode 100644 index 0000000..ce3ed57 --- /dev/null +++ b/VisionBuilder.UI.Windows.Duo/Installer/uno.bat @@ -0,0 +1,26 @@ +@echo off +setlocal + +rem --- resolve absolute path of DLL --- +set "dll=..\bin\Debug\net8.0-windows\VisionBuilder.UI.Windows.Duo.dll" +for %%I in ("%dll%") do set "dll=%%~fI" + +rem --- get version from DLL --- +for /f "tokens=2 delims==" %%v in ('wmic datafile where "name='%dll:\=\\%'" get Version /value ^| find "="') do set "ver=%%v" + +rem --- cut off last part (keep only major.minor.build) --- +for /f "tokens=1-3 delims=." %%a in ("%ver%") do set "ver=%%a.%%b.%%c" + +echo Found version: %ver% + +rem --- make sure output dir exists --- +if not exist Output mkdir Output + +rem --- build 7z-SFX --- +set "src=..\bin\Debug\net8.0-windows" +set "out=Output\UNO%ver%.exe" + +7z a -sfx "%out%" "%src%\*" + +echo Done: %out% +endlocal \ No newline at end of file diff --git a/VisionBuilder.UI.Windows.Duo/VisionBuilder.UI.Windows.Duo.csproj b/VisionBuilder.UI.Windows.Duo/VisionBuilder.UI.Windows.Duo.csproj index 103ace6..8763142 100644 --- a/VisionBuilder.UI.Windows.Duo/VisionBuilder.UI.Windows.Duo.csproj +++ b/VisionBuilder.UI.Windows.Duo/VisionBuilder.UI.Windows.Duo.csproj @@ -8,7 +8,7 @@ enable Inspectron icon-512.ico false - 2.0.8 + 2.0.9 @@ -39,5 +39,8 @@ + + + diff --git a/VisionBuilder.UI.Windows.Test/Program.cs b/VisionBuilder.UI.Windows.Test/Program.cs index 9d7d888..ef6591e 100644 --- a/VisionBuilder.UI.Windows.Test/Program.cs +++ b/VisionBuilder.UI.Windows.Test/Program.cs @@ -31,19 +31,23 @@ namespace VisionBuilder.UI.Windows.Test /// The main entry point for the application. /// [STAThread] - static void Main() + static void Main(string[] args) { // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); // In your application startup code MaterialSkin.MaterialSkinManager.ConfigureForInspectron(); + CommandLineParser commandLineParser = new CommandLineParser(args); + InspectronSettings settings = new InspectronSettings("..\\Data\\Config"); var mainKernel = Common.VisionBuilder.CreateMainKernel(settings); - mainKernel.UsePlugins(); + var profile = commandLineParser.GetStringArgument("profile", 'p'); + + mainKernel.UsePlugins(profile); mainKernel diff --git a/VisionBuilder.UI.Windows.Test/Properties/launchSettings.json b/VisionBuilder.UI.Windows.Test/Properties/launchSettings.json new file mode 100644 index 0000000..d5c1609 --- /dev/null +++ b/VisionBuilder.UI.Windows.Test/Properties/launchSettings.json @@ -0,0 +1,11 @@ +{ + "profiles": { + "VisionBuilder.UI.Windows.Uno": { + "commandName": "Project" + }, + "Candybox": { + "commandName": "Project", + "commandLineArgs": "--profile candybox" + } + } +} \ No newline at end of file diff --git a/VisionBuilder.UI.Windows.Test/VisionBuilder.UI.Windows.Uno.csproj b/VisionBuilder.UI.Windows.Test/VisionBuilder.UI.Windows.Uno.csproj index 1b1a5ad..351eabf 100644 --- a/VisionBuilder.UI.Windows.Test/VisionBuilder.UI.Windows.Uno.csproj +++ b/VisionBuilder.UI.Windows.Test/VisionBuilder.UI.Windows.Uno.csproj @@ -8,7 +8,7 @@ enable Inspectron icon-512.ico false - 2.0.8 + 2.0.9