增加卡尺工具,修复了一些bug

This commit is contained in:
liu.wenjie
2019-08-13 13:57:51 +08:00
committed by liu.wenjie
parent 4dbab27caf
commit ca7c7ec644
132 changed files with 1315 additions and 259 deletions

View File

@@ -5,12 +5,14 @@ using System.Text;
using System.Threading.Tasks;
using CommonMethods;
using HalconDotNet;
using HalconWindow.HalconWindow;
using ToolBase;
using static DataStruct.DataStruct;
namespace CaliperTool
{
[Serializable]
public class CaliperTool:IToolInfo
public class Caliper: IToolBase
{
public bool toolEnable = true;
/// <summary>
@@ -48,11 +50,11 @@ namespace CaliperTool
/// <summary>
/// 卡尺高
/// </summary>
public int length1 = 40;
public HTuple length1 = 40;
/// <summary>
/// 卡尺宽
/// </summary>
public int length2 = 40;
public HTuple length2 = 40;
/// <summary>
/// 找边极性,从明到暗或从暗到明
/// </summary>
@@ -77,86 +79,189 @@ namespace CaliperTool
/// 交点显示
/// </summary>
public bool dispCross = true;
/// <summary>
/// 找到的线
/// <summary
/// 是否显示的线
/// </summary>
public Point resultPoint = null;
/// <summary>
/// 显示的线
/// </summary>
public HObject LineDisp = null;
public bool LineDisp = true;
/// <summary>
/// 新的跟随姿态变化后的预期线信息
/// </summary>
HTuple newExpectLineStartRow = new HTuple(200), newExpectLineStartCol = new HTuple(200), newExpectLineEndRow = new HTuple(200), newExpectLineEndCol = new HTuple(600);
HTuple newExpectRecStartRow = new HTuple(200), newExpectRecStartColumn = new HTuple(200), newExpectPhi = new HTuple(0);
/// <summary>
/// 查找到的线的起点行坐标
/// </summary>
private HTuple _resultLineStartRow = 0;
internal HTuple ResultLineStartRow
private HTuple _resultRow = 0;
public HTuple ResulttRow
{
get
{
_resultLineStartRow = Math.Round((double)_resultLineStartRow, 3);
return _resultLineStartRow;
_resultRow = Math.Round((double)_resultRow, 3);
return _resultRow;
}
set { _resultLineStartRow = value; }
set { _resultRow = value; }
}
/// <summary>
/// 查找到的线的起点列坐标
/// </summary>
private HTuple _resultLineStartCol = 0;
internal HTuple ResultLineStartCol
private HTuple _resultCol = 0;
public HTuple ResultCol
{
get
{
_resultLineStartCol = Math.Round((double)_resultLineStartCol, 3);
return _resultLineStartCol;
_resultCol = Math.Round((double)_resultCol, 3);
return _resultCol;
}
set { _resultLineStartCol = value; }
}
/// <summary>
/// 查找到的线的终点行坐标
/// </summary>
private HTuple _resultLineEndRow = 0;
internal HTuple ResultLineEndRow
{
get
{
_resultLineEndRow = Math.Round((double)_resultLineEndRow, 3);
return _resultLineEndRow;
}
set { _resultLineEndRow = value; }
}
/// <summary>
/// 查找到的线的终点列坐标
/// </summary>
private HTuple _resultLineEndCol = 0;
internal HTuple ResultLineEndCol
{
get
{
_resultLineEndCol = Math.Round((double)_resultLineEndCol, 3);
return _resultLineEndCol;
}
set { _resultLineEndCol = value; }
}
/// <summary>
/// 查找到线的方向
/// </summary>
private HTuple _angle = 0;
internal HTuple Angle
{
get
{
_angle = Math.Round((double)_angle, 3);
return _angle;
}
set { _angle = value; }
set { _resultCol = value; }
}
public HObject inputImage { get; set; } = null;
public ToolRunStatu toolRunStatu { get; set; } = ToolRunStatu.Not_Run;
public void DispImage()
{
if (inputImage != null)
{
FormCaliper.Instance.myHwindow.HobjectToHimage(inputImage);
}
}
internal void DrawExpectLine(HWindow_Final myHwindow)
{
if (inputImage != null)
{
try
{
myHwindow.DrawModel = true;
myHwindow.Focus();
HOperatorSet.SetColor(myHwindow.hWindowControl.HalconWindow, new HTuple("green"));
HOperatorSet.DrawRectangle2Mod(myHwindow.hWindowControl.HalconWindow, expectRecStartRow, expectRecStartColumn, expectAngle, length1, length2,
out expectRecStartRow, out expectRecStartColumn, out expectAngle, out length1, out length2);
if (inputPose != null)
{
templatePose.X = inputPose.X;
templatePose.Y = inputPose.Y;
templatePose.U = inputPose.U;
}
// 输入
FormCaliper.Instance.tbx_expectCenterRow.Text = expectRecStartRow.TupleString("10.3f");
FormCaliper.Instance.tbx_expectCenterCol.Text = expectRecStartColumn.TupleString("10.3f");
FormCaliper.Instance.tbx_expectPhi.Text = expectAngle.TupleString("10.3f");
// 参数
FormCaliper.Instance.tbx_caliperLength1.Text = length1.TupleString("10.3f");
FormCaliper.Instance.tbx_caliperLength2.Text = length2.TupleString("10.3f");
myHwindow.DrawModel = false;
// Run();
}
catch (Exception ex)
{
FormCaliper.Instance.TextBoxMessageDisp(ex.Message, System.Drawing.Color.Red);
}
}
else
{
FormCaliper.Instance.TextBoxMessageDisp("图像为空", System.Drawing.Color.Red);
}
}
public void UpdateImage()
{
FormCaliper.Instance.myHwindow.ClearWindow();
DispImage();
}
public void Run()
{
HTuple HMeasureHandle = new HTuple();
HTuple resultRow, resultCol;
if (inputImage == null)
{
FormCaliper.Instance.TextBoxMessageDisp("图像为空", System.Drawing.Color.Red);
toolRunStatu = ToolRunStatu.Not_Input_Image;
return;
}
try
{
UpdateImage();
if (inputPose != null)
{
HTuple Row = inputPose.X - templatePose.X;
HTuple Col = inputPose.Y - templatePose.Y;
HTuple angle = inputPose.U - templatePose.U;
HTuple _homMat2D;
HOperatorSet.HomMat2dIdentity(out _homMat2D);
HOperatorSet.HomMat2dRotate(_homMat2D, (HTuple)(angle), (HTuple)templatePose.X, (HTuple)templatePose.Y, out _homMat2D);
HOperatorSet.HomMat2dTranslate(_homMat2D, (HTuple)(Row), (HTuple)(Col), out _homMat2D);
//对预期线的起始点做放射变换
HOperatorSet.AffineTransPixel(_homMat2D, (HTuple)expectRecStartRow, (HTuple)expectRecStartColumn, out newExpectRecStartRow, out newExpectRecStartColumn);
}
else
{
newExpectRecStartRow = expectRecStartRow;
newExpectRecStartColumn = expectRecStartColumn;
}
HTuple width, height, AmplitudeThreshold, distance;
HOperatorSet.GetImageSize(inputImage, out width, out height);
HOperatorSet.GenMeasureRectangle2(expectRecStartRow, expectRecStartColumn, expectAngle, length1, length2, width, height, "nearest_neighbor", out HMeasureHandle);
HOperatorSet.MeasurePos(inputImage, HMeasureHandle, sigma, threshold, polarity, edgeSelect, out resultRow, out resultCol, out AmplitudeThreshold, out distance);
if(resultRow.Length != 0)
{
ResulttRow = resultRow;
ResultCol = resultCol;
}
//把点显示出来
HOperatorSet.GenCrossContourXld(out crossDisp, ResulttRow, ResultCol, new HTuple(12), new HTuple(0));
DispMainWindow(FormCaliper.Instance.myHwindow);
// 参数传递
ParamsTrans();
FormCaliper.Instance.tbx_resultStartRow.Text = ResulttRow.ToString();
FormCaliper.Instance.tbx_resultStartCol.Text = ResultCol.ToString();
FormCaliper.Instance.TextBoxMessageDisp("运行成功", System.Drawing.Color.Green);
toolRunStatu = ToolRunStatu.Succeed;
}
catch (Exception ex)
{
FormCaliper.Instance.TextBoxMessageDisp("工具运行异常" + ex.Message, System.Drawing.Color.Red);
}
finally
{
//homMat2DArrow.Dispose();
//arrow.Dispose();
//arrowTrans.Dispose();
}
}
/// <summary>
/// 将数据传递给FindlineToolInterface
/// </summary>
private void ParamsTrans()
{
FormCaliper.Instance.myToolInfo.toolOutput.Clear();
FormCaliper.Instance.myToolInfo.toolOutput.Add(new ToolIO("outputCenterRow", ResulttRow, DataType.IntValue));
FormCaliper.Instance.myToolInfo.toolOutput.Add(new ToolIO("outputCenterColumn", ResultCol, DataType.IntValue));
}
public void DispMainWindow(HWindow_Final window)
{
// 显示矩形
if (dispRec)
{
window.DispObj(contoursDisp, "blue");
}
// 显示交点
if (dispCross)
{
window.DispObj(crossDisp, "orange");
}
//显示找到的线
// window.DispObj(LineDisp, "green");
}
}
}

