传输优化

This commit is contained in:
liu.wenjie
2021-03-17 16:08:13 +08:00
parent 1451352125
commit 0af0e8b01a
348 changed files with 12192 additions and 863190 deletions

View File

@@ -0,0 +1,123 @@
namespace ToolLib.VisionJob
{
partial class FormJobManage
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormJobManage));
this.tabJobUnion = new System.Windows.Forms.TabControl();
this.btnCycleRun = new System.Windows.Forms.Button();
this.btnSignael = new System.Windows.Forms.Button();
this.picDeleteJob = new System.Windows.Forms.PictureBox();
this.picNewJob = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.picDeleteJob)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.picNewJob)).BeginInit();
this.SuspendLayout();
//
// tabJobUnion
//
this.tabJobUnion.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tabJobUnion.Location = new System.Drawing.Point(-1, 1);
this.tabJobUnion.Name = "tabJobUnion";
this.tabJobUnion.SelectedIndex = 0;
this.tabJobUnion.Size = new System.Drawing.Size(373, 588);
this.tabJobUnion.TabIndex = 0;
//
// btnCycleRun
//
this.btnCycleRun.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnCycleRun.Location = new System.Drawing.Point(218, 595);
this.btnCycleRun.Name = "btnCycleRun";
this.btnCycleRun.Size = new System.Drawing.Size(63, 33);
this.btnCycleRun.TabIndex = 1;
this.btnCycleRun.Text = "连续运行";
this.btnCycleRun.UseVisualStyleBackColor = true;
//
// btnSignael
//
this.btnSignael.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnSignael.Location = new System.Drawing.Point(297, 595);
this.btnSignael.Name = "btnSignael";
this.btnSignael.Size = new System.Drawing.Size(63, 33);
this.btnSignael.TabIndex = 1;
this.btnSignael.Text = "单次运行";
this.btnSignael.UseVisualStyleBackColor = true;
this.btnSignael.Click += new System.EventHandler(this.btnSignael_Click);
//
// picDeleteJob
//
this.picDeleteJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.picDeleteJob.Image = ((System.Drawing.Image)(resources.GetObject("picDeleteJob.Image")));
this.picDeleteJob.Location = new System.Drawing.Point(53, 595);
this.picDeleteJob.Name = "picDeleteJob";
this.picDeleteJob.Size = new System.Drawing.Size(35, 40);
this.picDeleteJob.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.picDeleteJob.TabIndex = 2;
this.picDeleteJob.TabStop = false;
//
// picNewJob
//
this.picNewJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.picNewJob.Image = ((System.Drawing.Image)(resources.GetObject("picNewJob.Image")));
this.picNewJob.Location = new System.Drawing.Point(12, 595);
this.picNewJob.Name = "picNewJob";
this.picNewJob.Size = new System.Drawing.Size(35, 40);
this.picNewJob.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.picNewJob.TabIndex = 2;
this.picNewJob.TabStop = false;
//
// FormJobManage
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(372, 636);
this.Controls.Add(this.picDeleteJob);
this.Controls.Add(this.picNewJob);
this.Controls.Add(this.btnSignael);
this.Controls.Add(this.btnCycleRun);
this.Controls.Add(this.tabJobUnion);
this.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FormJobManage";
this.Text = "JobManage";
this.Load += new System.EventHandler(this.FormJobManage_Load);
((System.ComponentModel.ISupportInitialize)(this.picDeleteJob)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.picNewJob)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button btnCycleRun;
private System.Windows.Forms.Button btnSignael;
private System.Windows.Forms.PictureBox picNewJob;
private System.Windows.Forms.PictureBox picDeleteJob;
public System.Windows.Forms.TabControl tabJobUnion;
}
}

View File

@@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
namespace ToolLib.VisionJob
{
public partial class FormJobManage : DockContent
{
public FormJobManage()
{
InitializeComponent();
_instance = this;
}
/// <summary>
/// 窗体对象实例
/// </summary>
private static FormJobManage _instance;
public static FormJobManage Instance
{
get
{
if (_instance == null)
_instance = new FormJobManage();
return _instance;
}
}
private void FormJobManage_Load(object sender, EventArgs e)
{
}
private void btnSignael_Click(object sender, EventArgs e)
{
string jobName = tabJobUnion.SelectedTab.Text;
VisionJobParams.pVisionProject.Project[jobName].Run();
}
}
}

View File

@@ -0,0 +1,273 @@
<?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">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<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="picDeleteJob.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAABGdBTUEAALGPC/xhBQAACJNJREFUeF7t
nWF120oYRAshEAqhEAohEAIhEMogEAKhEALhQSiEQHjvm9Pteel0O/Y6lmznu/ec+We58t0dS1qp8ScA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOIXHx8e7ypeRrzvkc+Vu/PMA10NNTJVAvFR+VF4r/14w
2ofvFfFl7CbAftTE0xFC/FOZTdJrigrzMHYdYDtqoqkY38akm03Ga8/T+CgA56Uml06lbuGIcSj6DJx6
wfmoCSUufW1x7jyOjwdwOppIxWyCfYRwygWnUxNIzCbWRwpHElhHE6eYTaiPmPvxsQEOUxNGq1Uf7Zoj
RZ/18/j4AJmaLE9vJk+XfB8fH+Dv1ETRcu5sAq1E90l0Z/15p/y6iz/bl5V8HRoA5tQk0Y3A2eQ5FE1S
PRd10Weixj7oUZPZPh7K83gbgD+pCaJrj9VvYt14u7pvXu3T2LfZPv8tr2NzgD+pCXJvE+ZQVKarvbit
fVPhV0vCc1swpyaHmE2aWbTyc/WPbNQ+rq7IfRubAvxOTQ5d8M4mzSw3M5G0r7bvKaxmwRxNDpssKTdz
c632dWVl7mVsBvA7NTlWztdv5saa9tX2PeWfsRnA72hy2GRJoSDQC00OmywpFAR6oclhkyWFgsB+1MA8
VPQM1CWzshyqFa/Ze1xjVlbn5ECLFcfk16MuK5ntn4eni52SInmzASP9wiMvjqSYJNI3FMSRFJNE+oaC
OJJikkjfUBBHUkwS6RsK4kiKSSJ9Q0EcSTFJpG8oiCMpJon0DQVxJMUkkb6hII6kmCTSNxTEkRSTRPqG
gjiSYpJI31AQR1JMEukbCuJIikkifUNBHEkxSaRvKIgjKSaJ9A0FcSTFJJG+oSCOpJgk0jcUxJEUk0T6
hoI4kmKSSN9QEEdSTBLpGwrilBT9kWX9eZpjsvK3ZlW82XuQ92flS01/rWT2HtOMaQGnUALFbBBm4aeO
N6LcrnxRMQ57UbLFbBBm4c/5b0S5FTPns3DatBcle+Wbix+E2Yhyu/KDQxRkLyTb5KfwV/o2Qm7NdQq/
O7IXkm3yUyjIRpRb/Q7izPksFGQvJNvkp/DTxhsht+Y6hYLshWSb/BQKshFya65TKMheSLbJT6EgGyG3
5jqFguyFZJv8FAqyEXJrrlMoyF5ItslPObog9VrdzT8qY5OTmb3n3zI2OZnZe/4tY5OjqNdTkGtEsk1+
ykpBdvuFqdpezN53lnfd7Kzt9fjG7H1nOfoXpuq1FOQakWyTn0JBKEgvJNvkp1AQCtILyTb5KRSEgvRC
sk1+CgWhIL2QbJOfQkEoSC8k2+SnUBAK0gvJNvkpFISC9EKyTX4KBaEgvZBsk59CQShILyTb5KdQEArS
C8k2+SkUhIL0QrJNfgoFoSC9kGyTn0JBKEgvJNvkp1AQCtILyTb5KRSEgvRCsk1+CgWhIL2QbJOfQkEo
SC8k2+SnUBAK0gvJNvkpFISC9EKyTX4KBaEgvZBsk59CQShILyTb5KdQEArSC8k2+SkUhIL0QrJNfgoF
oSC9kGyTn0JBKEgvJNvkp1AQCtILyTb5KRSEgvRCsk1+CgWhIL2QbJOfQkEoSC8k2+SnUBAK0gvJNvkp
FISC9EKyTX4KBaEgvZBsk59CQShILyTb5KdQEArSC8k2+SkUhIL0QrJNfgoFoSC9kGyTn0JBKEgvJNvk
p1AQCtILyTb5KRSEgvRCsk1+CgWhIL2QbJOfQkEoSC8k2+SnUBAK0gvJNvkpFISC9EKyTX4KBaEgvZBs
k59CQShILyTb5KdQEArSC8k2+SkUhIL0QrJNfgoFoSC9kGyTn0JBKEgvJNvkp1AQCtILyTb5KRSEgvRC
sk1+CgWhIL2QbJOfQkEoSC8k2+SnUBAK0gvJNvkpFISC9EKyTX4KBaEgvZBsk59CQShILyTb5KdQEArS
C8k2+SkUhIL0QrJNfgoFoSC9kGyTn0JBKEgvJNvkp1AQCtILyTb5KRSEgvRCsk1+CgWhIL2QbJOfQkEo
SC8k2+SnUBAK0gvJNvkpFISC9EKyTX4KBaEgvZBsk59CQShILyTb5KdQEArSC8k2+SkUhIL0QrJNfgoF
oSC9kGyTn0JBKEgvJNvkp1AQCtILyTb5KRSEgvRCsk1+CgWhIL2QbJOfQkEoSC8k2+SnUBAK0gvJNvkp
FISC9EKyTX4KBaEgvSjZzyY/hYJQkF6U7CeTn/I4NjtIvZSCrBXkwbZNeR6bwdaU7G8mP4WCbFcQMXuP
WZ7GZrA1JXulIEdPrnotBaEgt0/J3uTQXq+lIGsF2eRUF95Jub5/I/5Qjr44rNfqyKQFgGPy3oLoAnf2
vrPcj81Oora/s/dLOfqbfrx+5nyWd30GWKBka8BngzDL69gMzky5XVluf9cXCixSwl9tAFLuxmZwJuS0
cuwY8CW1NyX9xQYh5eh7IXAccmqOU17GZrAXJX3lApE1+DNTTldWElnB2puSvnKhrlMBzoHPRLlcOb1S
uEC/BCX+hw1EyruWSuF/5NLcpqhIXANeghK/cpqlfBmbwonIYWXl6MEzWJei5K/cAFN0xOHb7ETkrrKy
OKJwenVJagBWTrMUfftxJFlEziqrrn+MzeFS1CCsXKy/jW5ysfx7ADmq6FR25bTqV3i85BqocVh5hsqj
gddpgwqjiUB+PkIip6tHjLfR9pzOXgM1EDr8zwaJXC4cna+JGpCVB+fItmHl6tqoQdEKy3tOtch5wqnV
taKBqZxyMUnOE1YIr50aIN0boST7R8657rgFaqBOWbMnp0fl4IbgrVGDxoX79tESOdcct0oNnv7/Oqdc
54+cPgzNcOvUYIrV54jIn5FDwVHjI1IDq4t4oYHmOiVHRwkt28qVHnFnhaorGvyKnjsiP11whAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAWfPr0H/jQ1+arHDMPAAAAAElFTkSuQmCC
</value>
</data>
<data name="picNewJob.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuVEQrblRFq25YSftuWEn7blhJ+25YSftuW
En7blhJ+25YSftuWEn7blhJ+2pURaNqVEQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25URsduWEv/blhL/25YS/9uW
Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25URsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAANuVEQralRFo2pUSgdqVEoHalRKB2pUSgdqVEoHalRKB2pUSgdqVEoHblRH525UR+9uW
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
En7blhJ+25YSftuWEn7blhJ+25YSftuWEn7alRFo2pURCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblRGx25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uVEbEAAAAAAAAAAAAAAADblRGx25YS/9uW
Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blRGxAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA25IQBNuVEffblRH725YRg9uWEn7blhJ+25YSftuWEoXalRL525YR+9uTEAjbkxAI2pMQDNuV
EffblRH725YRg9uWEn7blhJ+25YSftuWEn7blhJ+25YSftuWEn7blhKF2pUS+duWEfsAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADbkxAI25UR99uVEffbkxAIAAAAAAAAAAAAAAAA2ZUSCtqVEvXblhL/25UR99uV
EffalRH32pUS/9uVEffbkxAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANmVEgralRL125YS/wAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAANqTEAbalRH125UR+9uVEYPblhJ+25YSftuWEn7blRKF2pUS+duW
Ev0AAAAAAAAAANqTEAbalRH125UR+9uVEYPblhJ+25YSftuWEn7blhJ+25YSftuWEn7blhJ+25UShdqV
EvnblhL9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuVEa3blhL/25YS/9uWEv/blhL/25YS/9uW
Ev/blhL/2pURrwAAAAAAAAAAAAAAANuVEa3blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW
Ev/blhL/25YS/9qVEa8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25URCtuVEWbblhJ+25YSftuW
En7blhJ+25YSftqVEmbblREKAAAAAAAAAAAAAAAA25URCtuVEWbblhJ+25YSftuWEn7blhJ+25YSftuW
En7blhJ+25YSftuWEn7alRJm25URCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA/////////////////////////////gAP/gA/j/j8f8/7/j+P+/4AD/v/
///7////+/////v+AA/7/j+P+4B/z/u+P4/7vgAP+7////u////5P///4A4AD+OOP4/nwH/P444/j+AO
AA////////////////////////////////8=
</value>
</data>
</root>

