添加功能:

1、在工具箱窗体点击某工具后将该工具添加到流程中
2、使用工厂模式和反射对工具进行添加,去掉原先大量的Switch case操作
This commit is contained in:
liu.wenjie
2019-07-17 20:42:42 +08:00
committed by liu.wenjie
parent 4000480e75
commit bca077b840
67 changed files with 5338 additions and 81452 deletions

Binary file not shown.

View File

@@ -1,12 +1,12 @@
F:\VSCode\VisionEditTest\HalconWindowTest\bin\Debug\HalconWindowTest.exe.config
F:\VSCode\VisionEditTest\HalconWindowTest\bin\Debug\HalconWindowTest.exe
F:\VSCode\VisionEditTest\HalconWindowTest\bin\Debug\HalconWindowTest.pdb
F:\VSCode\VisionEditTest\HalconWindowTest\bin\Debug\halcondotnet.dll
F:\VSCode\VisionEditTest\HalconWindowTest\bin\Debug\halcondotnet.xml
F:\VSCode\VisionEditTest\HalconWindowTest\obj\Debug\HalconWindowTest.csprojResolveAssemblyReference.cache
F:\VSCode\VisionEditTest\HalconWindowTest\obj\Debug\HalconWindowTest.HalconWindow.HWindow_Final.resources
F:\VSCode\VisionEditTest\HalconWindowTest\obj\Debug\HalconWindowTest.MainForm.resources
F:\VSCode\VisionEditTest\HalconWindowTest\obj\Debug\HalconWindowTest.Properties.Resources.resources
F:\VSCode\VisionEditTest\HalconWindowTest\obj\Debug\HalconWindowTest.csproj.GenerateResource.Cache
F:\VSCode\VisionEditTest\HalconWindowTest\obj\Debug\HalconWindowTest.exe
F:\VSCode\VisionEditTest\HalconWindowTest\obj\Debug\HalconWindowTest.pdb
F:\VSCode\VisionEditTest\HalconWindowTest\bin\Debug\halcondotnet.dll
F:\VSCode\VisionEditTest\HalconWindowTest\bin\Debug\halcondotnet.xml
F:\VSCode\VisionEditTest\HalconWindowTest\obj\Debug\HalconWindowTest.HalconWindow.HWindow_Final.resources
F:\VSCode\VisionEditTest\HalconWindowTest\obj\Debug\HalconWindowTest.csprojResolveAssemblyReference.cache

View File

@@ -28,21 +28,11 @@
/// </summary>
private void InitializeComponent()
{
this.panel1 = new System.Windows.Forms.Panel();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormImageWindow));
this.comboBox1 = new System.Windows.Forms.ComboBox();
this.panel1 = new System.Windows.Forms.Panel();
this.SuspendLayout();
//
// panel1
//
this.panel1.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.panel1.BackColor = System.Drawing.SystemColors.Control;
this.panel1.Location = new System.Drawing.Point(0, 28);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(899, 552);
this.panel1.TabIndex = 0;
//
// comboBox1
//
this.comboBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
@@ -53,7 +43,18 @@
this.comboBox1.Location = new System.Drawing.Point(0, 0);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(899, 28);
this.comboBox1.TabIndex = 1;
this.comboBox1.TabIndex = 3;
//
// panel1
//
this.panel1.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.panel1.BackColor = System.Drawing.SystemColors.Control;
this.panel1.Location = new System.Drawing.Point(0, 28);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(899, 552);
this.panel1.TabIndex = 2;
//
// FormImageWindow
//
@@ -63,8 +64,9 @@
this.Controls.Add(this.comboBox1);
this.Controls.Add(this.panel1);
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 = "FormImageWindow";
this.Text = "图像显示";
this.Text = "图像";
this.Load += new System.EventHandler(this.FormImageWindow_Load);
this.ResumeLayout(false);
@@ -72,7 +74,7 @@
#endregion
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.ComboBox comboBox1;
private System.Windows.Forms.Panel panel1;
}
}

View File

@@ -1,5 +1,4 @@
using HalconWindowTest.HalconWindow;
using System;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
@@ -8,6 +7,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using HalconWindowTest.HalconWindow;
using WeifenLuo.WinFormsUI.Docking;
namespace VisionEdit.FormLib
@@ -18,7 +18,6 @@ namespace VisionEdit.FormLib
{
InitializeComponent();
}
public string m_fileName = string.Empty;
/// <summary>
/// 窗体对象实例
@@ -40,6 +39,5 @@ namespace VisionEdit.FormLib
this.panel1.Controls.Add(myHWindow);
myHWindow.Dock = DockStyle.Fill;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,120 +0,0 @@
<?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

@@ -32,6 +32,10 @@
this.tabControl1 = 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();
//
// tabControl1
@@ -39,18 +43,18 @@
this.tabControl1.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.tabControl1.Location = new System.Drawing.Point(-1, 3);
this.tabControl1.Location = new System.Drawing.Point(-1, 1);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(373, 586);
this.tabControl1.Size = new System.Drawing.Size(373, 588);
this.tabControl1.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(199, 595);
this.btnCycleRun.Location = new System.Drawing.Point(218, 595);
this.btnCycleRun.Name = "btnCycleRun";
this.btnCycleRun.Size = new System.Drawing.Size(74, 33);
this.btnCycleRun.Size = new System.Drawing.Size(63, 33);
this.btnCycleRun.TabIndex = 1;
this.btnCycleRun.Text = "连续运行";
this.btnCycleRun.UseVisualStyleBackColor = true;
@@ -58,32 +62,61 @@
// 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(286, 595);
this.btnSignael.Location = new System.Drawing.Point(297, 595);
this.btnSignael.Name = "btnSignael";
this.btnSignael.Size = new System.Drawing.Size(74, 33);
this.btnSignael.Size = new System.Drawing.Size(63, 33);
this.btnSignael.TabIndex = 1;
this.btnSignael.Text = "单次运行";
this.btnSignael.UseVisualStyleBackColor = true;
//
// picDeleteJob
//
this.picDeleteJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.picDeleteJob.Image = global::VisionEdit.Properties.Resources.;
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 = global::VisionEdit.Properties.Resources.1;
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.tabControl1);
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.TabControl tabControl1;
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 tabControl1;
}
}

View File

@@ -31,5 +31,9 @@ namespace VisionEdit.FormLib
return _instance;
}
}
private void FormJobManage_Load(object sender, EventArgs e)
{
}
}
}

View File

@@ -29,28 +29,31 @@
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.Windows.Forms.TreeNode treeNode14 = new System.Windows.Forms.TreeNode("流程");
System.Windows.Forms.TreeNode treeNode15 = new System.Windows.Forms.TreeNode("Halcon窗口");
System.Windows.Forms.TreeNode treeNode16 = new System.Windows.Forms.TreeNode("Basler");
System.Windows.Forms.TreeNode treeNode17 = new System.Windows.Forms.TreeNode("HIKVision");
System.Windows.Forms.TreeNode treeNode18 = new System.Windows.Forms.TreeNode("获取图像", new System.Windows.Forms.TreeNode[] {
treeNode15,
treeNode16,
treeNode17});
System.Windows.Forms.TreeNode treeNode19 = new System.Windows.Forms.TreeNode("滤波");
System.Windows.Forms.TreeNode treeNode20 = new System.Windows.Forms.TreeNode("平滑");
System.Windows.Forms.TreeNode treeNode21 = new System.Windows.Forms.TreeNode("去噪");
System.Windows.Forms.TreeNode treeNode22 = new System.Windows.Forms.TreeNode("图像预处理", new System.Windows.Forms.TreeNode[] {
treeNode19,
treeNode20,
treeNode21});
System.Windows.Forms.TreeNode treeNode23 = new System.Windows.Forms.TreeNode("形状匹配");
System.Windows.Forms.TreeNode treeNode24 = new System.Windows.Forms.TreeNode("可变形匹配");
System.Windows.Forms.TreeNode treeNode25 = new System.Windows.Forms.TreeNode("灰度匹配");
System.Windows.Forms.TreeNode treeNode26 = new System.Windows.Forms.TreeNode("匹配", new System.Windows.Forms.TreeNode[] {
treeNode23,
treeNode24,
treeNode25});
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("几何", new System.Windows.Forms.TreeNode[] {
treeNode14});
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);
@@ -68,45 +71,58 @@
this.tvw_ToolBox.Indent = 32;
this.tvw_ToolBox.Location = new System.Drawing.Point(0, 4);
this.tvw_ToolBox.Name = "tvw_ToolBox";
treeNode14.ImageIndex = 1;
treeNode14.Name = "NodeJob";
treeNode14.Text = "流程";
treeNode15.ImageIndex = 3;
treeNode15.Name = "节点1";
treeNode15.Text = "Halcon窗口";
treeNode16.ImageKey = "图像.png";
treeNode16.Name = "节点2";
treeNode16.Text = "Basler";
treeNode17.ImageKey = "图像.png";
treeNode17.Name = "节点3";
treeNode17.Text = "HIKVision";
treeNode18.ImageIndex = 4;
treeNode18.Name = "节点0";
treeNode18.Text = "获取图像";
treeNode19.Name = "节点5";
treeNode19.Text = "滤波";
treeNode20.Name = "节点6";
treeNode20.Text = "平滑";
treeNode21.Name = "节点7";
treeNode21.Text = "去噪";
treeNode22.Name = "节点4";
treeNode22.Text = "图像预处理";
treeNode23.Name = "节点9";
treeNode23.Text = "形状匹配";
treeNode24.Name = "节点10";
treeNode24.Text = "可变形匹配";
treeNode25.Name = "节点11";
treeNode25.Text = "灰度匹配";
treeNode26.Name = "节点8";
treeNode26.Text = "匹配";
treeNode1.ImageIndex = 1;
treeNode1.Name = "NodeJob";
treeNode1.SelectedImageIndex = 1;
treeNode1.Text = "流程";
treeNode2.ImageIndex = 3;
treeNode2.Name = "节点1";
treeNode2.SelectedImageIndex = 3;
treeNode2.Tag = "HalconToolInterface";
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.Name = "FindLine";
treeNode14.Tag = "FindLine";
treeNode14.Text = "找线";
treeNode15.Name = "节点0";
treeNode15.Text = "几何";
this.tvw_ToolBox.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
treeNode14,
treeNode18,
treeNode22,
treeNode26});
treeNode1,
treeNode5,
treeNode9,
treeNode13,
treeNode15});
this.tvw_ToolBox.SelectedImageIndex = 4;
this.tvw_ToolBox.Size = new System.Drawing.Size(367, 545);
this.tvw_ToolBox.TabIndex = 1;
this.tvw_ToolBox.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvw_ToolBox_AfterSelect);
this.tvw_ToolBox.DoubleClick += new System.EventHandler(this.tvw_ToolBox_DoubleClick);
//
// imageList1
//
@@ -117,6 +133,36 @@
this.imageList1.Images.SetKeyName(2, "流程图.png");
this.imageList1.Images.SetKeyName(3, "图像.png");
this.imageList1.Images.SetKeyName(4, "文件夹.png");
this.imageList1.Images.SetKeyName(5, "20190709065619943_easyicon_net_256.ico");
this.imageList1.Images.SetKeyName(6, "20190715063459237_easyicon_net_256.ico");
this.imageList1.Images.SetKeyName(7, "20190716033549111_easyicon_net_128.ico");
this.imageList1.Images.SetKeyName(8, "20190716033559344_easyicon_net_128.ico");
this.imageList1.Images.SetKeyName(9, "avatar_guy_male_man_user_64px_1212479_easyicon.net.ico");
this.imageList1.Images.SetKeyName(10, "avatar_male_man_user_64px_1212481_easyicon.net.ico");
this.imageList1.Images.SetKeyName(11, "camera_96px_1157134_easyicon.net.ico");
this.imageList1.Images.SetKeyName(12, "start.ico");
this.imageList1.Images.SetKeyName(13, "stop.ico");
this.imageList1.Images.SetKeyName(14, "User_64px_1115223_easyicon.net.ico");
this.imageList1.Images.SetKeyName(15, "user_64px_1218470_easyicon.net.ico");
this.imageList1.Images.SetKeyName(16, "保存.png");
this.imageList1.Images.SetKeyName(17, "保存2.png");
this.imageList1.Images.SetKeyName(18, "保存3.png");
this.imageList1.Images.SetKeyName(19, "打开.png");
this.imageList1.Images.SetKeyName(20, "复位.png");
this.imageList1.Images.SetKeyName(21, "工具箱.ico");
this.imageList1.Images.SetKeyName(22, "工具箱.png");
this.imageList1.Images.SetKeyName(23, "镜头.png");
this.imageList1.Images.SetKeyName(24, "开始.png");
this.imageList1.Images.SetKeyName(25, "流程.ico");
this.imageList1.Images.SetKeyName(26, "流程.png");
this.imageList1.Images.SetKeyName(27, "流程图.png");
this.imageList1.Images.SetKeyName(28, "删除.png");
this.imageList1.Images.SetKeyName(29, "停止.png");
this.imageList1.Images.SetKeyName(30, "图像.png");
this.imageList1.Images.SetKeyName(31, "文件夹.png");
this.imageList1.Images.SetKeyName(32, "相机.png");
this.imageList1.Images.SetKeyName(33, "新建.png");
this.imageList1.Images.SetKeyName(34, "新建2.png");
//
// richTextBoxEx1
//
@@ -154,6 +200,6 @@
private System.Windows.Forms.TreeView tvw_ToolBox;
private DevComponents.DotNetBar.Controls.RichTextBoxEx richTextBoxEx1;
private System.Windows.Forms.ImageList imageList1;
public System.Windows.Forms.ImageList imageList1;
}
}

View File

@@ -7,29 +7,124 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using VisionEdit.VisionTool;
using WeifenLuo.WinFormsUI.Docking;
namespace VisionEdit.FormLib
{
public partial class FormToolBox : DockContent
{
public FormToolBox()
FormLog myFormLog = null;
FormJobManage myFormJobManage = null;
public FormToolBox(FormLog inputFormLog, FormJobManage inputFormJob)
{
InitializeComponent();
myFormLog = inputFormLog;
myFormJobManage = inputFormJob;
VisionToolFactory.InitVisionToolTypeDic();
}
private void tvw_ToolBox_AfterSelect(object sender, TreeViewEventArgs e)
{
}
private void tvw_ToolBox_DoubleClick(object sender, EventArgs e)
{
try
{
if (tvw_ToolBox.SelectedNode.SelectedImageIndex == 0) //如果双击的是文件夹节点,返回
return;
if (myFormJobManage.tabControl1.TabPages.Count > 0) //如果已存在流程
{
object selectTag = tvw_ToolBox.SelectedNode.Tag;
Add_Tool((ToolType)Enum.Parse(typeof(ToolType), selectTag.ToString()));
}
else
{
//如果当前不存在可用流程,先创建流程,在添加工具
OperateJob.CreateNewJob();
}
}
catch (Exception ex)
{
myFormLog.ShowLog("添加流程失败!" + ex.Message);
}
}
/// <summary>
/// 窗体对象实例
/// 向流程中添加工具,需要根据选择的工具名对工具类型等进行判断
/// </summary>
private static FormToolBox _instance;
public static FormToolBox Instance
/// <param name="tool">工具类型</param>
/// <param name="isInsert">插入位置,当为-1时表示在末尾插入当不为-1时表示被插入的工具索引</param>
internal void Add_Tool(ToolType tool, int insertPos = -1)
{
get
string toolName = GetNewToolName(tool.ToString());
IToolInfo insertTool = VisionToolFactory.CreateToolVision(tool, toolName);
TreeNode insertNode = new TreeNode();
insertNode = GlobalParams.myJobTreeView.Nodes.Add("", insertTool.toolName, (int)tool, (int)tool); // 该工具对应的节点
// 判断节点是否添加默认输入输出图
for (int i = 0; i < insertTool.toolOutput.Count; i++)
{
if (_instance == null)
_instance = new FormToolBox();
return _instance;
TreeNode childrenNode = new TreeNode();
childrenNode.Text = "-->" + insertTool.toolOutput[i].IOName;
childrenNode.Tag = insertTool.toolOutput[i].ioType;
insertNode.Nodes.Add(childrenNode);
}
GlobalParams.myVisionJob.L_toolList.Add(insertTool);
}
internal string GetNewToolName(string toolType)
{
try
{
if (!TreeView_Contains_Key(toolType))
{
return toolType;
}
for (int i = 1; i < 101; i++)
{
if (!TreeView_Contains_Key(toolType + "_" + i))
{
return toolType + "_" + i;
}
}
myFormLog.ShowLog("此工具已添加个数已达到数量上限,无法继续添加");
return "Error";
}
catch (Exception ex)
{
myFormLog.ShowLog("添加出错!" + ex.Message);
return "Error";
}
}
/// <summary>
/// 判断TreeView是否已经包含某节点
/// </summary>
/// <param name="key">节点文本</param>
/// <returns>是否包含</returns>
private bool TreeView_Contains_Key(string key)
{
try
{
foreach (TreeNode node in GlobalParams.myJobTreeView.Nodes)
{
if (node.Text == key)
return true;
}
return false;
}
catch (Exception ex)
{
myFormLog.ShowLog(ex.Message);
return false;
}
}
}
}

