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" }; private FilePath _modelFilePath = new FilePath(){ Format = "Onnx format(*.onnx)|*.onnx" };
public int IgnoreType { get; set; } = -1;
public FilePath ModelFilePath public FilePath ModelFilePath
{ {
get => _modelFilePath; get => _modelFilePath;
@@ -101,9 +103,9 @@ public class YoloDetectionOperation:BaseOperation
continue; continue;
} }
if (box.Class.Id + 1 == 10) if (box.Class.Id + 1 == IgnoreType)
{ {
continue;
} }
classes[box.Class.Id + 1] = box.Class.Name; classes[box.Class.Id + 1] = box.Class.Name;
var rect = box.Bounds; var rect = box.Bounds;

View File

@@ -1,4 +1,6 @@
namespace Lindt.Candybox.Demo using System.Resources;
namespace Lindt.Candybox.Demo
{ {
partial class MapEditor partial class MapEditor
{ {
@@ -28,200 +30,216 @@
/// </summary> /// </summary>
private void InitializeComponent() 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.maskControl1 = new Lindt.Candybox.Demo.MaskControl();
this.materialRaisedButton1 = new MaterialSkin.Controls.MaterialRaisedButton(); label1 = new Label();
this.materialRaisedButton3 = new MaterialSkin.Controls.MaterialRaisedButton(); udMemoryBuffer = new NumericUpDown();
this.label1 = new System.Windows.Forms.Label(); btnBrush = new MaterialSkin.Controls.MaterialRaisedButton();
this.udMemoryBuffer = new System.Windows.Forms.NumericUpDown(); btnDrawLine = new MaterialSkin.Controls.MaterialRaisedButton();
this.btnBrush = new MaterialSkin.Controls.MaterialRaisedButton(); btnRemoveLine = new MaterialSkin.Controls.MaterialRaisedButton();
this.btnDrawLine = new MaterialSkin.Controls.MaterialRaisedButton(); btnMoveLine = new MaterialSkin.Controls.MaterialRaisedButton();
this.btnRemoveLine = new MaterialSkin.Controls.MaterialRaisedButton(); btnMoveVertices = new MaterialSkin.Controls.MaterialRaisedButton();
this.btnMoveLine = new MaterialSkin.Controls.MaterialRaisedButton(); label2 = new Label();
this.btnMoveVertices = new MaterialSkin.Controls.MaterialRaisedButton(); btnRelearnPositions = new MaterialSkin.Controls.MaterialRaisedButton();
this.label2 = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)udMemoryBuffer).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.udMemoryBuffer)).BeginInit(); SuspendLayout();
this.SuspendLayout();
// //
// maskControl1 // maskControl1
// //
this.maskControl1.Location = new System.Drawing.Point(8, 32); 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.Name = "maskControl1";
this.maskControl1.Original = ((System.Drawing.Bitmap)(resources.GetObject("maskControl1.Original")));
this.maskControl1.Size = new System.Drawing.Size(900, 704); this.maskControl1.Size = new System.Drawing.Size(900, 704);
this.maskControl1.TabIndex = 0; this.maskControl1.TabIndex = 0;
// //
// materialRaisedButton1 // materialRaisedButton1
// //
this.materialRaisedButton1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; materialRaisedButton1.AutoSizeMode = AutoSizeMode.GrowAndShrink;
this.materialRaisedButton1.Cursor = System.Windows.Forms.Cursors.Hand; materialRaisedButton1.Cursor = Cursors.Hand;
this.materialRaisedButton1.Depth = 0; materialRaisedButton1.Depth = 0;
this.materialRaisedButton1.DrawBorder = true; materialRaisedButton1.DrawBorder = true;
this.materialRaisedButton1.Icon = null; materialRaisedButton1.Icon = null;
this.materialRaisedButton1.Location = new System.Drawing.Point(928, 424); materialRaisedButton1.Location = new Point(928, 496);
this.materialRaisedButton1.MouseState = MaterialSkin.MouseState.HOVER; materialRaisedButton1.MouseState = MaterialSkin.MouseState.HOVER;
this.materialRaisedButton1.Name = "materialRaisedButton1"; materialRaisedButton1.Name = "materialRaisedButton1";
this.materialRaisedButton1.Primary = false; materialRaisedButton1.Primary = false;
this.materialRaisedButton1.Size = new System.Drawing.Size(128, 64); materialRaisedButton1.Size = new Size(128, 64);
this.materialRaisedButton1.TabIndex = 1; materialRaisedButton1.TabIndex = 1;
this.materialRaisedButton1.Text = "Cancel"; materialRaisedButton1.Text = "Cancel";
this.materialRaisedButton1.UseVisualStyleBackColor = true; materialRaisedButton1.UseVisualStyleBackColor = true;
this.materialRaisedButton1.Click += new System.EventHandler(this.materialRaisedButton1_Click); materialRaisedButton1.Click += materialRaisedButton1_Click;
// //
// materialRaisedButton3 // materialRaisedButton3
// //
this.materialRaisedButton3.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; materialRaisedButton3.AutoSizeMode = AutoSizeMode.GrowAndShrink;
this.materialRaisedButton3.Cursor = System.Windows.Forms.Cursors.Hand; materialRaisedButton3.Cursor = Cursors.Hand;
this.materialRaisedButton3.Depth = 0; materialRaisedButton3.Depth = 0;
this.materialRaisedButton3.DrawBorder = true; materialRaisedButton3.DrawBorder = true;
this.materialRaisedButton3.Icon = null; materialRaisedButton3.Icon = null;
this.materialRaisedButton3.Location = new System.Drawing.Point(928, 352); materialRaisedButton3.Location = new Point(928, 352);
this.materialRaisedButton3.MouseState = MaterialSkin.MouseState.HOVER; materialRaisedButton3.MouseState = MaterialSkin.MouseState.HOVER;
this.materialRaisedButton3.Name = "materialRaisedButton3"; materialRaisedButton3.Name = "materialRaisedButton3";
this.materialRaisedButton3.Primary = true; materialRaisedButton3.Primary = true;
this.materialRaisedButton3.Size = new System.Drawing.Size(128, 64); materialRaisedButton3.Size = new Size(128, 64);
this.materialRaisedButton3.TabIndex = 3; materialRaisedButton3.TabIndex = 3;
this.materialRaisedButton3.Text = "Learn"; materialRaisedButton3.Text = "Learn";
this.materialRaisedButton3.UseVisualStyleBackColor = true; materialRaisedButton3.UseVisualStyleBackColor = true;
this.materialRaisedButton3.Click += new System.EventHandler(this.materialRaisedButton3_Click); materialRaisedButton3.Click += materialRaisedButton3_Click;
// //
// label1 // label1
// //
this.label1.AutoSize = true; label1.AutoSize = true;
this.label1.BackColor = System.Drawing.Color.White; label1.BackColor = Color.White;
this.label1.Location = new System.Drawing.Point(928, 504); label1.Location = new Point(928, 576);
this.label1.Name = "label1"; label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(90, 15); label1.Size = new Size(90, 15);
this.label1.TabIndex = 4; label1.TabIndex = 4;
this.label1.Text = "Memory buffer:"; label1.Text = "Memory buffer:";
// //
// udMemoryBuffer // udMemoryBuffer
// //
this.udMemoryBuffer.Location = new System.Drawing.Point(928, 528); udMemoryBuffer.Location = new Point(928, 600);
this.udMemoryBuffer.Name = "udMemoryBuffer"; udMemoryBuffer.Name = "udMemoryBuffer";
this.udMemoryBuffer.Size = new System.Drawing.Size(120, 23); udMemoryBuffer.Size = new Size(120, 23);
this.udMemoryBuffer.TabIndex = 5; udMemoryBuffer.TabIndex = 5;
// //
// btnBrush // btnBrush
// //
this.btnBrush.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; btnBrush.AutoSizeMode = AutoSizeMode.GrowAndShrink;
this.btnBrush.Cursor = System.Windows.Forms.Cursors.Hand; btnBrush.Cursor = Cursors.Hand;
this.btnBrush.Depth = 0; btnBrush.Depth = 0;
this.btnBrush.DrawBorder = true; btnBrush.DrawBorder = true;
this.btnBrush.Icon = null; btnBrush.Icon = null;
this.btnBrush.Location = new System.Drawing.Point(928, 64); btnBrush.Location = new Point(928, 64);
this.btnBrush.MouseState = MaterialSkin.MouseState.HOVER; btnBrush.MouseState = MaterialSkin.MouseState.HOVER;
this.btnBrush.Name = "btnBrush"; btnBrush.Name = "btnBrush";
this.btnBrush.Primary = false; btnBrush.Primary = false;
this.btnBrush.Size = new System.Drawing.Size(128, 32); btnBrush.Size = new Size(128, 32);
this.btnBrush.TabIndex = 6; btnBrush.TabIndex = 6;
this.btnBrush.Text = "Brush"; btnBrush.Text = "Brush";
this.btnBrush.UseVisualStyleBackColor = true; btnBrush.UseVisualStyleBackColor = true;
this.btnBrush.Click += new System.EventHandler(this.btnBrush_Click); btnBrush.Click += btnBrush_Click;
// //
// btnDrawLine // btnDrawLine
// //
this.btnDrawLine.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; btnDrawLine.AutoSizeMode = AutoSizeMode.GrowAndShrink;
this.btnDrawLine.Cursor = System.Windows.Forms.Cursors.Hand; btnDrawLine.Cursor = Cursors.Hand;
this.btnDrawLine.Depth = 0; btnDrawLine.Depth = 0;
this.btnDrawLine.DrawBorder = true; btnDrawLine.DrawBorder = true;
this.btnDrawLine.Icon = null; btnDrawLine.Icon = null;
this.btnDrawLine.Location = new System.Drawing.Point(928, 104); btnDrawLine.Location = new Point(928, 104);
this.btnDrawLine.MouseState = MaterialSkin.MouseState.HOVER; btnDrawLine.MouseState = MaterialSkin.MouseState.HOVER;
this.btnDrawLine.Name = "btnDrawLine"; btnDrawLine.Name = "btnDrawLine";
this.btnDrawLine.Primary = false; btnDrawLine.Primary = false;
this.btnDrawLine.Size = new System.Drawing.Size(128, 32); btnDrawLine.Size = new Size(128, 32);
this.btnDrawLine.TabIndex = 7; btnDrawLine.TabIndex = 7;
this.btnDrawLine.Text = "Draw Line"; btnDrawLine.Text = "Draw Line";
this.btnDrawLine.UseVisualStyleBackColor = true; btnDrawLine.UseVisualStyleBackColor = true;
this.btnDrawLine.Click += new System.EventHandler(this.btnDrawLine_Click); btnDrawLine.Click += btnDrawLine_Click;
// //
// btnRemoveLine // btnRemoveLine
// //
this.btnRemoveLine.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; btnRemoveLine.AutoSizeMode = AutoSizeMode.GrowAndShrink;
this.btnRemoveLine.Cursor = System.Windows.Forms.Cursors.Hand; btnRemoveLine.Cursor = Cursors.Hand;
this.btnRemoveLine.Depth = 0; btnRemoveLine.Depth = 0;
this.btnRemoveLine.DrawBorder = true; btnRemoveLine.DrawBorder = true;
this.btnRemoveLine.Icon = null; btnRemoveLine.Icon = null;
this.btnRemoveLine.Location = new System.Drawing.Point(928, 144); btnRemoveLine.Location = new Point(928, 144);
this.btnRemoveLine.MouseState = MaterialSkin.MouseState.HOVER; btnRemoveLine.MouseState = MaterialSkin.MouseState.HOVER;
this.btnRemoveLine.Name = "btnRemoveLine"; btnRemoveLine.Name = "btnRemoveLine";
this.btnRemoveLine.Primary = false; btnRemoveLine.Primary = false;
this.btnRemoveLine.Size = new System.Drawing.Size(128, 32); btnRemoveLine.Size = new Size(128, 32);
this.btnRemoveLine.TabIndex = 8; btnRemoveLine.TabIndex = 8;
this.btnRemoveLine.Text = "Remove Line"; btnRemoveLine.Text = "Remove Line";
this.btnRemoveLine.UseVisualStyleBackColor = true; btnRemoveLine.UseVisualStyleBackColor = true;
this.btnRemoveLine.Click += new System.EventHandler(this.btnRemoveLine_Click); btnRemoveLine.Click += btnRemoveLine_Click;
// //
// btnMoveLine // btnMoveLine
// //
this.btnMoveLine.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; btnMoveLine.AutoSizeMode = AutoSizeMode.GrowAndShrink;
this.btnMoveLine.Cursor = System.Windows.Forms.Cursors.Hand; btnMoveLine.Cursor = Cursors.Hand;
this.btnMoveLine.Depth = 0; btnMoveLine.Depth = 0;
this.btnMoveLine.DrawBorder = true; btnMoveLine.DrawBorder = true;
this.btnMoveLine.Icon = null; btnMoveLine.Icon = null;
this.btnMoveLine.Location = new System.Drawing.Point(928, 184); btnMoveLine.Location = new Point(928, 184);
this.btnMoveLine.MouseState = MaterialSkin.MouseState.HOVER; btnMoveLine.MouseState = MaterialSkin.MouseState.HOVER;
this.btnMoveLine.Name = "btnMoveLine"; btnMoveLine.Name = "btnMoveLine";
this.btnMoveLine.Primary = false; btnMoveLine.Primary = false;
this.btnMoveLine.Size = new System.Drawing.Size(128, 32); btnMoveLine.Size = new Size(128, 32);
this.btnMoveLine.TabIndex = 9; btnMoveLine.TabIndex = 9;
this.btnMoveLine.Text = "Move Line"; btnMoveLine.Text = "Move Line";
this.btnMoveLine.UseVisualStyleBackColor = true; btnMoveLine.UseVisualStyleBackColor = true;
this.btnMoveLine.Click += new System.EventHandler(this.btnMoveLine_Click); btnMoveLine.Click += btnMoveLine_Click;
// //
// btnMoveVertices // btnMoveVertices
// //
this.btnMoveVertices.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; btnMoveVertices.AutoSizeMode = AutoSizeMode.GrowAndShrink;
this.btnMoveVertices.Cursor = System.Windows.Forms.Cursors.Hand; btnMoveVertices.Cursor = Cursors.Hand;
this.btnMoveVertices.Depth = 0; btnMoveVertices.Depth = 0;
this.btnMoveVertices.DrawBorder = true; btnMoveVertices.DrawBorder = true;
this.btnMoveVertices.Icon = null; btnMoveVertices.Icon = null;
this.btnMoveVertices.Location = new System.Drawing.Point(928, 224); btnMoveVertices.Location = new Point(928, 224);
this.btnMoveVertices.MouseState = MaterialSkin.MouseState.HOVER; btnMoveVertices.MouseState = MaterialSkin.MouseState.HOVER;
this.btnMoveVertices.Name = "btnMoveVertices"; btnMoveVertices.Name = "btnMoveVertices";
this.btnMoveVertices.Primary = false; btnMoveVertices.Primary = false;
this.btnMoveVertices.Size = new System.Drawing.Size(128, 32); btnMoveVertices.Size = new Size(128, 32);
this.btnMoveVertices.TabIndex = 10; btnMoveVertices.TabIndex = 10;
this.btnMoveVertices.Text = "Move Vertices"; btnMoveVertices.Text = "Move Vertices";
this.btnMoveVertices.UseVisualStyleBackColor = true; btnMoveVertices.UseVisualStyleBackColor = true;
this.btnMoveVertices.Click += new System.EventHandler(this.btnMoveVertices_Click); btnMoveVertices.Click += btnMoveVertices_Click;
// //
// label2 // label2
// //
this.label2.AutoSize = true; label2.AutoSize = true;
this.label2.BackColor = System.Drawing.Color.White; label2.BackColor = Color.White;
this.label2.Location = new System.Drawing.Point(928, 32); label2.Location = new Point(928, 32);
this.label2.Name = "label2"; label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(68, 15); label2.Size = new Size(69, 15);
this.label2.TabIndex = 11; label2.TabIndex = 11;
this.label2.Text = "Edit Modes:"; 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 // MapEditor
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); AutoScaleDimensions = new SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1066, 824); ClientSize = new Size(1059, 817);
this.Controls.Add(this.label2); Controls.Add(btnRelearnPositions);
this.Controls.Add(this.btnMoveVertices); Controls.Add(label2);
this.Controls.Add(this.btnMoveLine); Controls.Add(btnMoveVertices);
this.Controls.Add(this.btnRemoveLine); Controls.Add(btnMoveLine);
this.Controls.Add(this.btnDrawLine); Controls.Add(btnRemoveLine);
this.Controls.Add(this.btnBrush); Controls.Add(btnDrawLine);
this.Controls.Add(this.udMemoryBuffer); Controls.Add(btnBrush);
this.Controls.Add(this.label1); Controls.Add(udMemoryBuffer);
this.Controls.Add(this.materialRaisedButton3); Controls.Add(label1);
this.Controls.Add(this.materialRaisedButton1); Controls.Add(materialRaisedButton3);
Controls.Add(materialRaisedButton1);
this.Controls.Add(this.maskControl1); this.Controls.Add(this.maskControl1);
this.MaximizeBox = false; MaximizeBox = false;
this.MinimizeBox = false; MinimizeBox = false;
this.Name = "MapEditor"; Name = "MapEditor";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; StartPosition = FormStartPosition.CenterScreen;
this.Text = "MapEditor"; Text = "MapEditor";
((System.ComponentModel.ISupportInitialize)(this.udMemoryBuffer)).EndInit(); ((System.ComponentModel.ISupportInitialize)udMemoryBuffer).EndInit();
this.ResumeLayout(false); ResumeLayout(false);
this.PerformLayout(); PerformLayout();
} }
@@ -238,5 +256,6 @@
private MaterialSkin.Controls.MaterialRaisedButton btnMoveLine; private MaterialSkin.Controls.MaterialRaisedButton btnMoveLine;
private MaterialSkin.Controls.MaterialRaisedButton btnMoveVertices; private MaterialSkin.Controls.MaterialRaisedButton btnMoveVertices;
private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label2;
private MaterialSkin.Controls.MaterialRaisedButton btnRelearnPositions;
} }
} }

