This commit is contained in:
meelstorm
2025-10-15 13:13:47 +02:00
parent 97ac18eac6
commit dec036dbcf
16 changed files with 534 additions and 678 deletions

View File

@@ -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;

View File

@@ -1,4 +1,6 @@
namespace Lindt.Candybox.Demo
using System.Resources;
namespace Lindt.Candybox.Demo
{
partial class MapEditor
{
@@ -28,200 +30,216 @@
/// </summary>
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;
}
}

View File

@@ -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<Point[]> contours = new List<Point[]>();
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<Point[]> contours = new List<Point[]>();
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;
}
}
}

View File

@@ -1,4 +1,64 @@
<root>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
@@ -57,345 +117,4 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="maskControl1.Mask" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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==
</value>
</data>
<data name="maskControl1.Original" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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==
</value>
</data>
</root>

View File

@@ -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;
}
}
}

View File

@@ -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<RecipeData> GetRecipesData()
{
var recipes = new List<RecipeData>();
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);
}

View File

@@ -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));
}
}

View File

@@ -54,12 +54,17 @@ namespace CandyboxPlugin.Recipe
}
}
public void LearnContours(OpenCvSharp.Point[][] contours, Mat image, List<VectorLine> cuts)
public void LearnContours(OpenCvSharp.Point[][] contours, Mat image, List<VectorLine> 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);

View File

@@ -0,0 +1,35 @@
namespace VisionBuilder.UI.Common;
public class CommandLineParser
{
private readonly List<string> _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);
}
}

View File

@@ -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<PluginLoader>();
self.Get<PluginLoader>().InitializeModule();
self.Get<PluginLoader>().InitializeModule(pluginsProfile);
return self;
}

View File

@@ -16,6 +16,18 @@ public class PluginLoader:IVisionBuilderModule
public List<IPlugin> Plugins { get; } = new List<IPlugin>();
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);

View File

@@ -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

View File

@@ -8,7 +8,7 @@
<Nullable>enable</Nullable>
<ApplicationIcon>Inspectron icon-512.ico</ApplicationIcon>
<Deterministic>false</Deterministic>
<Version>2.0.8</Version>
<Version>2.0.9</Version>
</PropertyGroup>
<ItemGroup>
@@ -39,5 +39,8 @@
<ItemGroup>
<Folder Include="Installer\" />
</ItemGroup>
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Exec Command=" echo &quot;$(ProjectDir)Output\DUO$(Version).exe&quot;&#xD;&#xA;if exist &quot;$(ProjectDir)\Installer\Output\DUO$(Version).exe&quot; (&#xD;&#xA; echo ERROR: Output\DUO$(Version).exe already exists.&#xD;&#xA; exit /b 1&#xD;&#xA;)" />
</Target>
</Project>

View File

@@ -31,19 +31,23 @@ namespace VisionBuilder.UI.Windows.Test
/// The main entry point for the application.
/// </summary>
[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

View File

@@ -0,0 +1,11 @@
{
"profiles": {
"VisionBuilder.UI.Windows.Uno": {
"commandName": "Project"
},
"Candybox": {
"commandName": "Project",
"commandLineArgs": "--profile candybox"
}
}
}

View File

@@ -8,7 +8,7 @@
<ImplicitUsings>enable</ImplicitUsings>
<ApplicationIcon>Inspectron icon-512.ico</ApplicationIcon>
<Deterministic>false</Deterministic>
<Version>2.0.8</Version>
<Version>2.0.9</Version>
</PropertyGroup>