View File

@@ -124,80 +124,372 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADi
EAAAAk1TRnQBSQFMAgEBBQEAARABAAEQAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABgAMAAUADAAEBAQABCAYAASAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
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//8AhAAB9htZZAAdWWMA
HVljAB1ZYwAdWWMAHVljAB1ZYwAdWWMAHVljAB1ZYwAdWWMAHVljAB1ZYwAdWWMAHVljAB1ZYwAdWWMA
ATEbWQExYwADMQFYFf8EMWMAAzEBWBX/BDFjAB0xYwAbMQF5ZAASMW4AETEBmW4AETH/AP8AdgABsxAA
Af8Bu20AAbIRAAGybAABsgEJAbICCQGzAgkBugIJAbsHCQG6AbNqAAL/AQABswIAAQkCAAHzAgAB/wgA
AQlqAAH/AgABswIAAQkCAAHzAgAB/wgAARkJAAH/BQkB9AIAARkFCQH/AgAGCRQAC7IBswYAHfQGAAH/
AgABswIAAQkCAAHzAgAB/wgAARkJAAH/BQkB9AIAARkFCQH/AgAGCRMAAQkMsgUAH4oFAAH/ArMBshKz
CQAB/wIJAf8CCQH0AgABGQEJARkB/wIJAf8CAAMJAf8B8gEJCgABswqyAfQIAAG6AbIEAAG0AYoBZQK7
GhkBigUAAf8UAAEZCQAB/wIJAQACCQH0AgABGQEJAfMBAAIJAf8CAAMJAQAB8wEJCQAB8wGzCAABugGy
AfQIAAG6AbIEAAGzAYoCZQK7GRkBigUAAf8UAAEZCQAB/wUJAfQCAAEZBQkB/wIABgkJAAG6AfQIAAEJ
DLIEAAGzAYoBuwJlAbsBCRgZAYoFAAH/FAABGQkAAf8FCQH0AgABGQUJAf8CAAYJCQABugH0CQAMsgQA
AbMBigG7ARkCZQG7AQkJGQEJDBkBuwGKBQAB/xQAARkKAAH/AgkC/wMAAv8DCQH/AwAC/wIJAfMB/wkA
AboB9BkAAbMBigG7AhkCZQG7CBkCuwsZAQkBZQGKBQAB/xQAARkLAAIJBwADCQYAAgkB9AoAAboB9BkA
AbMBigG7AxkCZQG7BhkBuwJlAbsKGQJlAYoFAAH/FAABGQsAAgkH/wMJBv8CCQH0CgABugH0CQALsgGz
BAABswGKAbsEGQJlAbsFGQFmAmUBZgEJCBkBuwFlARkBigUAAf8UAAEZCwAUCQH0CgABugH0CAABCQyy
BAABswGKAbsFGQJlAbsDGQG7AWUBZgGRAWUBuwcZAQkCZQEZAYoFAAH/FAABGQsAFAkB9AoAAboB9AQA
BPQBswGyAfQIAAG6AbIEAAGzAYoBuwYZAWUBZgG7AQkBuwJlAhkBZQFmAQkGGQFmAWUCGQGKBQAB/xWy
FAAB8wIJEwABugH0AgAIsgH0CAABugGyBAABswGKAbsGGQG7AmUBuwJlAxkBCQFlAbsFGQG7AWUBbAIZ
AYoFAAH/AgABswIAAQkCAAHzAgAB/wgAARkUAAHzAgkTAAG6AfQCAAGyBQABCQyyBAABswGKAbsHGQG1
A2UFGQJlAbsDGQEJAmUDGQGKBQAB/wIAAbMCAAEJAgAB8wIAAf8IAAEZDQAH/wEZAgkH/wwAAboB9AIA
AbIGAAyyBAABswGKAbsQGQEJAWUBuwMZAa4BZQQZAYoFAAH/AgABswIAAQkCAAHzAgAB/wgAARkMAAHz
EgkLAAG6AfQCAAGyFgABswGKAbsCGQFmAmUMGQJlAbsBGQG7AmUEGQGKBQAB/wIAAbMCAAEJAgAB8wIA
Af8IAAEZDAAB8wEJDv8DCQsAAboB9AIAAbIWAAGzAYoBuwEZAWUBiwIZAWUMGQFlArsCZQUZAYoEAAH/
AbIVtAGyCwAB8wEJDgADCQoAB7IBswQAC7IBswQAAbMBigG7ARkBZQG7AhkBZQwZBGUBkQUZAYoEAAGy
FwABsgoAAfMBCQMAAgkJAAMJCQABCQiyAwABCQyyBAABswGKAbsBGQFlAbsCCQFlDhkBtQcZAYoEAAGy
F7MBsgoAAfMBCQMAAgkJAAMJCQABugGyAfQEAAG6AbID9AGzAbIB9AgAAboBsgQAAbMBigG7AhkDZQG7
FhkBigQAAboXAAGyCgAB8wEJDgADCQkAAboBsgH0BAABugayAfQIAAG6AbIEAAGzAYoBuxwZAYoEAAG6
FwABsgoAAfMBCQ4AAwkJAAEJCLIDAAEJDLIEAAGzAYoduwGKBAABuhcAAbIKAAHzEgkKAAiyBAAMsgUA
H4oEAAG6BAABsgH0CwABCQGyBAABsgoAAf8RCQHzJwAB/xytAbQFAAG6AwABsgEAAbMLAAEJAQABsgMA
AbJnAAG6AgABsgMAAbIJAAGyAwABswIAAbJnAAG6AbMBugQAAboIAALzAwAB/wG6AbMBCW8AAbIBCQUA
AboBs3kAAboDsgEJbQABQgFNAT4HAAE+AwABKAMAAYADAAFAAwABAQEAAQEGAAEEFgAD/wEABP8MAAT/
DAAE/wwAAcACAAEDDAABwAIAAQEMAAHAAgABAQwAAcACAAEBDAABwAIAAQEMAAHAAgABAQwAAcACAAEB
DAABwAIAAQEMAAHAAgABAQwAAcACAAEBDAABwAIAAQEMAAHAAgABAQwAAcACAAEBDAABwAIAAQEMAAHA
AgABAQwAAcACAAEBDAABwAIAAQEMAAHAAgABAQwAAcACAAEBDAABwAIAAQEMAAHAAgABAQwAAcACAAED
DAABwAEAAQ8B/wwAAcABAAEPAf8MAAHAAQABHwH/DAAE/wwABP8MAAT/DAAE/wwAAf4C/wE/DP8B/gL/
Ab8M/wH8AgABHwz/AfkBbQG/Ad8M/wH7AW0BvwHfAfABGAEMAQ8C/wEAAQ8BwAIAAQEB+wFtAb8B3wHw
ARgBDAEPAf8B/gEAAQ8BgAMAAfgCAAEfAfABGAEMAQ8B/AEAAT8BzwQAAfsC/wHfAfEBGAGMAU8B+QH+
AT8BzwQAAfsC/wHfAfABGAEMAQ8B+QH+AQABDwQAAfsC/wHfAfABGAEMAQ8B+QH/AQABDwQAAfsC/wHf
AfgBOAEcAQ8B+QP/BAAB+wL/Ad8B/AH+AT8BHwH5A/8EAAH7Av8B3wH8AgABHwH5Af8BAAEPBAAB+wL/
Ad8B/AIAAR8B+QH+AQABDwQAAfsC/wHfAfwCAAEfAfkB4AE/Ac8EAAH4AgABHwH/Af4BPwH/AfkBgAE/
Ac8EAAH7AW0BvwHfAf8B/gE/Af8B+QG+AQABDwQAAfsBbQG/Ad8B/wIAAX8B+QG/AQABDwQAAfsBbQG/
Ad8B/gIAAT8B+QG/Av8EAAH7AW0BvwHfAf4CAAE/AfkBvwL/BAAB8AIAAQ8B/gF/Af4BPwHwAQ8BAAEP
BAAB9wL/AfcB/gFzAf4BPwHgAQ4BAAEPBAAB8AIAAQcB/gFzAf4BPwHjAcABPwHPBAAB9wL/AfcB/gF/
Af4BPwHjAcABPwHPBAAB9wL/AfcB/gF/Af4BPwHgAQ4BAAEPBAAB9wL/AfcB/gIAAT8B8AEPAQABDwGA
AwAB9wGfAfwB9wH+AgABPwT/AYACAAEBAfcBXwH9AXcM/wH2Ae8B+wG3DP8B8QHvAfMBhw3/AfMB5w7/
AfwBHw3/Cw==
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAB+
VQAAAk1TRnQBSQFMAgEBIwEAAUgBAAEYAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABgAMAASABAQIAAQEBAAEIBgABkBgAAYACAAGAAwACgAEAAYADAAGAAQABgAEAAoACAAPAAQABwAHc
AcABAAHwAcoBpgEAATMFAAEzAQABMwEAATMBAAIzAgADFgEAAxwBAAMiAQADKQEAA1UBAANNAQADQgEA
AzkBAAGAAXwB/wEAAlAB/wEAAZMBAAHWAQAB/wHsAcwBAAHGAdYB7wEAAdYC5wEAAZABqQGtAgAB/wEz
AwABZgMAAZkDAAHMAgABMwMAAjMCAAEzAWYCAAEzAZkCAAEzAcwCAAEzAf8CAAFmAwABZgEzAgACZgIA
AWYBmQIAAWYBzAIAAWYB/wIAAZkDAAGZATMCAAGZAWYCAAKZAgABmQHMAgABmQH/AgABzAMAAcwBMwIA
AcwBZgIAAcwBmQIAAswCAAHMAf8CAAH/AWYCAAH/AZkCAAH/AcwBAAEzAf8CAAH/AQABMwEAATMBAAFm
AQABMwEAAZkBAAEzAQABzAEAATMBAAH/AQAB/wEzAgADMwEAAjMBZgEAAjMBmQEAAjMBzAEAAjMB/wEA
ATMBZgIAATMBZgEzAQABMwJmAQABMwFmAZkBAAEzAWYBzAEAATMBZgH/AQABMwGZAgABMwGZATMBAAEz
AZkBZgEAATMCmQEAATMBmQHMAQABMwGZAf8BAAEzAcwCAAEzAcwBMwEAATMBzAFmAQABMwHMAZkBAAEz
AswBAAEzAcwB/wEAATMB/wEzAQABMwH/AWYBAAEzAf8BmQEAATMB/wHMAQABMwL/AQABZgMAAWYBAAEz
AQABZgEAAWYBAAFmAQABmQEAAWYBAAHMAQABZgEAAf8BAAFmATMCAAFmAjMBAAFmATMBZgEAAWYBMwGZ
AQABZgEzAcwBAAFmATMB/wEAAmYCAAJmATMBAANmAQACZgGZAQACZgHMAQABZgGZAgABZgGZATMBAAFm
AZkBZgEAAWYCmQEAAWYBmQHMAQABZgGZAf8BAAFmAcwCAAFmAcwBMwEAAWYBzAGZAQABZgLMAQABZgHM
Af8BAAFmAf8CAAFmAf8BMwEAAWYB/wGZAQABZgH/AcwBAAHMAQAB/wEAAf8BAAHMAQACmQIAAZkBMwGZ
AQABmQEAAZkBAAGZAQABzAEAAZkDAAGZAjMBAAGZAQABZgEAAZkBMwHMAQABmQEAAf8BAAGZAWYCAAGZ
AWYBMwEAAZkBMwFmAQABmQFmAZkBAAGZAWYBzAEAAZkBMwH/AQACmQEzAQACmQFmAQADmQEAApkBzAEA
ApkB/wEAAZkBzAIAAZkBzAEzAQABZgHMAWYBAAGZAcwBmQEAAZkCzAEAAZkBzAH/AQABmQH/AgABmQH/
ATMBAAGZAcwBZgEAAZkB/wGZAQABmQH/AcwBAAGZAv8BAAHMAwABmQEAATMBAAHMAQABZgEAAcwBAAGZ
AQABzAEAAcwBAAGZATMCAAHMAjMBAAHMATMBZgEAAcwBMwGZAQABzAEzAcwBAAHMATMB/wEAAcwBZgIA
AcwBZgEzAQABmQJmAQABzAFmAZkBAAHMAWYBzAEAAZkBZgH/AQABzAGZAgABzAGZATMBAAHMAZkBZgEA
AcwCmQEAAcwBmQHMAQABzAGZAf8BAALMAgACzAEzAQACzAFmAQACzAGZAQADzAEAAswB/wEAAcwB/wIA
AcwB/wEzAQABmQH/AWYBAAHMAf8BmQEAAcwB/wHMAQABzAL/AQABzAEAATMBAAH/AQABZgEAAf8BAAGZ
AQABzAEzAgAB/wIzAQAB/wEzAWYBAAH/ATMBmQEAAf8BMwHMAQAB/wEzAf8BAAH/AWYCAAH/AWYBMwEA
AcwCZgEAAf8BZgGZAQAB/wFmAcwBAAHMAWYB/wEAAf8BmQIAAf8BmQEzAQAB/wGZAWYBAAH/ApkBAAH/
AZkBzAEAAf8BmQH/AQAB/wHMAgAB/wHMATMBAAH/AcwBZgEAAf8BzAGZAQAB/wLMAQAB/wHMAf8BAAL/
ATMBAAHMAf8BZgEAAv8BmQEAAv8BzAEAAmYB/wEAAWYB/wFmAQABZgL/AQAB/wJmAQAB/wFmAf8BAAL/
AWYBAAEhAQABpQEAA18BAAN3AQADhgEAA5YBAAPLAQADsgEAA9cBAAPdAQAD4wEAA+oBAAPxAQAD+AEA
AfAB+wH/AQABpAKgAQADgAMAAf8CAAH/AwAC/wEAAf8DAAH/AQAB/wEAAv8CAAP/AgAfZykAAf8D8jMA
AfQBZx2YAWcpAAEJA7IHAAj0JAAB7QFnHZgBZykAAQkDsgcACLIkAAHtAWcMmAFtA2cB6wyYAWcpAAEJ
A7IHAAiyJAAB7QFnCpgB7AdnAZIKmAFnFgACshEAAQkDsg0AArIkAAHtAWcJmANnBf8CZwHrCZgBZxYA
ArIMAAXzAQkDsgXzAf8HAAKyJAAB7QFnCZgBZwH3B/8CZwmYAWcHAAqyBQACsgwADrIB9AcAArIkAAHt
AWcImAJnCf8CZwiYAWcHAAqyBQACsgwADrIB9AcAArIkAAHtAWcHmAHrAWcE/wHzAe0B9AT/AWcImAFn
BwACsgoACbIIAA6yAfQHAAKyJAAB7QFnB5gCZwP/BWcD/wJnB5gBZwcAArIKAAmyCAAF8wG7A7IF8wH/
BwACsiQAAe0BZweYAWcD/wFtAWcCmAHtAWcBBwP/AWcHmAFnBwACsg0AArIRAAEJA7INAAKyJAAB7QFn
B5gBZwP/AWcB7AOYAmcD/wFnB5gBZwcAArINAAKyEQABCQOyDQACsiQAAe0BZweYAWcD/wFnBZgBZwP/
AWcHmAFnBwACsgMACAkCAAKyEQABCQOyDQACsiQAAe0BZweYAWcD/wFnBZgBZwP/AWcHmAFnBwACsgMA
CLIVAAEJA7INAAKyJAAB7QFnB5gBZwP/AWcBkgOYAeoBZwP/AWcHmAFnBwACsgMACAkDAAHzARkB8w8A
AfQDCQ0AArIkAAHtAWcHmAFnA/8CZwOYAWcBjQP/AWcHmAFnBwACsg4AAboBsgG6IAACsiQAAe0BZweY
AWcB6wP/BWcD/wJnB5gBZwcAArIOAAG6AbIBuiAAArIkAAHtAWcHmAHrAWcE/wH3AWcBvAT/AWcImAFn
BwACsg4AAboBsgG6IAACsiQAAe0BZwiYAWcBbQn/AmcImAFnBwACsgMACAkDAAG6AbIBuiAAArIkAAHt
AWcImAHsAWcB8wf/AZIBZwOYBWcBmAFnBwACsgMACLIDAAG6AbIBuiAAArIkAAHtAWcJmANnBf8DZwOY
BWcBmAFnBwACsgMACLoDAAG6AbIBugoAArIB9BMAArIkAAHtAWcKmAFtB2cB7ASYAWcD4wFnAZgBZwcA
ArIOAAG6AbIBugoAArIB9BMAArIkAAHtAWcMmAVnBpgFZwGYAWcHAAKyDgABugGyAboKAAKyAfQTAAKy
JAAB7QFnF5gBbQNnAewBmAFnBwACsg4AAboBsgG6CgACsgH0EwACsiQAAfABZx2YAWcHAAKyDgABugGy
AboKAAKyAfQTAAKyJQAfZwcAErIBugoAArIB9BMAArImAAUHAmcPbgFnAewFBwgAErIBugoAArIB9BMA
ArIrAAHwAWcPmgFnAf8qAAKyAfQTAAKyLAABZw+aAWcrABiyLAABZw+aAWcrAAKzFrosABFnbwAB9A9n
Af+SAAolAW9zAA8lUwAL9BEACSUBTAglAW9PAA/rDgAFJQFvCQABRgUlJwAB9htZCgAC6wHyCwABBwLr
DAAEJQFMDQAFJQYAHfQDAB1ZCQAB6wHtDQAC6wsABCUQAAH0BCUEAB+KAgAdWQkAAesB8gEAAusCAAHy
AesDAAHrAewBAAHsAesKAAQlEgAB/wMlAW8CAAG0AYoBZQK7GhkBigIAHVkJAAHrAfQBAALrAgAB8gHr
AwAB6wHsAQABkgHrCQAB/wMlFAAB9AMlAgABswGKAmUCuxkZAYoCAB1ZCQAB6wH0AQAC6wIAAfIB6wMA
AesB7AEAAZIB6wkAAyUBFhUAAUYDJQEAAbMBigG7AmUBuwEJGBkBigIAHVkJAAHrAfQBAALrAgAB8gHr
AwAB6wHsAQABkgHrCAAB/wMlBQAM/wYAAyUBAAGzAYoBuwEZAmUBuwEJCRkBCQwZAbsBigIAHVkJAAHr
AfQBAALrAgAB8gHrAwAB6wHsAQABkgHrCAADJQHzBQABbwslBgABRgIlAW8BswGKAbsCGQJlAbsIGQK7
CxkBCQFlAYoCAB1ZCQAB6wH0AQAC6wIAAfIB6wMAAesB7AEAAZIB6wgAAyUGAAFvCyUHAAMlAbMBigG7
AxkCZQG7BhkBuwJlAbsKGQJlAYoCAB1ZCQAB6wH0AQAC6wIAAfIB6wMAAesB7AEAAZIB6wgAAyUGAAFv
CyUHAAMlAbMBigG7BBkCZQG7BRkBZgJlAWYBCQgZAbsBZQEZAYoCAB1ZCQAB6wH0AQAC6wIAAfIB6wMA
AesB7AEAAZIB6wcAAf8DJQYAAW8LJQcAAyUBswGKAbsFGQJlAbsDGQG7AWUBZgGRAWUBuwcZAQkCZQEZ
AYoCAB1ZCQAB6wH0AQAC6wIAAfIB6wMAAesB7AEAAZIB6wcAAZQCJQEaBgABbwslBwADJQGzAYoBuwYZ
AWUBZgG7AQkBuwJlAhkBZQFmAQkGGQFmAWUCGQGKAgAdWQkAAesB9AEAAusCAAHyAesDAAHrAewBAAGS
AesHAAFGAiUB9AYAAW8LJQcAAW8CJQGzAYoBuwYZAbsCZQG7AmUDGQEJAWUBuwUZAbsBZQFsAhkBigIA
HVkJAAHrAfQBAALrAgAB8gHrAwAB6wHsAQABkgHrBwABkwIlARoGAAFvCyUHAAMlAbMBigG7BxkBtQNl
BRkCZQG7AxkBCQJlAxkBigIAHVkJAAHrAfQBAALrAgAB8gHrAwAB6wHsAQABkgHrBwAB/wIlAUwGAAFv
CyUHAAMlAbMBigG7EBkBCQFlAbsDGQGuAWUEGQGKAgAdWQkAAesB9AEAAusCAAHyAesDAAHrAewBAAGS
AesIAAMlBgABbwslBwADJQGzAYoBuwIZAWYCZQwZAmUBuwEZAbsCZQQZAYoCAB1ZCQAB6wH0AQAC6wIA
AfIB6wMAAesB7AEAAZIB6wgAAyUGAAFvCyUHAAMlAbMBigG7ARkBZQGLAhkBZQwZAWUCuwJlBRkBigIA
HVkJAAHrAfQNAAGSAesIAAMlAf8FAAFvCyUGAAEWAyUBswGKAbsBGQFlAbsCGQFlDBkEZQGRBRkBigIA
ATEbWQExBwAC/wHrAfAN/wHsAesC/wYAAfQDJQUAARYLRgYAAyUB/wGzAYoBuwEZAWUBuwIJAWUOGQG1
BxkBigIAAzEBWBX/BDEHABXrBwADJQHzFQABbwMlAQABswGKAbsCGQNlAbsWGQGKAgADMQFYFf8EMQcA
FesHAAEaAyUVAAMlAgABswGKAbscGQGKAgAdMQcAFesIAAQlEwAEJQIAAbMBih27AYoCABsxAXkNAALr
BwAB6wHsDgAEJREABCUEAB+KAgASMRcAAusB9AUAAbwB6wHvDwAEJQHzDQABkwQlBQAB/xytAbQDABEx
AZkYAAnrEQAFJQH/CQAB8wUlJwARMRoAAfEFkgH0EwAHJQFvARsB9AEaAUYHJW4AARoPJQH/cQAB9Asl
Af93AAH/AZMBRgGTAf9ZAAH0BlUBdwH/dQANVXEAB1UBlwGYAXcGVQF3bgAEVQGYCQABdwRVawAB9ANV
AZ0NAAGXA1UB/xMAAf8BGQkJARkB/wgAAf8FCQH0AgABGQUJAf8CAAYJFAALsgGzCAAB/wNVEAAB/wNV
EwABuwuyAbsIAAH/BQkB9AIAARkFCQH/AgAGCRMAAQkMsggAA1USAAH/A1UIAAH/ARkICQKzCQkCswgA
Af8CCQH/AgkB9AIAARkBCQEZAf8CCQH/AgADCQH/AfIBCQoAAbMKsgH0CAABugGyBwADVRQAAfQCVQGX
BwACuwgJArMB/wcAAf8BswGyCAAB/wIJAQACCQH0AgABGQEJAfMBAAIJAf8CAAMJAQAB8wEJCQAB8wGz
CAABugGyAfQIAAG6AbIGAAH/AlUBCAcAAfENAAF3AlUGAAH/AbMB/wcAAf8CswkJAbMBsggAAf8FCQH0
AgABGQUJAf8CAAYJCQABugH0CAABCQyyBgADVQgAAlUNAAJVAXcFAAH/AbMB/wgAAbsLsgG7CAAB/wUJ
AfQCAAEZBQkB/wIABgkJAAG6AfQJAAyyBgACVQH0CAADVQwAAXcCVQUAAf8BswH/CAAB/wEZCQkBGQH/
CQAB/wIJAv8DAAL/AwkB/wMAAv8CCQHzAf8JAAG6AfQaAAEIAlUJAARVAfELAAJVAf8EAAH/AbMB/x8A
AgkHAAMJBgACCQH0CgABugH0GgADVQkABlUKAAJVAXcEAAH/AbMB/wgAAf8BGQkJARkB/woAAgkH/wMJ
Bv8CCQH0CgABugH0CQALsgGzBQACVQGXCQAHVQkAA1UEAAH/AbMB/wgAAbsLsgG7CgAUCQH0CgABugH0
CAABCQyyBQACVQHzCQAIVQEIBwADVQQAAf8BswH/AwAF/wKzCQkCswoAFAkB9AoAAboB9AQABPQBswGy
AfQIAAG6AbIFAAJVAfQJAAlVBwABnQJVBAAB/wGzAf8BAAH/AbsFswGyAbMB/wcAAf8BswGyEwAB8wIJ
EwABugH0AgAIsgH0CAABugGyBQACVQHzCQAIVQgAA1UEAAH/AbMB/wEAARkBuwH/AwAB/wKzCQkBswGy
EwAB8wIJEwABugH0AgABsgUAAQkMsgUAAlUBlwkABlUBCAkAA1UEAAH/AbMB/wEAAgkFAAG7C7IBuwwA
B/8BGQIJB/8MAAG6AfQCAAGyBgAMsgUAA1UJAAVVAf8KAANVBAAB/wGzAf8BAAIJBQAB/wEZCQkBGQH/
CwAB8xIJCwABugH0AgABshcAAZgCVQkABFUMAAJVAfQEAAH/AbMB/wEAAgkdAAHzAQkO/wMJCwABugH0
AgABshgAAlUB/wgAAlUBCAwAAZcCVQQAAf8BGQGzAgkCugEZAf8DAAH/ARkJCQEZAf8LAAHzAQkOAAMJ
CgAHsgGzBAALsgGzBgADVQgAAVUOAANVBAABuweyAbsDAAG7C7IBuwsAAfMBCQMAAgkJAAMJCQABCQiy
AwABCQyyBgAB9AJVAfMVAAGXAlUEAAH/ArMFCQKzA/8CswkJArMLAAHzAQkDAAIJCQADCQkAAboBsgH0
BAABugGyA/QBswGyAfQIAAG6AbIHAANVFQADVQQAAf8CswH/AwAB/wGzAbIDswGyAbMB/wcAAf8BswGy
CwAB8wEJDgADCQkAAboBsgH0BAABugayAfQIAAG6AbIIAANVEwADVQUAAf8CswUJAbMBsgIAAf8CswkJ
AbMBsgsAAfMBCQ4AAwkJAAEJCLIDAAEJDLIIAAHyA1URAANVBwABuweyAbsDAAG7C7IBuwsAAfMSCQoA
CLIEAAyyCQABCANVAfINAAGYA1UB9AcAAf8BGQUJARkB/wMAAf8BGQkJARkB/wsAAf8RCQHzLAAB8gRV
Af8JAAHyBFVuAAZVAZcB8QH0AfEHVXAAAfQNVQH/dAABmAdVAfD0AAHCCFoB8w4AAbwBbRrrAW0BBwH/
AQAB8wHyG/8B9wgAAbMQAAH/AbsNAAHzDFoB9AsAAf8B6xwZAewB/wEAAREdCQHqBwABshEAAbIMABBa
CgAB/wHrAbsEUQG7FgkB7AH0AQABEQEJBFkBERcJAeoGAAGyAQkBsgIJAbMCCQG6AgkBuwcJAboBswoA
BloBCAQAAZ4FWgoAAf8B6wG7AXMCdAFzAbsWCQHsAfQBAAERAQkBuwMTGAkB6gUAAv8BAAGzAgABCQIA
AfMCAAH/CAABCQkABVoB/wgAAf8DWgoAAf8B6xsJAewB6wH0AQABERwJAbsB6gUAAf8CAAGzAgABCQIA
AfMCAAH/CAABGQgAAZ4EWgwAAeQB/woAAf8B6xsJAZEBbQH0AQABERwJAbsB6gUAAf8CAAGzAgABCQIA
AfMCAAH/CAABGQgABFoZAAH/AesbCQGRAW0B9AEAAREcCQG7AeoFAAH/ArMBshKzBwAEWhoAAf8B6xsJ
AbsB6wH0AQABER0JAeoFAAH/FAABGQcAA1oB/xoAAf8B6xsJAZEB6wH0AQABERwJAbsB6gUAAf8UAAEZ
BgABngNaGwAB/wHrGwkBuwHrAfQBAAERHQkB6gUAAf8UAAEZBgADWgH/GwAB/wHrCwkBuwHsA+sBuwsJ
AewB9AEAAREMCQURDAkB6gUAAf8UAAEZBgADWhQAA1oFAAH/AesLCQH3AWgCsQFvAZILCQHsAfQBAAER
DAkBQwMWAREMCQHqBQAB/xQAARkGAANaEwABCARaBAAB/wHrCwkB9wFvAhYBbwH3CwkB7AH0AQABEQwJ
AUMBFgFvARYBEQwJAeoFAAH/FAABGQUAAf8DWhIAAf8GWgMAAf8B6wsJAfcEbwH3CwkB7AH0AQABEQwJ
AUMBFgFZARYBEQwJAeoFAAH/FAABGQUAAZ4CWgGeEgAHWgEIAgAB8wESCrQBkQGuBG8B6wGRCrQB6gHx
ARMNEQFDARYBWQEWDhEFAAH/FAABGQUAA1oBwhEACVoB/wEAARQMiwFtAW4CTAFvAW0MiwEUARENugFD
AREBWQFEARENugUAAf8VsgUAAZ4CWgGeEAALWgH/AeoFuwEJBdwBCQH3AW4CUgFuAZIBCQvcAW0BEQEJ
AhEBCQERAUMHCQFDARUBWQFoARENCQUAAf8CAAGzAgABCQIAAfMCAAH/CAABGQUAAf8DWg8ABFoBngNa
Af8EWgFtAbsBkQH3AbsB7QG7BgkB9wFuAo4BbwH3DAkB6wERDQkBQwMWARENCQUAAf8CAAGzAgABCQIA
AfMCAAH/CAABGQYAA1oPAARaAQADWgEAAf8DWgFtDAkB9wFvArEBbwH3DAkB6wERDQkBFAOUARENCQUA
Af8CAAGzAgABCQIAAfMCAAH/CAABGQYAA1oPAANaAgADWgIAAcACWgFtDAkBuwFtAusBbQH3DAkB6wER
DQkBkgMRAbsNCQUAAf8CAAGzAgABCQIAAfMCAAH/CAABGQYAA1oQAAEbAgAB8wNaAwAB/wEAAW0eCQHr
AREfCQQAAf8BshW0AbIFAAF8A1oSAANaAZ4FAAFtHgkB6wERHwkEAAGyFwABsgUAA1oRAAH/A1oGAAFt
HgkB6wERHgkBGQQAAbIXswGyBQAEWhAABFoGAAHrAfMc9AHzAesBAAESHf8BEQQAAboXAAGyBgAEWg4A
BFoHAAHzBuwBbQFKAeoM7AHqAUoB6gbsAfMIAAFEAUwNAAFSARELAAG6FwABsgYABVoMAARaAZ4OAAEH
AVIBHAH/CwABHAFSAe8PAAFEAVINAAFZARELAAG6FwABsgcABVoKAAVaDwABBwFSARwB/wsAARwBUgHv
DwABRAFSDQABWQERCwABugQAAbIB9AsAAQkBsgQAAbIIAAZaBgAGWhAAAQcBUgEcAf8LAAEcAVIB7w8A
AUQBUg0AAVkBEQsAAboDAAGyAQABswsAAQkBAAGyAwABsgkAEFoRAAG8AVIBSwH/CgAB/wFuAVIBBw8A
AREBWQHqCwABEQFZARELAAG6AgABsgMAAbIJAAGyAwABswIAAbIKAAHkDFoBnhIAAfMBdAFSAewKBwHs
AVIBdAHyDwABvAF6AVkLEQFZARoB/wsAAboBswG6BAABuggAAvMDAAH/AboBswEJDAAKWhQAAf8B7wF0
AVkKUgFZAXQB9wH/EAABEQH/AcMJmgHDAfEBExQAAbIBCQUAAboBsxcAAfQCngH/GAAB/wG8AewL6wEH
Af8TAAEUCREBExgAAboDsgEJEQAY/woAFP8IAB2yJQAZ1AcAAf8XrAUAA7IEuhCyBboDsiQAGdQHABms
AwAB/wKyBQAQsgYAArIkAALUAgAC1A0AAtQCAALUBgACrAEJFQABsgGsAfQCAAGzAbIB8wUAELIGAAG6
AbIkAALUAgAC1A0AAtQCAALUBgACrBcAAqwCAAKyAfQFABCyBgABugGyCAAR9AsAAtQCAALUDQAC1AIA
AtQGAAKsFwACrAIAArIB9AUAELIGAAG6AbIGAAGzE7IBCQkAAtQCAALUAwAB1QXUAfMDAALUAgAC1AYA
AqwXAAKsAgACsgH0BQAQsgYAAboBsgYAArIQGQEJArIJAALUAgAC1AMABtQB3QMAAtQCAALUBgACrBcA
AqwCAAKyAfQFABCyBgABugGyBQAB9AGyAQkRAAKyCQAC1AIAAtQNAALUAgAC1AYAAqwXAAKsAgACsgH0
BQABsw+yBgABugGyBQAB9AGyAQkRAAKyCQAC1AIAAtQNAALUAgAC1AYAAqwXAAKsAgACsgH0BQAB9A+y
BgABugGyBQAB9AGyAQkRAAKyCQAC1AIAAtQNAALUAgAC1AYAAqwXAAKsAgACsgH0BgAPsgYAAboBsgUA
AfQBsgEJEQACsgkAAtQCABHUAgAC1AYAAqwXAAKsAgACsgH0BgAB/w2yBwABugGyBQAB9AGyAQkRAAKy
CQAC1AIAEdQCAALUBgACrBcAAqwCAAKyAfQIAAHzCboB/wgAAboBsgUAAfQBsgEJEQACsgkAAtQCAAH/
D/MDAALUBgACrBcAAqwCAAKyAfQbAAG6AbIFAAH0AbIBCREAArIJAALUFQAC1AYAAqwXAAKsAgACsgH0
GwABugGyBQAB9AGyAQkIAAG6CAACsgkAAtQVAALUBgACrBcAAqwCAAKyAfQbAAG6AbIFAAH0AbIBCQcA
AboCshIAAtQVAALUBgACrBcAAqwCAAKyAfQbAAG6AbIFAAH0AbIBCQgAA7IRAALUFQAC1AYAAqwXAAKs
AgACsgH0GwABugGyBQAB9AGyAQkJAAOyEAAC1BUAAtQGAAKsBAABsw2sAQkEAAKsAgACsgH0GwABugGy
BQAB9AGyAQkKAAOyBQABugkAAtQVAALUBgACrAQAD6wEAAKsAgACsgH0GwABugGyBQAB9AGyAQkLAAOy
AwACsgkAAtQVAALUBgACrAQAAqwLAAKsBAACrAIAArIB9BsAAboBsgUAAfQBsgEJDAADsgIAArIJAALU
FQAC1AYAAqwEAAKsCwACrAQAAqwCAAKyAfQHAA30BwABugGyBQAB9AGyAQkNAAOyAQACsgkAAtQCAAzU
AQkGAALUBgACrAQAAqwGAAEZAawDAAKsBAACrAIAArIB9AUAEbIFAAG6AbIFAAH0AbIBCQ4ABbIJAALU
AgAN1AUAA9QGAAKsBAACrAYAAqwDAAKsBAACrAIAArIB9AQAE7IEAAG6AbIFAAH0AbIBuw8ABLIJAALU
AgAN1AQAA9QHAAKsBAACrAYAAqwDAAKsBAACrAIAArIB9AMAAfQTsgQAAboBsgYACrIEAAeyCQAC1AIA
DdQDAAPUAf8HAAKsBAACrAYAAqwDAAKsBAACrAIAArIB9AMAAbsTsgH0AwABugGyBgABCQmyAwABugey
CQAC1AIADdQCAAPUAf8IAAKsBAACrAcAAf8DAAKsBAACrAIAArIB9AMAAboTsgH0AwABugGyJAAC1AIA
DdQBAAPUCgACrAQAAqwLAAKsAwABCQGsAQkCAAKyAfQDAAG6E7IB9AMAAboBsiQAFNQLAAH/AqwBtAIZ
AqwLtAKsAhkBswKsAwAB9AGyAbMDAAG6E7IB9AMAArIkABPUAf8MAAGzF6wB8wQAArIBswL0AboTsgEZ
AfQB8wOyJAAB8xHdAf8OAAH/AbMTrAG0BgAB/x2yZAAB9BiyAbMmAAGXA1UBCD8AAf8B9AHcAdQK0wHU
AdsBGQH/KQABwgZVAfQiAAH/AZMBbwMXAW8BGgH/EAAB/wHbEtMB1AH0CQAB/wHvARQSDwERAewB8wYA
CVUB/x4AARYLFwEaDQABGRbTAdUB/wUAAf8B7xgAARQB/wQAClUBlxsAAbcPFwH/CgABGRjTAdQFAAEH
AQABDgHxFAAB/wFtAQABEQH/AwAMVQHCGAASFwGTCAAB/xrTARkDAAH/ARABDgHzFgAB/wFtAQABvAMA
DlUB/xUAFBcBFgcAARka0wHUAwAB8gEAARUB/xcAAfABAAHtAwAQVRMAFhcBkwYAAQkN0wGyDNMB1AMA
AfEBAAETAf8XAAHxAQAB7AMAEVUBmBAAARYXFwH/BQAB8w3TAW0M0wHUAwAB8gEAARUB/xcAAfEBAAHt
AwATVQHyDQAB/xkXBQAB/wzTAbIBSgzTAQkDAAHzAQABEAH/FwABBwEAAe8DABVVAf8LAAYXARYN/wYX
ARoFAAHUC9MBiwFKDNMB/wMAAf8BEQEOAfQXAAHsAQABvAMAFlUBlwkAAf8GFwEWDf8HFwUAAfML0wHq
AUoBrQrTAdUFAAHrAQAB8RYAAf8BEQEAAfMDABhVAZgHAAGTBhcBFg3/BxcB/wUAC9MCSgFtCtMB/wUA
AbwBAAHsAf8VAAHwAQABQwH/AwAaVQH0BQAHFwEWDf8HFwEaBQAB8wnTAawDRAHNCNMB1QYAAfQBDgEA
AfEGAAH/AfIBkgHqARIB7AG8Af8GAAH/ARIBAAHwBAAbVQGYBAAHFwEWDf8HFwFvBgAB1AbTAqwBbANE
AqwBzQbTAf8HAAHxAQABDwHzAwAB/wHrCAABEAHxAwAB/wHqAQAB6gH/BAAcVQH/AwAHFwEWDf8IFwYA
Af8F0wOsAUoDRAGLAqwF0wHzCAAB/wHvAgABFQH3AewCAAERAQcB/wIAAf8B8gFtAgABEAHvAW0CAAES
Af8FABxVAZgDAAcXARYN/wgXBwAB9ATTA6wBSgJuAUoBEgOsA9MBGQsAAfMBFAMAAQ8B8ggAAf8B7AMA
AQ4BBwH/BgAcVQEbAwAHFwEWDf8IFwgAAf8D0wKsAfcEmgF0AqwBzQLTAfQOAAT/AQAB/wHwAewCEwHs
AfAB/wIAA/8JABxVBAAHFwEWDf8HFwFvCQAB/wEJAtMBHAeaAawB0wEJAf8SAAH/AewIAAHsAf8MABpV
AZcFAAcXARYN/wcXAZMMAAEaCZoUAAH0AQ4BAAEQAfAB/wIAAf8B8AEPAQABEQH0CwAZVQH/BgABFgYX
ARYN/wcXAf8LAAH/CpoB8xIAAfQBDgEAAfcHAAH/Ae0BAAEPAf8KABdVAfEIAAH0BhcBFg3/BxcMAAEa
C5oSAAHsAQABkgoAAZIBAAHsAf8JABVWAZgLAAYXARYN/wYXARYLAAH/DJoB9BAAAfQBDgEQAf8KAAH0
AQ4BAAH0CQAUVgH/DAABGgYXDRYGFwwAAfQMmgEaEAAB8QEAAW0B/woAAf8B6gEAAfEJABJWAfQPABgX
AbcMAAEaC5oBkwHrEAABvAEAAesB/woAAf8B6wEAAfAJABBWAQgRAAH/FxcNAAEcAewD6wFzAZMEmgGZ
Am0QAAHyAQABEwH/CgAB/wEVAQAB8gkADlYBlxQAAfQVFw4AAewHbQEcApoB6wJtEAAB/wFDAQ4B9AoA
AfIBAAEQAf8JAA1WAf8WAAH0ExcPAAEHCG0B6wGTAm0B7BEAAQcBAAERAf8IAAH/ARQBAAG8CgALVgH0
GQAB/xAXARYQAAH/DG0B8BEAAf8B7AEAAREB8wYAAfMBEAEAAesB/woACVYBCB0AARoNFwH/EgAB7Qtt
EwAB/wHsAgABEQH3AvAB9wERAgABkgwAAZgGVgGXIQAB9AEWBxcBkwH/FAAB/wHrCW0B9BUAAfQB6gYA
AeoB9A4ABVYB/0IAAf8BkgZtAewB/xkAAf8C9AH/EgACCAH/RgAB9AHvAusB9wHzjQAB/x4AAREhAAHy
HO0B7wH/AQAB8gHtCZIB7QHsAesDbQHsAe0JkgHtAe8B/wFtKgAL/wsAAfIB8An/AfMB8A//AfQBBwH/
AQAB8gHxBv8B9AP/Au8CFAHsAbwB8wL/AfQG/wH0AQcB/ykAD+sJAAHzAbwJ/wHxAe8E/wLyCf8B8gG8
AgAB8wG8Bf8B9AHvA/8B7wHzARIBEwHwAbwB8wL/Ae0B8wX/AfEBvCkAAusB8Qv/AfcB6wH3CAAB/wHv
Cf8B8QHvBP8CBwn/AfcB9AIAAf8B9wX/AQcB8QP/Ae0B7wHrAeoB7wHsAfMC/wH0Ae8F/wH3AfQOAAEP
Ae0B8QHzAfABbQEOFAAB6wH3DQAC6wkAAfMB9wj/AfEB7wH/AfMB8gHzAe8BBwj/AbwB8QQAAfMB9wT/
AfMB7wP/Ae8B9AHrAW0B9AG8AfMC/wGSAfIE/wG8AfENAAERAfQGAAH/AfISAAH/AesB9AEAAusCAAHw
AesDAAHrAewBAAHsAesKAAH0AfcE/wH0AQcB7QH3AQcBkgHzAf8BBwHvAQcBkgHtAfEE/wEHAfAB/wUA
AfMB7wj/Ae0B7wL/AQcB7QHzB/8BBwG8Af8MAAH3CwABEhAAAfQB6wH/AQAC6wIAAfAB6wMAAesB7AEA
AewB6wsAAf8BvAH3AbwB7QG8A/QB9wH0A/8B7wHyAvQB8wH3AQcC7wH/CAAB/wEHAfcB8wX/Ae8B9AP/
AQcB8wT/AfQBBwHvAf8NAAEHDQABQw8AAfQB6wH/AQAC6wIAAfAB6wMAAesB7AEAAewB6w0AAfQB7wH/
A/QB8wH3BP8B7wHxBPQBvAHwDQAB/wHzAfID8QHvAf8C9AH/AQcB8APxAfMB/w8AAW0GAAP/FQAB9AHr
Af8BAALrAgAB8AHrAwAB6wHsAQAB7AHrDQAB/wHxAfcB8ALzAZIB7AHvAbwB8AEHAZIB7AHvAfMB8AHv
AQcB/xEAAf8B8AHsAQcB8gHzAbwB7QHvAfQYAAHzARADAAETAf8EAAH0DgAB9AHrAf8BAALrAgAB8AHr
AwAB6wHsAQAB7AHrEAAB/wH3Ae8B9AL/A/QB/wH0AfIB7AHwAf8RAAH/AbwB7wj/AfAB9wH/EAAB9wQA
AfcHAAH0BAABDg0AAfQB6wH/AQAC6wIAAfAB6wMAAesB7AEAAewB6w8AAf8B9wHzAfQC/wH0AQcB7wG8
A/8B9AG8AQcQAAH/Ae8B9AP/AfMCBwHyBP8BkgHyEwAB8gkAAf8DAAHzDQAB9AHrAf8BAALrAgAB8AHr
AwAB6wHsAQAB7AHrDgAB/wHsAfMB9AL/AfQB8AEHAe8BBwHxAv8C9AG8AQcB/w0AAf8B7wHzA/8B9AHw
AgcBvAHzBP8B7wHzHAABFREAAfQB6wH/AQAC6wIAAfAB6wMAAesB7AEAAewB6w0AAf8BvAHxAvQB8wHv
AfMF/wHxAe8B8wL0AfcB8wwAAf8BBwHwAv8B8AH3AfME/wH0AQcB9wL/AfQB9wH/DAABbQMAAf8cAAH0
AesB/wEAAusCAAHwAesDAAHrAewBAAHsAesNAAH/AQcD/wv0Av8B8wEHAf8LAAH0AfcQ/wEHAfEMAAEH
AwAB7QsAAf8DAAEODAAB9AHrAf8BAALrAgAB8AHrAwAB6wHsAQAB7AHrDAAB8gHtAQcI/wEHAfcB9AX/
AfQB7QH3Af8JAAHxAewBvAj/AfcB7wb/AfMB7AG8Af8KAAHyAwABEwsAAfMDAAFDDAAB9AHrAf8BAALr
AgAB8AHrAwAB6wHsAQAB7AHrCwAB8wG8AfIBvAL/AfIBvAHxA/8B9AHvAv8B8QHwAfIC/wHvAfQB7wH/
BwAB8QHwAbwB8QL/A/QD/wG8Ae8C/wL0AfYB/wHzAfcB8gEHCgAB8AMAAesLAAH0AwABEAwAAfQB6wH/
AQAC6wIAAfAB6wMAAesB7AEAAewB6woAAf8B8QHvAQcBvAL3AfEB8wHxAfcB7AH0Af8BvAHsAbwB8wHy
AQcB7QH0A+8B8wYAAf8BvALvAfIQ/wH0AfcBBwH3Af8JAAGSAwAB8RwAAfQB6wH/AQAC6wIAAfAB6wMA
AesB7AEAAewB6woAAf8BvAHvAesBbQHzAf8B8QHtAe8B/wG8AfcB8wHsAvQBBwHvAfQB/wPsAQcB8gH/
BQAB/wEHAfcB7AHyAv8B8wEHAfQH/wK8A/8B7AGSAfcB9AkAAQ8DAAH/HAAB9AHrAf8BAALrAgAB8AHr
AwAB6wHsAQAB7AHrCgAB/wG8AfABBwHqAfIC/wLzAfEB9wESAeoB6wHwAfIC8wL/AesBbQHyAe8B8wYA
Af8BBwH/AQcB8wL/AfQB8Aj/AvED/wH3AfQB7QH0DgAB6wkAAfIDAAH/DQAB9AHrAf8NAAHsAesLAAL/
AQcB6wHtAfcB7wEHAfAB8QHzAv8B9AHyAfABvAEHAfcB7QHsAW0B8QH/CAAB/wHzAewB8QG8AZIC8wG8
AQcE/wHwAQcC8wHvAfcB9AHtAfIB/wsAAfMEAAEOBwAB6gQAAW0MAAL/AesB8w3/AewB6wL/CwABBwHt
Ef8B6wHzCgAB/wFtARIB8AL/AfQI/wL0Av8B9AFtAfIMAAEOBAAB/wHqBQAB7xIAFesLAAEHAesB8w//
AbwB6wHyCgAB8gETARQB6gHxCf8D9AL/AfEBEwH3Af8MAAHxBQAB/wEHAZIBvAH/BQAB6g0AFesLAAHw
AuwO/wHyAesB7QHzCgAB8AMUAfcD/wHxAZIB6gETCRQB7AH/DQAB/w0AAfIOABXrCwAB8wPtAfMBBwHs
Am0D6wFtAewB7wH0AfAB7AH3Ae0B9AoAAbwDFAHsAfQB7A4UAW0B/w4AAf8LAAHxFAAC6wcAAesB7BAA
Af8D9wHtAvcDkgH3AZID9wLtAfcBkgHvAf8KAAH0ARICFAETEBQB7AH/BAAB7AoAAfEIAAH/AZIVAALr
Af8FAAHwAesBBxEAAfMB6wf3Ae0H9wHsAf8LAAH/AfMB7AESERQBBwH/BAAB/wEOCgABDwG8Af8DAAH/
AZIBDgoAAeoLAAH/CesTAAHzAesB7AGSBPcBkgb3Ae0B/w8AAf8B7w8UAewB/wcABf8BkhEAAfAF/w4A
AQcF7AHyFgAB/wEHAewB9wHtAZID9wHsAe0B7AHvAf8RAAH/AesMFAESAbwfAAHsMwAB/wG8AfMB9wLs
Ae8D/xQAAf8B8AFtBxQBbQHvAfQB/xAAARIPAAHzNwAC/xsABv8VAAHzgAAB8AwAARAB/ykAAfMB8Rv/
AfcB/wEAH2dBAAERHQkB6gH0AWcdmAFnQQABEQEJBFkBERcJAeoB7QFnHZgBZyIAAfYbWQMAAREBCQG7
AxIYCQHqAe0BZwyYAW0DZwHsDJgBZyIAHVkCAAERHAkBuwHqAe0BZwqYAewHZwGSCpgBZxYAAroKAB1Z
AgABERwJAbsB6gHtAWcJmAHqAmcF/wJnAesJmAFnFgACsgoAHVkCAAERHAkBuwHqAe0BZwmYAWcB9wf/
AW0BZwmYAWcHAAqyBQACsgoAHVkCAAERHQkB6gHtAWcImAJnCf8CZwiYAWcHAAqyBQACsgoAHVkCAAER
HAkBuwHqAe0BZweYAesBZwT/AfMB7QH0BP8BZwiYAWcHAAKyCgAIsgG6BgAdWQIAAREdCQHqAe0BZweY
AWcB6wP/BWcD/wJnB5gBZwcAArIKAAiyAboGAB1ZAgABEQwJAREDQwERDAkB6gHtAWcHmAFnA/8B7AFn
ApgB7QFnAQcC/wH0AWcHmAFnBwACsg0AArIKAB1ZAgABEQwJAUMDFgERDAkB6gHtAWcHmAFnA/8BZwHs
A5gCZwP/AWcHmAFnBwACsg0AArIKAB1ZAgABEQwJAUMBFgFvARYBEQwJAeoB7QFnB5gBZwP/AWcFmAFn
A/8BZweYAWcHAAKyAwAIGQIAArIKAB1ZAgABEQwJAUMBFgFZARYBEQwJAeoB7QFnB5gBZwP/AWcFmAFn
A/8BZweYAWcHAAKyAwAIsg4AHVkBAAHqDREBQwEWAVkBFg0RAUMB7QFnB5gBZwP/AWcB7QOYAeoBZwP/
AWcHmAFnBwACsgMACLoDAAL0Af8IAB1ZAQABEQ26AkMBWQFEARENugHtAWcHmAFnA/8CZwOYAWcB7QL/
AfQBZweYAWcHAAKyDgABtAGyAQkIAB1ZAQABEQEJAhUBCQEVARQHCQFDAUQBegFoARENCQHtAWcHmAFn
AY0D/wVnA/8CZweYAWcHAAKyDgABtAGyAQkIAB1ZAQABEQ0JAUMDFgERDQkB7QFnB5gB6wFnBP8B9wFn
AbwE/wFnAZIHmAFnBwACsg4AAbQBsgEJCAAdWQEAARENCQEUA5QBEQ0JAe0BZwiYAWcB6wn/AmcImAFn
BwACsgMACBkDAAG0AbIBCQgAHVkBAAERDQkBkQMSAfcNCQHtAWcImAHsAWcB8Af/AZIBZwOYBWcBmAFn
BwACsgMACLIDAAG0AbIBCQgAATEbWQExAQABER8JAe0BZwmYA2cF/wJnAeoDmAVnAZgBZwcAArIDAAiz
AwABtAGyAQkIAAMxAVgV/wQxAQABER8JAe0BZwqYAW0HZwHsBJgBZwPjAWcBmAFnBwACsg4AAbQBsgEJ
CAADMQFYFf8EMQEAAREBGR0JARkB7QFnDJgFZwaYBWcBmAFnBwACsg4AAbQBsgEJCAAdMQIAAW0d/wEU
Ae0BZxeYAW0DZwHsAZgBZwcAArIOAAG0AbIBCQgAGzEBeQQABv8BRAFLDf8BMQERBv8BAAHwAWcdmAFn
BwACsg4AAbQBsgEJCAASMRQAAUQBUg0AAVkBEQgAH2cHABKyAQkIABExAZkUAAFEAVINAAFZAREJAAUH
AmcPbgFnAewFBwgAErIBCQgAETEVAAFEAVINAAFZAREOAAHxAWcPmgFnAf9OAAERAVkBbQsAAUMBWQER
DgAB/wFnD5oBZwH/TgABBwF6AVMLEQFZARoB/w8AAWcPmgFnUAABEQH/AcMJmgHDAfEBExAAEWdSAAEU
CREBExIAAfQPZwH/LgABsxAAAf8Bu20AAbIRAAGybAABsgEJAbICCQGzAgkBugIJAbsHCQG6AbNqAAL/
AQABswIAAQkCAAHzAgAB/wgAAQlqAAH/AgABswIAAQkCAAHzAgAB/wgAARkJAAH/BQkB9AIAARkFCQH/
AgAGCRQAC7IBswYAHfQGAAH/AgABswIAAQkCAAHzAgAB/wgAARkJAAH/BQkB9AIAARkFCQH/AgAGCRMA
AQkMsgUAH4oFAAH/ArMBshKzCQAB/wIJAf8CCQH0AgABGQEJARkB/wIJAf8CAAMJAf8B8gEJCgABswqy
AfQIAAG6AbIEAAG0AYoBZQK7GhkBigUAAf8UAAEZCQAB/wIJAQACCQH0AgABGQEJAfMBAAIJAf8CAAMJ
AQAB8wEJCQAB8wGzCAABugGyAfQIAAG6AbIEAAGzAYoCZQK7GRkBigUAAf8UAAEZCQAB/wUJAfQCAAEZ
BQkB/wIABgkJAAG6AfQIAAEJDLIEAAGzAYoBuwJlAbsBCRgZAYoFAAH/FAABGQkAAf8FCQH0AgABGQUJ
Af8CAAYJCQABugH0CQAMsgQAAbMBigG7ARkCZQG7AQkJGQEJDBkBuwGKBQAB/xQAARkKAAH/AgkC/wMA
Av8DCQH/AwAC/wIJAfMB/wkAAboB9BkAAbMBigG7AhkCZQG7CBkCuwsZAQkBZQGKBQAB/xQAARkLAAIJ
BwADCQYAAgkB9AoAAboB9BkAAbMBigG7AxkCZQG7BhkBuwJlAbsKGQJlAYoFAAH/FAABGQsAAgkH/wMJ
Bv8CCQH0CgABugH0CQALsgGzBAABswGKAbsEGQJlAbsFGQFmAmUBZgEJCBkBuwFlARkBigUAAf8UAAEZ
CwAUCQH0CgABugH0CAABCQyyBAABswGKAbsFGQJlAbsDGQG7AWUBZgGRAWUBuwcZAQkCZQEZAYoFAAH/
FAABGQsAFAkB9AoAAboB9AQABPQBswGyAfQIAAG6AbIEAAGzAYoBuwYZAWUBZgG7AQkBuwJlAhkBZQFm
AQkGGQFmAWUCGQGKBQAB/xWyFAAB8wIJEwABugH0AgAIsgH0CAABugGyBAABswGKAbsGGQG7AmUBuwJl
AxkBCQFlAbsFGQG7AWUBbAIZAYoFAAH/AgABswIAAQkCAAHzAgAB/wgAARkUAAHzAgkTAAG6AfQCAAGy
BQABCQyyBAABswGKAbsHGQG1A2UFGQJlAbsDGQEJAmUDGQGKBQAB/wIAAbMCAAEJAgAB8wIAAf8IAAEZ
DQAH/wEZAgkH/wwAAboB9AIAAbIGAAyyBAABswGKAbsQGQEJAWUBuwMZAa4BZQQZAYoFAAH/AgABswIA
AQkCAAHzAgAB/wgAARkMAAHzEgkLAAG6AfQCAAGyFgABswGKAbsCGQFmAmUMGQJlAbsBGQG7AmUEGQGK
BQAB/wIAAbMCAAEJAgAB8wIAAf8IAAEZDAAB8wEJDv8DCQsAAboB9AIAAbIWAAGzAYoBuwEZAWUBiwIZ
AWUMGQFlArsCZQUZAYoEAAH/AbIVtAGyCwAB8wEJDgADCQoAB7IBswQAC7IBswQAAbMBigG7ARkBZQG7
AhkBZQwZBGUBkQUZAYoEAAGyFwABsgoAAfMBCQMAAgkJAAMJCQABCQiyAwABCQyyBAABswGKAbsBGQFl
AbsCCQFlDhkBtQcZAYoEAAGyF7MBsgoAAfMBCQMAAgkJAAMJCQABugGyAfQEAAG6AbID9AGzAbIB9AgA
AboBsgQAAbMBigG7AhkDZQG7FhkBigQAAboXAAGyCgAB8wEJDgADCQkAAboBsgH0BAABugayAfQIAAG6
AbIEAAGzAYoBuxwZAYoEAAG6FwABsgoAAfMBCQ4AAwkJAAEJCLIDAAEJDLIEAAGzAYoduwGKBAABuhcA
AbIKAAHzEgkKAAiyBAAMsgUAH4oEAAG6BAABsgH0CwABCQGyBAABsgoAAf8RCQHzJwAB/xytAbQFAAG6
AwABsgEAAbMLAAEJAQABsgMAAbJnAAG6AgABsgMAAbIJAAGyAwABswIAAbJnAAG6AbMBugQAAboIAALz
AwAB/wG6AbMBCW8AAbIBCQUAAboBs3kAAboDsgEJbQABQgFNAT4HAAE+AwABKAMAAYADAAEgAQECAAEB
AQABAQYAARIWAAP/AQABgAMABf8BhwL/CAAF/wGHAfABDwgABf8BhwHwAQ8IAAX/AYcB8AEPCAAC/wH8
Av8BhwH/Ac8IAAL/AfwB/wHwAQABHwHPCAAB/gEAAXwB/wHwAQABHwHPCAAB/gEAAXwB/wHwAQABHwHP
CAAB/gF/AeABDwHwAQABHwHPCAAB/gF/AeABDwHwAQABHwHPCAAB/gF/AfwC/wGHAf8BzwgAAf4BfwH8
Av8BhwH/Ac8IAAH+AXABDAL/AYcB/wHPCAAB/gFwAQ8C/wGHAf8BzwgAAf4BcAEOAT8B/wGHAf8BzwgA
Af4BfwH+AT8D/wHPCAAB/gF/Af4BPwP/Ac8IAAH+AX8B/gE/A/8BzwgAAf4BcAEOAT8D/wHPCAAB/gFw
AQ4BPwP/Ac8IAAH+AXABDgE/AfEC/wHPCAAB/gF/Af4BPwHxAv8BzwgAAf4BfwH+AT8B8QL/Ac8IAAH+
AX8B/gE/AfEC/wHPCAAB/gF/Af4BPwHxAv8BzwQAAYADAAH+AgABPwHxAv8BzwQAAcACAAEBAf4CAAE/
AfEC/wHPBAAB/gIAAT8E/wHxAv8BzwQAAf8CAAF/BP8B8AIAAQ8EAAH/AgABfwT/AfACAAEPBAAB/wIA
AX8I/wQAAf8CAAF/CP8EAAX/AeABAw7/AYABAAr/AeABAwH/Af4CAAE/Cf8BgAEAAf8B/AEPAfgBHwT/
AcACAAEDAf8BHwH8AX8B+AE/Af4BDwHAAgABAQHAAgABAQH/AT8B/gF/AfAC/wEHAYADAAHAAgABAQH/
ASYBcgF/AeEC/wGDBAABwAIAAQEB/wEmAXIBfwHDAv8BwwQAAcACAAEBAf8BJgFyAX8BwwL/AeEEAAHA
AgABAQH/ASYBcgF/AYcBwAEDAfEEAAHAAgABAQH/ASYBcgF/AYcBwAEDAfAEAAHAAgABAQH/ASYBcgF/
AY8BwAEDAfgEAAHAAgABAQH/ASYBcgF/AY8BwAEDAfgEAAHAAgABAQH/ASYBcgF/AQ8BwAEDAfgEAAHA
AgABAQH/ASYBcgF/AQ8BwAEDAfgEAAHAAgABAQH/ASYBcgF/AQ8BwAEDAfgEAAHAAgABAQH/ASYBcgF/
AQ8BwAEDAfgEAAHAAgABAQH/ASYBcgF/AQ8BwAEDAfgEAAHAAgABAQH/ASYBcgF/AY8BwAEDAfgEAAHA
AgABAQH/ASYBcgF/AY8BwAEDAfgEAAHAAgABAQH/AT8B/gF/AYcBwAEDAfAEAAHAAgABAQH8AgABHwGH
AcABAwHwBAABwAIAAQEB/AIAAR8BwwL/AeEEAAHAAgABAQH8AgABHwHDAv8B4wQAAcACAAEBAfwCAAEf
AeEC/wHDBAABwAIAAQMB/wHnAfMB/wHwAv8BhwGAAwABwAEAAQ8C/wLjAf8B+AE/Af4BDwGAAgABAQHA
AQABDwL/AfABBwH/AfwBDwH4AR8E/wHAAQABHwL/AfgBDwH/Af4CAAE/Df8CAAF/Df8BwAEBDv8B/AEf
Cv8B8AEHDv8BwAEBDv8CAAF/DP8B/gEPAfgBPwz/AfgBPwH+AQ8B/wH+AQABDwHwARgBDAEPAv8BAAEP
AfAC/wEPAf8B/gEAAQ8B8AEYAQwBDwH/Af4BAAEPAfEC/wGHAfgCAAEPAfABGAEMAQ8B/AEAAT8BzwHj
Av8BwwH4AQABPwGPAfEBGAGMAU8B+QH+AT8BzwHDAfsB/wHjAfEB/AEAAQ8B8AEYAQwBDwH5Af4BAAEP
AccB+QH/AvEB/gEAAQ8B8AEYAQwBDwH5Af8BAAEPAccB+AH/AvEB/gEAAQ8B+AE4ARwBDwH5A/8BjwH4
AT8B+AHxA/8B/AH+AT8BHwH5A/8BjwH4AR8B+AHxAf4BAAEPAfwCAAEfAfkB/wEAAQ8BjwH4AQ8B+AHx
Af4BAAEPAfwCAAEfAfkB/gEAAQ8BjwH4AQMB+AHxAcABAAEPAfwCAAEfAfkB4AE/Ac8BjwH4AQMB+AHx
AQABPwGPAf8B/gE/Af8B+QGAAT8BzwGPAfgBBwH4AfEBHAEAAQ8B/wH+AT8B/wH5Ab4BAAEPAY8B+AEP
AfgB8QE+AQABDwH/AgABfwH5Ab8BAAEPAY8B+AEfAfgB8QE+AQABDwH+AgABPwH5Ab8C/wGPAfgBfwH4
AfEBPwL/Af4CAAE/AfkBvwL/AccB+AH/AfEB4AEOAQABDwH+AX8B/gE/AfABDwEAAQ8BxwH7Af8B8QHg
AQ4BAAEPAf4BcwH+AT8B4AEOAQABDwHDAv8B4wHAAgABDwH+AXMB/gE/AeMBwAE/Ac8B4wL/AeMBwwGA
AT8BjwH+AX8B/gE/AeMBwAE/Ac8B8QL/AccBwAEMAQABDwH+AX8B/gE/AeABDgEAAQ8B8AL/AY8B4AEO
AQABDwH+AgABPwHwAQ8BAAEPAfgBPwH+AQ8B4AEOAQABDwH+AgABPwT/AfwBDwH4AT8N/wIAAX8N/wGA
AQAO/wHwAQce/wGAAR8B/wGAAwABgAIAAQEB/gL/AT8B/gEAAQcB/wQAAYADAAH+Av8BvwH8AQABAwH/
BAABgAMAAfwCAAEfAfgBDwEDAf8EAAGAAwAB+QFtAb8B3wHwAT8BwwH/BAABgAMAAfsBbQG/Ad8B4AH/
AfMB/wQAAYADAAH7AW0BvwHfAeED/wQAAYADAAH4AgABHwHDA/8EAAGAAwAB+wL/Ad8BwwP/BAABgAMA
AfsC/wHfAYcD/wQAAYADAAH7Av8B3wGHA/8EAAGAAwAB+wL/Ad8BjwL/AR8EAAGAAwAB+wL/Ad8BjwH/
Af4BDwQAAYADAAH7Av8B3wEPAf8B/AEHBAABgAMAAfsC/wHfAQ8B/wH8AQMIAAH7Av8B3wEPAf8B+AEB
CAAB+AIAAR8BDwH/AfAJAAH7AW0BvwHfAQ8B/wHgCQAB+wFtAb8B3wGPAf8B4QEQCAAB+wFtAb8B3wGP
Af8B4wEYCAAB+wFtAb8B3wGPAf8B9gEdCAAB8AIAAQ8BhwH/Af4BHwgAAfcC/wH3AccB/wH8AT8IAAHw
AgABBwHDAf8B/AE/BAABgAMAAfcC/wH3AeEB/wH4AX8EAAH/AT8B/gF/AfcC/wH3AeAB/wHwAX8B/gEf
AfwBfwH/AT8B/gF/AfcC/wH3AfABfwHgAf8B/gEfAfwBfwH/AT8B/gF/AfcBnwH8AfcB+AEfAYEB/wH+
AR8B/AF/Af8BPwH+AX8B9wFfAf0BdwH8AQABAwH/Af4BHwH4AX8B/wEfAfwBfwH2Ae8B+wG3Af4BAAEH
Af8B/gIAAX8B/wIAAX8B8QHvAfMBhwH/AYABHwH/Af4CAAF/Af8BgAEAAv8B8wHnAv8B8AP/AgAC/wHg
AQMC/wH8AR8B/wHwAgABDwH8AgABPwHAAgABAQT/AfACAAEHAfACAAEPAYADAAT/AfACAAEHAfACAAEH
AR8CAAH8BP8B8wE/Af4BZwHjAv8B4wEfAgAB/AT/AfMBPwH+AWcB5wL/AfMBHwIAAfwB/wIAAX8B8wE/
Af4BZwHnAv8B8wEfAgAC/AIAAR8B8wE4AQ4BZwHnAv8B8wEfAgAC/AIAAR8B8wE4AQ4BZwHnAv8B8wEf
AgAB/AH4Av8BnwHzAT8B/gFnAecC/wHzAR8CAAH8AfgC/wGfAfMBPwH+AWcB5wL/AfMBHwIAAfwB+AL/
AZ8B8wE/Af4BZwHnAv8B8wEfAYABAAH8AfgC/wGfAfMCAAFnAecC/wHzAR8BgAEBAfwB+AL/AZ8B8wIA
AWcB5wL/AfMBHwHgAQMB/AH4Av8BnwHzAgAC5wL/AfMBHwL/AfwB+AL/AZ8B8wL/AucC/wHzAR8C/wH8
AfgB/wF/AZ8B8wL/AucC/wHzAR8C/wH8AfgB/gE/Af8B8wL/AucC/wHzAR8C/wH8AfgB/wEfAf8B8wL/
AucC/wHzAR8C/wH8AfgB/wGPAf8B8wL/AucBgAEAAfMBHwL/AfwB+AH/AccB3wHzAv8C5wGAAQAB8wEf
Av8B/AH4Af8B4wGfAfMC/wLnAZ8B/AHzAR8C/wH8AfgB/wHxAZ8B8wL/AucBnwH8AfMBHwHAAQEB/AH4
Af8B+AGfAfMBAAEHAucBnwGcAfMBHwIAAXwB+AH/AfwBHwHzAQABBwHHAecBnwGcAfMBHgIAATwB+AH/
Af4BHwHzAQABBwGPAecBnwGcAfMBHAIAATwB/AEAAfABHwHzAQABBwEPAecBnwGcAfMBHAIAARwB/AEA
AeABHwHzAQABBgEfAecBnwHcAfMBHAIAARwE/wHzAQABBAF/AecBnwH8AeMBHAIAARwE/wHwAgAB/wHg
AgABBwEcAgABHAT/AfACAAH/AfACAAEHAYADAAT/AfABAAEBAf8B+AIAAR8BgAIAAQEM/wHgAgABBwT/
AeAH/wH+AgABfwT/AcABPwP/AfABBwH/AfgCAAEfAfACAAEPAcABDwP/AcABAQH/AfACAAEHAcACAAED
AcABBwP/AgABfwHgAgABBwHDAv8BwQHAAQEC/wH+AgABPwHAAgABAwGHAv8B4QHAAQABfwH/AfwCAAEf
AcACAAEDAYcC/wHxAcABAAE/Af8B+AIAAQ8BwAIAAQMBhwL/AfEBwAEAAQ8B/wHwAgABBwHAAgABAwGH
Av8B8QHAAQABAwH/AeACAAEHAcACAAEDAYcC/wHxAcACAAH/AeACAAEDAeACAAEDAYcC/wHxAcACAAF/
AcACAAEDAeACAAEHAccC/wHhAcACAAEfAcACAAEBAfACAAEHAcMC/wHhAcACAAEHAcACAAEBAfACAAEP
AcMB8AEPAcMBwAIAAQMBwAIAAQEB+AIAAQ8B4QHAAQMBgwHAAgABAQHAAgABAQH4AgABHwHgAQEBgAEH
AcACAAEBAcACAAEBAfwCAAE/AfgBDwHwAQ8BwAIAAQEBwAIAAQEB/gIAAX8B/gEQAQwBfwHAAgABAwHA
AgABAQH/AgAC/wHAAQMB/wHAAgABBwHAAgABAQH/AeABBwL/AoEB/wHAAgABDwHAAgABAQH/AcABAwL/
AQ8B4AH/AcACAAE/AcACAAEDAf8BwAEDAv8BHwH4AX8BwAIAAf8B4AIAAQMB/wGAAQEB/wH+AR8B+AF/
AcABAAEBAf8B4AIAAQcB/wGAAQEB/wH+AR8B+AF/AcABAAEHAf8B8AIAAQcB/wGAAQEB/wH+AR8B+AF/
AcABAAEfAf8B8AIAAQ8B/wGAAQEB/wH+AR8B+AF/AcABAAF/Af8B+AIAAR8B/wGAAQEB/wH+AR8B+AF/
AcABAAL/AfwCAAE/Af8BgAEBAv8BDwHwAf8BwAEDAv8B/gIAAX8B/wGAAQEC/wEHAeAB/wHAAQ8D/wGA
AQAC/wHAAQMC/wGAAQMB/wHAAT8D/wHgAQMC/wHAAQMC/wHgAQcB/wHgAX8H/wHgAQcC/wH8AT8B/wHx
CP8B+AEfEf8EAAT/AYADAAGABwAB/wHgAQMB/wGAAwABgAcAAf8BgAEAAf8BgAIAAQEBgAIAAQEEAAH/
AgABfwGAAgABAQGAAgABAQQAAf8BPwH+AX8BwAIAAQMBwAIAAQMBAAEHAeABAAH+ASYBcgF/AeACAAED
AeACAAEDAQABHwH8AQAB/gEmAXIBfwHwAgABDwHwAgABDwEAAT8B/gEAAf4BJgFyAX8B/AIAAT8B/gIA
AX8BAAF+AT8BAAH+ASYBcgF/AfwCAAE/Af8B4AEHAf8BAAH4AQ8BAAH+ASYBcgF/Af8BgAEAAv8BgAEB
Af8BAAHwAQcBgAH+ASYBcgF/Af8CAAL/AgAB/wEBAeABAwGAAf4BJgFyAX8B/gIAAT8B/gIAAX8BAQHg
AQMBwAH+ASYBcgF/AfwCAAE/AfwCAAE/AQEBwAEDAcAB/gEmAXIBfwH8AgABHwH8AgABPwEBAcABAQHA
Af4BJgFyAX8B+AIAAQ8B+AIAAQ8BAQHAAQEBwAH+ASYBcgF/AfACAAEHAfACAAEPAQEBwAEBAcAB/gEm
AXIBfwHgAgABBwHgAgABBwEBAcABAwHAAf4BJgFyAX8B4AIAAQMB4AIAAQcBAQHAAQMBwAH+ASYBcgF/
AeACAAEHAeACAAEHAQEB4AEDAYAB/gE/Af4BfwHwAgABDwHwAgABDwEAAfABBwGAAfwCAAEfAfwCAAEf
AfgCAAEfAQAB8AEPAYAB/AIAAR8B/AIAAR8B+AIAAQ8BAAF8AR8BAAH8AgABHwH8AgABHwH4AgABDwEA
AT8B/gEAAfwCAAEfAfwCAAEfAfgCAAEPAQABHwH8AQAB/wHnAfMB/wH8AgABHwH4AgABDwEAAQ8B8AEA
Af8C4wH/Af4CAAE/AfgCAAEPAQABAQHAAQAB/wHgAQcC/wIAAX8B/wIAAR8BwAIAAQEB/wH4AQ8C/wHA
AQAC/wGAAQABfwH/AgABfwX/AfABAwL/AcABAAL/AgABfwb/AT8C/wH4AR8C/wIADv8BgAEABf8BgAMA
AYADAAj/AYAHAAj/AYAHAAT/AcACAAEDAYAHAAT/AcACAAEBAYAHAAL/AfwB/wHAAgABAQGABwAC/wH8
Af8BwAIAAQEBgAcAAf4BAAF8Af8BwAIAAQEBgAcAAf4BAAF8Af8BwAIAAQEBgAcAAf4BfwHgAQ8BwAIA
AQEBgAcAAf4BfwHgAQ8BwAIAAQEBgAcAAf4BfwH8Af8BwAIAAQEBgAcAAf4BfwH8Af8BwAIAAQEBgAcA
Af4BcAEMAf8BwAIAAQEBgAcAAf4BcAEPAf8BwAIAAQEIAAH+AXABDgE/AcACAAEBCAAB/gF/Af4BPwHA
AgABAQgAAf4BfwH+AT8BwAIAAQEIAAH+AX8B/gE/AcACAAEBCAAB/gFwAQ4BPwHAAgABAQgAAf4BcAEO
AT8BwAIAAQEIAAH+AXABDgE/AcACAAEBCAAB/gF/Af4BPwHAAgABAQgAAf4BfwH+AT8BwAIAAQEBgAcA
Af4BfwH+AT8BwAIAAQMBwAIAAQEEAAH+AX8B/gE/AcABAAEPAv8BPwH+AX8BgAMAAf4CAAE/AcABAAEP
Av8BPwH+AX8BwAIAAQEB/gIAAT8BwAEAAR8C/wE/Af4BfwH+AgABPwn/AR8B/AF/Af4CAAE/Cf8CAAF/
Af8CAAF/Cf8BgAEAAv8CAAF/Cf8B4AEDAv8CAAF/BP8B/gL/AT8M/wH+Av8Bvwz/AfwCAAEfDP8B+QFt
Ab8B3wz/AfsBbQG/Ad8B8AEYAQwBDwL/AQABDwHAAgABAQH7AW0BvwHfAfABGAEMAQ8B/wH+AQABDwGA
AwAB+AIAAR8B8AEYAQwBDwH8AQABPwHPBAAB+wL/Ad8B8QEYAYwBTwH5Af4BPwHPBAAB+wL/Ad8B8AEY
AQwBDwH5Af4BAAEPBAAB+wL/Ad8B8AEYAQwBDwH5Af8BAAEPBAAB+wL/Ad8B+AE4ARwBDwH5A/8EAAH7
Av8B3wH8Af4BPwEfAfkD/wQAAfsC/wHfAfwCAAEfAfkB/wEAAQ8EAAH7Av8B3wH8AgABHwH5Af4BAAEP
BAAB+wL/Ad8B/AIAAR8B+QHgAT8BzwQAAfgCAAEfAf8B/gE/Af8B+QGAAT8BzwQAAfsBbQG/Ad8B/wH+
AT8B/wH5Ab4BAAEPBAAB+wFtAb8B3wH/AgABfwH5Ab8BAAEPBAAB+wFtAb8B3wH+AgABPwH5Ab8C/wQA
AfsBbQG/Ad8B/gIAAT8B+QG/Av8EAAHwAgABDwH+AX8B/gE/AfABDwEAAQ8EAAH3Av8B9wH+AXMB/gE/
AeABDgEAAQ8EAAHwAgABBwH+AXMB/gE/AeMBwAE/Ac8EAAH3Av8B9wH+AX8B/gE/AeMBwAE/Ac8EAAH3
Av8B9wH+AX8B/gE/AeABDgEAAQ8EAAH3Av8B9wH+AgABPwHwAQ8BAAEPAYADAAH3AZ8B/AH3Af4CAAE/
BP8BgAIAAQEB9wFfAf0Bdwz/AfYB7wH7AbcM/wHxAe8B8wGHDf8B8wHnDv8B/AEfDf8L
</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