View File

@@ -52,7 +52,7 @@ namespace Lindt.Candybox.Demo
maskControl1.Mask = matContours2.ToBitmap(); maskControl1.Mask = matContours2.ToBitmap();
maskControl1.Original = original.Clone().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 // Set default mode to Brush
SetMode(EditMode.Brush); SetMode(EditMode.Brush);
} }
@@ -110,14 +110,28 @@ namespace Lindt.Candybox.Demo
} }
_recipe.LearnedParameters.Configuration.MemoryBuffer = (int)udMemoryBuffer.Value; _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; 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) private void materialRaisedButton1_Click(object sender, EventArgs e)
{ {
DialogResult = DialogResult.Cancel; 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: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:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true"> <xsd:element name="root" msdata:IsDataSet="true">
@@ -57,345 +117,4 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </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> </root>

View File

@@ -15,95 +15,6 @@ using Point = System.Drawing.Point;
namespace Lindt.Candybox.Demo 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 public partial class MaskControl : UserControl
{ {
private Bitmap _backBuffer; private Bitmap _backBuffer;
@@ -282,8 +193,17 @@ namespace Lindt.Candybox.Demo
private Pen _vectorLinePen = new Pen(Color.DeepPink, 12); private Pen _vectorLinePen = new Pen(Color.DeepPink, 12);
private Brush _vertexBrush = new SolidBrush(Color.Orange); private Brush _vertexBrush = new SolidBrush(Color.Orange);
protected override void OnPaint(PaintEventArgs e) protected override void OnPaint(PaintEventArgs e)
{ {
OnPaintInternal(e);
}
void OnPaintInternal(PaintEventArgs e)
{
var mat = Mask.ToMat().CvtColor(ColorConversionCodes.BGR2GRAY); var mat = Mask.ToMat().CvtColor(ColorConversionCodes.BGR2GRAY);
var contours = mat.FindContoursAsArray(RetrievalModes.External, ContourApproximationModes.ApproxNone); var contours = mat.FindContoursAsArray(RetrievalModes.External, ContourApproximationModes.ApproxNone);
LastContours = contours; LastContours = contours;
@@ -355,4 +275,115 @@ namespace Lindt.Candybox.Demo
base.OnResize(e); 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 public class CandyboxImageProcessingControl : BaseRecognitionControl
{ {
private readonly CandyboxRecognitionControlSettings _settings;
private readonly IImageSource _imageSource; private readonly IImageSource _imageSource;
private HistoRecipe _histoRecipe; private HistoRecipe _histoRecipe;
public CandyboxImageProcessingControl(CandyboxRecognitionControlSettings settings, IImageSource imageSource, ILoadingService loadingService) : base(settings, loadingService) public CandyboxImageProcessingControl(CandyboxRecognitionControlSettings settings, IImageSource imageSource, ILoadingService loadingService) : base(settings, loadingService)
{ {
_settings = settings;
_imageSource = imageSource; _imageSource = imageSource;
} }
@@ -24,7 +26,7 @@ public class CandyboxImageProcessingControl : BaseRecognitionControl
public override List<RecipeData> GetRecipesData() public override List<RecipeData> GetRecipesData()
{ {
var recipes = new List<RecipeData>(); 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) foreach (var file in recipeFiles)
{ {
var name = Path.GetFileNameWithoutExtension(file); var name = Path.GetFileNameWithoutExtension(file);
@@ -99,6 +101,11 @@ public class CandyboxImageProcessingControl : BaseRecognitionControl
res.ErrorReason.Where(x=>x != EErrorReason.Good).Select(x=>x.ToString()) res.ErrorReason.Where(x=>x != EErrorReason.Good).Select(x=>x.ToString())
).ToArray(); ).ToArray();
if (_settings.AlwaysError)
{
allErrors = allErrors.Concat(new[] { "Always Error" }).ToArray();
}
return (image, res.ProcessedImage, swTotal.Elapsed, swAcquision.Elapsed, allErrors); 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; namespace CandyboxPlugin.Module;
public class CandyboxRecognitionControlSettings : BaseRecognitionControlSettings public class CandyboxRecognitionControlSettings : BaseRecognitionControlSettings
{ {
[SettingDescription("Usefull to learn on good images")]
public bool AlwaysError { get; set; }
public CandyboxRecognitionControlSettings(string cameraName) : base(cameraName) 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) lock (_lockObject)
{ {
_learnedParameters = relearn ? new LearningParameters() : _learnedParameters;
// Convert cuts to be relative to blister center
_learnedParameters.Cuts = cuts; _learnedParameters.Cuts = cuts;
if (_learnedParameters.CandyParameters.Count == 0)//initial learning if (_learnedParameters.CandyParameters.Count == 0)//initial learning
{ {
_learnedParameters.BlisterAngle = _blisterAngle; _learnedParameters.BlisterAngle = _blisterAngle;
@@ -131,6 +136,8 @@ namespace CandyboxPlugin.Recipe
return clone; return clone;
} }
public Point BlisterCenter => _blisterCenter;
public ProcessingResult ProcessImage(Mat image) public ProcessingResult ProcessImage(Mat image)
{ {
lock (_lockObject) lock (_lockObject)
@@ -166,7 +173,7 @@ namespace CandyboxPlugin.Recipe
resBlister.Dispose(); resBlister.Dispose();
resBlister = blisterOpened; resBlister = blisterOpened;
Cv2.WaitKey(1);
sw1.Stop(); sw1.Stop();
Console.WriteLine("AI Time:" + sw1.ElapsedMilliseconds); Console.WriteLine("AI Time:" + sw1.ElapsedMilliseconds);
@@ -207,44 +214,6 @@ namespace CandyboxPlugin.Recipe
)) ))
.ToList()); .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); var edges = Voronoi.Voronoi.GenerateEdgesFromDelaunay(triangles);
foreach (Edge edge in edges) 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) foreach (VectorLine cut in _learnedParameters.Cuts)
{ {
Cv2.Line(res, new OpenCvSharp.Point(cut.StartPoint.X, cut.StartPoint.Y), // Convert from relative to absolute coordinates
new OpenCvSharp.Point(cut.EndPoint.X, cut.EndPoint.Y), new Scalar(0, 0, 0), 3); 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; var mat = res;
Cv2.Threshold(mat, mat, 128, 255, ThresholdTypes.Binary); 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.RegisterModule<PluginLoader>();
self.Get<PluginLoader>().InitializeModule(); self.Get<PluginLoader>().InitializeModule(pluginsProfile);
return self; return self;
} }

View File

@@ -16,6 +16,18 @@ public class PluginLoader:IVisionBuilderModule
public List<IPlugin> Plugins { get; } = new List<IPlugin>(); public List<IPlugin> Plugins { get; } = new List<IPlugin>();
private bool _isInitialized; private bool _isInitialized;
private string _pluginsProfile = "enabled_plugins.txt";
public void InitializeModule(string? pluginsProfile)
{
if (pluginsProfile != null)
_pluginsProfile = pluginsProfile + ".txt";
InitializeModule();
}
public void InitializeModule() public void InitializeModule()
{ {
if (_isInitialized) if (_isInitialized)
@@ -27,7 +39,7 @@ public class PluginLoader:IVisionBuilderModule
Log.Information("Loading plugins..."); Log.Information("Loading plugins...");
var pluginsPath = Path.Combine("..", "Data", PLUGINS_DIRECTORY); 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)) if (!File.Exists(enabledPluginsPath))
{ {
Log.Warning("Enabled plugins file not found: {EnabledPluginsPath}. All discovered plugins will be disabled by default.", 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> <Nullable>enable</Nullable>
<ApplicationIcon>Inspectron icon-512.ico</ApplicationIcon> <ApplicationIcon>Inspectron icon-512.ico</ApplicationIcon>
<Deterministic>false</Deterministic> <Deterministic>false</Deterministic>
<Version>2.0.8</Version> <Version>2.0.9</Version>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@@ -39,5 +39,8 @@
<ItemGroup> <ItemGroup>
<Folder Include="Installer\" /> <Folder Include="Installer\" />
</ItemGroup> </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> </Project>

View File

@@ -31,19 +31,23 @@ namespace VisionBuilder.UI.Windows.Test
/// The main entry point for the application. /// The main entry point for the application.
/// </summary> /// </summary>
[STAThread] [STAThread]
static void Main() static void Main(string[] args)
{ {
// To customize application configuration such as set high DPI settings or default font, // To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration. // see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize(); ApplicationConfiguration.Initialize();
// In your application startup code // In your application startup code
MaterialSkin.MaterialSkinManager.ConfigureForInspectron(); MaterialSkin.MaterialSkinManager.ConfigureForInspectron();
CommandLineParser commandLineParser = new CommandLineParser(args);
InspectronSettings settings = new InspectronSettings("..\\Data\\Config"); InspectronSettings settings = new InspectronSettings("..\\Data\\Config");
var mainKernel = Common.VisionBuilder.CreateMainKernel(settings); var mainKernel = Common.VisionBuilder.CreateMainKernel(settings);
mainKernel.UsePlugins(); var profile = commandLineParser.GetStringArgument("profile", 'p');
mainKernel.UsePlugins(profile);
mainKernel 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> <ImplicitUsings>enable</ImplicitUsings>
<ApplicationIcon>Inspectron icon-512.ico</ApplicationIcon> <ApplicationIcon>Inspectron icon-512.ico</ApplicationIcon>
<Deterministic>false</Deterministic> <Deterministic>false</Deterministic>
<Version>2.0.8</Version> <Version>2.0.9</Version>
</PropertyGroup> </PropertyGroup>