234
ToolLib.VisionJob/FormToolBox.Designer.cs generated Normal file
View File

@@ -0,0 +1,234 @@
namespace ToolLib.VisionJob
{
partial class FormToolBox
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("流程", 1, 1);
System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Halcon窗口", 3, 3);
System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Basler");
System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("HIKVision");
System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("获取图像", new System.Windows.Forms.TreeNode[] {
treeNode2,
treeNode3,
treeNode4});
System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("滤波");
System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("平滑");
System.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode("去噪");
System.Windows.Forms.TreeNode treeNode9 = new System.Windows.Forms.TreeNode("图像预处理", new System.Windows.Forms.TreeNode[] {
treeNode6,
treeNode7,
treeNode8});
System.Windows.Forms.TreeNode treeNode10 = new System.Windows.Forms.TreeNode("形状匹配");
System.Windows.Forms.TreeNode treeNode11 = new System.Windows.Forms.TreeNode("可变形匹配");
System.Windows.Forms.TreeNode treeNode12 = new System.Windows.Forms.TreeNode("灰度匹配");
System.Windows.Forms.TreeNode treeNode13 = new System.Windows.Forms.TreeNode("匹配", new System.Windows.Forms.TreeNode[] {
treeNode10,
treeNode11,
treeNode12});
System.Windows.Forms.TreeNode treeNode14 = new System.Windows.Forms.TreeNode("找线");
System.Windows.Forms.TreeNode treeNode15 = new System.Windows.Forms.TreeNode("找圆");
System.Windows.Forms.TreeNode treeNode16 = new System.Windows.Forms.TreeNode("卡尺");
System.Windows.Forms.TreeNode treeNode17 = new System.Windows.Forms.TreeNode("几何", new System.Windows.Forms.TreeNode[] {
treeNode14,
treeNode15,
treeNode16});
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormToolBox));
this.tvw_ToolBox = new System.Windows.Forms.TreeView();
this.imageList1 = new System.Windows.Forms.ImageList(this.components);
this.richTextBoxEx1 = new DevComponents.DotNetBar.Controls.RichTextBoxEx();
this.imageListTool = new System.Windows.Forms.ImageList(this.components);
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
this.SuspendLayout();
//
// tvw_ToolBox
//
this.tvw_ToolBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.tvw_ToolBox.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.tvw_ToolBox.ImageIndex = 4;
this.tvw_ToolBox.ImageList = this.imageList1;
this.tvw_ToolBox.Indent = 32;
this.tvw_ToolBox.Location = new System.Drawing.Point(0, 0);
this.tvw_ToolBox.Name = "tvw_ToolBox";
treeNode1.ImageIndex = 1;
treeNode1.Name = "NodeJob";
treeNode1.SelectedImageIndex = 1;
treeNode1.Text = "流程";
treeNode2.ImageIndex = 3;
treeNode2.Name = "节点1";
treeNode2.SelectedImageIndex = 3;
treeNode2.Tag = "HalconTool";
treeNode2.Text = "Halcon窗口";
treeNode3.ImageKey = "图像.png";
treeNode3.Name = "节点2";
treeNode3.SelectedImageIndex = 3;
treeNode3.Text = "Basler";
treeNode4.ImageKey = "图像.png";
treeNode4.Name = "节点3";
treeNode4.SelectedImageIndex = 3;
treeNode4.Text = "HIKVision";
treeNode5.ImageIndex = 4;
treeNode5.Name = "节点0";
treeNode5.Text = "获取图像";
treeNode6.Name = "节点5";
treeNode6.Text = "滤波";
treeNode7.Name = "节点6";
treeNode7.Text = "平滑";
treeNode8.Name = "节点7";
treeNode8.Text = "去噪";
treeNode9.Name = "节点4";
treeNode9.Text = "图像预处理";
treeNode10.Name = "节点9";
treeNode10.Text = "形状匹配";
treeNode11.Name = "节点10";
treeNode11.Text = "可变形匹配";
treeNode12.Name = "节点11";
treeNode12.Text = "灰度匹配";
treeNode13.Name = "节点8";
treeNode13.Text = "匹配";
treeNode14.ImageKey = "Line.png";
treeNode14.Name = "FindLine";
treeNode14.SelectedImageKey = "Line.png";
treeNode14.Tag = "FindLine";
treeNode14.Text = "找线";
treeNode15.ImageKey = "Circle.png";
treeNode15.Name = "FindCircle";
treeNode15.SelectedImageKey = "Circle.png";
treeNode15.Text = "找圆";
treeNode16.ImageKey = "卡尺.png";
treeNode16.Name = "Caliper";
treeNode16.SelectedImageKey = "卡尺.png";
treeNode16.Tag = "Caliper";
treeNode16.Text = "卡尺";
treeNode17.Name = "节点0";
treeNode17.Text = "几何";
this.tvw_ToolBox.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
treeNode1,
treeNode5,
treeNode9,
treeNode13,
treeNode17});
this.tvw_ToolBox.SelectedImageIndex = 4;
this.tvw_ToolBox.Size = new System.Drawing.Size(417, 543);
this.tvw_ToolBox.TabIndex = 1;
this.tvw_ToolBox.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvw_ToolBox_AfterSelect);
this.tvw_ToolBox.Click += new System.EventHandler(this.tvw_ToolBox_Click);
this.tvw_ToolBox.DoubleClick += new System.EventHandler(this.tvw_ToolBox_DoubleClick);
//
// imageList1
//
this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
this.imageList1.Images.SetKeyName(0, "镜头.png");
this.imageList1.Images.SetKeyName(1, "流程.png");
this.imageList1.Images.SetKeyName(2, "流程图.png");
this.imageList1.Images.SetKeyName(3, "图像.png");
this.imageList1.Images.SetKeyName(4, "文件夹.png");
this.imageList1.Images.SetKeyName(5, "Line.png");
this.imageList1.Images.SetKeyName(6, "Circle.png");
this.imageList1.Images.SetKeyName(7, "卡尺.png");
//
// richTextBoxEx1
//
//
//
//
this.richTextBoxEx1.BackgroundStyle.Class = "RichTextBoxBorder";
this.richTextBoxEx1.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.richTextBoxEx1.Dock = System.Windows.Forms.DockStyle.Fill;
this.richTextBoxEx1.Location = new System.Drawing.Point(0, 0);
this.richTextBoxEx1.Name = "richTextBoxEx1";
this.richTextBoxEx1.Rtf = "{\\rtf1\\ansi\\deff0{\\fonttbl{\\f0\\fnil\\fcharset134 \\\'cb\\\'ce\\\'cc\\\'e5;}}\r\n\\viewkind4\\u" +
"c1\\pard\\lang2052\\f0\\fs18 richTextBoxEx1\\par\r\n}\r\n";
this.richTextBoxEx1.Size = new System.Drawing.Size(417, 95);
this.richTextBoxEx1.TabIndex = 2;
this.richTextBoxEx1.Text = "richTextBoxEx1";
//
// imageListTool
//
this.imageListTool.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListTool.ImageStream")));
this.imageListTool.TransparentColor = System.Drawing.Color.Transparent;
this.imageListTool.Images.SetKeyName(0, "流程.png");
this.imageListTool.Images.SetKeyName(1, "流程图.png");
this.imageListTool.Images.SetKeyName(2, "图像.png");
this.imageListTool.Images.SetKeyName(3, "图像.png");
this.imageListTool.Images.SetKeyName(4, "图像.png");
this.imageListTool.Images.SetKeyName(5, "图像.png");
this.imageListTool.Images.SetKeyName(6, "line.png");
this.imageListTool.Images.SetKeyName(7, "Circle.png");
this.imageListTool.Images.SetKeyName(8, "卡尺.png");
//
// splitContainer1
//
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.Location = new System.Drawing.Point(0, 0);
this.splitContainer1.Name = "splitContainer1";
this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.Controls.Add(this.tvw_ToolBox);
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.richTextBoxEx1);
this.splitContainer1.Size = new System.Drawing.Size(417, 642);
this.splitContainer1.SplitterDistance = 543;
this.splitContainer1.TabIndex = 7;
//
// FormToolBox
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(417, 642);
this.Controls.Add(this.splitContainer1);
this.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FormToolBox";
this.Text = "工具箱";
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TreeView tvw_ToolBox;
private DevComponents.DotNetBar.Controls.RichTextBoxEx richTextBoxEx1;
public System.Windows.Forms.ImageList imageList1;
public System.Windows.Forms.ImageList imageListTool;
private System.Windows.Forms.SplitContainer splitContainer1;
}
}

View File

@@ -0,0 +1,88 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CommonMethods;
using WeifenLuo.WinFormsUI.Docking;
using ToolLib.VisionJob;
using VisionJobFactory;
namespace ToolLib.VisionJob
{
public partial class FormToolBox : DockContent
{
public FormToolBox()
{
InitializeComponent();
VisionToolFactory.InitVisionToolTypeDic();
}
/// <summary>
/// 窗体对象实例
/// </summary>
private static FormToolBox _instance;
public static FormToolBox Instance
{
get
{
if (_instance == null)
_instance = new FormToolBox();
return _instance;
}
}
private void tvw_ToolBox_AfterSelect(object sender, TreeViewEventArgs e)
{
if(e.Node.Level == 0)
{
this.richTextBoxEx1.Text = e.Node.Text;
}
else if(e.Node.Level == 1)
{
object selectTag = tvw_ToolBox.SelectedNode.Tag;
if (selectTag != null)
{
IToolInfo insertTool = VisionToolFactory.CreateToolVision((ToolType)Enum.Parse(typeof(ToolType), selectTag.ToString()));
this.richTextBoxEx1.Text = insertTool.toolDescription;
}
else
{
this.richTextBoxEx1.Text = "此工具尚未开发";
}
}
}
private void tvw_ToolBox_DoubleClick(object sender, EventArgs e)
{
try
{
if (tvw_ToolBox.SelectedNode.SelectedImageIndex == 0) //如果双击的是文件夹节点,返回
return;
if(VisionJobParams.pVisionProject.Project.Count == 0) // 若当前无流程,需要先建立项目和流程树,并对其进行初始化
{
OperateProject.Instance.CreateNewJob();
}
if (VisionJobParams.pVisionProject.Project.Count > 0) //再次确认已存在流程
{
object selectTag = tvw_ToolBox.SelectedNode.Tag;
OperateTreeView.Instance.Add_Tool((ToolType)Enum.Parse(typeof(ToolType), selectTag.ToString()));
}
}
catch (Exception ex)
{
Logger.LoggerClass.WriteLog("添加流程失败!", ex);
}
}
private void tvw_ToolBox_Click(object sender, EventArgs e)
{
}
}
}

View File