View File

@@ -17,10 +17,10 @@ namespace VisionEdit
{
#region
private string m_DockPath { get; set; } = string.Empty;
public FormImageWindow myFormImageWindow = new FormImageWindow();
public FormJobManage myFormJobManage = new FormJobManage();
public FormToolBox myFormToolBox = new FormToolBox();
public FormLog myFormLog = new FormLog();
public static FormImageWindow myFormImageWindow = new FormImageWindow();
public static FormJobManage myFormJobManage = new FormJobManage();
public static FormLog myFormLog = new FormLog();
public FormToolBox myFormToolBox = new FormToolBox(myFormLog, myFormJobManage);
#endregion
public FormMain()
@@ -54,6 +54,8 @@ namespace VisionEdit
myFormJobManage.Show(this.dockPanel1, DockState.DockRight);
myFormImageWindow.Show(this.dockPanel1, DockState.Document);
myFormLog.Show(this.dockPanel1, DockState.DockBottom);
// 初始化JOB
InitJob();
}
#region Dockpanel
@@ -113,5 +115,16 @@ namespace VisionEdit
{
this.lbTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
public void InitJob()
{
// 初始化加载默认Job
myFormJobManage.tabControl1.TabPages.Add("defultJob");
GlobalParams.myJobTreeView = new TreeView();
GlobalParams.myVisionJob = new VisionJob(GlobalParams.myJobTreeView, myFormLog, "defultJob");
myFormJobManage.tabControl1.TabPages[0].Controls.Add(GlobalParams.myJobTreeView);
GlobalParams.myJobTreeView.Dock = DockStyle.Fill;
GlobalParams.myJobTreeView.ImageList = myFormToolBox.imageList1;
}
}
}