View File

@@ -35,6 +35,8 @@
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
@@ -44,6 +46,12 @@
</ItemGroup>
<ItemGroup>
<Compile Include="CaliperTool.cs" />
<Compile Include="FormCaliper.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FormCaliper.Designer.cs">
<DependentUpon>FormCaliper.cs</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
@@ -55,6 +63,19 @@
<Project>{DF3D4D4C-02DF-4F92-9FD4-0A861F64B0EF}</Project>
<Name>DataStruct</Name>
</ProjectReference>
<ProjectReference Include="..\HalconWindowTest\HalconWindow.csproj">
<Project>{4ADC75AE-59C7-4D36-B675-A6CE51B6F5BA}</Project>
<Name>HalconWindow</Name>
</ProjectReference>
<ProjectReference Include="..\ToolBase\ToolBase.csproj">
<Project>{7CD50B44-BF56-4E8E-8FA1-05F6968C1835}</Project>
<Name>ToolBase</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="FormCaliper.resx">
<DependentUpon>FormCaliper.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

519
CaliperTool/FormCaliper.Designer.cs generated Normal file
View File

@@ -0,0 +1,519 @@
namespace CaliperTool
{
partial class FormCaliper
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormCaliper));
this.tbx_resultStartRow = new System.Windows.Forms.TextBox();
this.label5 = new System.Windows.Forms.Label();
this.label16 = new System.Windows.Forms.Label();
this.label14 = new System.Windows.Forms.Label();
this.label15 = new System.Windows.Forms.Label();
this.label13 = new System.Windows.Forms.Label();
this.label11 = new System.Windows.Forms.Label();
this.tbx_caliperLength2 = new System.Windows.Forms.TextBox();
this.tbx_Sigma = new System.Windows.Forms.TextBox();
this.tbx_caliperLength1 = new System.Windows.Forms.TextBox();
this.tbx_threshold = new System.Windows.Forms.TextBox();
this.cbx_polarity = new System.Windows.Forms.ComboBox();
this.btn_runCaliperool = new System.Windows.Forms.Button();
this.btn_moveCliperRegion = new System.Windows.Forms.Button();
this.cbx_edgeSelect = new System.Windows.Forms.ComboBox();
this.tbx_resultStartCol = new System.Windows.Forms.TextBox();
this.txbLog = new System.Windows.Forms.TextBox();
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.panel1 = new System.Windows.Forms.Panel();
this.groupBox4 = new System.Windows.Forms.GroupBox();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.chBDispCaliperROI = new System.Windows.Forms.CheckBox();
this.chBDispCross = new System.Windows.Forms.CheckBox();
this.chBDispRec = new System.Windows.Forms.CheckBox();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.label3 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.tbx_expectPhi = new System.Windows.Forms.TextBox();
this.tbx_expectCenterCol = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.tbx_expectCenterRow = new System.Windows.Forms.TextBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.label7 = new System.Windows.Forms.Label();
this.label9 = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
this.groupBox4.SuspendLayout();
this.groupBox3.SuspendLayout();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.SuspendLayout();
//
// tbx_resultStartRow
//
this.tbx_resultStartRow.Location = new System.Drawing.Point(98, 28);
this.tbx_resultStartRow.Margin = new System.Windows.Forms.Padding(2);
this.tbx_resultStartRow.Name = "tbx_resultStartRow";
this.tbx_resultStartRow.Size = new System.Drawing.Size(71, 21);
this.tbx_resultStartRow.TabIndex = 102;
//
// label5
//
this.label5.AutoSize = true;
this.label5.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label5.Location = new System.Drawing.Point(19, 201);
this.label5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(79, 20);
this.label5.TabIndex = 279;
this.label5.Text = "结果选择:";
//
// label16
//
this.label16.AutoSize = true;
this.label16.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label16.Location = new System.Drawing.Point(19, 71);
this.label16.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label16.Name = "label16";
this.label16.Size = new System.Drawing.Size(65, 20);
this.label16.TabIndex = 302;
this.label16.Text = "卡尺宽:";
//
// label14
//
this.label14.AutoSize = true;
this.label14.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label14.Location = new System.Drawing.Point(19, 38);
this.label14.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label14.Name = "label14";
this.label14.Size = new System.Drawing.Size(65, 20);
this.label14.TabIndex = 302;
this.label14.Text = "卡尺长:";
//
// label15
//
this.label15.AutoSize = true;
this.label15.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label15.Location = new System.Drawing.Point(21, 138);
this.label15.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label15.Name = "label15";
this.label15.Size = new System.Drawing.Size(54, 20);
this.label15.TabIndex = 310;
this.label15.Text = "Sigma:";
//
// label13
//
this.label13.AutoSize = true;
this.label13.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label13.Location = new System.Drawing.Point(19, 105);
this.label13.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(51, 20);
this.label13.TabIndex = 310;
this.label13.Text = "阈值:";
//
// label11
//
this.label11.AutoSize = true;
this.label11.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label11.Location = new System.Drawing.Point(19, 171);
this.label11.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(51, 20);
this.label11.TabIndex = 298;
this.label11.Text = "极性:";
//
// tbx_caliperLength2
//
this.tbx_caliperLength2.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.tbx_caliperLength2.Location = new System.Drawing.Point(109, 68);
this.tbx_caliperLength2.Margin = new System.Windows.Forms.Padding(2);
this.tbx_caliperLength2.Name = "tbx_caliperLength2";
this.tbx_caliperLength2.Size = new System.Drawing.Size(92, 26);
this.tbx_caliperLength2.TabIndex = 301;
//
// tbx_Sigma
//
this.tbx_Sigma.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.tbx_Sigma.Location = new System.Drawing.Point(111, 135);
this.tbx_Sigma.Margin = new System.Windows.Forms.Padding(2);
this.tbx_Sigma.Name = "tbx_Sigma";
this.tbx_Sigma.Size = new System.Drawing.Size(92, 26);
this.tbx_Sigma.TabIndex = 309;
//
// tbx_caliperLength1
//
this.tbx_caliperLength1.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.tbx_caliperLength1.Location = new System.Drawing.Point(109, 35);
this.tbx_caliperLength1.Margin = new System.Windows.Forms.Padding(2);
this.tbx_caliperLength1.Name = "tbx_caliperLength1";
this.tbx_caliperLength1.Size = new System.Drawing.Size(92, 26);
this.tbx_caliperLength1.TabIndex = 301;
//
// tbx_threshold
//
this.tbx_threshold.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.tbx_threshold.Location = new System.Drawing.Point(109, 102);
this.tbx_threshold.Margin = new System.Windows.Forms.Padding(2);
this.tbx_threshold.Name = "tbx_threshold";
this.tbx_threshold.Size = new System.Drawing.Size(92, 26);
this.tbx_threshold.TabIndex = 309;
//
// cbx_polarity
//
this.cbx_polarity.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.cbx_polarity.FormattingEnabled = true;
this.cbx_polarity.Items.AddRange(new object[] {
"从明到暗",
"从暗到明"});
this.cbx_polarity.Location = new System.Drawing.Point(109, 168);
this.cbx_polarity.Name = "cbx_polarity";
this.cbx_polarity.Size = new System.Drawing.Size(92, 28);
this.cbx_polarity.TabIndex = 314;
this.cbx_polarity.Text = "从明到暗";
//
// btn_runCaliperool
//
this.btn_runCaliperool.BackColor = System.Drawing.Color.White;
this.btn_runCaliperool.Location = new System.Drawing.Point(430, 355);
this.btn_runCaliperool.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.btn_runCaliperool.Name = "btn_runCaliperool";
this.btn_runCaliperool.Size = new System.Drawing.Size(90, 48);
this.btn_runCaliperool.TabIndex = 270;
this.btn_runCaliperool.Text = "运行";
this.btn_runCaliperool.UseVisualStyleBackColor = false;
this.btn_runCaliperool.Click += new System.EventHandler(this.btn_runCaliperool_Click);
//
// btn_moveCliperRegion
//
this.btn_moveCliperRegion.BackColor = System.Drawing.Color.White;
this.btn_moveCliperRegion.Location = new System.Drawing.Point(296, 355);
this.btn_moveCliperRegion.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.btn_moveCliperRegion.Name = "btn_moveCliperRegion";
this.btn_moveCliperRegion.Size = new System.Drawing.Size(90, 48);
this.btn_moveCliperRegion.TabIndex = 269;
this.btn_moveCliperRegion.Text = "编辑卡尺";
this.btn_moveCliperRegion.UseVisualStyleBackColor = false;
this.btn_moveCliperRegion.Click += new System.EventHandler(this.btn_moveCliperRegion_Click);
//
// cbx_edgeSelect
//
this.cbx_edgeSelect.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.cbx_edgeSelect.FormattingEnabled = true;
this.cbx_edgeSelect.Items.AddRange(new object[] {
"all",
"first",
"last"});
this.cbx_edgeSelect.Location = new System.Drawing.Point(109, 199);
this.cbx_edgeSelect.Name = "cbx_edgeSelect";
this.cbx_edgeSelect.Size = new System.Drawing.Size(92, 28);
this.cbx_edgeSelect.TabIndex = 317;
this.cbx_edgeSelect.Text = "all";
//
// tbx_resultStartCol
//
this.tbx_resultStartCol.Location = new System.Drawing.Point(98, 61);
this.tbx_resultStartCol.Margin = new System.Windows.Forms.Padding(2);
this.tbx_resultStartCol.Name = "tbx_resultStartCol";
this.tbx_resultStartCol.Size = new System.Drawing.Size(71, 21);
this.tbx_resultStartCol.TabIndex = 104;
//
// txbLog
//
this.txbLog.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txbLog.Location = new System.Drawing.Point(1, 487);
this.txbLog.Name = "txbLog";
this.txbLog.ReadOnly = true;
this.txbLog.Size = new System.Drawing.Size(1127, 21);
this.txbLog.TabIndex = 276;
//
// splitContainer1
//
this.splitContainer1.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.splitContainer1.Location = new System.Drawing.Point(1, 2);
this.splitContainer1.Name = "splitContainer1";
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.Controls.Add(this.panel1);
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.BackColor = System.Drawing.Color.White;
this.splitContainer1.Panel2.Controls.Add(this.groupBox4);
this.splitContainer1.Panel2.Controls.Add(this.groupBox3);
this.splitContainer1.Panel2.Controls.Add(this.groupBox1);
this.splitContainer1.Panel2.Controls.Add(this.groupBox2);
this.splitContainer1.Panel2.Controls.Add(this.btn_runCaliperool);
this.splitContainer1.Panel2.Controls.Add(this.btn_moveCliperRegion);
this.splitContainer1.Size = new System.Drawing.Size(1127, 479);
this.splitContainer1.SplitterDistance = 562;
this.splitContainer1.TabIndex = 275;
//
// panel1
//
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(562, 479);
this.panel1.TabIndex = 272;
//
// groupBox4
//
this.groupBox4.Controls.Add(this.label14);
this.groupBox4.Controls.Add(this.cbx_edgeSelect);
this.groupBox4.Controls.Add(this.cbx_polarity);
this.groupBox4.Controls.Add(this.tbx_threshold);
this.groupBox4.Controls.Add(this.label5);
this.groupBox4.Controls.Add(this.tbx_caliperLength1);
this.groupBox4.Controls.Add(this.label16);
this.groupBox4.Controls.Add(this.tbx_Sigma);
this.groupBox4.Controls.Add(this.tbx_caliperLength2);
this.groupBox4.Controls.Add(this.label15);
this.groupBox4.Controls.Add(this.label11);
this.groupBox4.Controls.Add(this.label13);
this.groupBox4.Location = new System.Drawing.Point(14, 166);
this.groupBox4.Name = "groupBox4";
this.groupBox4.Size = new System.Drawing.Size(224, 271);
this.groupBox4.TabIndex = 320;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "卡尺参数";
//
// groupBox3
//
this.groupBox3.Controls.Add(this.chBDispCaliperROI);
this.groupBox3.Controls.Add(this.chBDispCross);
this.groupBox3.Controls.Add(this.chBDispRec);
this.groupBox3.Location = new System.Drawing.Point(296, 170);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(213, 124);
this.groupBox3.TabIndex = 319;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "显示";
//
// chBDispCaliperROI
//
this.chBDispCaliperROI.AutoSize = true;
this.chBDispCaliperROI.Location = new System.Drawing.Point(29, 92);
this.chBDispCaliperROI.Name = "chBDispCaliperROI";
this.chBDispCaliperROI.Size = new System.Drawing.Size(96, 16);
this.chBDispCaliperROI.TabIndex = 0;
this.chBDispCaliperROI.Text = "结果显示交点";
this.chBDispCaliperROI.UseVisualStyleBackColor = true;
//
// chBDispCross
//
this.chBDispCross.AutoSize = true;
this.chBDispCross.Location = new System.Drawing.Point(29, 60);
this.chBDispCross.Name = "chBDispCross";
this.chBDispCross.Size = new System.Drawing.Size(96, 16);
this.chBDispCross.TabIndex = 0;
this.chBDispCross.Text = "结果显示交点";
this.chBDispCross.UseVisualStyleBackColor = true;
//
// chBDispRec
//
this.chBDispRec.AutoSize = true;
this.chBDispRec.Location = new System.Drawing.Point(29, 29);
this.chBDispRec.Name = "chBDispRec";
this.chBDispRec.Size = new System.Drawing.Size(108, 16);
this.chBDispRec.TabIndex = 0;
this.chBDispRec.Text = "结果显示矩形框";
this.chBDispRec.UseVisualStyleBackColor = true;
//
// groupBox1
//
this.groupBox1.Controls.Add(this.label3);
this.groupBox1.Controls.Add(this.label1);
this.groupBox1.Controls.Add(this.tbx_expectPhi);
this.groupBox1.Controls.Add(this.tbx_expectCenterCol);
this.groupBox1.Controls.Add(this.label2);
this.groupBox1.Controls.Add(this.tbx_expectCenterRow);
this.groupBox1.Location = new System.Drawing.Point(14, 19);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(224, 127);
this.groupBox1.TabIndex = 318;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "输入坐标";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(22, 89);
this.label3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(65, 12);
this.label3.TabIndex = 276;
this.label3.Text = "卡尺角度:";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(22, 31);
this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(77, 12);
this.label1.TabIndex = 272;
this.label1.Text = "中心行坐标:";
//
// tbx_expectPhi
//
this.tbx_expectPhi.Location = new System.Drawing.Point(131, 86);
this.tbx_expectPhi.Margin = new System.Windows.Forms.Padding(2);
this.tbx_expectPhi.Name = "tbx_expectPhi";
this.tbx_expectPhi.Size = new System.Drawing.Size(71, 21);
this.tbx_expectPhi.TabIndex = 275;
//
// tbx_expectCenterCol
//
this.tbx_expectCenterCol.Location = new System.Drawing.Point(131, 57);
this.tbx_expectCenterCol.Margin = new System.Windows.Forms.Padding(2);
this.tbx_expectCenterCol.Name = "tbx_expectCenterCol";
this.tbx_expectCenterCol.Size = new System.Drawing.Size(71, 21);
this.tbx_expectCenterCol.TabIndex = 273;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(22, 60);
this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(77, 12);
this.label2.TabIndex = 274;
this.label2.Text = "中心列坐标:";
//
// tbx_expectCenterRow
//
this.tbx_expectCenterRow.Location = new System.Drawing.Point(131, 28);
this.tbx_expectCenterRow.Margin = new System.Windows.Forms.Padding(2);
this.tbx_expectCenterRow.Name = "tbx_expectCenterRow";
this.tbx_expectCenterRow.Size = new System.Drawing.Size(71, 21);
this.tbx_expectCenterRow.TabIndex = 271;
//
// groupBox2
//
this.groupBox2.Controls.Add(this.tbx_resultStartRow);
this.groupBox2.Controls.Add(this.tbx_resultStartCol);
this.groupBox2.Controls.Add(this.label7);
this.groupBox2.Controls.Add(this.label9);
this.groupBox2.Location = new System.Drawing.Point(296, 19);
this.groupBox2.Margin = new System.Windows.Forms.Padding(2);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Padding = new System.Windows.Forms.Padding(2);
this.groupBox2.Size = new System.Drawing.Size(201, 127);
this.groupBox2.TabIndex = 297;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "结果点";
//
// label7
//
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(22, 31);
this.label7.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(77, 12);
this.label7.TabIndex = 103;
this.label7.Text = "中心行坐标:";
//
// label9
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(22, 64);
this.label9.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(77, 12);
this.label9.TabIndex = 105;
this.label9.Text = "中心列坐标:";
//
// FormCaliper
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1132, 509);
this.Controls.Add(this.txbLog);
this.Controls.Add(this.splitContainer1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FormCaliper";
this.Text = "卡尺工具";
this.Load += new System.EventHandler(this.FormCaliper_Load);
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false);
this.groupBox4.ResumeLayout(false);
this.groupBox4.PerformLayout();
this.groupBox3.ResumeLayout(false);
this.groupBox3.PerformLayout();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
public System.Windows.Forms.TextBox tbx_resultStartRow;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label16;
private System.Windows.Forms.Label label14;
private System.Windows.Forms.Label label15;
private System.Windows.Forms.Label label13;
private System.Windows.Forms.Label label11;
public System.Windows.Forms.TextBox tbx_caliperLength2;
public System.Windows.Forms.TextBox tbx_Sigma;
public System.Windows.Forms.TextBox tbx_caliperLength1;
public System.Windows.Forms.TextBox tbx_threshold;
public System.Windows.Forms.ComboBox cbx_polarity;
public System.Windows.Forms.Button btn_runCaliperool;
private System.Windows.Forms.Button btn_moveCliperRegion;
public System.Windows.Forms.ComboBox cbx_edgeSelect;
public System.Windows.Forms.TextBox tbx_resultStartCol;
public System.Windows.Forms.TextBox txbLog;
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.GroupBox groupBox3;
private System.Windows.Forms.CheckBox chBDispCross;
private System.Windows.Forms.CheckBox chBDispRec;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label1;
public System.Windows.Forms.TextBox tbx_expectPhi;
public System.Windows.Forms.TextBox tbx_expectCenterCol;
private System.Windows.Forms.Label label2;
public System.Windows.Forms.TextBox tbx_expectCenterRow;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.GroupBox groupBox4;
private System.Windows.Forms.CheckBox chBDispCaliperROI;
}
}