@@ -0,0 +1,450 @@
<?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">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<data name="imageList1.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA8
FgAAAk1TRnQBSQFMAgEBCAEAAUABAAFAAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABgAMAAWADAAEBAQABCAYAATAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AP8A/wD/AP8A
/wD/AP8A/wD/AP8A/wD/AP8A/wA0AAHzA1ooAAHzA1owAAH2G1kEAAHzAVoBAAFaJgAEWgEABFoUAAFs
AfQB8xYAHVkDAAHzA1ojAAH/AloB9AEAAfMDWgIAAQgCWhEAAWwB9AFmFwAdWQQAAvMBwgFaIQABngFa
Af8EAAPzBAABwgFaAf8OAAFsAvQB/wMAAf8BrhIAHVkHAAH0AVofAAJaDwABWgHCDAABbAL0AWYEAAFs
AbUSAB1ZCAAB/wFaHQAB5AFaEQABWgH/CgABbAL0AWYEAAHyAfQBkRIAHVkJAAH/AVobAAH/AVoTAAFa
CQAB7gL0Aa4FAAHtAfQBZhIAHVkKAAH0AVoaAAFaFAABwgFaCAAB9wL0AWYEAAHsAvQB8xIAHVkLAAH0
AVoYAAH/AVoVAAFaBwABbAT0Ae4B9wIAAWYC9BMAHVkMAAH/AVoXAAFaFgABCAFaBgAE9AH3AWwB8wFs
AWYBCQFmAa4TAB1ZDQAB/wFaFgABWhcAAVoFAAGuAfMF9AHzAWwB/wHxAgkBbBIAHVkOAAH0AVoVAAFa
FwABWgYAAWYC9AFsBPQB7gGuAf8BrgEJAZEBvBAAHVkPAAH0AVoSAAHzA1oUAAHzA1oEAAH/AfQBZgIA
AWwBkQL0AfAB9AGuAfEB/wGuAQkBbAFtAbsB7QwAHVkQAAH/AVoRAAHzAVoBAAFaFAAB8wFaAQABWgQA
AWwB8QIAAQcBCQG7AWwD9AGuAfQBZgL/AgkCZgwAHVkRAAH/AVoQAAHzA1oUAAHzA1oDAAHzAWYB/wIA
ApEBAAFmAWwBCQFmAvQBrgEHAWYB/wHvAWwBuwH3CwAdWRIAAfQBWhAAAfMBWgHzFQAB8wFaAfMHAAHz
AQkBBwIAAW0B9AFsAbsBrgL0AbUBbAH3Af8BrgHwCwAdWRMAAfQBWhAAAVoXAAFaCAAB8wFsBQABZgH/
AZEBrgEHAvQB8wNmCwAdWRQAAf8BWg8AAVoWAAH0AVoNAAGSAf8BZgH/AWwB/wEJAWYE9AHwAWwBZgkA
ATEbWQExFQAB/wFaDgABngFaFQABWg8AAWYB/wIAAfcBvAHtAQkBZgH0AfID9AGRAfAHAAMxAVgV/wQx
FgAB9AFaDgABWhQAAf8BWhUAAWwB/wFsAa4G9AFsAf8FAAMxAVgV/wQxFwAB9AFaDQABGwFaEwABWgH/
FgAB/wHzAQABrgHwBvQBbAQAHTEYAAH/AVoNAAJaEQABWgGeHAABZgb0AfIBrgIAGzEBeRoAAf8BWg0A
AloPAAJaHwABbAX0AWYCABIxJQAB9AFaDQACWg0AAVoB5CEAAbwBkgL0AfMDABExAZkmAAHCA1oLAAEb
AloCAAHzA1oDAAJaAf8kAAFsAfQBbAMAETEnAAHzAVoBAAFaDQABngRaAQAEWgH/ZAAB8wNaEAAB8wNa
aQAD8xEAA/P/ADYAAbMQAAH/AbttAAGyEQABsmwAAbIBCQGyAgkBswIJAboCCQG7BwkBugGzagAC/wEA
AbMCAAEJAgAB8wIAAf8IAAEJagAB/wIAAbMCAAEJAgAB8wIAAf8IAAEZCQAB/wUJAfQCAAEZBQkB/wIA
BgkUAAuyAbMGAB30BgAB/wIAAbMCAAEJAgAB8wIAAf8IAAEZCQAB/wUJAfQCAAEZBQkB/wIABgkTAAEJ
DLIFAB+KBQAB/wKzAbISswkAAf8CCQH/AgkB9AIAARkBCQEZAf8CCQH/AgADCQH/AfIBCQoAAbMKsgH0
CAABugGyBAABtAGKAWUCuxoZAYoFAAH/FAABGQkAAf8CCQEAAgkB9AIAARkBCQHzAQACCQH/AgADCQEA
AfMBCQkAAfMBswgAAboBsgH0CAABugGyBAABswGKAmUCuxkZAYoFAAH/FAABGQkAAf8FCQH0AgABGQUJ
Af8CAAYJCQABugH0CAABCQyyBAABswGKAbsCZQG7AQkYGQGKBQAB/xQAARkJAAH/BQkB9AIAARkFCQH/
AgAGCQkAAboB9AkADLIEAAGzAYoBuwEZAmUBuwEJCRkBCQwZAbsBigUAAf8UAAEZCgAB/wIJAv8DAAL/
AwkB/wMAAv8CCQHzAf8JAAG6AfQZAAGzAYoBuwIZAmUBuwgZArsLGQEJAWUBigUAAf8UAAEZCwACCQcA
AwkGAAIJAfQKAAG6AfQZAAGzAYoBuwMZAmUBuwYZAbsCZQG7ChkCZQGKBQAB/xQAARkLAAIJB/8DCQb/
AgkB9AoAAboB9AkAC7IBswQAAbMBigG7BBkCZQG7BRkBZgJlAWYBCQgZAbsBZQEZAYoFAAH/FAABGQsA
FAkB9AoAAboB9AgAAQkMsgQAAbMBigG7BRkCZQG7AxkBuwFlAWYBkQFlAbsHGQEJAmUBGQGKBQAB/xQA
ARkLABQJAfQKAAG6AfQEAAT0AbMBsgH0CAABugGyBAABswGKAbsGGQFlAWYBuwEJAbsCZQIZAWUBZgEJ
BhkBZgFlAhkBigUAAf8VshQAAfMCCRMAAboB9AIACLIB9AgAAboBsgQAAbMBigG7BhkBuwJlAbsCZQMZ
AQkBZQG7BRkBuwFlAWwCGQGKBQAB/wIAAbMCAAEJAgAB8wIAAf8IAAEZFAAB8wIJEwABugH0AgABsgUA
AQkMsgQAAbMBigG7BxkBtQNlBRkCZQG7AxkBCQJlAxkBigUAAf8CAAGzAgABCQIAAfMCAAH/CAABGQ0A
B/8BGQIJB/8MAAG6AfQCAAGyBgAMsgQAAbMBigG7EBkBCQFlAbsDGQGuAWUEGQGKBQAB/wIAAbMCAAEJ
AgAB8wIAAf8IAAEZDAAB8xIJCwABugH0AgABshYAAbMBigG7AhkBZgJlDBkCZQG7ARkBuwJlBBkBigUA
Af8CAAGzAgABCQIAAfMCAAH/CAABGQwAAfMBCQ7/AwkLAAG6AfQCAAGyFgABswGKAbsBGQFlAYsCGQFl
DBkBZQK7AmUFGQGKBAAB/wGyFbQBsgsAAfMBCQ4AAwkKAAeyAbMEAAuyAbMEAAGzAYoBuwEZAWUBuwIZ
AWUMGQRlAZEFGQGKBAABshcAAbIKAAHzAQkDAAIJCQADCQkAAQkIsgMAAQkMsgQAAbMBigG7ARkBZQG7
AgkBZQ4ZAbUHGQGKBAABshezAbIKAAHzAQkDAAIJCQADCQkAAboBsgH0BAABugGyA/QBswGyAfQIAAG6
AbIEAAGzAYoBuwIZA2UBuxYZAYoEAAG6FwABsgoAAfMBCQ4AAwkJAAG6AbIB9AQAAboGsgH0CAABugGy
BAABswGKAbscGQGKBAABuhcAAbIKAAHzAQkOAAMJCQABCQiyAwABCQyyBAABswGKHbsBigQAAboXAAGy
CgAB8xIJCgAIsgQADLIFAB+KBAABugQAAbIB9AsAAQkBsgQAAbIKAAH/EQkB8ycAAf8crQG0BQABugMA
AbIBAAGzCwABCQEAAbIDAAGyZwABugIAAbIDAAGyCQABsgMAAbMCAAGyZwABugGzAboEAAG6CAAC8wMA
Af8BugGzAQlvAAGyAQkFAAG6AbN5AAG6A7IBCW0AAUIBTQE+BwABPgMAASgDAAGAAwABYAMAAQEBAAEB
BgABBhYAA///AP8AAwAk/wHDBP8B/AE/Bf8BwAIAAQMBywT/AfABhwL/AY8C/wHAAgABAQHDBP8BhAEx
Av8BHwL/AcACAAEBAeEE/wEeATwBfwH+ARwC/wHAAgABAQH8A/8B/gF/Af8BPwH8ATwC/wHAAgABAQH+
AX8C/wH8Av8BnwH4AXgC/wHAAgABAQH/AT8C/wH5Av8B3wHwAfgC/wHAAgABAQH/AZ8C/wH7Av8BzwLw
Av8BwAIAAQEB/wHPAv8B8wL/Ae8B4AExAv8BwAIAAQEB/wHnAv8B9wL/AecB4AEBAv8BwAIAAQEB/wHz
Av8B9wL/AfcBwAEAAv8BwAIAAQEB/wH5Av8B9wL/AfcB4AEAAT8B/wHAAgABAQH/AfwC/wHDAv8BwwHG
AQABAwH/AcACAAEBAf8B/gF/Af8BywL/AcsBzAEAAQMB/wHAAgABAQL/AT8B/wHDAv8BwwGMAYABAQH/
AcACAAEBAv8BnwH/AeMC/wHjAfgBwAEBAf8BwAIAAQEC/wHPAf8B9wL/AfcB+QHwAQEB/wHAAgABAQL/
AecB/wH3Av8B5wH/AcABAAF/AcACAAEBAv8B8wH/AfMC/wHvAf8B5gEAAR8BwAIAAQEC/wH5Af8B+wL/
Ac8C/wGAAQcBwAIAAQEC/wH8Af8B+QL/Ac8C/wHIAQMBwAIAAQEC/wH+AX8B/AL/AZ8C/wH+AQABwAIA
AQMD/wE/Af4BfwH/AT8D/wGAAcABAAEPBP8BnwH/AT8B/gF/A/8BwQHAAQABDwT/AcMB/wGMATgE/wHx
AcABAAEfBP8BywH/AeABgwz/AcMB/wH8AT8M/wHjAf8B/gE/Jf8B/gL/AT8M/wH+Av8Bvwz/AfwCAAEf
DP8B+QFtAb8B3wz/AfsBbQG/Ad8B8AEYAQwBDwL/AQABDwHAAgABAQH7AW0BvwHfAfABGAEMAQ8B/wH+
AQABDwGAAwAB+AIAAR8B8AEYAQwBDwH8AQABPwHPBAAB+wL/Ad8B8QEYAYwBTwH5Af4BPwHPBAAB+wL/
Ad8B8AEYAQwBDwH5Af4BAAEPBAAB+wL/Ad8B8AEYAQwBDwH5Af8BAAEPBAAB+wL/Ad8B+AE4ARwBDwH5
A/8EAAH7Av8B3wH8Af4BPwEfAfkD/wQAAfsC/wHfAfwCAAEfAfkB/wEAAQ8EAAH7Av8B3wH8AgABHwH5
Af4BAAEPBAAB+wL/Ad8B/AIAAR8B+QHgAT8BzwQAAfgCAAEfAf8B/gE/Af8B+QGAAT8BzwQAAfsBbQG/
Ad8B/wH+AT8B/wH5Ab4BAAEPBAAB+wFtAb8B3wH/AgABfwH5Ab8BAAEPBAAB+wFtAb8B3wH+AgABPwH5
Ab8C/wQAAfsBbQG/Ad8B/gIAAT8B+QG/Av8EAAHwAgABDwH+AX8B/gE/AfABDwEAAQ8EAAH3Av8B9wH+
AXMB/gE/AeABDgEAAQ8EAAHwAgABBwH+AXMB/gE/AeMBwAE/Ac8EAAH3Av8B9wH+AX8B/gE/AeMBwAE/
Ac8EAAH3Av8B9wH+AX8B/gE/AeABDgEAAQ8EAAH3Av8B9wH+AgABPwHwAQ8BAAEPAYADAAH3AZ8B/AH3
Af4CAAE/BP8BgAIAAQEB9wFfAf0Bdwz/AfYB7wH7AbcM/wHxAe8B8wGHDf8B8wHnDv8B/AEfDf8L
</value>
</data>
<metadata name="imageListTool.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>132, 17</value>
</metadata>
<data name="imageListTool.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABK
HgAAAk1TRnQBSQFMAgEBCQEAASgBAAEoAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABMAMAAQEBAAEgBgABMP8AJwAB/wH2AesB//gAAf8B9gHrAf8DBgEIBAADDAEQ7AAB/wH2AesB/wFn
AUsBMgH/CAAB/wH2AesB/+gAAbQBoQGQAv8B9gHrAf8IAAFkAVIBQQHPAf8B9gHrAf/oAAH/AfYB6wL/
AfYB6wH/AXoBYAFJAf8BcQFWAT4B/wHiAcoBsAH/AYUBawFVAf/oAAH/AfYB6wH/AXEBVgE+Av8B9gHr
Av8B9gHrAf8BkwF+AWwB/wGOAXcBZAH/AagBjwF0Af/gAAFxAVYBPgH/BAABVAFMAUQBjwHLAbIBmQH/
AfsB8QHlAv8B9gHrAf8B+wHxAeUF/wHbAcIBqAH/AWcBSwEyAf/gAAHiAcoBsAH/BAABZgFQATsB5wF5
AWABSQH/AYABZgFPAv8B9gHrAf8BewFiAUsF/wFCAT4BOgFk5AABYAFRAUUBuAFnAUsBMgH/AXUBXAFF
Af8B4gHKAbAC/wH2AesC/wH2AesB/wHjAdYByQH/AWcBSwEyAf/wAAH7AfoB+QH/AZMBewFmAv8B9gHr
Av8B9gHrAv8B9gHrAf8DBgEI9AAB/wH2AesC/wH2AesC/wH2AesB/wHsAeEB1AH/9AABSAFCAT4BcAH/
AfYB6wH/AfEB5gHaAf//AP8A/wD/AP8ASQADMgFQUAABJwH6ARgB/wEnAfoBGAH/BAABJwH6ARgB/wEn
AfoBGAH/GAABqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZ
AQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/
AagBWQEHAf8YAAFYAVQBSwGeAdsBlgEPAf8B2wGWAQ8B/wHbAZYBDwH/AwABARwAAzIBUAEmAfoBFwH/
QAABSwFrAUcBoAMSARgIAAEyATQBMgFQCAABPgFFAT4BbAMhATAMAAGNAWsBRgHvAVABJwEOAf8B4QG9
AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/FAAB2wGWAQ8B/xQA
AdsBlgEPAf8gAAEmAfoBFwH/OAABRwGiAT8BzyQAAyEBMAgAAY0BawFGAe8B4QG9AYoB/wFQAScBDgH/
AeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AeEBvQGKAf8QAAHSAZYBFQH9QAABJgH6
ARcB/1wAAToBQAE6AWQIAAGNAWsBRgHvAeEBvQGKAf8B+gHrAdIB/wFQAScBDgH/AeEBvQGKAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8BUAEnAQ4B/wHhAb0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wFQAScBDgH/EAADNgFZHAAB2wGWAQ8B/yQAASYB+gEXAf8sAAEnAfoBGAH/
LAABJwH6ARgB/wQAAY0BawFGAe8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8BUAEnAQ4B/wHhAb0BigH/
AfoB6wHSAf8B3QG5AYcB/wFWAS0BFAH/AVABJwEOAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wFQAScBDgH/AfoB6wHSAf8wAAI2ATUBVygAASYB+gEXAf8oAAEnAfoBGAH/LAABJwH6ARgB/wQA
AY0BawFGAe8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wFQAScBDgH/AeEBvQGKAf8BUAEn
AQ4B/wH6AesB0gH/AecB1QG8Af8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B4QG9AYoB/wF0AVEBOAH/
AfoB6wHSAf8gAAHbAZYBDwH/PAABJgH6ARcB/yAAATIBNAEyAVAsAAEyATQBMgFQCAABjQFrAUYB7wHh
Ab0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/yAA
AdsBlgEPAf9AAAEmAfoBFwH/IAABJwH6ARgB/ywAAScB+gEYAf8EAAGNAWsBRgHvAeEBvQGKAf8BUAEn
AQ4B/wH6AesB0gH/AVABJwEOAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B2gG2AYQB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/EAAB2wGWAQ8B/wwA
AdsBlgEPAf8QAAG1AYcBJwHwMAABJgH6ARcB/xwAAScB+gEYAf8sAAEnAfoBGAH/BAABjQFrAUYB7wHh
Ab0BigH/AVABJwEOAf8B6QHMAaEB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfYB5wHOAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/xQA
AVEBTgFKAZAIAAHbAZYBDwH/SAABJgH6ARcB/0QAAxIBGAgAAY0BawFGAe8B4QG9AYoB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8YAAHbAZYBDwH/BAAB2wGW
AQ8B/wwAAdsBlgEPAf88AAEmAfoBFwH/GAABJwH6ARgB/yQAAUoBcgFIAagMAAGoAVkBBwH/AagBWQEH
Af8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGo
AVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/ygAAdsBlgEPAf8BQQFA
AT8BcEQAASYB+gEXAf8YAAEnAfoBGAH/HAABSAGWAUIBx8AAAzIBUCAAAScB+gEYAf8BJwH6ARgB/wQA
AScB+gEYAf8BJwH6ARgB/8wAAzIBUCQAATIBNAEyAVD/AP8A/wA/AAHbAZYBDQH/AdsBlgENAf8B2wGW
AQ0B/wHbAZYBDQH/AdsBlgENAf8B2wGWAQ0B/wwAAagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEH
Af8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGo
AVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/BAABqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZ
AQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/
AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8EAAGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGo
AVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEH
Af8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wwAAX0BbAFKAd8QAAHbAZYBDQH/EAABYgFd
AVQBwAgAAY0BawFGAe8BUAEnAQ4B/wHhAb0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6
AesB0gH/AfoB6wHSAf8BjQFrAUYB7wFQAScBDgH/AeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wGNAWsBRgHvAVABJwEOAf8B4QG9AYoB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/DAADKgFAEAAB2wGWAQ0B/wHbAZYBDQH/AdsBlgEN
Af8B2wGWAQ0B/wHbAZYBDQH/AdsBlgENAf8IAAGNAWsBRgHvAeEBvQGKAf8BUAEnAQ4B/wHhAb0BigH/
AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wHhAb0BigH/AY0BawFGAe8B4QG9AYoB/wFQAScBDgH/
AeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AeEBvQGKAf8BjQFrAUYB7wHhAb0BigH/
AVABJwEOAf8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B4QG9AYoB/wwAAyoBQDAA
AY0BawFGAe8B4QG9AYoB/wH6AesB0gH/AVABJwEOAf8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wFQAScBDgH/AeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AVABJwEOAf8BjQFrAUYB7wHhAb0BigH/AfoB6wHSAf8BUAEnAQ4B/wHhAb0BigH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AVABJwEOAf8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8BUAEnAQ4B/wGNAWsBRgHvAeEBvQGKAf8B+gHrAdIB/wFQAScBDgH/AeEBvQGKAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8BUAEnAQ4B/wHhAb0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wFQAScBDgH/DAADKgFAEAAB2wGWAQ0B/wHbAZYBDQH/AdsBlgENAf8B2wGW
AQ0B/wHbAZYBDQH/AdsBlgENAf8IAAGNAWsBRgHvAeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AVABJwEO
Af8B4QG9AYoB/wH6AesB0gH/Ad0BuQGHAf8BVgEtARQB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/wH6
AesB0gH/AfoB6wHSAf8BUAEnAQ4B/wH6AesB0gH/AY0BawFGAe8B4QG9AYoB/wH6AesB0gH/AfoB6wHS
Af8BUAEnAQ4B/wHhAb0BigH/AfoB6wHSAf8B3QG5AYcB/wFWAS0BFAH/AVABJwEOAf8B+gHrAdIB/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wFQAScBDgH/AfoB6wHSAf8BjQFrAUYB7wHhAb0BigH/AfoB6wHS
Af8B+gHrAdIB/wFQAScBDgH/AeEBvQGKAf8B+gHrAdIB/wHdAbkBhwH/AVYBLQEUAf8BUAEnAQ4B/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AVABJwEOAf8B+gHrAdIB/wwAAyoBQAQAAdsBlgEN
Af8B2wGWAQ0B/wHbAZYBDQH/AdsBlgENAf8QAAFiAV0BVAHACAABjQFrAUYB7wHhAb0BigH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AVABJwEOAf8B4QG9AYoB/wFQAScBDgH/AfoB6wHSAf8B5wHVAbwB/wHh
Ab0BigH/AfoB6wHSAf8B+gHrAdIB/wHhAb0BigH/AXQBUQE4Af8B+gHrAdIB/wGNAWsBRgHvAeEBvQGK
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8BUAEnAQ4B/wHhAb0BigH/AVABJwEOAf8B+gHrAdIB/wHn
AdUBvAH/AeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AeEBvQGKAf8BdAFRATgB/wH6AesB0gH/AY0BawFG
Ae8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wFQAScBDgH/AeEBvQGKAf8BUAEnAQ4B/wH6
AesB0gH/AecB1QG8Af8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B4QG9AYoB/wF0AVEBOAH/AfoB6wHS
Af8MAAMqAUAQAAHbAZYBDQH/AdsBlgENAf8B2wGWAQ0B/wHbAZYBDQH/AdsBlgENAf8B2wGWAQ0B/wgA
AY0BawFGAe8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8BUAEnAQ4B/wH6AesB0gH/AfoB6wHSAf8BUAEnAQ4B/wH6AesB0gH/
AfoB6wHSAf8BjQFrAUYB7wHhAb0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/wFQAScBDgH/
AfoB6wHSAf8B+gHrAdIB/wGNAWsBRgHvAeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AVABJwEOAf8B+gHrAdIB/wH6AesB0gH/
AVABJwEOAf8B+gHrAdIB/wH6AesB0gH/DAADKgFAMAABjQFrAUYB7wHhAb0BigH/AVABJwEOAf8B+gHr
AdIB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AdoBtgGEAf8BUAEnAQ4B/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wGNAWsBRgHvAeEBvQGKAf8BUAEn
AQ4B/wH6AesB0gH/AVABJwEOAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B2gG2AYQB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AY0BawFGAe8B4QG9
AYoB/wFQAScBDgH/AfoB6wHSAf8BUAEnAQ4B/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wHaAbYBhAH/AVABJwEOAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8IAAHb
AZYBDQH/AdsBlgENAf8B2wGWAQ0B/wHbAZYBDQH/CAAB2wGWAQ0B/wHbAZYBDQH/AdsBlgENAf8B2wGW
AQ0B/wHbAZYBDQH/AdsBlgENAf8IAAGNAWsBRgHvAeEBvQGKAf8BUAEnAQ4B/wHpAcwBoQH/AVABJwEO
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B9gHnAc4B/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AY0BawFGAe8B4QG9AYoB/wFQAScBDgH/AekBzAGh
Af8BUAEnAQ4B/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH2
AecBzgH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8BjQFrAUYB7wHhAb0BigH/AVABJwEO
Af8B6QHMAaEB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6
AesB0gH/AfYB5wHOAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wgAAdsBlgENAf8IAAFi
AV0BVAHAAdsBlgENAf8B2wGWAQ0B/wHbAZYBDQH/EAABYgFdAVQBwAgAAY0BawFGAe8B4QG9AYoB/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8BjQFrAUYB7wHh
Ab0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wGN
AWsBRgHvAeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6
AesB0gH/CAAB2wGWAQ0B/wHbAZYBDQH/AdsBlgENAf8B2wGWAQ0B/wgAAdsBlgENAf8B2wGWAQ0B/wHb
AZYBDQH/AdsBlgENAf8B2wGWAQ0B/wHbAZYBDQH/DAABqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZ
AQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/
AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8EAAGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGo
AVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEH
Af8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wQAAagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/
AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZ
AQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH//wD/AP8AAwABQgFNAT4HAAE+AwABKAMA
AUADAAEwAwABAQEAAQEFAAGAAQEWAAP/AQAC/wYAAfsB/wYAAfIB/wYAAeYB/wYAAcwB/wYAAcAB/wYA
AcABfwYAAaABHwYAAegBDwYAAfgBBwYAAf8BgQYAAf8B8AYAAf8B+AYAAv8GAAL/BgAC/wYADP8BvwH/
AfwBnwGAAQAB/AEfAc8B/wHzAWcCAAH7Ae8B9wH/Ae8B+wIAAfcB/wH7Av8B+wIAAvcB/QH/Ad8B/QIA
Af8B9wH+Af8B3wH9AgAB/wF/Af8BfwG/AfsCAAH/AX8B/wG/Ad8B/QIAAfcBewH/At8B/QIAAfsBfwH/
Ae8B/wH7AgAB/QF3Af8B9wHvAfsBgAEAAf8BzwH/AfsC9wX/AfsB/AGfBf8B/QH/AX8Z/wEDAYABAAGA
AQABgAEAAe8BewYAAe8BAwYAAe8B/wYAAe8BAwYAAegBewYAAe8BAwYAAe8B/wYAAcMBAwYAAdgBewYA
AcMBAwGAAQABgAEAAYABABj/Cw==
</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAIyAAAAEAIACoEgAAFgAAACgAAAAjAAAAQAAAAAEAIAAAAAAAgBEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAGyU0ZFdeafFscnz/bHJ8/2xyfP9scnz/bHJ8/2xyfP9scnz/bHJ8/2xyfP9scnz/bHJ8/2xy
fP9scnz/bHJ8/2xyfP9scnz/bHJ8/2xyfP9scnz/bHJ8/2xyfP9scnz/bHJ8/2xyfP9scnz/bHJ8/2xy
fP9scnz/bHJ8/1dfavUcJjRsAAAAABkjMgZbYWnz+fHY//nv0f/579H/+e/R//nv0f/579H/+e/R//nv
0f/579H/+e/R//nv0f/579H/+e/R//nv0f/579H/+e/R//nv0f/579H/+e/R//nv0f/579H/+e/R//nv
0f/579H/+e/R//nv0f/579H/+e/R//nv0f/579H/+vHX/19lbPcZIzIIGSQzCnBvZP/p2qj/QH6T/y6H
q/8th6v/Loer/2aLjv/15K7/9eSu//Tkrf/15K7/9eSu//Xjrf/15K7/9eSu//Xjrv/15K7/9eSt//Tj
rf/1463/9OSu//Tkrv/15K7/9OOt//Tjrf/15K7/9eSu//Tkrv/1467/9eSu//Tkrf/0467/cnJl/xki
Mg4ZJDMKcG9j/+fYp/9aiJb/Wpqy/1qasv9amrL/dpGQ//Xkrv/1467/9eSt//Xjrv/15K7/9eSt//Xk
rv/05K7/9eSt//Xkrv/1463/9OOt//Xkrv/05K3/9OOt//Xkrv/0463/9eOt//Xkrv/15K7/9OSu//Xj
rf/15K7/9OOt//Pjrf9xcGT/GSIyDhkkMwpwb2P/9OOt//Xkrv/15K7/9OOt//Tkrv/1467/9eSu//Xk
rv/05K3/9eSu//Tkrv/1463/9eSu//Tkrv/0463/9eSu//Tjrf/05K7/9eOu//Tkrf/0467/9eSu//Tj
rf/15K7/9eSu//Xjrf/05K7/9eSu//Xkrv/0463/cnJk/3FwZP8ZIjIOGSQzCnBvY//1463/9OSu//Xk
rv/15K3/9OSt//Tkrv/15K7/9eSu//Xkrf/15K7/9eSu//Xkrf/1467/9eSt//Xkrv/15K3/9eOt//Tk
rf/15K7/9OSt//Tkrv/15K7/9OOt//Tjrf/15K7/9eOu//Tkrv/1463/9eSu//Tjrf9qamD/cXBk/xki
Mg4ZJDMKcG9j//Tjrf/15K7/9eOu//Tjrf/05K3/9eSu//Xkrv/15K7/9OSt//Xkrv/15K7/9eOt//Xk
rv/15K7/9eOu//Xkrv/15K3/9OOt//Xjrf/05K7/9OSu//Xkrv/0463/9OOt//Xkrv/15K7/9OSu//Xj
rv/15K7/9OSt/2pqYP9xcGT/GSIyDhkkMwpwb2P/9OOt//Xkrv/15K7/9eSt//Tjrf/15K7/9eSu//Xj
rv/15K3/9eOu//Xkrv/15K3/9eSu//Tkrv/15K3/9eSu//Xjrf/0463/9eSu//Tkrf/0463/9eSu//Tj
rf/1463/9eSu//Xkrv/05K7/9eOt//Xkrv/0463/vbOP/3FwZP8ZIjIOGSQzCnBvY//0463/9eSu//Xk
rv/0463/9OSu//Xjrv/15K7/9eSu//Tkrf/15K7/9OSu//Xjrf/15K7/9OSu//Tjrf/15K7/9OOt//Tk
rv/1467/9OSt//Tjrv/15K7/9OOt//Xkrv/15K7/9eOt//Tkrv/15K7/9eSu//Tjrf92dGb/cXBk/xki
Mg4ZJDMKcG9j//Xjrf/05K7/9eSu//Xkrf/05K3/9OSu//Xkrv/15K7/9eSt//Xkrv/15K7/9eSt//Xj
rv/15K3/9eSu//Xkrf/1463/9OSt//Xkrv/05K3/9OSu//Xkrv/0463/9OOt//Xkrv/1467/9OSu//Xj
rf/15K7/9OOt/8/CmP9xcGT/GSIyDhkkMwpwb2P/9OOt//Xkrv/1467/9OOt//Tkrf/15K7/9eSu//Xk
rv/05K3/9eSu//Xkrv/1463/8+Ks/5CMdf90c2b/dHNm/3RzZv+Gg3D/796q//Tkrv/05K7/9eSu//Tj
rf/0463/9eSu//Xkrv/05K7/9eOu//Xkrv/05K3/9OOu/3FwZP8ZIjIOGSQzCnBvY//0463/9eSu//Xk
rv/15K3/9OOt//Xkrv/15K7/9eOu//Xkrf/1467/9eSu//Xkrf/VyJz/S0KD/4lp6P+Jaej/iWno/1hL
mf/EuZL/9OSt//Tjrf/15K7/9OOt//Xjrf/15K7/9eSu//Tkrv/1463/9eSu//Tjrf/05K7/cXBk/xki
Mg4ZJDMKcG9j//Tjrf/15K7/9eSu//Tjrf/05K7/9eOu//Xkrv/15K7/9OSt//Xkrv/05K7/9eOt/9DE
mf9TSpD/lnn+/5R3+/+WeP7/Y1Wq/8K3kf/05K3/9OOu//Xkrv/0463/9eSu//Xkrv/1463/9OSu//Xk
rv/15K7/9OOt//Tkrv9xcGT/GSIyDhkkMwpwb2L/9OOs//TjrP/046z/9OOs//TjrP/046z/9OOs//Tj
rP/046z/9OOs//TjrP/046z/0MOX/1NKkP+Xef//Mk16/4tx7P9jVar/wreQ//TjrP/046z/9OOs//Tj
rP/046z/9OOs//TjrP/046z/9OOs//TjrP/046z/9OOs/3FwY/8ZIjIOGSMyPlVVQ/+woVv/sKFb/7Ch
W/+woVv/sKFb/7ChW/+woVv/sKFb/7ChW/+woVv/sKFb/7ChW/+XjFT/U0qQ/5d5/v8oVHv/h27m/2NV
qv+NhFL/sKFb/7ChW/+woVv/sKFb/7ChW/+woVv/sKFb/7ChW/+woVv/sKFb/7ChW/+woVv/WVlE/xkj
MkJCRTz/iH9N/4h/Tf+If03/iH9N/4h/Tf+If03/iH9N/4h/Tf+If03/iH9N/4h/Tf+If03/iH9N/3Vw
Sf9TSpD/cGbK/x6Drv9iY7z/Y1Wq/25qR/+If03/iH9N/4h/Tf+If03/iH9N/4h/Tf+If03/iH9N/4h/
Tf+If03/iH9N/4h/Tf+If03/REc9/2dnWf/ZyY//wLOC/8K1g//u3Jv/w7aD/8u9h//w3p3/8N6d//De
nf/w3p3/8N6d//Denf/w3p3/zL+L/1NKkP9Uc6//K8X3/05/tf9jVar/v7OE//Denf/w3p3/8N6d//De
nf/w3p3/8N6d//Denf/w3p3/8N6d//Denf/w3p3/8N6d//Denf9paFn/aGhf/8W6k/+blXv/npd9/+7e
qv+el33/rKSF//Tkrv/15K7/9eSu//Xkrf/15K7/9eSu//Xkrf/QxJn/U0qQ/4Jr2v+Hf7j/gWzW/2NV
qv/Ct5H/9OSt//Tkrv/15K7/9OOt//Tjrf/15K7/9eOu//Tkrv/1463/9eSu//Tjrf/15K7/9OOt/2lp
X/9oaF//9eSu//Tjrf/15K7/9eOu//Tjrf/05K3/9eSu//Xkrv/15K7/9OSt//Xkrv/15K7/9eOt/9DE
mf9VTZH/mHv+/5h7//+Ye///ZVir/8K3kf/05K7/9OSu//Xkrv/0463/9OOt//Xkrv/15K7/9OSu//Xj
rv/15K7/9OSt//Tjrv/15K7/aWlf/2hoX//15K7/9OOt//Xkrv/15K7/9eSt//Tjrf/15K7/9eSu//Xj
rv/15K3/9eOu//Xkrv/15K3/6Nmn/1RZX/9pbnz/aW58/2lufP9SWGH/282f//Tkrf/0463/9eSu//Tj
rf/1463/9eSu//Xkrv/05K7/9eOt//Xkrv/0463/9OSu//Tjrv9paV//aGhf//Xkrv/0463/9eSu//Xk
rv/0463/9OSu//Xjrv/15K7/9eSu//Tkrf/15K7/9OSu//Xjrf/15K7/9OSu//Tjrf/15K7/9OOt//Tk
rv/1467/9OSt//Tjrv/15K7/9OOt//Xkrv/15K7/9eOt//Tkrv/15K7/9eSu//Tjrf/05K7/9OSu/2lp
X/9oaF//9OSu//Xjrf/05K7/9eSu//Xkrf/05K3/9OSu//Xkrv/15K7/9eSt//Xkrv/15K7/9eSt//Xj
rv/15K3/9eSu//Xkrf/1463/9OSt//Xkrv/05K3/9OSu//Xkrv/0463/9OOt//Xkrv/1467/9OSu//Xj
rf/15K7/9OOt//Xkrv/0463/aWlf/2lqYv/15K7/9OOt//Xkrv/1467/9OOt//Tkrf/15K7/9eSu//Xk
rv/05K3/9eSu//Xkrv/1463/9eSu//Xkrv/1467/9eSu//Xkrf/0463/9eOt//Tkrv/05K7/9eSu//Tj
rf/0463/9eSu//Xkrv/05K7/9eOu//Xkrv/05K3/9OOu//Xkrv9rbGT/Q0tX4fDs3v/79eH/+/Xh//v1
4f/79eH/+/Xh//v14f/79eH/+/Xh//v14f/79eH/+/Xh//v14f/79eH/+/Xh//v14f/79eH/+/Xh//v1
4f/79eH/+/Xh//v14f/79eH/+/Xh//v14f/79eH/+/Xh//v14f/79eH/+/Xh//v14f/79eH/8+7g/0hP
W+UZIzM0KjNBtz9IVMk/SFTJP0hUyT9IVMk/SFTJP0hUyTlFU/M3WXL/OkNQ6T9HVMs/R1TLP0dUyz9H
VMs/R1TLP0dUyz9HVMs/R1TLP0dUyz9HVMs/R1TLP0dUyz9HVMs6Q0/pN1lx/zhFVPU/SFTJP0hUyT9I
VMk/SFTJP0hUyT9IVMkqM0G5GSMzNgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGjRIyRu3
7f8aJDOZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoj
M5cbseb/Gj1TzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAaNEjJG7nu/xokM5kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAGSQzlxuz5v8aPVPNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABo0R8kbue7/GiQzmwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaJDOXG7Xo/xo7UM0AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGig4rR25
7P8aOU7XGiQzBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGSMyBho2
Ss8duu7/Gio7swAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAZJDNcOo+v/xuTwP8ZMUbBGSMyhRokM4MZIzKDGiMzgxokM4MaJDODGiQzgxoj
M4MZIzODGSQzgxkjMoUZMEW/G5C7/zyUtf8aJDNiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkjMgQtN0W7cbHI/0zC7v8xqNj/MKbX/zCm
1/8wptf/MKbX/zCm1/8wptf/MKbX/zCm1/8wptf/MafX/0vB7v9xs8v/LzpHvxkjMgYAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkk
MgoeKDeHUlll5Wlxe/1qcnz/anJ8/2pyfP9qcnz/anJ8/2pyfP9qcnz/anJ8/2pyfP9qcXv9U1pm5x8o
N4kZIzIKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAGAAAACAAAAAIAAAAIAA
AAAgAAAAgAAAACAAAACAAAAAIAAAAIAAAAAgAAAAgAAAACAAAACAAAAAIAAAAIAAAAAgAAAAgAAAACAA
AACAAAAAIAAAAIAAAAAgAAAAgAAAACAAAACAAAAAIAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAACAA
AAD/H/8f4AAAAP8f/x/gAAAA/x//H+AAAAD/H/8f4AAAAP+AAD/gAAAA/4AAP+AAAAD/wAB/4AAAAA==
</value>
</data>
</root>