View File

@@ -3,11 +3,19 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using VisionEdit.VisionTool;
namespace VisionEdit
{
public class GlobalParams
{
/// <summary>
/// 流程树
/// </summary>
public static TreeView myJobTreeView { get; set; }
public static VisionJob myVisionJob { get; set; }
public static VisionToolFactory myVisionToolFactory = new VisionToolFactory();
}
}

View File

@@ -6,11 +6,11 @@ using System.Threading.Tasks;
namespace VisionEdit
{
public enum ToolType
public enum ToolType:int
{
None,
Job,
HalconInterface,
HalconToolInterface,
SDK_Basler,
SDK_Congex,
SDK_PointGray,
@@ -55,4 +55,49 @@ namespace VisionEdit
Circle,
Pose,
}
public enum ToolRunStatu
{
Not_Run,
Not_Enabled,
No_Input_Image,
Not_Input_Image,
Character_Untrained,
Not_Assign_Image_Template,
Not_Assign_Input_Image,
Not_Assign_Input_Source,
Not_Assign_Input_Pos,
Not_Asign_Input_Source,
Lack_Of_Input_Image,
Lack_Of_Input_Search_Region,
Not_Assign_Path,
Not_Asign_Input_Image,
Input_Image_Cannot_Be_Converted,
Not_Create_Template,
No_Image_In_Folder,
File_Error_Or_Path_Invalid,
Not_Assign_Acq_Device,
Not_Succeed,
Succeed,
No_Input_String,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
}
}