109
CaliperTool/FormCaliper.cs Normal file
View File

@@ -0,0 +1,109 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CommonMethods;
using HalconWindow.HalconWindow;
namespace CaliperTool
{
public partial class FormCaliper : Form
{
public Caliper myCaliper = null;
public IToolInfo myToolInfo = null;
public HWindow_Final myHwindow = new HWindow_Final();
private static FormCaliper _instance;
public FormCaliper(ref object caliper)
{
InitializeComponent();
myToolInfo = (IToolInfo)caliper;
myCaliper = (Caliper)myToolInfo.tool;
_instance = this;
}
public static FormCaliper Instance
{
get
{
if(_instance!= null)
{
return _instance;
}
else
{
object caliper = new object();
_instance = new FormCaliper(ref caliper);
return _instance;
}
}
}
private void FormCaliper_Load(object sender, EventArgs e)
{
this.panel1.Controls.Add(myHwindow);
myHwindow.Dock = DockStyle.Fill;
InitTool();
}
private void InitTool()
{
this.Text = myToolInfo.toolName;
btn_runCaliperool.Focus();
Application.DoEvents();
// 预期设定值
tbx_expectCenterRow.Text = myCaliper.expectRecStartRow.ToString();
tbx_expectCenterCol.Text = myCaliper.expectRecStartColumn.ToString();
tbx_expectPhi.Text = myCaliper.expectAngle.ToString();
// 预期参数
tbx_caliperLength1.Text = myCaliper.length1.ToString();
tbx_caliperLength2.Text = myCaliper.length2.ToString();
cbx_edgeSelect.Text = myCaliper.edgeSelect;
cbx_polarity.Text = myCaliper.polarity == "positive" ? "从暗到明" : "从明到暗";
tbx_threshold.Text = myCaliper.threshold.ToString();
tbx_Sigma.Text = myCaliper.sigma.ToString();
// 显示
chBDispRec.Checked = myCaliper.dispRec;
chBDispCross.Checked = myCaliper.dispCross;
chBDispCaliperROI.Checked = myCaliper.LineDisp;
}
private void btn_moveCliperRegion_Click(object sender, EventArgs e)
{
myCaliper.UpdateImage();
myCaliper.DrawExpectLine(myHwindow);
}
public void TextBoxMessageDisp(string mes, Color setColor)
{
txbLog.BackColor = setColor;
txbLog.Text = mes;
txbLog.Font = new Font("微软雅黑", 10, FontStyle.Bold);
CommonMethods.CommonMethods.Delay(2000);
txbLog.BackColor = Color.White;
}
private void btn_runCaliperool_Click(object sender, EventArgs e)
{
// 更改界面中参数,实时更新类中参数
myCaliper.expectRecStartRow = Convert.ToDouble(tbx_expectCenterRow.Text.Trim());
myCaliper.expectRecStartColumn = Convert.ToDouble(tbx_expectCenterCol.Text.Trim());
myCaliper.expectAngle = Convert.ToDouble(tbx_expectPhi.Text.Trim());
// 运行参数
myCaliper.threshold = Convert.ToInt16(tbx_threshold.Text.Trim());
myCaliper.length1 = Convert.ToInt16(tbx_caliperLength1.Text.Trim());
myCaliper.length2 = Convert.ToInt16(tbx_caliperLength2.Text.Trim());
myCaliper.polarity = cbx_polarity.SelectedItem.ToString() == "从明到暗" ? "negative" : "positive";
myCaliper.edgeSelect = cbx_edgeSelect.SelectedItem.ToString();
myCaliper.sigma = Convert.ToDouble(tbx_Sigma.Text.Trim());
myCaliper.Run();
}
}
}