View File

@@ -0,0 +1,195 @@
/*
* ==============================================================================
*
* Filename: OperateJob
* Description:
*
* Version: 1.0
* Created: 2021/2/25 15:23:31
*
* Author: liu.wenjie
*
* ==============================================================================
*/
using CommonMethods;
using Logger;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ToolLib.VisionJob
{
public class OperateProject
{
private static OperateProject _instance;
private static readonly object lockObject = new object();
private OperateProject() { }
/// <summary>
/// 操作者单例模式调用
/// </summary>
public static OperateProject Instance
{
get
{
if (_instance == null)
{
lock (lockObject)
{
if (_instance == null)
{
_instance = new OperateProject();
}
}
}
return _instance;
}
}
public void CreateNewJob(string jobName = "newJob", bool newAddJob = true)
{
TabPage newTab = new TabPage(jobName);
newTab.Controls.Add(new TreeView());
FormJobManage.Instance.tabJobUnion.TabPages.Add(newTab);
if(newAddJob)
{
VisionJobParams.pVisionProject.Project.Add(jobName, new VisionJob(jobName));
}
InitJob(VisionJobParams.pVisionProject.Project[jobName]);
}
public void SaveJob()
{
// Serialize.BinarySerialize($"{VisionJobParams.sSysConfigPath}Vision.prj" , VisionJobParams.myProject);
//SaveFileDialog saveFileDialog = new SaveFileDialog();
//saveFileDialog.Title = "请指定项目保存路径";
//saveFileDialog.Filter = "项目文件|*.pjt";
//saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
//if (saveFileDialog.ShowDialog() == DialogResult.OK)
//{
// try
// {
// Serialize.BinarySerialize(saveFileDialog.FileName, VisionJobParams.myProject);
// LoggerClass.WriteLog("项目保存成功");
// }
// catch (Exception ex)
// {
// LoggerClass.WriteLog("项目保存失败", ex);
// }
//}
}
public void InitJob(VisionJob myJob)
{
myJob.GetJobTree().Dock = DockStyle.Fill;
myJob.GetJobTree().ImageList = FormToolBox.Instance.imageListTool;
myJob.GetJobTree().Font = new Font("微软雅黑", 9, FontStyle.Bold);
myJob.GetJobTree().Scrollable = true;
myJob.GetJobTree().ItemHeight = 20;
myJob.GetJobTree().ShowLines = false;
myJob.GetJobTree().AllowDrop = true;
//myTreeView.ImageList = Job.imageList;
// 在窗体UI出现变化时更新画线
myJob.GetJobTree().AfterSelect += myJob.tvw_job_AfterSelect;
myJob.GetJobTree().ChangeUICues += myJob.MyJobTreeView_ChangeUICues;
FormJobManage.Instance.SizeChanged += myJob.tbc_jobs_SelectedIndexChanged;
//节点间拖拽
myJob.GetJobTree().ItemDrag += new ItemDragEventHandler(myJob.TvwJob_ItemDrag);
myJob.GetJobTree().DragEnter += new DragEventHandler(myJob.TvwJob_DragEnter);
myJob.GetJobTree().DragDrop += new DragEventHandler(myJob.TvwJob_DragDrop);
//以下事件为画线事件
myJob.GetJobTree().MouseMove += myJob.DrawLineWithoutRefresh;
myJob.GetJobTree().AfterExpand += myJob.Draw_Line;
myJob.GetJobTree().AfterCollapse += myJob.Draw_Line;
// 在流程节点上操作时
myJob.GetJobTree().MouseDoubleClick += TreeViewJob_DoubleClick; ;
myJob.GetJobTree().MouseClick += myJob.tvw_job_MouseClick;
Application.DoEvents();
if (myJob.GetJobTree().Nodes.Count > 0)
{
//默认选中第一个工具节点
myJob.GetJobTree().SelectedNode = myJob.GetJobTree().Nodes[0];
}
//展开已默认添加的工具的输入输出项
myJob.GetJobTree().ExpandAll();
}
public void InitJob(Dictionary<string, VisionJob> myProject, string jobName)
{
myProject[jobName].GetJobTree().Dock = DockStyle.Fill;
myProject[jobName].GetJobTree().ImageList = FormToolBox.Instance.imageListTool;
myProject[jobName].GetJobTree().Font = new Font("微软雅黑", 9, FontStyle.Bold);
myProject[jobName].GetJobTree().Scrollable = true;
myProject[jobName].GetJobTree().ItemHeight = 20;
myProject[jobName].GetJobTree().ShowLines = false;
myProject[jobName].GetJobTree().AllowDrop = true;
//myTreeView.ImageList = Job.imageList;
// 在窗体UI出现变化时更新画线
myProject[jobName].GetJobTree().AfterSelect += myProject[jobName].tvw_job_AfterSelect;
myProject[jobName].GetJobTree().ChangeUICues += myProject[jobName].MyJobTreeView_ChangeUICues;
FormJobManage.Instance.SizeChanged += myProject[jobName].tbc_jobs_SelectedIndexChanged;
//节点间拖拽
myProject[jobName].GetJobTree().ItemDrag += new ItemDragEventHandler(myProject[jobName].TvwJob_ItemDrag);
myProject[jobName].GetJobTree().DragEnter += new DragEventHandler(myProject[jobName].TvwJob_DragEnter);
myProject[jobName].GetJobTree().DragDrop += new DragEventHandler(myProject[jobName].TvwJob_DragDrop);
//以下事件为画线事件
myProject[jobName].GetJobTree().MouseMove += myProject[jobName].DrawLineWithoutRefresh;
myProject[jobName].GetJobTree().AfterExpand += myProject[jobName].Draw_Line;
myProject[jobName].GetJobTree().AfterCollapse += myProject[jobName].Draw_Line;
// 在流程节点上操作时
myProject[jobName].GetJobTree().MouseDoubleClick += TreeViewJob_DoubleClick; ;
myProject[jobName].GetJobTree().MouseClick += myProject[jobName].tvw_job_MouseClick;
Application.DoEvents();
if(myProject[jobName].GetJobTree().Nodes.Count > 0)
{
//默认选中第一个工具节点
myProject[jobName].GetJobTree().SelectedNode = myProject[jobName].GetJobTree().Nodes[0];
}
//展开已默认添加的工具的输入输出项
myProject[jobName].GetJobTree().ExpandAll();
}
/// <summary>
/// TreeView双击
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public static void TreeViewJob_DoubleClick(object sender, MouseEventArgs e)
{
//判断是否在节点上双击
object toolClass = new object();
string jobName = FormJobManage.Instance.tabJobUnion.SelectedTab.Text;
TreeViewHitTestInfo test = VisionJobParams.pVisionProject.Project[jobName].GetJobTree().HitTest(e.X, e.Y);
TreeNode selectNode = test.Node.Level == 0 ? test.Node : test.Node.Parent;
selectNode.ExpandAll();
for (int i = 0; i < VisionJobParams.pVisionProject.Project[jobName].L_toolList.Count; i++)
{
if (selectNode.Text == VisionJobParams.pVisionProject.Project[jobName].L_toolList[i].toolName)
{
string AssemblyName = VisionJobParams.pVisionProject.Project[jobName].L_toolList[i].FormToolName.Split('.')[0];
string className = VisionJobParams.pVisionProject.Project[jobName].L_toolList[i].FormToolName;
toolClass = VisionJobParams.pVisionProject.Project[jobName].L_toolList[i];
IToolInfo.FormTool = (Form)Assembly.Load(AssemblyName).CreateInstance(className, false, BindingFlags.Default, null, new object[] { toolClass }, null, null);
IToolInfo.FormTool.ShowDialog();
//VisionJobParams.myProject[jobName].L_toolList[i].SetFormTool(IToolInfo.FormTool);
//VisionJobParams.myProject[jobName].L_toolList[i].GetFormTool().ShowDialog();
//VisionJobParams.myProject[jobName].L_toolList[i].FormTool = (Form)Assembly.Load(AssemblyName).CreateInstance(className, false, BindingFlags.Default, null, new object[] { toolClass }, null, null);
//VisionJobParams.myProject[jobName].L_toolList[i].FormTool.ShowDialog();
}
}
}
}
}