View File

@@ -3,12 +3,42 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace VisionEdit
{
public class ToolInfo:IToolInfo
public class IToolInfo
{
public ToolInfo()
/// <summary>
/// 工具是否启用
/// </summary>
public bool enable { get; set; }
/// <summary>
/// 工具名称
/// </summary>
public string toolName { get; set; }
/// <summary>
/// 工具类型
/// </summary>
public ToolType toolType { get; set; }
/// <summary>
/// 工具对象
/// </summary>
public object tool { get; set; }
/// <summary>
/// 工具描述信息
/// </summary>
public string toolTipInfo { get; set; }
/// <summary>
/// 工具输入字典集合
/// </summary>
public List<ToolIO> toolInput { get; set; }
/// <summary>
/// 工具输出字典集合
/// </summary>
public List<ToolIO> toolOutput { get; set; }
public IToolInfo()
{
enable = true;
toolType = ToolType.None;
@@ -46,6 +76,7 @@ namespace VisionEdit
}
return new ToolIO();
}
/// <summary>
/// 移除工具输入项
/// </summary>
@@ -71,4 +102,27 @@ namespace VisionEdit
}
}
}
/// <summary>
/// 工具的输入输出类
/// </summary>
[Serializable]
public class ToolIO
{
public string IOName;
public object value;
public DataType ioType;
public ToolIO() { }
public ToolIO(string IOName1, object value1, DataType ioType1)
{
this.IOName = IOName1;
this.value = value1;
this.ioType = ioType1;
}
}
}