View File

@@ -0,0 +1,205 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAIyAAAAEAIACoEgAAFgAAACgAAAAjAAAAQAAAAAEAIAAAAAAAgBEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAGyU0ZFdeafFscnz/bHJ8/2xyfP9scnz/bHJ8/2xyfP9scnz/bHJ8/2xyfP9scnz/bHJ8/2xy
fP9scnz/bHJ8/2xyfP9scnz/bHJ8/2xyfP9scnz/bHJ8/2xyfP9scnz/bHJ8/2xyfP9scnz/bHJ8/2xy
fP9scnz/bHJ8/1dfavUcJjRsAAAAABkjMgZbYWnz+fHY//nv0f/579H/+e/R//nv0f/579H/+e/R//nv
0f/579H/+e/R//nv0f/579H/+e/R//nv0f/579H/+e/R//nv0f/579H/+e/R//nv0f/579H/+e/R//nv
0f/579H/+e/R//nv0f/579H/+e/R//nv0f/579H/+vHX/19lbPcZIzIIGSQzCnBvZP/p2qj/QH6T/y6H
q/8th6v/Loer/2aLjv/15K7/9eSu//Tkrf/15K7/9eSu//Xjrf/15K7/9eSu//Xjrv/15K7/9eSt//Tj
rf/1463/9OSu//Tkrv/15K7/9OOt//Tjrf/15K7/9eSu//Tkrv/1467/9eSu//Tkrf/0467/cnJl/xki
Mg4ZJDMKcG9j/+fYp/9aiJb/Wpqy/1qasv9amrL/dpGQ//Xkrv/1467/9eSt//Xjrv/15K7/9eSt//Xk
rv/05K7/9eSt//Xkrv/1463/9OOt//Xkrv/05K3/9OOt//Xkrv/0463/9eOt//Xkrv/15K7/9OSu//Xj
rf/15K7/9OOt//Pjrf9xcGT/GSIyDhkkMwpwb2P/9OOt//Xkrv/15K7/9OOt//Tkrv/1467/9eSu//Xk
rv/05K3/9eSu//Tkrv/1463/9eSu//Tkrv/0463/9eSu//Tjrf/05K7/9eOu//Tkrf/0467/9eSu//Tj
rf/15K7/9eSu//Xjrf/05K7/9eSu//Xkrv/0463/cnJk/3FwZP8ZIjIOGSQzCnBvY//1463/9OSu//Xk
rv/15K3/9OSt//Tkrv/15K7/9eSu//Xkrf/15K7/9eSu//Xkrf/1467/9eSt//Xkrv/15K3/9eOt//Tk
rf/15K7/9OSt//Tkrv/15K7/9OOt//Tjrf/15K7/9eOu//Tkrv/1463/9eSu//Tjrf9qamD/cXBk/xki
Mg4ZJDMKcG9j//Tjrf/15K7/9eOu//Tjrf/05K3/9eSu//Xkrv/15K7/9OSt//Xkrv/15K7/9eOt//Xk
rv/15K7/9eOu//Xkrv/15K3/9OOt//Xjrf/05K7/9OSu//Xkrv/0463/9OOt//Xkrv/15K7/9OSu//Xj
rv/15K7/9OSt/2pqYP9xcGT/GSIyDhkkMwpwb2P/9OOt//Xkrv/15K7/9eSt//Tjrf/15K7/9eSu//Xj
rv/15K3/9eOu//Xkrv/15K3/9eSu//Tkrv/15K3/9eSu//Xjrf/0463/9eSu//Tkrf/0463/9eSu//Tj
rf/1463/9eSu//Xkrv/05K7/9eOt//Xkrv/0463/vbOP/3FwZP8ZIjIOGSQzCnBvY//0463/9eSu//Xk
rv/0463/9OSu//Xjrv/15K7/9eSu//Tkrf/15K7/9OSu//Xjrf/15K7/9OSu//Tjrf/15K7/9OOt//Tk
rv/1467/9OSt//Tjrv/15K7/9OOt//Xkrv/15K7/9eOt//Tkrv/15K7/9eSu//Tjrf92dGb/cXBk/xki
Mg4ZJDMKcG9j//Xjrf/05K7/9eSu//Xkrf/05K3/9OSu//Xkrv/15K7/9eSt//Xkrv/15K7/9eSt//Xj
rv/15K3/9eSu//Xkrf/1463/9OSt//Xkrv/05K3/9OSu//Xkrv/0463/9OOt//Xkrv/1467/9OSu//Xj
rf/15K7/9OOt/8/CmP9xcGT/GSIyDhkkMwpwb2P/9OOt//Xkrv/1467/9OOt//Tkrf/15K7/9eSu//Xk
rv/05K3/9eSu//Xkrv/1463/8+Ks/5CMdf90c2b/dHNm/3RzZv+Gg3D/796q//Tkrv/05K7/9eSu//Tj
rf/0463/9eSu//Xkrv/05K7/9eOu//Xkrv/05K3/9OOu/3FwZP8ZIjIOGSQzCnBvY//0463/9eSu//Xk
rv/15K3/9OOt//Xkrv/15K7/9eOu//Xkrf/1467/9eSu//Xkrf/VyJz/S0KD/4lp6P+Jaej/iWno/1hL
mf/EuZL/9OSt//Tjrf/15K7/9OOt//Xjrf/15K7/9eSu//Tkrv/1463/9eSu//Tjrf/05K7/cXBk/xki
Mg4ZJDMKcG9j//Tjrf/15K7/9eSu//Tjrf/05K7/9eOu//Xkrv/15K7/9OSt//Xkrv/05K7/9eOt/9DE
mf9TSpD/lnn+/5R3+/+WeP7/Y1Wq/8K3kf/05K3/9OOu//Xkrv/0463/9eSu//Xkrv/1463/9OSu//Xk
rv/15K7/9OOt//Tkrv9xcGT/GSIyDhkkMwpwb2L/9OOs//TjrP/046z/9OOs//TjrP/046z/9OOs//Tj
rP/046z/9OOs//TjrP/046z/0MOX/1NKkP+Xef//Mk16/4tx7P9jVar/wreQ//TjrP/046z/9OOs//Tj
rP/046z/9OOs//TjrP/046z/9OOs//TjrP/046z/9OOs/3FwY/8ZIjIOGSMyPlVVQ/+woVv/sKFb/7Ch
W/+woVv/sKFb/7ChW/+woVv/sKFb/7ChW/+woVv/sKFb/7ChW/+XjFT/U0qQ/5d5/v8oVHv/h27m/2NV
qv+NhFL/sKFb/7ChW/+woVv/sKFb/7ChW/+woVv/sKFb/7ChW/+woVv/sKFb/7ChW/+woVv/WVlE/xkj
MkJCRTz/iH9N/4h/Tf+If03/iH9N/4h/Tf+If03/iH9N/4h/Tf+If03/iH9N/4h/Tf+If03/iH9N/3Vw
Sf9TSpD/cGbK/x6Drv9iY7z/Y1Wq/25qR/+If03/iH9N/4h/Tf+If03/iH9N/4h/Tf+If03/iH9N/4h/
Tf+If03/iH9N/4h/Tf+If03/REc9/2dnWf/ZyY//wLOC/8K1g//u3Jv/w7aD/8u9h//w3p3/8N6d//De
nf/w3p3/8N6d//Denf/w3p3/zL+L/1NKkP9Uc6//K8X3/05/tf9jVar/v7OE//Denf/w3p3/8N6d//De
nf/w3p3/8N6d//Denf/w3p3/8N6d//Denf/w3p3/8N6d//Denf9paFn/aGhf/8W6k/+blXv/npd9/+7e
qv+el33/rKSF//Tkrv/15K7/9eSu//Xkrf/15K7/9eSu//Xkrf/QxJn/U0qQ/4Jr2v+Hf7j/gWzW/2NV
qv/Ct5H/9OSt//Tkrv/15K7/9OOt//Tjrf/15K7/9eOu//Tkrv/1463/9eSu//Tjrf/15K7/9OOt/2lp
X/9oaF//9eSu//Tjrf/15K7/9eOu//Tjrf/05K3/9eSu//Xkrv/15K7/9OSt//Xkrv/15K7/9eOt/9DE
mf9VTZH/mHv+/5h7//+Ye///ZVir/8K3kf/05K7/9OSu//Xkrv/0463/9OOt//Xkrv/15K7/9OSu//Xj
rv/15K7/9OSt//Tjrv/15K7/aWlf/2hoX//15K7/9OOt//Xkrv/15K7/9eSt//Tjrf/15K7/9eSu//Xj
rv/15K3/9eOu//Xkrv/15K3/6Nmn/1RZX/9pbnz/aW58/2lufP9SWGH/282f//Tkrf/0463/9eSu//Tj
rf/1463/9eSu//Xkrv/05K7/9eOt//Xkrv/0463/9OSu//Tjrv9paV//aGhf//Xkrv/0463/9eSu//Xk
rv/0463/9OSu//Xjrv/15K7/9eSu//Tkrf/15K7/9OSu//Xjrf/15K7/9OSu//Tjrf/15K7/9OOt//Tk
rv/1467/9OSt//Tjrv/15K7/9OOt//Xkrv/15K7/9eOt//Tkrv/15K7/9eSu//Tjrf/05K7/9OSu/2lp
X/9oaF//9OSu//Xjrf/05K7/9eSu//Xkrf/05K3/9OSu//Xkrv/15K7/9eSt//Xkrv/15K7/9eSt//Xj
rv/15K3/9eSu//Xkrf/1463/9OSt//Xkrv/05K3/9OSu//Xkrv/0463/9OOt//Xkrv/1467/9OSu//Xj
rf/15K7/9OOt//Xkrv/0463/aWlf/2lqYv/15K7/9OOt//Xkrv/1467/9OOt//Tkrf/15K7/9eSu//Xk
rv/05K3/9eSu//Xkrv/1463/9eSu//Xkrv/1467/9eSu//Xkrf/0463/9eOt//Tkrv/05K7/9eSu//Tj
rf/0463/9eSu//Xkrv/05K7/9eOu//Xkrv/05K3/9OOu//Xkrv9rbGT/Q0tX4fDs3v/79eH/+/Xh//v1
4f/79eH/+/Xh//v14f/79eH/+/Xh//v14f/79eH/+/Xh//v14f/79eH/+/Xh//v14f/79eH/+/Xh//v1
4f/79eH/+/Xh//v14f/79eH/+/Xh//v14f/79eH/+/Xh//v14f/79eH/+/Xh//v14f/79eH/8+7g/0hP
W+UZIzM0KjNBtz9IVMk/SFTJP0hUyT9IVMk/SFTJP0hUyTlFU/M3WXL/OkNQ6T9HVMs/R1TLP0dUyz9H
VMs/R1TLP0dUyz9HVMs/R1TLP0dUyz9HVMs/R1TLP0dUyz9HVMs6Q0/pN1lx/zhFVPU/SFTJP0hUyT9I
VMk/SFTJP0hUyT9IVMkqM0G5GSMzNgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGjRIyRu3
7f8aJDOZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoj
M5cbseb/Gj1TzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAaNEjJG7nu/xokM5kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAGSQzlxuz5v8aPVPNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABo0R8kbue7/GiQzmwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaJDOXG7Xo/xo7UM0AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGig4rR25
7P8aOU7XGiQzBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGSMyBho2
Ss8duu7/Gio7swAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAZJDNcOo+v/xuTwP8ZMUbBGSMyhRokM4MZIzKDGiMzgxokM4MaJDODGiQzgxoj
M4MZIzODGSQzgxkjMoUZMEW/G5C7/zyUtf8aJDNiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkjMgQtN0W7cbHI/0zC7v8xqNj/MKbX/zCm
1/8wptf/MKbX/zCm1/8wptf/MKbX/zCm1/8wptf/MafX/0vB7v9xs8v/LzpHvxkjMgYAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkk
MgoeKDeHUlll5Wlxe/1qcnz/anJ8/2pyfP9qcnz/anJ8/2pyfP9qcnz/anJ8/2pyfP9qcXv9U1pm5x8o
N4kZIzIKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAGAAAACAAAAAIAAAAIAA
AAAgAAAAgAAAACAAAACAAAAAIAAAAIAAAAAgAAAAgAAAACAAAACAAAAAIAAAAIAAAAAgAAAAgAAAACAA
AACAAAAAIAAAAIAAAAAgAAAAgAAAACAAAACAAAAAIAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAACAA
AAD/H/8f4AAAAP8f/x/gAAAA/x//H+AAAAD/H/8f4AAAAP+AAD/gAAAA/4AAP+AAAAD/wAB/4AAAAA==
</value>
</data>
</root>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.