View File

@@ -0,0 +1,163 @@
/*
* ==============================================================================
*
* Filename: OperateTreeView
* Description:
*
* Version: 1.0
* Created: 2021/2/26 10:09:32
*
* Author: liu.wenjie
*
* ==============================================================================
*/
using CommonMethods;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using VisionJobFactory;
namespace ToolLib.VisionJob
{
public class OperateTreeView
{
private static OperateTreeView _instance;
private static readonly object lockObject = new object();
/// <summary>
/// 禁止直接生成
/// </summary>
private OperateTreeView(){}
/// <summary>
/// 操作者单例模式调用
/// </summary>
public static OperateTreeView Instance
{
get
{
if(_instance == null)
{
lock (lockObject)
{
if(_instance == null)
{
return _instance = new OperateTreeView();
}
}
}
return _instance;
}
}
/// <summary>
/// 获取当前流程所对应的流程树对象
/// </summary>
/// <param name="jobName">流程名</param>
/// <returns>流程树控件对象</returns>
public static TreeView GetJobTree(string jobName)
{
try
{
foreach (var myJob in VisionJobParams.pVisionProject.Project)
{
if(myJob.Value.JobName == jobName)
{
return myJob.Value.GetJobTree();
}
}
return new TreeView();
}
catch (Exception ex)
{
Logger.LoggerClass.WriteLog("获取JobTree时出错", ex);
return new TreeView();
}
}
/// <summary>
/// 向流程中添加工具,需要根据选择的工具名对工具类型等进行判断
/// </summary>
/// <param name="tool">工具类型</param>
/// <param name="isInsert">插入位置,当为-1时表示在末尾插入当不为-1时表示被插入的工具索引</param>
public void Add_Tool(ToolType tool, bool newAddTool = true, int insertPos = -1, int imageKey = 0)
{
string jobName = FormJobManage.Instance.tabJobUnion.SelectedTab.Text;
string toolName = GetNewToolName(jobName, tool.ToString());
IToolInfo insertTool = VisionToolFactory.CreateToolVision(tool, toolName);
TreeNode insertNode = new TreeNode();
insertNode = GetJobTree(jobName).Nodes.Add("", insertTool.toolName, (int)tool, (int)tool); // 该工具对应的节点
// 判断节点是否添加默认输入输出图
// 输入
for (int i = 0; i < insertTool.toolInput.Count; i++)
{
TreeNode childrenInputNode = insertNode.Nodes.Add("<--" + insertTool.toolInput[i].IOName);
childrenInputNode.Tag = insertTool.toolInput[i].ioType;
childrenInputNode.ForeColor = Color.DarkMagenta;
}
// 输出
for (int i = 0; i < insertTool.toolOutput.Count; i++)
{
TreeNode childrenOutputNode = insertNode.Nodes.Add("-->" + insertTool.toolOutput[i].IOName);
childrenOutputNode.Tag = insertTool.toolOutput[i].ioType;
childrenOutputNode.ForeColor = Color.Blue;
}
insertNode.Expand();
if(newAddTool)
{
VisionJobParams.pVisionProject.Project[jobName].L_toolList.Add(insertTool);
}
}
internal string GetNewToolName(string jobName, string toolType)
{
try
{
if (!TreeView_Contains_Key(jobName, toolType))
{
return toolType;
}
for (int i = 1; i < 101; i++)
{
if (!TreeView_Contains_Key(jobName, toolType + "_" + i))
{
return toolType + "_" + i;
}
}
Logger.LoggerClass.WriteLog("此工具已添加个数已达到数量上限,无法继续添加", true);
return "Error";
}
catch (Exception ex)
{
Logger.LoggerClass.WriteLog("添加出错!", ex);
return "Error";
}
}
/// <summary>
/// 判断TreeView是否已经包含某节点
/// </summary>
/// <param name="key">节点文本</param>
/// <returns>是否包含</returns>
private bool TreeView_Contains_Key(string jobName, string key)
{
try
{
foreach (TreeNode node in VisionJobParams.pVisionProject.Project[jobName].GetJobTree().Nodes)
{
if (node.Text == key)
return true;
}
return false;
}
catch (Exception ex)
{
Logger.LoggerClass.WriteLog("TreeView_Contains_Key 函数出错", ex);
return false;
}
}
}
}

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("ToolLib.VisionJob")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ToolLib.VisionJob")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
//将 ComVisible 设置为 false 将使此程序集中的类型
//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("16e8ff17-98a8-4452-ab9e-c433dc9c21f7")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”: :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace ToolLib.VisionJob.Properties {
using System;
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ToolLib.VisionJob.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 使用此强类型资源类,为所有资源查找
/// 重写当前线程的 CurrentUICulture 属性。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@@ -0,0 +1,120 @@
<?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">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,116 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{16E8FF17-98A8-4452-AB9E-C433DC9C21F7}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ToolLib.VisionJob</RootNamespace>
<AssemblyName>ToolLib.VisionJob</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="DevComponents.DotNetBar2, Version=14.0.0.15, Culture=neutral, PublicKeyToken=c39c3242a43eee2b, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>C:\Program Files (x86)\DotNetBar for Windows Forms\DevComponents.DotNetBar2.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="WeifenLuo.WinFormsUI.Docking">
<HintPath>..\..\..\..\优秀待学习源码\VM Pro 20200701.0.1.6\VM Pro 20200701.0.1.6\VisionAndMotion\bin\Debug\WeifenLuo.WinFormsUI.Docking.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="FormJobManage.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FormJobManage.Designer.cs">
<DependentUpon>FormJobManage.cs</DependentUpon>
</Compile>
<Compile Include="FormToolBox.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FormToolBox.Designer.cs">
<DependentUpon>FormToolBox.cs</DependentUpon>
</Compile>
<Compile Include="OperateProject.cs" />
<Compile Include="OperateTreeView.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="VisionJob.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="VisionJobParams.cs" />
<Compile Include="VisionProject.cs" />
<Compile Include="VisionToolFactory.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\CommonMethods\CommonHelper.csproj">
<Project>{1c8d0ddc-2086-48a9-9586-f2b643e2fc54}</Project>
<Name>CommonHelper</Name>
</ProjectReference>
<ProjectReference Include="..\DataStruct\DataStruct.csproj">
<Project>{df3d4d4c-02df-4f92-9fd4-0a861f64b0ef}</Project>
<Name>DataStruct</Name>
</ProjectReference>
<ProjectReference Include="..\ToolLib.Log\LogForm\LogForm.csproj">
<Project>{6b38d68f-e77b-4761-bde5-a261ea8925dd}</Project>
<Name>LogForm</Name>
</ProjectReference>
<ProjectReference Include="..\ToolLib.Log\Logger\Logger.csproj">
<Project>{d4e052b9-e541-4b67-a1f9-273073ef1d4b}</Project>
<Name>Logger</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="FormJobManage.resx">
<DependentUpon>FormJobManage.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FormToolBox.resx">
<DependentUpon>FormToolBox.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@@ -0,0 +1,737 @@
using CommonMethods;
using CommonMethods.Interface;
using Logger;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ToolLib.VisionJob
{
[Serializable]
public class VisionJob : IVisionJob
{
[Serializable]
public delegate void CreateLineDelegate(TreeView inputTreeView, TreeNode startNode, TreeNode endNode);
CreateLineDelegate createLineDelegateFun;
public VisionJob(string jobName)
{
this.JobName = jobName;
createLineDelegateFun = new CreateLineDelegate(CreateLine);
}
/// <summary>
/// 获取当前流程所对应的流程树对象
/// </summary>
/// <param name="jobName">流程名</param>
/// <returns>流程树控件对象</returns>
public TreeView GetJobTree(string jobName)
{
try
{
for (int i = 0; i < FormJobManage.Instance.tabJobUnion.TabCount; i++)
{
if (FormJobManage.Instance.tabJobUnion.TabPages[i].Text == jobName)
{
return (TreeView)(FormJobManage.Instance.tabJobUnion.TabPages[i].Controls[0]);
}
}
return new TreeView();
}
catch (Exception ex)
{
LoggerClass.WriteLog("获取流程树对象时出错!",ex);
return new TreeView();
}
}
/// <summary>
/// 获取当前流程所对应的流程树对象
/// </summary>
/// <param name="jobName">流程名</param>
/// <returns>流程树控件对象</returns>
public TreeView GetJobTree()
{
try
{
for (int i = 0; i < FormJobManage.Instance.tabJobUnion.TabCount; i++)
{
if (FormJobManage.Instance.tabJobUnion.TabPages[i].Text == JobName)
{
return (TreeView)(FormJobManage.Instance.tabJobUnion.TabPages[i].Controls[0]);
}
}
return new TreeView();
}
catch (Exception ex)
{
LoggerClass.WriteLog("获取流程树对象时出错!", ex);
return new TreeView();
}
}
/// <summary>
/// 拖动工具节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void TvwJob_ItemDrag(object sender, ItemDragEventArgs e)//左键拖动
{
try
{
if (((TreeView)sender).SelectedNode != null)
{
if (((TreeView)sender).SelectedNode.Level == 1) //输入输出不允许拖动
{
GetJobTree().DoDragDrop(e.Item, DragDropEffects.Move);
}
else if (e.Button == MouseButtons.Left)
{
GetJobTree().DoDragDrop(e.Item, DragDropEffects.Move);
}
}
}
catch (Exception ex)
{
Logger.LoggerClass.WriteLog("拖动节点出错 ", ex);
}
}
/// <summary>
/// 节点拖动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void TvwJob_DragEnter(object sender, DragEventArgs e)
{
try
{
if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode"))
{
e.Effect = DragDropEffects.Move;
}
else
{
e.Effect = DragDropEffects.None;
}
}
catch (Exception ex)
{
Logger.LoggerClass.WriteLog("节点拖动出错,描述: ", ex);
}
}
/// <summary>
/// 释放被拖动的节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void TvwJob_DragDrop(object sender, DragEventArgs e)//拖动
{
try
{
//获得拖放中的节点
TreeNode moveNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
//根据鼠标坐标确定要移动到的目标节点
System.Drawing.Point pt;
TreeNode targeNode; // 目标节点
pt = ((TreeView)(sender)).PointToClient(new System.Drawing.Point(e.X, e.Y));
targeNode = GetJobTree().GetNodeAt(pt);
//如果目标节点无子节点则添加为同级节点,反之添加到下级节点的未端
if (moveNode == targeNode) //若是把自己拖放到自己,不可,返回
return;
if (targeNode == null) //目标节点为null就是把节点拖到了空白区域不可直接返回
return;
if (moveNode.Level == 1 && targeNode.Level == 1 && moveNode.Parent == targeNode.Parent) //都是输入输出节点,内部拖动排序
{
moveNode.Remove();
targeNode.Parent.Nodes.Insert(targeNode.Index, moveNode);
return;
}
if (moveNode.Level == 0) // 被拖动的是子节点,也就是工具节点
{
if (targeNode.Level == 0) // 目标也是工具节点
{
moveNode.Remove();
GetJobTree().Nodes.Insert(targeNode.Index, moveNode);
IToolInfo temp = new IToolInfo();
for (int i = 0; i < L_toolList.Count; i++)
{
if (L_toolList[i].toolName == moveNode.Text)
{
SwapDataFun(L_toolList, i, targeNode.Index);
break;
}
}
}
else
{
// 目标是子节点,则移动到该子节点的父节点的下一个节点上
moveNode.Remove();
GetJobTree().Nodes.Insert(targeNode.Parent.Index + 1, moveNode);
for (int i = 0; i < L_toolList.Count; i++)
{
if (L_toolList[i].toolName == moveNode.Text)
{
SwapDataFun(L_toolList, i, targeNode.Parent.Index);
break;
}
}
}
}
else //被拖动的是输入输出节点
{
if (targeNode.Level == 0 && GetToolInfoByToolName(targeNode.Text).toolType == ToolType.Output)
{
// 如果目标节点是工具节点,并且工具节点类型为可接收输入的节点,则直接将输出添加,先不考虑该情况
//string result = moveNode.Parent.Text + " . -->" + moveNode.Text.Substring(3);
//GetToolInfoByToolName(jobName, targeNode.Text).input.Add(new ToolIO("<--" + result, "", DataType.String));
//TreeNode node = targeNode.Nodes.Add("", "<--" + result, 26, 26);
//node.ForeColor = Color.DarkMagenta;
//D_itemAndSource.Add(node, moveNode);
//targeNode.Expand();
//DrawLine();
return;
}
else if (targeNode.Level == 0)
return;
//连线前首先要判断被拖动节点是否为输出项,目标节点是否为输入项
if (moveNode.Text.Substring(0, 3) != "-->" || targeNode.Text.Substring(0, 3) != "<--")
{
Logger.LoggerClass.WriteLog("拖动类型不匹配!");
return;
}
//连线前要判断被拖动节点和目标节点的数据类型是否一致
if ((DataType)moveNode.Tag != (DataType)targeNode.Tag)
{
Logger.LoggerClass.WriteLog("被拖动节点和目标节点数据类型不一致,不可关联");
return;
}
string input = targeNode.Text;
if (input.Contains("《")) //表示已经连接了源
input = Regex.Split(input, "《")[0];
else //第一次连接源就需要添加到输入输出集合
D_itemAndSource.Add(targeNode, moveNode);
GetToolInfoByToolName(targeNode.Parent.Text).GetInput(input.Substring(3)).value = "《- " + moveNode.Parent.Text + " . " + moveNode.Text.Substring(3);
targeNode.Text = input + "《- " + moveNode.Parent.Text + " . " + moveNode.Text.Substring(3);
DrawLine();
//移除拖放的节点
if (moveNode.Level == 0)
moveNode.Remove();
}
//更新当前拖动的节点选择
GetJobTree().SelectedNode = moveNode;
//展开目标节点,便于显示拖放效果
targeNode.Expand();
}
catch (Exception ex)
{
Logger.LoggerClass.WriteLog("释放节点出错,原因: ", ex);
}
}
private static Graphics graph;
/// <summary>
/// 绘制输入输出指向线
/// </summary>
/// <param name="obj"></param>
public void DrawLine()
{
try
{
if (!isDrawing)
{
isDrawing = true;
Thread th = new Thread(() =>
{
GetJobTree().MouseWheel += new MouseEventHandler(CancelUpDowm_MouseWheel); //划线的时候不能滚动,否则画好了线,结果已经滚到其它地方了
maxLength = 150;
colValueAndColor.Clear();
startNodeAndColor.Clear();
list.Clear();
TreeView tree = GetJobTree();
graph = tree.CreateGraphics();
tree.CreateGraphics().Dispose();
foreach (KeyValuePair<TreeNode, TreeNode> item in D_itemAndSource)
{
// 将此划线线程委托到JOB管理界面
FormJobManage.Instance.Invoke(createLineDelegateFun, new object[] { tree, item.Key, item.Value });
}
Application.DoEvents();
GetJobTree().MouseWheel -= new MouseEventHandler(CancelUpDowm_MouseWheel);
isDrawing = false;
});
th.IsBackground = true;
//th.ApartmentState = ApartmentState.STA;
th.Start();
}
}
catch (Exception ex)
{
}
}
public void CancelUpDowm_MouseWheel(object sender, MouseEventArgs e)
{
HandledMouseEventArgs h = e as HandledMouseEventArgs;
if (h != null)
{
h.Handled = true;
}
}
#region 线
public void tvw_job_AfterSelect(object sender, TreeViewEventArgs e)
{
nodeTextBeforeEdit = GetJobTree().SelectedNode.Text;
}
public void Draw_Line(object sender, TreeViewEventArgs e)
{
GetJobTree().Refresh();
DrawLine();
}
public void tbc_jobs_SelectedIndexChanged(object sender, EventArgs e)
{
GetJobTree().Refresh();
DrawLine();
}
public void DrawLineWithoutRefresh(object sender, MouseEventArgs e)
{
GetJobTree().Update();
DrawLine();
}
public void MyJobTreeView_ChangeUICues(object sender, UICuesEventArgs e)
{
GetJobTree().Update();
DrawLine();
}
#endregion
public void tvw_job_MouseClick(object sender, MouseEventArgs e)
{
//判断是否在节点单击
TreeViewHitTestInfo test = GetJobTree().HitTest(e.X, e.Y);
if (e.Button == MouseButtons.Right && test.Node.Level == 1)
{
GetJobTree().ContextMenuStrip = rightClickMenu;
rightClickMenu.Items.Clear();
if (test.Node.Text.Contains("《"))
{
rightClickMenu.Items.Add("删除连线");
rightClickMenu.Items[0].Click += DeleteLine;
}
}
}
/// <summary>
/// 画Treeview控件两个节点之间的连线
/// </summary>
/// <param name="treeview">要画连线的Treeview</param>
/// <param name="startNode">结束节点</param>
/// <param name="endNode">开始节点</param>
private void CreateLine(TreeView treeview, TreeNode endNode, TreeNode startNode)
{
try
{
//得到起始与结束节点之间所有节点的最大长度,保证画线不穿过节点
int startNodeParantIndex = startNode.Parent.Index;
int endNodeParantIndex = endNode.Parent.Index;
int startNodeIndex = startNode.Index;
int endNodeIndex = endNode.Index;
int max = 0;
if (!startNode.Parent.IsExpanded)
{
max = startNode.Parent.Bounds.X + startNode.Parent.Bounds.Width;
}
else
{
for (int i = startNodeIndex; i < startNode.Parent.Nodes.Count - 1; i++)
{
if (max < treeview.Nodes[startNodeParantIndex].Nodes[i].Bounds.X + treeview.Nodes[startNodeParantIndex].Nodes[i].Bounds.Width)
max = treeview.Nodes[startNodeParantIndex].Nodes[i].Bounds.X + treeview.Nodes[startNodeParantIndex].Nodes[i].Bounds.Width;
}
}
for (int i = startNodeParantIndex + 1; i < endNodeParantIndex; i++)
{
if (!treeview.Nodes[i].IsExpanded)
{
if (max < treeview.Nodes[i].Bounds.X + treeview.Nodes[i].Bounds.Width)
max = treeview.Nodes[i].Bounds.X + treeview.Nodes[i].Bounds.Width;
}
else
{
for (int j = 0; j < treeview.Nodes[i].Nodes.Count; j++)
{
if (max < treeview.Nodes[i].Nodes[j].Bounds.X + treeview.Nodes[i].Nodes[j].Bounds.Width)
max = treeview.Nodes[i].Nodes[j].Bounds.X + treeview.Nodes[i].Nodes[j].Bounds.Width;
}
}
}
if (!endNode.Parent.IsExpanded)
{
if (max < endNode.Parent.Bounds.X + endNode.Parent.Bounds.Width)
max = endNode.Parent.Bounds.X + endNode.Parent.Bounds.Width;
}
else
{
for (int i = 0; i < endNode.Index; i++)
{
if (max < treeview.Nodes[endNodeParantIndex].Nodes[i].Bounds.X + treeview.Nodes[endNodeParantIndex].Nodes[i].Bounds.Width)
max = treeview.Nodes[endNodeParantIndex].Nodes[i].Bounds.X + treeview.Nodes[endNodeParantIndex].Nodes[i].Bounds.Width;
}
}
max += 10; //箭头不能连着 节点,
if (!startNode.Parent.IsExpanded)
startNode = startNode.Parent;
if (!endNode.Parent.IsExpanded)
endNode = endNode.Parent;
if (endNode.Bounds.X + endNode.Bounds.Width + 20 > max)
max = endNode.Bounds.X + endNode.Bounds.Width + 20;
if (startNode.Bounds.X + startNode.Bounds.Width + 20 > max)
max = startNode.Bounds.X + startNode.Bounds.Width + 20;
//判断是否可以在当前处划线
foreach (KeyValuePair<int, Dictionary<TreeNode, TreeNode>> item in list)
{
if (Math.Abs(max - item.Key) < 15)
{
foreach (KeyValuePair<TreeNode, TreeNode> item1 in item.Value)
{
if (startNode != item1.Value)
{
if ((item1.Value.Bounds.X < maxLength && item1.Key.Bounds.X < maxLength) || (item1.Value.Bounds.X < maxLength && item1.Key.Bounds.X < maxLength))
{
max += (15 - Math.Abs(max - item.Key));
}
}
}
}
}
Dictionary<TreeNode, TreeNode> temp = new Dictionary<TreeNode, TreeNode>();
temp.Add(endNode, startNode);
if (!list.ContainsKey(max))
list.Add(max, temp);
else
list[max].Add(endNode, startNode);
if (!startNodeAndColor.ContainsKey(startNode))
startNodeAndColor.Add(startNode, color[startNodeAndColor.Count]);
Pen pen = new Pen(startNodeAndColor[startNode], 1);
Brush brush = new SolidBrush(startNodeAndColor[startNode]);
graph.DrawLine(pen, startNode.Bounds.X + startNode.Bounds.Width,
startNode.Bounds.Y + startNode.Bounds.Height / 2,
max,
startNode.Bounds.Y + startNode.Bounds.Height / 2);
graph.DrawLine(pen, max,
startNode.Bounds.Y + startNode.Bounds.Height / 2,
max,
endNode.Bounds.Y + endNode.Bounds.Height / 2);
graph.DrawLine(pen, max,
endNode.Bounds.Y + endNode.Bounds.Height / 2,
endNode.Bounds.X + endNode.Bounds.Width,
endNode.Bounds.Y + endNode.Bounds.Height / 2);
graph.DrawString("<", new Font("微软雅黑", 12F), brush, endNode.Bounds.X + endNode.Bounds.Width - 5,
endNode.Bounds.Y + endNode.Bounds.Height / 2 - 12);
Application.DoEvents();
}
catch { }
}
/// <summary>
/// 交换List中的两个位置的值
/// </summary>
/// <param name="inputList">要交换的List</param>
/// <param name="souceIndex">原位置索引</param>
/// <param name="targetIndex">现位置索引</param>
/// <returns></returns>
public static List<IToolInfo> SwapDataFun(List<IToolInfo> inputList, int souceIndex, int targetIndex)
{
IToolInfo temp = inputList[targetIndex];
inputList[targetIndex] = inputList[souceIndex];
inputList[souceIndex] = temp;
return inputList;
}
/// <summary>
/// 根据工具名获取工具信息
/// </summary>
/// <param name="jobName">下一版本去掉该参数,流程名</param>
/// <param name="toolName">工具名</param>
/// <returns></returns>
public IToolInfo GetToolInfoByToolName(string toolName)
{
try
{
for (int i = 0; i < L_toolList.Count; i++)
{
if (L_toolList[i].toolName == toolName)
{
return L_toolList[i];
}
}
return new IToolInfo();
}
catch (Exception ex)
{
Logger.LoggerClass.WriteLog("根据工具名获取工具信息出错!原因: ", ex);
return new IToolInfo();
}
}
/// <summary>
/// 通过TreeNode节点文本获取节点
/// </summary>
/// <param name="nodeText">节点文本</param>
/// <returns>节点对象</returns>
public TreeNode GetToolNodeByNodeText(string nodeText)
{
try
{
foreach (TreeNode toolNode in GetJobTree().Nodes)
{
if (((TreeNode)toolNode).Text != nodeText)
{
foreach (TreeNode itemNode in ((TreeNode)toolNode).Nodes)
{
if (((TreeNode)itemNode).Text.Substring(3) == nodeText)
{
return itemNode;
}
}
}
else
{
return toolNode;
}
}
return null;
}
catch (Exception ex)
{
Logger.LoggerClass.WriteLog("通过TreeNode节点文本获取节点错误", ex);
return null;
}
}
/// <summary>
/// 删除连线及值传递
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DeleteLine(object sender, EventArgs e)
{
try
{
if (GetJobTree().SelectedNode == null)
{
return;
}
string nodeText = GetJobTree().SelectedNode.Text.ToString();
int level = GetJobTree().SelectedNode.Level;
string fatherNodeText = string.Empty;
foreach (TreeNode toolNode in GetJobTree().Nodes)
{
if (level == 1)
{
fatherNodeText = GetJobTree().SelectedNode.Parent.Text;
if (toolNode.Text == fatherNodeText)
{
foreach (var itemNode in toolNode.Nodes)
{
if (itemNode != null)
{
if (((TreeNode)itemNode).Text == nodeText)
{
// 移除连线集合中的这条连线
for (int i = 0; i < D_itemAndSource.Count; i++)
{
if (((TreeNode)itemNode) == D_itemAndSource.Keys.ToArray()[i] || ((TreeNode)itemNode) == D_itemAndSource[D_itemAndSource.Keys.ToArray()[i]])
D_itemAndSource.Remove(D_itemAndSource.Keys.ToArray()[i]);
}
// 修改节点的显示
for (int i = 0; i < L_toolList.Count; i++)
{
if (L_toolList[i].toolName == fatherNodeText)
{
for (int j = 0; j < L_toolList[i].toolInput.Count; j++)
{
string last = Regex.Split(nodeText, "《")[1]; // "《"后边的部分
string ConnectString = "《" + last; // 拼接后字符
if (L_toolList[i].toolInput[j].value.ToString() == ConnectString)
{
string source = Regex.Split(nodeText, "《")[0]; // "《"之前的部分,即未连线初始部分
L_toolList[i].toolInput[j].value = null; //重新置null
((TreeNode)itemNode).Text = source;
}
}
for (int j = 0; j < L_toolList[i].toolOutput.Count; j++)
{
if (L_toolList[i].toolOutput[j].IOName == nodeText.Substring(3))
L_toolList[i].RemoveOutputIO(nodeText.Substring(3));
}
}
}
}
}
}
}
}
}
}
catch (Exception ex)
{
//LogHelper.SaveErrorInfo(ex);
}
}
/// <summary>
/// 删除项
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DeleteItem(object sender, EventArgs e)
{
try
{
if (GetJobTree().SelectedNode == null)
return;
string nodeText = GetJobTree().SelectedNode.Text.ToString();
int level = GetJobTree().SelectedNode.Level;
string fatherNodeText = string.Empty;
//如果是子节点
if (level == 1)
{
fatherNodeText = GetJobTree().SelectedNode.Parent.Text;
}
foreach (TreeNode toolNode in GetJobTree().Nodes)
{
if (level == 1)
{
if (toolNode.Text == fatherNodeText)
{
foreach (var itemNode in toolNode.Nodes)
{
if (itemNode != null)
{
if (((TreeNode)itemNode).Text == nodeText)
{
//移除连线集合中的这条连线
for (int i = 0; i < D_itemAndSource.Count; i++)
{
if (((TreeNode)itemNode) == D_itemAndSource.Keys.ToArray()[i] || ((TreeNode)itemNode) == D_itemAndSource[D_itemAndSource.Keys.ToArray()[i]])
D_itemAndSource.Remove(D_itemAndSource.Keys.ToArray()[i]);
}
((TreeNode)itemNode).Remove();
GetJobTree().SelectedNode = null;
}
}
}
}
}
else
{
if (((TreeNode)toolNode).Text == nodeText)
{
((TreeNode)toolNode).Remove();
break;
}
}
}
//如果是父节点
if (level == 0)
{
for (int i = 0; i < L_toolList.Count; i++)
{
if (L_toolList[i].toolName == nodeText)
{
try
{
//移除连线集合中的这条连线
for (int j = D_itemAndSource.Count - 1; j >= 0; j--)
{
if (nodeText == D_itemAndSource.Keys.ToArray()[j].Parent.Text || nodeText == D_itemAndSource[D_itemAndSource.Keys.ToArray()[j]].Parent.Text)
D_itemAndSource.Remove(D_itemAndSource.Keys.ToArray()[j]);
}
}
catch { }
L_toolList.RemoveAt(i);
}
}
}
else
{
for (int i = 0; i < L_toolList.Count; i++)
{
if (L_toolList[i].toolName == fatherNodeText)
{
for (int j = 0; j < L_toolList[i].toolInput.Count; j++)
{
if (L_toolList[i].toolInput[j].value.ToString() == Regex.Split(nodeText, "《")[0])
L_toolList[i].RemoveInputIO(Regex.Split(nodeText, "《")[0]);
}
for (int j = 0; j < L_toolList[i].toolOutput.Count; j++)
{
if (L_toolList[i].toolOutput[j].IOName == nodeText.Substring(3))
L_toolList[i].RemoveOutputIO(nodeText.Substring(3));
}
}
}
}
}
catch (Exception ex)
{
//LogHelper.SaveErrorInfo(ex);
}
}
public void Run()
{
for (int i = 0; i < L_toolList.Count; i++)
{
TreeNode treeNode = GetToolNodeByNodeText(L_toolList[i].toolName);
inputItemNum = (L_toolList[i]).toolInput.Count;
outputItemNum = (L_toolList[i]).toolOutput.Count;
// 通过要调用的程序集名称.类名,程序集名称 对类进行调用
// FormToolName 中已存储程序集名称
string assemblyName = $"{L_toolList[i].FormToolName.Split('.')[0]}.{L_toolList[i].toolType.ToString()}Run,{L_toolList[i].FormToolName.Split('.')[0]}";
Type classType = Type.GetType(assemblyName);
IToolRun myTool = (IToolRun)Activator.CreateInstance(classType);
myTool.ToolRun(JobName, i, inputItemNum, treeNode, L_toolList);
}
}
public void FormLogDisp(string mes, Color color, TreeNode treeNode, Logger.MsgLevel msgLevel = Logger.MsgLevel.Info)
{
Logger.LoggerClass.WriteLog(mes, msgLevel);
treeNode.ForeColor = color;
}
}
}