View File

@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VisionEdit.Interface
{
public interface ToolBase
{
// internal ToolRunStatu runStatu = ToolRunStatu.Not_Run;
/// <summary>
/// 工具运行
/// </summary>
void Run(string jobName);
}
}

View File

@@ -1,62 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VisionEdit
{
public abstract class IToolInfo
{
/// <summary>
/// 工具是否启用
/// </summary>
public bool enable { get; set; }
/// <summary>
/// 工具名称
/// </summary>
public string toolName { get; set; }
/// <summary>
/// 工具类型
/// </summary>
public ToolType toolType { get; set; }
/// <summary>
/// 工具对象
/// </summary>
public object tool { get; set; }
/// <summary>
/// 工具描述信息
/// </summary>
public string toolTipInfo { get; set; }
/// <summary>
/// 工具输入字典集合
/// </summary>
public List<ToolIO> toolInput { get; set; }
/// <summary>
/// 工具输出字典集合
/// </summary>
public List<ToolIO> toolOutput { get; set; }
}
/// <summary>
/// 工具的输入输出类
/// </summary>
[Serializable]
public class ToolIO
{
public string IOName;
public object value;
public DataType ioType;
public ToolIO() { }
public ToolIO(string IOName1, object value1, DataType ioType1)
{
this.IOName = IOName1;
this.value = value1;
this.ioType = ioType1;
}
}
}

View File

@@ -20,11 +20,11 @@ namespace VisionEdit
/// 需要连线的节点对,不停的画连线,注意键值对中第一个为连线的结束节点,第二个为起始节点,一个输出可能连接多个输入,而键值对中的键不能重复,
/// 所以把源作为值,输入作为键
/// </summary>
public Dictionary<TreeNode, TreeNode> D_itemAndSource { get; set; }
public Dictionary<TreeNode, TreeNode> D_itemAndSource { get; set; } = new Dictionary<TreeNode, TreeNode>();
/// <summary>
/// 流程运行结果图像
/// </summary>
public HObject jobResultImage { get; set; }
public HObject jobResultImage { get; set; } = new HObject();
/// <summary>
/// 流程树中节点的最大长度
/// </summary>
@@ -32,7 +32,7 @@ namespace VisionEdit
/// <summary>
/// 工具对象集合
/// </summary>
public List<IToolInfo> L_toolList { get; set; }
public List<IToolInfo> L_toolList { get; set; } = new List<IToolInfo>();
/// <summary>
/// 正在绘制输入输出指向线
/// </summary>
@@ -44,19 +44,19 @@ namespace VisionEdit
/// <summary>
/// 标准图像字典,用于存储标准图像路径和图像对象
/// </summary>
public Dictionary<string, HObject> D_standardImage { get; set; }
public Dictionary<string, HObject> D_standardImage { get; set; } = new Dictionary<string, HObject>();
/// <summary>
/// 记录起始节点和此节点的列坐标值
/// </summary>
public Dictionary<TreeNode, Color> startNodeAndColor { get; set; }
public Dictionary<TreeNode, Color> startNodeAndColor { get; set; } = new Dictionary<TreeNode, Color>();
/// <summary>
/// 记录前面的划线所跨越的列段,
/// </summary>
public Dictionary<int, Dictionary<TreeNode, TreeNode>> list { get; set; }
public Dictionary<int, Dictionary<TreeNode, TreeNode>> list { get; set; } = new Dictionary<int, Dictionary<TreeNode, TreeNode>>();
/// <summary>
/// 每一个列坐标值对应一种颜色
/// </summary>
public Dictionary<int, Color> colValueAndColor { get; set; }
public Dictionary<int, Color> colValueAndColor { get; set; } = new Dictionary<int, Color>();
/// <summary>
/// 输入输出指向线的颜色数组
/// </summary>

16
VisionEdit/OperateJob.cs Normal file
View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VisionEdit
{
public class OperateJob
{
public static void CreateNewJob()
{
}
}
}

Binary file not shown.

View File

@@ -127,19 +127,28 @@
<data name="停止" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\停止.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="保存21" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\保存21.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="保存2" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\保存2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="打开" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\打开.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="保存3" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\保存3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="开始" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\开始.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="保存21" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\保存21.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="保存3" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\保存3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="打开" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\打开.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="删除" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\删除.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="新建1" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\新建1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="新建2" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\新建2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,78 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using HalconDotNet;
namespace VisionEdit.ToolLib
{
public class HalconTool
{
/// <summary>
/// 流程名
/// </summary>
internal string jobName = string.Empty;
/// <summary>
/// 曝光时间
/// </summary>
internal Int32 exposure = 30;
/// <summary>
/// 图像的获取方式
/// </summary>
//internal ImageSourceMode imageSourceMode = ImageSourceMode.FormDevice;
/// <summary>
/// 是否处于实时采集模式
/// </summary>
internal bool realTimeMode = false;
/// <summary>
/// 相机句柄
/// </summary>
internal Int64 cameraHandle = -1;
/// <summary>
/// 设备信息字符串包括了相机SN、品牌等信息
/// </summary>
internal string deviceInfoStr = string.Empty;
/// <summary>
/// 实时采集线程
/// </summary>
internal static Thread th_acq; //Thread类不能序列化所以申明为静态的
/// <summary>
/// 读取文件夹图像模式时每次运行是否自动切换图像
/// </summary>
internal bool autoSwitch = true;
/// <summary>
/// 是否将彩色图像转化成灰度图像
/// </summary>
internal bool RGBToGray = true;
/// <summary>
/// 工作模式为读取文件夹图像时,当前图像的名称
/// </summary>
internal string currentImageName = "";
/// <summary>
/// 工作模式为读取文件夹图像时,当前显示的图片的索引
/// </summary>
internal int currentImageIndex = 0;
/// <summary>
/// 文件夹中的图像文件集合
/// </summary>
internal List<string> L_imageFile = new List<string>();
/// <summary>
/// 单张图像的文件路径
/// </summary>
internal string imagePath = string.Empty;
/// <summary>
/// 图像文件夹路径
/// </summary>
internal string imageDirectoryPath = string.Empty;
/// <summary>
/// 输出图像
/// </summary>
internal HObject outputImage;
/// <summary>
/// 读取单张图像或批量读取文件夹图像工作模式
/// </summary>
//internal WorkMode workMode = WorkMode.ReadMultImage;
}
}

View File

@@ -55,11 +55,11 @@
</ItemGroup>
<ItemGroup>
<Compile Include="AppConfig.cs" />
<Compile Include="FormLib\FormImageWindow.cs">
<Compile Include="FormLib\FormImageWindow.cs.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FormLib\FormImageWindow.Designer.cs">
<DependentUpon>FormImageWindow.cs</DependentUpon>
<Compile Include="FormLib\FormImageWindow.cs.Designer.cs">
<DependentUpon>FormImageWindow.cs.cs</DependentUpon>
</Compile>
<Compile Include="FormLib\FormJobManage.cs">
<SubType>Form</SubType>
@@ -87,14 +87,18 @@
</Compile>
<Compile Include="GlobalParams.cs" />
<Compile Include="Interface\EnumList.cs" />
<Compile Include="ToolInfo.cs" />
<Compile Include="Interface\ToolInfoInterface.cs" />
<Compile Include="Interface\ToolBase.cs" />
<Compile Include="OperateJob.cs" />
<Compile Include="Interface\IToolInfo.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Interface\VisionJobInterface.cs" />
<Compile Include="ToolLib\HalconTool.cs" />
<Compile Include="VisionJob.cs" />
<EmbeddedResource Include="FormLib\FormImageWindow.resx">
<DependentUpon>FormImageWindow.cs</DependentUpon>
<Compile Include="VisionTool\VisionToolFactory.cs" />
<Compile Include="VisionTool\VisionToolList.cs" />
<EmbeddedResource Include="FormLib\FormImageWindow.cs.resx">
<DependentUpon>FormImageWindow.cs.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FormLib\FormJobManage.resx">
<DependentUpon>FormJobManage.cs</DependentUpon>
@@ -161,6 +165,15 @@
<Name>HalconWindowTest</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="Resources\删除.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\新建1.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\新建2.png" />
</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.

View File