View File

@@ -0,0 +1,34 @@
/*
* ==============================================================================
*
* Filename: VisionJobParams
* Description:
*
* Version: 1.0
* Created: 2021/2/25 15:22:22
*
* Author: liu.wenjie
*
* ==============================================================================
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ToolLib.VisionJob
{
public class VisionJobParams
{
/// <summary>
/// 当前项目一个项目对应多个JOB
/// </summary>
public static VisionProject pVisionProject{ get; set; } = new VisionProject();
/// <summary>
/// 系统路径
/// </summary>
public static string sSysConfigPath { get; } = @"C:\MyCCDSystem\";
}
}

View File

@@ -0,0 +1,75 @@
/*
* ==============================================================================
*
* Filename: VisionProject
* Description:
*
* Version: 1.0
* Created: 2021/2/27 15:49:25
*
* Author: liu.wenjie
*
* ==============================================================================
*/
using CommonMethods;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ToolLib.VisionJob
{
public class VisionProject
{
/// <summary>
/// 工程路径
/// </summary>
public string prjFilePath { get; set; } = @"D:\vision.prj";
/// <summary>
/// 工程名称
/// </summary>
public string prjName { get; set; }
/// <summary>
/// 工程中所包含的VisionJob
/// </summary>
public Dictionary<string, VisionJob> Project { get; set; } = new Dictionary<string, VisionJob>() { };
public bool LoadProject()
{
if(!File.Exists(prjFilePath))
{
return false;
}
else
{
try
{
Project = Serialize.BinaryDeserialize<Dictionary<string, VisionJob>>(prjFilePath);
foreach (var item in Project)
{
OperateProject.Instance.CreateNewJob(item.Key, false);
foreach (var tool in item.Value.L_toolList)
{
OperateTreeView.Instance.Add_Tool((ToolType)Enum.Parse(typeof(ToolType), tool.toolType.ToString()), false);
}
OperateProject.Instance.InitJob(item.Value);
}
return true;
}
catch (Exception ex)
{
Logger.LoggerClass.WriteLog("载入项目工程时出现异常!", ex);
return false;
}
}
}
public void SaveObject()
{
Serialize.BinarySerialize(prjFilePath, Project);
}
}
}

View File

@@ -0,0 +1,146 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using CommonMethods;
using System.IO;
namespace VisionJobFactory
{
public class VisionToolFactory
{
private static Dictionary<ToolType, Type> animalTypeDic = new Dictionary<ToolType, Type>();
public static void InitVisionToolTypeDic()
{
animalTypeDic.Clear();
//读取所有带有VisionToolAttribute的类
var classEnumerator = new ClassEnumerator(typeof(VisionToolAttribute), null, typeof(VisionToolAttribute).Assembly);
var em = classEnumerator.Results.GetEnumerator();
while (em.MoveNext())
{
var classType = em.Current;
var atts = classType.GetCustomAttributes(typeof(VisionToolAttribute), true);
if (atts.Length > 0)
{
var att = atts[0] as VisionToolAttribute;
if (null != att)
{
animalTypeDic.Add(att.ToolType, classType);
}
}
}
}
public static IToolInfo CreateToolVision(ToolType animalType, string toolName)
{
if (animalTypeDic.ContainsKey(animalType))
{
return (IToolInfo)Activator.CreateInstance(animalTypeDic[animalType], new object[] { toolName });
}
return null;
}
public static IToolInfo CreateToolVision(ToolType animalType)
{
if (animalTypeDic.ContainsKey(animalType))
{
return (IToolInfo)Activator.CreateInstance(animalTypeDic[animalType]);
}
return null;
}
}
//根据Attribute提取类
public class ClassEnumerator
{
protected List<Type> results = new List<Type>();
public List<Type> Results
{
get
{
return results;
}
}
private Type AttributeType;
private Type InterfaceType;
public ClassEnumerator(Type InAttributeType, Type InInterfaceType, Assembly InAssembly, bool bIgnoreAbstract = true, bool bInheritAttribute = false, bool bShouldCrossAssembly = true)
{
AttributeType = InAttributeType;
InterfaceType = InInterfaceType;
try
{
if (bShouldCrossAssembly)
{
//Assembly[] Assemblys = AppDomain.CurrentDomain.GetAssemblies();
//if (Assemblys != null)
//{
// for (int i = 0, len = Assemblys.Length; i < len; i++)
// {
// CheckInAssembly(Assemblys[i], bIgnoreAbstract, bInheritAttribute);
// }
//}
List<Assembly> allAssemblies = new List<Assembly>();
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string[] FILES = Directory.GetFiles(path, "*.dll");
foreach (string dll in Directory.GetFiles(path, "*.dll"))
allAssemblies.Add(Assembly.LoadFile(dll));
// 手动寻找该dll若dll名称改变需要重新编译不智能
// Assembly assem = Assembly.LoadFile($"{AppDomain.CurrentDomain.BaseDirectory}ToolLib.VisionToolList.dll");
if (allAssemblies != null)
{
for (int i = 0; i < allAssemblies.Count; i++)
{
CheckInAssembly(allAssemblies[i], bIgnoreAbstract, bInheritAttribute);
}
}
}
else
{
CheckInAssembly(InAssembly, bIgnoreAbstract, bInheritAttribute);
}
}
catch (Exception e)
{
Debug.WriteLine("Error in enumerate classes: " + e.Message);
}
}
private void CheckInAssembly(Assembly InAssembly, bool bInIgnoreAbstract, bool bInInheritAttribute)
{
Type[] types = InAssembly.GetTypes();
if (null == types)
{
return;
}
for (int i = 0, len = types.Length; i < len; i++)
{
var type = types[i];
if (InterfaceType == null || InterfaceType.IsAssignableFrom(type))
{
if (!bInIgnoreAbstract || (bInIgnoreAbstract && !type.IsAbstract))
{
if (type.GetCustomAttributes(AttributeType, bInInheritAttribute).Length > 0)
{
results.Add(type);
}
}
}
}
}
}
}