@@ -4,6 +4,7 @@ using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using HalconDotNet;
@@ -16,10 +17,11 @@ namespace VisionEdit
public TreeView tvwOnWorkJob = new TreeView();
FormLog myFormLog = null;
public VisionJob(TreeView inputTreeView, FormLog inputFormLog)
public VisionJob(TreeView inputTreeView, FormLog inputFormLog, string jobName)
{
tvwOnWorkJob = inputTreeView;
this.myFormLog = inputFormLog;
this.JobName = jobName;
}
/// <summary>
@@ -91,7 +93,6 @@ namespace VisionEdit
pt = ((TreeView)(sender)).PointToClient(new System.Drawing.Point(e.X, e.Y));
targeNode = tvwOnWorkJob.GetNodeAt(pt);
//如果目标节点无子节点则添加为同级节点,反之添加到下级节点的未端
if (moveNode == targeNode) //若是把自己拖放到自己,不可,返回
return;
@@ -107,36 +108,31 @@ namespace VisionEdit
if (moveNode.Level == 0) // 被拖动的是子节点,也就是工具节点
{
if (targeNode.Level == 0)
if (targeNode.Level == 0) // 目标也是工具节点
{
moveNode.Remove();
tvwOnWorkJob.Nodes.Insert(targeNode.Index, moveNode);
ToolInfo temp = new ToolInfo();
IToolInfo temp = new IToolInfo();
for (int i = 0; i < L_toolList.Count; i++)
{
if (L_toolList[i].toolName == moveNode.Text)
{
temp = (ToolInfo)L_toolList[i];
L_toolList.RemoveAt(i);
L_toolList.Insert(targeNode.Index - 2, temp);
SwapDataFun(L_toolList, i, targeNode.Index);
break;
}
}
}
else
else
{
// 目标是子节点,则移动到该子节点的父节点的下一个节点上
moveNode.Remove();
tvwOnWorkJob.Nodes.Insert(targeNode.Parent.Index + 1, moveNode);
ToolInfo temp = new ToolInfo();
for (int i = 0; i < L_toolList.Count; i++)
{
if (L_toolList[i].toolName == moveNode.Text)
{
temp = (ToolInfo)L_toolList[i];
L_toolList.RemoveAt(i);
L_toolList.Insert(targeNode.Parent.Index, temp);
SwapDataFun(L_toolList, i, targeNode.Index);
break;
}
}
@@ -144,15 +140,16 @@ namespace VisionEdit
}
else //被拖动的是输入输出节点
{
if (targeNode.Level == 0 && GetToolInfoByToolName(jobName, targeNode.Text).toolType == ToolType.Output)
if (targeNode.Level == 0 && GetToolInfoByToolName(JobName, 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();
// 如果目标节点是工具节点,并且工具节点类型为可接收输入的节点,则直接将输出添加,先不考虑该情况
//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)
@@ -161,13 +158,14 @@ namespace VisionEdit
//连线前首先要判断被拖动节点是否为输出项,目标节点是否为输入项
if (moveNode.Text.Substring(0, 3) != "-->" || targeNode.Text.Substring(0, 3) != "<--")
{
myFormLog.ShowLog("拖动类型不匹配!");
return;
}
//连线前要判断被拖动节点和目标节点的数据类型是否一致
if ((DataType)moveNode.Tag != (DataType)targeNode.Tag)
{
// Frm_Main.Instance.OutputMsg("被拖动节点和目标节点数据类型不一致,不可关联", Color.Red);
myFormLog.ShowLog("被拖动节点和目标节点数据类型不一致,不可关联");
return;
}
@@ -176,7 +174,7 @@ namespace VisionEdit
input = Regex.Split(input, "《")[0];
else //第一次连接源就需要添加到输入输出集合
D_itemAndSource.Add(targeNode, moveNode);
GetToolInfoByToolName(jobName, targeNode.Parent.Text).GetInput(input.Substring(3)).value = "《- " + moveNode.Parent.Text + " . " + moveNode.Text.Substring(3);
GetToolInfoByToolName(this.JobName, 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();
@@ -191,6 +189,219 @@ namespace VisionEdit
}
catch (Exception ex)
{
myFormLog.ShowLog("释放节点出错,原因: " + ex.Message);
}
}
private static Graphics graph;
/// <summary>
/// 绘制输入输出指向线
/// </summary>
/// <param name="obj"></param>
public void DrawLine()
{
try
{
if (!isDrawing)
{
isDrawing = true;
Thread th = new Thread(() =>
{
tvwOnWorkJob.MouseWheel += new MouseEventHandler(CancelUpDowm_MouseWheel); //划线的时候不能滚动,否则画好了线,结果已经滚到其它地方了
maxLength = 150;
colValueAndColor.Clear();
startNodeAndColor.Clear();
list.Clear();
TreeView tree = tvwOnWorkJob;
graph = tree.CreateGraphics();
tree.CreateGraphics().Dispose();
foreach (KeyValuePair<TreeNode, TreeNode> item in D_itemAndSource)
{
CreateLine(tree, item.Key, item.Value);
}
Application.DoEvents();
tvwOnWorkJob.MouseWheel -= new MouseEventHandler(CancelUpDowm_MouseWheel);
isDrawing = false;
});
th.IsBackground = true;
th.ApartmentState = ApartmentState.STA; //此处要加一行,否则画线时会报错
th.Start();
}
}
catch (Exception ex)
{
}
}
private void CancelUpDowm_MouseWheel(object sender, MouseEventArgs e)
{
HandledMouseEventArgs h = e as HandledMouseEventArgs;
if (h != null)
{
h.Handled = true;
}
}
/// <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 jobName, string toolName)
{
try
{
for (int i = 0; i < L_toolList.Count; i++)
{
if (L_toolList[i].toolName == toolName)
{
return (IToolInfo)L_toolList[i];
}
}
return new IToolInfo();
}
catch (Exception ex)
{
myFormLog.ShowLog("根据工具名获取工具信息出错!原因: " + ex.Message);
return new IToolInfo();
}
}
}

View File

@@ -0,0 +1,409 @@
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;
using HalconDotNet;
using VisionEdit.FormLib;
namespace VisionEdit
{
public class VisionJob : IVisionJob
{
public TreeView tvwOnWorkJob = new TreeView();
FormLog myFormLog = null;
public VisionJob(TreeView inputTreeView, FormLog inputFormLog, string jobName)
{
tvwOnWorkJob = inputTreeView;
this.myFormLog = inputFormLog;
this.JobName = jobName;
}
/// <summary>
/// 拖动工具节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
internal void TvwJobItemDrag(object sender, ItemDragEventArgs e)//左键拖动
{
try
{
if (((TreeView)sender).SelectedNode != null)
{
if (((TreeView)sender).SelectedNode.Level == 1) //输入输出不允许拖动
{
tvwOnWorkJob.DoDragDrop(e.Item, DragDropEffects.Move);
}
else if (e.Button == MouseButtons.Left)
{
tvwOnWorkJob.DoDragDrop(e.Item, DragDropEffects.Move);
}
}
}
catch (Exception ex)
{
myFormLog.ShowLog("拖动节点出错,描述: " + ex.Message);
}
}
/// <summary>
/// 节点拖动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
internal 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)
{
myFormLog.ShowLog("节点拖动出错,描述: " + ex.Message);
}
}
/// <summary>
/// 释放被拖动的节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
internal void TvwJob_DragDrop(object sender, DragEventArgs e)//拖动
{
try
{
//获得拖放中的节点
TreeNode moveNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
//根据鼠标坐标确定要移动到的目标节点
Point pt;
TreeNode targeNode; // 目标节点
pt = ((TreeView)(sender)).PointToClient(new System.Drawing.Point(e.X, e.Y));
targeNode = tvwOnWorkJob.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();
tvwOnWorkJob.Nodes.Insert(targeNode.Index, moveNode);
ToolInfo temp = new ToolInfo();
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();
tvwOnWorkJob.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.Index);
break;
}
}
}
}
else //被拖动的是输入输出节点
{
if (targeNode.Level == 0 && GetToolInfoByToolName(JobName, 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) != "<--")
{
myFormLog.ShowLog("拖动类型不匹配!");
return;
}
//连线前要判断被拖动节点和目标节点的数据类型是否一致
if ((DataType)moveNode.Tag != (DataType)targeNode.Tag)
{
myFormLog.ShowLog("被拖动节点和目标节点数据类型不一致,不可关联");
return;
}
string input = targeNode.Text;
if (input.Contains("《")) //表示已经连接了源
input = Regex.Split(input, "《")[0];
else //第一次连接源就需要添加到输入输出集合
D_itemAndSource.Add(targeNode, moveNode);
GetToolInfoByToolName(this.JobName, 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();
}
//更新当前拖动的节点选择
tvwOnWorkJob.SelectedNode = moveNode;
//展开目标节点,便于显示拖放效果
targeNode.Expand();
}
catch (Exception ex)
{
myFormLog.ShowLog("释放节点出错,原因: " + ex.Message);
}
}
private static Graphics graph;
/// <summary>
/// 绘制输入输出指向线
/// </summary>
/// <param name="obj"></param>
public void DrawLine()
{
try
{
if (!isDrawing)
{
isDrawing = true;
Thread th = new Thread(() =>
{
tvwOnWorkJob.MouseWheel += new MouseEventHandler(CancelUpDowm_MouseWheel); //划线的时候不能滚动,否则画好了线,结果已经滚到其它地方了
maxLength = 150;
colValueAndColor.Clear();
startNodeAndColor.Clear();
list.Clear();
TreeView tree = tvwOnWorkJob;
graph = tree.CreateGraphics();
tree.CreateGraphics().Dispose();
foreach (KeyValuePair<TreeNode, TreeNode> item in D_itemAndSource)
{
CreateLine(tree, item.Key, item.Value);
}
Application.DoEvents();
tvwOnWorkJob.MouseWheel -= new MouseEventHandler(CancelUpDowm_MouseWheel);
isDrawing = false;
});
th.IsBackground = true;
th.ApartmentState = ApartmentState.STA; //此处要加一行,否则画线时会报错
th.Start();
}
}
catch (Exception ex)
{
}
}
private void CancelUpDowm_MouseWheel(object sender, MouseEventArgs e)
{
HandledMouseEventArgs h = e as HandledMouseEventArgs;
if (h != null)
{
h.Handled = true;
}
}
/// <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 ToolInfo GetToolInfoByToolName(string jobName, string toolName)
{
try
{
for (int i = 0; i < L_toolList.Count; i++)
{
if (L_toolList[i].toolName == toolName)
{
return (ToolInfo)L_toolList[i];
}
}
return new ToolInfo();
}
catch (Exception ex)
{
myFormLog.ShowLog("根据工具名获取工具信息出错!原因: " + ex.Message);
return new ToolInfo();
}
}
}
}

View File

@@ -0,0 +1,127 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace VisionEdit
{
public class VisionToolFactory
{
private static Dictionary<ToolType, Type> animalTypeDic = new Dictionary<ToolType, Type>();
public static void InitVisionToolTypeDic()
{
animalTypeDic.Clear();
//读取所有带有AnimalAttribute的类
var classEnumerator = new ClassEnumerator(typeof(VisionToolAttribute), null, typeof(IToolInfo).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)
{
//读取AnimalType
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;
}
}
//自定义Attribute
public sealed class VisionToolAttribute : Attribute
{
public ToolType ToolType { get; private set; }
public VisionToolAttribute(ToolType toolType)
{
ToolType = toolType;
}
}
//根据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 = false)
{
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);
}
}
}
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);
}
}
}
}
}
}
}

View File

@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using HalconDotNet;
using VisionEdit.Interface;
using VisionEdit.ToolLib;
namespace VisionEdit.VisionTool
{
[VisionToolAttribute(ToolType.HalconToolInterface)]
public class HalconToolInterface : IToolInfo
{
// 必添加输出项
ToolIO outputImage = new ToolIO("OutputImage", null, DataType.Image);
public HalconToolInterface(string toolName)
{
enable = true;
toolType = ToolType.HalconToolInterface;
this.toolName = toolName;
tool = new HalconTool();
toolInput = new List<ToolIO>();
toolOutput = new List<ToolIO>() { outputImage };
}
}
[VisionToolAttribute(ToolType.FindLine)]
public class FindLineToolInterface : IToolInfo
{
}
[VisionToolAttribute(ToolType.BlobAnalyse)]
public class BlobAnalyseToolInterface : IToolInfo
{
}
}

Binary file not shown.

Binary file not shown.

View File

@@ -2,20 +2,20 @@ F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\VisionEdit.exe.config
F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\VisionEdit.exe
F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\VisionEdit.pdb
F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\DevComponents.DotNetBar2.dll
F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\halcondotnet.dll
F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\HalconWindowTest.exe
F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\WeifenLuo.WinFormsUI.Docking.dll
F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\HalconWindowTest.pdb
F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\DevComponents.DotNetBar2.xml
F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\halcondotnet.xml
F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\WeifenLuo.WinFormsUI.Docking.pdb
F:\VSCode\VisionEditTest\VisionEdit\obj\Debug\VisionEdit.csprojResolveAssemblyReference.cache
F:\VSCode\VisionEditTest\VisionEdit\obj\Debug\VisionEdit.FormLib.FormImageWindow.resources
F:\VSCode\VisionEditTest\VisionEdit\obj\Debug\VisionEdit.FormLib.FormJobManage.resources
F:\VSCode\VisionEditTest\VisionEdit\obj\Debug\VisionEdit.FormLib.FormLog.resources
F:\VSCode\VisionEditTest\VisionEdit\obj\Debug\VisionEdit.FormLib.FormToolBox.resources
F:\VSCode\VisionEditTest\VisionEdit\obj\Debug\VisionEdit.FormMain.resources
F:\VSCode\VisionEditTest\VisionEdit\obj\Debug\VisionEdit.Properties.Resources.resources
F:\VSCode\VisionEditTest\VisionEdit\obj\Debug\VisionEdit.csproj.GenerateResource.Cache
F:\VSCode\VisionEditTest\VisionEdit\obj\Debug\VisionEdit.exe
F:\VSCode\VisionEditTest\VisionEdit\obj\Debug\VisionEdit.pdb
F:\VSCode\VisionEditTest\VisionEdit\obj\Debug\VisionEdit.csprojResolveAssemblyReference.cache
F:\VSCode\VisionEditTest\VisionEdit\obj\Debug\VisionEdit.FormMain.resources
F:\VSCode\VisionEditTest\VisionEdit\obj\Debug\VisionEdit.FormLib.FormJobManage.resources
F:\VSCode\VisionEditTest\VisionEdit\obj\Debug\VisionEdit.FormLib.FormToolBox.resources
F:\VSCode\VisionEditTest\VisionEdit\obj\Debug\VisionEdit.FormLib.FormImageWindow.resources
F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\WeifenLuo.WinFormsUI.Docking.dll
F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\WeifenLuo.WinFormsUI.Docking.pdb
F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\HalconWindowTest.exe
F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\halcondotnet.dll
F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\HalconWindowTest.pdb
F:\VSCode\VisionEditTest\VisionEdit\bin\Debug\halcondotnet.xml
F:\VSCode\VisionEditTest\VisionEdit\obj\Debug\VisionEdit.FormLib.FormLog.resources

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
</configuration>

View File

@@ -1,13 +0,0 @@
F:\VSCode\VisionEditTest\VisionEditTest\bin\Debug\VisionEditTest.exe.config
F:\VSCode\VisionEditTest\VisionEditTest\obj\Debug\VisionEditTest.Properties.Resources.resources
F:\VSCode\VisionEditTest\VisionEditTest\obj\Debug\VisionEditTest.csproj.GenerateResource.Cache
F:\VSCode\VisionEditTest\VisionEditTest\bin\Debug\VisionEditTest.exe
F:\VSCode\VisionEditTest\VisionEditTest\bin\Debug\VisionEditTest.pdb
F:\VSCode\VisionEditTest\VisionEditTest\bin\Debug\DevComponents.DotNetBar2.dll
F:\VSCode\VisionEditTest\VisionEditTest\bin\Debug\halcondotnet.dll
F:\VSCode\VisionEditTest\VisionEditTest\bin\Debug\DevComponents.DotNetBar2.xml
F:\VSCode\VisionEditTest\VisionEditTest\obj\Debug\VisionEditTest.exe
F:\VSCode\VisionEditTest\VisionEditTest\obj\Debug\VisionEditTest.pdb
F:\VSCode\VisionEditTest\VisionEditTest\obj\Debug\VisionEditTest.TestFrmIn.resources
F:\VSCode\VisionEditTest\VisionEditTest\obj\Debug\VisionEditTest.TestForm.resources
F:\VSCode\VisionEditTest\VisionEditTest\obj\Debug\VisionEditTest.csprojResolveAssemblyReference.cache