From edf127edc771f715c49f86e91e768633f0a0ed93 Mon Sep 17 00:00:00 2001
From: alvin.chen <alvin.chen@DESKTOP-RPIS58P>
Date: 星期五, 29 十一月 2019 10:31:32 +0800
Subject: [PATCH] add source
---
HalconTools/MeasureModule/MeasureParamSave.cs | 94
HalconTools/frmJobManager.cs | 237
LLMF/LLMF.csproj | 186
PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/FunctionPlot.cs | 562
Lib/FlyCapture/FlyCapture2Managed_v100.dll | 0
PointGreyAndHalcon/PointGreyAndHalcon/PointGreyAndHalcon.csproj | 88
HalconTools/frmCalibration.resx | 132
Lib/SuperDog/dog_windows_3153818.dll | 0
LLMF/frmPassword.Designer.cs | 89
HalconTools/FitModule/FitAssistant.cs | 419
HalconTools/Resources/Resource.zh-CN.resx | 330
HalconTools/ViewROI/ROIRectangle1.cs | 211
Lib/SuperDog/api_dsp_windows.dll | 0
FileToolkit/Properties/Settings.Designer.cs | 26
PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROIController.cs | 401
HalconTools/ToolKit/EventData.cs | 31
Lib/SuperDog/dog_windows_x64_3153818.dll | 0
HalconTools/MeasureModule/Measurement.cs | 516
LLMF/frmMain.resx | 1172 +
HalconTools/frmContourAssistant.Designer.cs | 528
FileToolkit/SerializeFileTool.cs | 70
HalconTools/Properties/Settings.Designer.cs | 26
HalconTools/Properties/Settings.settings | 7
HalconTools/CalibrationModule/QualityProcedures.cs | 1034 +
HalconTools/ViewROI/HObjectEntry.cs | 53
HalconTools/Resources/Resource.en-US.resx | 330
PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/GraphicsContext.cs | 417
EventTool/Properties/Resources.Designer.cs | 63
LLMF/Log.cs | 92
PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROICircularArc.cs | 305
HalconTools/frmFitCircleAndLine.Designer.cs | 1254 +
HalconTools/ContourModule/ContourResult.cs | 43
HalconTools/frmScrewAssistant.cs | 202
HalconTools/ToolKit/SerializeTool.cs | 46
HalconTools/frmFitCircleAndLine.cs | 512
Lib/FlyCapture/FlyCapture2Managed.dll | 0
LLMF/FrmActive.cs | 251
HalconTools/CalibrationModule/CalibrationAssistant.cs | 1751 ++
FileToolkit/StarterTool.cs | 76
HalconTools/frmMain.Designer.cs | 194
EventTool/EventTool.csproj | 87
LLMF/RegistryHelper.cs | 79
FileToolkit/Properties/AssemblyInfo.cs | 36
HalconTools/FitModule/FitCircleParam.cs | 38
HalconTools/ViewROI/ROICircularArc.cs | 305
LLMF/Properties/Resources.resx | 117
LLMF/Program.cs | 51
LLMF/frmMain.cs | 2202 ++
HalconTools/ToolKit/LogType.cs | 12
HalconTools/ViewROI/ROICircle.cs | 155
FileToolkit/Properties/Resources.resx | 117
HalconTools/HalconTools.csproj | 240
HalconTools/ScrewModule/ScrewResult.cs | 22
HalconTools/ResourceCulture.cs | 124
LLMF/Properties/Settings.settings | 7
LLMF/WelcomeUser.cs | 19
PointGreyAndHalcon/PointGreyAndHalcon/PointGreyAndHalcon.cs | 343
HalconTools/ToolKit/ListenEventCreater.cs | 25
PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/HObjectEntry.cs | 53
PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROIRectangle2.cs | 251
HalconTools/CalibrationModule/QualityIssue.cs | 46
LLMF/Properties/Settings.Designer.cs | 26
PointGreyAndHalcon/PointGreyAndHalcon/Properties/AssemblyInfo.cs | 36
LLMF/frmConfig.cs | 188
PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/HWndCtrl.cs | 868 +
HalconTools/FitModule/LinePosition.cs | 33
LLMF/FrmActive.resx | 120
HalconTools/JobModule/Job.cs | 42
HalconTools/MatchingModule/MatchingParamSave.cs | 113
HalconTools/ViewROI/ROI.cs | 161
LLMF/frmConfig.Designer.cs | 421
HalconTools/ToolKit/FileOperationResult.cs | 10
FileToolkit/Win32API.cs | 132
HalconTools/FitModule/FitModule.csproj | 107
HalconTools/MeasureModule/MeasurementPair.cs | 165
LLMF.sln | 52
HalconTools/ViewROI/FunctionPlot.cs | 562
FileToolkit/SerializeTool.cs | 46
HalconTools/ScrewModule/ScrewParam.cs | 20
HalconTools/ToolKit/SerialPort.cs | 177
EventTool/EventData.cs | 31
HalconTools/MatchingModule/MatchingAssistant.cs | 1544 +
HalconTools/MatchingModule/MatchingParam.cs | 641
HalconTools/frmFitCircleAndLine.resx | 120
HalconTools/HalconTool.cs | 624
HalconTools/ToolKit/StarterTool.cs | 76
HalconTools/ViewROI/ROILine.cs | 204
PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROILine.cs | 202
HalconTools/ToolKit/SocketTools.cs | 348
LLMF/Properties/Resources.Designer.cs | 63
HalconTools/ToolKit/Win32API.cs | 132
LLMF/frmPassword.resx | 120
HalconTools/FitModule/LineMetrology.cs | 52
LLMF/Toolkit/OPC.cs | 483
HalconTools/FitModule/FitLineResult.cs | 117
HalconTools/ToolKit/IniTool.cs | 59
Lib/SuperDog/api_dsp_windows_x64.dll | 0
LLMF/frmMain.Designer.cs | 2096 ++
Lib/SuperDog/dog_net_windows.dll | 0
HalconTools/ToolKit/Log.cs | 5
HalconTools/MatchingModule/MatchingOptSpeed.cs | 245
HalconTools/ContourModule/ContourParam.cs | 33
HalconTools/ToolKit/NetWorkTool.cs | 20
LLMF/ico.ico | 0
HalconTools/ScrewModule/ScrewAssistant.cs | 195
HalconTools/FitModule/FitLineParam.cs | 41
PointGreyAndHalcon/PointGreyAndHalcon.sln | 20
LLMF/WelcomeUser.Designer.cs | 66
HalconTools/ToolKit/LkSensor.cs | 403
HalconTools/JobModule/ToolType.cs | 29
LLMF/frmConfig.resx | 120
HalconTools/MeasureModule/MeasurementEdge.cs | 134
HalconTools/Properties/AssemblyInfo.cs | 36
HalconTools/ContourModule/ContourAssistant.cs | 224
HalconTools/FitModule/FitCircleResult.cs | 118
PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROI.cs | 161
LLMF/WelcomeUser.resx | 2544 +++
HalconTools/ToolKit/Counter.cs | 90
HalconTools/ViewROI/ROIRectangle2.cs | 251
HalconTools/CalibrationModule/CalibImage.cs | 285
HalconTools/MatchingModule/MatchingOptStatistics.cs | 283
HalconTools/frmContourAssistant.resx | 120
EventTool/Properties/Settings.Designer.cs | 26
LLMF/Toolkit/ConfigStruct.cs | 208
HalconTools/MeasureModule/MeasureAssistant.cs | 733
HalconTools/Properties/Resources.resx | 120
HalconTools/frmContourAssistant.cs | 240
HalconTools/ToolKit/SerializeFileTool.cs | 70
HalconTools/frmScrewAssistant.resx | 120
HalconTools/frmJobManager.resx | 123
FileToolkit/Properties/Settings.settings | 7
LLMF/app.config | 3
HalconTools/MeasureModule/MeasurementResult.cs | 164
HalconTools/ViewROI/GraphicsContext.cs | 417
HalconTools/frmMain.zh-CHS.resx | 120
EventTool/Properties/AssemblyInfo.cs | 36
FileToolkit/FileToolkit.csproj | 84
HalconTools/Properties/Resources.Designer.cs | 63
EventTool/Properties/Settings.settings | 7
HalconTools/ToolKit/LogManager.cs | 179
HalconTools/MatchingModule/MatchingOpt.cs | 147
FileToolkit/Properties/Resources.Designer.cs | 63
HalconTools/frmMeasureAssistant.resx | 129
HalconTools/JobModule/JobAssistance.cs | 72
HalconTools/ViewROI/ROIController.cs | 402
HalconTools/FitModule/FitResult.cs | 15
PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROICircle.cs | 155
HalconTools/frmJobManager.Designer.cs | 270
LLMF/FrmActive.designer.cs | 86
EventTool/Properties/Resources.resx | 117
HalconTools/ViewROI/HWndCtrl.cs | 867 +
HalconTools/frmMatchingAssistant.cs | 4774 +++++
HalconTools/frmMeasureAssistant.cs | 2649 +++
HalconTools/frmMain.resx | 479
LLMF/frmPassword.cs | 59
FileToolkit/FileOperationResult.cs | 10
EventTool/ListenEventArgs.cs | 27
EventTool/ListenEventCreater.cs | 25
HalconTools/FitModule/CirclePosition.cs | 29
Lib/halcon/halcondotnet.dll | 0
PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROIRectangle1.cs | 211
HalconTools/frmMain.cs | 159
LLMF/Toolkit/StarterTool.cs | 33
HalconTools/ToolKit/StyleSetTools.cs | 77
HalconTools/frmScrewAssistant.Designer.cs | 354
HalconTools/frmCalibration.cs | 1415 +
HalconTools/ToolKit/ListenEventArgs.cs | 27
HalconTools/ToolKit/KillApplication.cs | 35
HalconTools/MatchingModule/MatchingResult.cs | 101
LLMF/Properties/AssemblyInfo.cs | 36
HalconTools/frmCalibration.Designer.cs | 2958 +++
HalconTools/frmMatchingAssistant.resx | 138
172 files changed, 50,330 insertions(+), 0 deletions(-)
diff --git a/EventTool/EventData.cs b/EventTool/EventData.cs
new file mode 100644
index 0000000..d4ff2e0
--- /dev/null
+++ b/EventTool/EventData.cs
@@ -0,0 +1,31 @@
+锘縩amespace EventTool
+{
+ public class EventData
+ {
+ private object data;
+
+ public EventData()
+ {
+ this.data = "";
+ }
+
+ public EventData(object obj)
+ {
+ this.data = "";
+ this.data = obj;
+ }
+
+ public object Data
+ {
+ get
+ {
+ return this.data;
+ }
+ set
+ {
+ this.data = value;
+ }
+ }
+ }
+}
+
diff --git a/EventTool/EventTool.csproj b/EventTool/EventTool.csproj
new file mode 100644
index 0000000..13ccec0
--- /dev/null
+++ b/EventTool/EventTool.csproj
@@ -0,0 +1,87 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>9.0.21022</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{2EBB374F-7C87-4A83-8AF4-503CDF0D1B0E}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>EventTool</RootNamespace>
+ <AssemblyName>EventTool</AssemblyName>
+ <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <StartupObject>
+ </StartupObject>
+ <FileUpgradeFlags>
+ </FileUpgradeFlags>
+ <UpgradeBackupLocation>
+ </UpgradeBackupLocation>
+ <OldToolsVersion>3.5</OldToolsVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Xml.Linq">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Data.DataSetExtensions">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Data" />
+ <Reference Include="System.Deployment" />
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Windows.Forms" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="EventData.cs" />
+ <Compile Include="ListenEventArgs.cs" />
+ <Compile Include="ListenEventCreater.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Resources.resx</DependentUpon>
+ <DesignTime>True</DesignTime>
+ </Compile>
+ <None Include="Properties\Settings.settings">
+ <Generator>SettingsSingleFileGenerator</Generator>
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+ </None>
+ <Compile Include="Properties\Settings.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Settings.settings</DependentUpon>
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
+ </Compile>
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project>
\ No newline at end of file
diff --git a/EventTool/ListenEventArgs.cs b/EventTool/ListenEventArgs.cs
new file mode 100644
index 0000000..dcead99
--- /dev/null
+++ b/EventTool/ListenEventArgs.cs
@@ -0,0 +1,27 @@
+锘縰sing System;
+
+namespace EventTool
+{
+ public class ListenEventArgs : EventArgs
+ {
+ private EventData iData;
+
+ public ListenEventArgs(EventData iData)
+ {
+ this.iData = iData;
+ }
+
+ public EventData IData
+ {
+ get
+ {
+ return this.iData;
+ }
+ set
+ {
+ this.iData = value;
+ }
+ }
+ }
+}
+
diff --git a/EventTool/ListenEventCreater.cs b/EventTool/ListenEventCreater.cs
new file mode 100644
index 0000000..7b1a787
--- /dev/null
+++ b/EventTool/ListenEventCreater.cs
@@ -0,0 +1,25 @@
+锘縰sing System;
+
+namespace EventTool
+{
+ public class ListenEventCreater
+ {
+ public event EventHandler<ListenEventArgs> ListenEvent;
+
+ public void ChangeValue(EventData iData)
+ {
+ ListenEventArgs args = new ListenEventArgs(iData);
+ this.SendEvent(args);
+ }
+
+ protected virtual void SendEvent(ListenEventArgs args)
+ {
+ EventHandler<ListenEventArgs> listenEvent = this.ListenEvent;
+ if (listenEvent != null)
+ {
+ listenEvent(this, args);
+ }
+ }
+ }
+}
+
diff --git a/EventTool/Properties/AssemblyInfo.cs b/EventTool/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..3090b92
--- /dev/null
+++ b/EventTool/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+锘縰sing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 鏈夊叧绋嬪簭闆嗙殑甯歌淇℃伅閫氳繃涓嬪垪灞炴�ч泦
+// 鎺у埗銆傛洿鏀硅繖浜涘睘鎬у�煎彲淇敼
+// 涓庣▼搴忛泦鍏宠仈鐨勪俊鎭��
+[assembly: AssemblyTitle("EventTool")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("EventTool")]
+[assembly: AssemblyCopyright("Copyright 漏 Microsoft 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 灏� ComVisible 璁剧疆涓� false 浣挎绋嬪簭闆嗕腑鐨勭被鍨�
+// 瀵� COM 缁勪欢涓嶅彲瑙併�傚鏋滈渶瑕佷粠 COM 璁块棶姝ょ▼搴忛泦涓殑绫诲瀷锛�
+// 鍒欏皢璇ョ被鍨嬩笂鐨� ComVisible 灞炴�ц缃负 true銆�
+[assembly: ComVisible(false)]
+
+// 濡傛灉姝ら」鐩悜 COM 鍏紑锛屽垯涓嬪垪 GUID 鐢ㄤ簬绫诲瀷搴撶殑 ID
+[assembly: Guid("3b92a380-78bd-4567-ab18-d8a4cec99b2a")]
+
+// 绋嬪簭闆嗙殑鐗堟湰淇℃伅鐢变笅闈㈠洓涓�肩粍鎴�:
+//
+// 涓荤増鏈�
+// 娆$増鏈�
+// 鍐呴儴鐗堟湰鍙�
+// 淇鍙�
+//
+// 鍙互鎸囧畾鎵�鏈夎繖浜涘�硷紝涔熷彲浠ヤ娇鐢ㄢ�滃唴閮ㄧ増鏈彿鈥濆拰鈥滀慨璁㈠彿鈥濈殑榛樿鍊硷紝
+// 鏂规硶鏄寜濡備笅鎵�绀轰娇鐢ㄢ��*鈥�:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/EventTool/Properties/Resources.Designer.cs b/EventTool/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..7b61084
--- /dev/null
+++ b/EventTool/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+锘�//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.17929
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace EventTool.Properties {
+ using System;
+
+
+ /// <summary>
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ /// </summary>
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ /// <summary>
+ /// Returns the cached ResourceManager instance used by this class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EventTool.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/EventTool/Properties/Resources.resx b/EventTool/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/EventTool/Properties/Resources.resx
@@ -0,0 +1,117 @@
+锘�<?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.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: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" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ </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" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ </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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
\ No newline at end of file
diff --git a/EventTool/Properties/Settings.Designer.cs b/EventTool/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..74803eb
--- /dev/null
+++ b/EventTool/Properties/Settings.Designer.cs
@@ -0,0 +1,26 @@
+锘�//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.17929
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace EventTool.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/EventTool/Properties/Settings.settings b/EventTool/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/EventTool/Properties/Settings.settings
@@ -0,0 +1,7 @@
+锘�<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+ <Profiles>
+ <Profile Name="(Default)" />
+ </Profiles>
+ <Settings />
+</SettingsFile>
diff --git a/FileToolkit/FileOperationResult.cs b/FileToolkit/FileOperationResult.cs
new file mode 100644
index 0000000..a2f8fcf
--- /dev/null
+++ b/FileToolkit/FileOperationResult.cs
@@ -0,0 +1,10 @@
+锘縩amespace ToolKit.FileToolkit
+{
+ public enum FileOperationResult
+ {
+ OK,
+ NOTEXIST,
+ WRITEERROR
+ }
+}
+
diff --git a/FileToolkit/FileToolkit.csproj b/FileToolkit/FileToolkit.csproj
new file mode 100644
index 0000000..c803437
--- /dev/null
+++ b/FileToolkit/FileToolkit.csproj
@@ -0,0 +1,84 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>9.0.21022</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{EC3A7C8F-C3FB-461C-9AF1-2456E1CBEC46}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>FileToolkit</RootNamespace>
+ <AssemblyName>FileToolkit</AssemblyName>
+ <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <StartupObject>
+ </StartupObject>
+ <FileUpgradeFlags>
+ </FileUpgradeFlags>
+ <UpgradeBackupLocation>
+ </UpgradeBackupLocation>
+ <OldToolsVersion>3.5</OldToolsVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Deployment" />
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Runtime.Serialization.Formatters.Soap" />
+ <Reference Include="System.Windows.Forms" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="FileOperationResult.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Resources.resx</DependentUpon>
+ <DesignTime>True</DesignTime>
+ </Compile>
+ <None Include="Properties\Settings.settings">
+ <Generator>SettingsSingleFileGenerator</Generator>
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+ </None>
+ <Compile Include="Properties\Settings.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Settings.settings</DependentUpon>
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
+ </Compile>
+ <Compile Include="SerializeFileTool.cs" />
+ <Compile Include="SerializeTool.cs" />
+ <Compile Include="StarterTool.cs" />
+ <Compile Include="Win32API.cs" />
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project>
\ No newline at end of file
diff --git a/FileToolkit/Properties/AssemblyInfo.cs b/FileToolkit/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..a5f7c70
--- /dev/null
+++ b/FileToolkit/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+锘縰sing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 鏈夊叧绋嬪簭闆嗙殑甯歌淇℃伅閫氳繃涓嬪垪灞炴�ч泦
+// 鎺у埗銆傛洿鏀硅繖浜涘睘鎬у�煎彲淇敼
+// 涓庣▼搴忛泦鍏宠仈鐨勪俊鎭��
+[assembly: AssemblyTitle("FileToolkit")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("BroConcentric")]
+[assembly: AssemblyProduct("FileToolkit")]
+[assembly: AssemblyCopyright("Copyright 漏 BroConcentric2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 灏� ComVisible 璁剧疆涓� false 浣挎绋嬪簭闆嗕腑鐨勭被鍨�
+// 瀵� COM 缁勪欢涓嶅彲瑙併�傚鏋滈渶瑕佷粠 COM 璁块棶姝ょ▼搴忛泦涓殑绫诲瀷锛�
+// 鍒欏皢璇ョ被鍨嬩笂鐨� ComVisible 灞炴�ц缃负 true銆�
+[assembly: ComVisible(false)]
+
+// 濡傛灉姝ら」鐩悜 COM 鍏紑锛屽垯涓嬪垪 GUID 鐢ㄤ簬绫诲瀷搴撶殑 ID
+[assembly: Guid("6d8fbddf-137a-42b0-9573-3f346f1380dc")]
+
+// 绋嬪簭闆嗙殑鐗堟湰淇℃伅鐢变笅闈㈠洓涓�肩粍鎴�:
+//
+// 涓荤増鏈�
+// 娆$増鏈�
+// 鍐呴儴鐗堟湰鍙�
+// 淇鍙�
+//
+// 鍙互鎸囧畾鎵�鏈夎繖浜涘�硷紝涔熷彲浠ヤ娇鐢ㄢ�滃唴閮ㄧ増鏈彿鈥濆拰鈥滀慨璁㈠彿鈥濈殑榛樿鍊硷紝
+// 鏂规硶鏄寜濡備笅鎵�绀轰娇鐢ㄢ��*鈥�:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.1")]
+[assembly: AssemblyFileVersion("1.0.0.1")]
diff --git a/FileToolkit/Properties/Resources.Designer.cs b/FileToolkit/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..a56aec9
--- /dev/null
+++ b/FileToolkit/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+锘�//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.17929
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace FileToolkit.Properties {
+ using System;
+
+
+ /// <summary>
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ /// </summary>
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ /// <summary>
+ /// Returns the cached ResourceManager instance used by this class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FileToolkit.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/FileToolkit/Properties/Resources.resx b/FileToolkit/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/FileToolkit/Properties/Resources.resx
@@ -0,0 +1,117 @@
+锘�<?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.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: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" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ </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" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ </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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
\ No newline at end of file
diff --git a/FileToolkit/Properties/Settings.Designer.cs b/FileToolkit/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..db12d5f
--- /dev/null
+++ b/FileToolkit/Properties/Settings.Designer.cs
@@ -0,0 +1,26 @@
+锘�//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.17929
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace FileToolkit.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/FileToolkit/Properties/Settings.settings b/FileToolkit/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/FileToolkit/Properties/Settings.settings
@@ -0,0 +1,7 @@
+锘�<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+ <Profiles>
+ <Profile Name="(Default)" />
+ </Profiles>
+ <Settings />
+</SettingsFile>
diff --git a/FileToolkit/SerializeFileTool.cs b/FileToolkit/SerializeFileTool.cs
new file mode 100644
index 0000000..28df99b
--- /dev/null
+++ b/FileToolkit/SerializeFileTool.cs
@@ -0,0 +1,70 @@
+锘縰sing System;
+using System.IO;
+using System.Text;
+
+namespace ToolKit.FileToolkit
+{
+ public class SerializeFileTool<T>
+ {
+ public T GetConfig(string fileName)
+ {
+ T local = default(T);
+ byte[] bStr = null;
+ if (this.ReadBytes(fileName, out bStr) == FileOperationResult.OK)
+ {
+ local = SerializeTool<T>.XmlSerializerDeserialize(bStr);
+ }
+ return local;
+ }
+
+ private FileOperationResult ReadBytes(string path, out byte[] bStr)
+ {
+ bStr = null;
+ if (!File.Exists(path))
+ {
+ return FileOperationResult.NOTEXIST;
+ }
+ try
+ {
+ using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite))
+ {
+ bStr = new byte[stream.Length];
+ stream.Read(bStr, 0, bStr.Length);
+ }
+ }
+ catch
+ {
+ return FileOperationResult.WRITEERROR;
+ }
+ return FileOperationResult.OK;
+ }
+
+ public void SetConfig(string fileName, T config)
+ {
+ this.WriteBytes(fileName, FileMode.Create, SerializeTool<T>.XmlSerializerSerialize(config));
+ }
+
+ private FileOperationResult WriteBytes(string path, FileMode filemode, byte[] bStr)
+ {
+ try
+ {
+ using (FileStream stream = new FileStream(path, filemode, FileAccess.ReadWrite))
+ {
+ stream.Write(bStr, 0, bStr.Length);
+ }
+ }
+ catch (Exception)
+ {
+ return FileOperationResult.WRITEERROR;
+ }
+ return FileOperationResult.OK;
+ }
+
+ private FileOperationResult WriteString(string path, FileMode filemode, string str)
+ {
+ byte[] bytes = Encoding.Default.GetBytes(str);
+ return this.WriteBytes(path, filemode, bytes);
+ }
+ }
+}
+
diff --git a/FileToolkit/SerializeTool.cs b/FileToolkit/SerializeTool.cs
new file mode 100644
index 0000000..27ccf10
--- /dev/null
+++ b/FileToolkit/SerializeTool.cs
@@ -0,0 +1,46 @@
+锘縰sing System.IO;
+using System.Runtime.Serialization.Formatters.Soap;
+using System.Xml.Serialization;
+
+namespace ToolKit.FileToolkit
+{
+ public class SerializeTool<T>
+ {
+ public static T SoapFormatterDeserialize(byte[] data)
+ {
+ using (MemoryStream stream = new MemoryStream(data))
+ {
+ SoapFormatter formatter = new SoapFormatter();
+ return (T) formatter.Deserialize(stream);
+ }
+ }
+
+ public static byte[] SoapFormatterSerialize(T obj)
+ {
+ using (MemoryStream stream = new MemoryStream())
+ {
+ new SoapFormatter().Serialize(stream, obj);
+ return stream.ToArray();
+ }
+ }
+
+ public static T XmlSerializerDeserialize(byte[] data)
+ {
+ using (MemoryStream stream = new MemoryStream(data))
+ {
+ XmlSerializer serializer = new XmlSerializer(typeof(T));
+ return (T) serializer.Deserialize(stream);
+ }
+ }
+
+ public static byte[] XmlSerializerSerialize(T obj)
+ {
+ using (MemoryStream stream = new MemoryStream())
+ {
+ new XmlSerializer(typeof(T)).Serialize((Stream) stream, obj);
+ return stream.ToArray();
+ }
+ }
+ }
+}
+
diff --git a/FileToolkit/StarterTool.cs b/FileToolkit/StarterTool.cs
new file mode 100644
index 0000000..392d70b
--- /dev/null
+++ b/FileToolkit/StarterTool.cs
@@ -0,0 +1,76 @@
+锘縰sing System.Diagnostics;
+using System.Threading;
+
+namespace ToolKit
+{
+ public class StarterTool
+ {
+ public static bool IsExistMutex(string mutexName, out Mutex mutex)
+ {
+ bool flag;
+ mutex = new Mutex(true, mutexName, out flag);
+ return !flag;
+ }
+
+ public static bool IsSingle()
+ {
+ return (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length <= 1);
+ }
+
+ public static void PowerWait(string[] args)
+ {
+ if ((((args != null) && (args.Length > 1)) && args[0].ToUpper().Equals("-S")) && (args[1] != null))
+ {
+ int result = 0;
+ if (int.TryParse(args[1], out result) && (result > 0))
+ {
+ Thread.Sleep((int) (result * 0x3e8));
+ }
+ }
+ }
+
+ //private void Form1_Load(object sender, EventArgs e)
+ //{
+
+ // string appPath = @"C:\Program Files\KEPServerEx\servermain.exe E:\MacBookTest_F2\Kep_F2.opf";
+ // int sleepTime = 200;
+ // bool isVisible = false;
+
+ // KillApp(appPath);
+ // ShowWindow(appPath, sleepTime, isVisible);
+ //}
+
+ public static void ShowWindow(string appPathNargs, int sleepTime, bool isVisible)
+ {
+ int exeStart = appPathNargs.IndexOf(".exe", 0);
+ string appPath = appPathNargs.Substring(0, exeStart + 4);
+ string args = appPathNargs.Substring(exeStart + 5);
+
+ System.Diagnostics.Process p = System.Diagnostics.Process.Start(appPath, args);
+
+ System.Threading.Thread.Sleep(sleepTime);
+ string name = p.MainWindowTitle;
+
+ System.IntPtr ptr = HideIcon.Win32API.FindWindow(null, name);
+ HideIcon.Win32API.ShowWindow(ptr, System.Convert.ToInt32(isVisible));
+ }
+
+ public static void KillApp(string appPath)
+ {
+ int exeStart = appPath.IndexOf(".exe", 0);
+
+ string[] appNames = appPath.Substring(0, exeStart).Split('\\');
+ string appName = appNames[appNames.Length - 1];
+
+ System.Diagnostics.Process[] pList = System.Diagnostics.Process.GetProcesses();
+ foreach (System.Diagnostics.Process item in pList)
+ {
+ if (item.ProcessName.ToUpper().Equals(appName.ToUpper()))
+ {
+ item.Kill();
+ }
+ }
+ }
+ }
+}
+
diff --git a/FileToolkit/Win32API.cs b/FileToolkit/Win32API.cs
new file mode 100644
index 0000000..21c430e
--- /dev/null
+++ b/FileToolkit/Win32API.cs
@@ -0,0 +1,132 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+
+/********************************************************************************
+* 璧勬枡鏀堕泦:Jonny Sun ,www.csframework.com
+* ******************************************************************************/
+
+namespace HideIcon
+{
+ /// <summary>
+ /// 鎿嶄綔Windows绐椾綋,绯荤粺鎵樼洏鎵�鐢ㄧ殑API鍑芥暟
+ /// </summary>
+ public class Win32API
+ {
+ public const int WM_USER = 0x400;
+ public const int WM_CLOSE = 0x10;
+ public const int WM_GETTEXT = 0x000D;
+ public const int WM_SETTEXT = 0x000C;
+
+ public const int STANDARD_RIGHTS_REQUIRED = 0xF0000;
+ public const int SYNCHRONIZE = 0x100000;
+ public const int PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF;
+ public const int PROCESS_TERMINATE = 0x1;
+
+ public const int PROCESS_VM_OPERATION = 0x8;
+ public const int PROCESS_VM_READ = 0x10;
+ public const int PROCESS_VM_WRITE = 0x20;
+
+ public const int MEM_RESERVE = 0x2000;
+ public const int MEM_COMMIT = 0x1000;
+ public const int MEM_RELEASE = 0x8000;
+
+ public const int PAGE_READWRITE = 0x4;
+
+ public const int TB_BUTTONCOUNT = (WM_USER + 24);
+ public const int TB_HIDEBUTTON = (WM_USER + 4);
+ public const int TB_GETBUTTON = (WM_USER + 23);
+ public const int TB_GETBUTTONTEXT = WM_USER + 75;
+ public const int TB_GETBITMAP = (WM_USER + 44);
+ public const int TB_DELETEBUTTON = (WM_USER + 22);
+ public const int TB_ADDBUTTONS = (WM_USER + 20);
+ public const int TB_INSERTBUTTON = (WM_USER + 21);
+ public const int TB_ISBUTTONHIDDEN = (WM_USER + 12);
+ public const int ILD_NORMAL = 0x0;
+ public const int TPM_NONOTIFY = 0x80;
+
+ public const int WS_VISIBLE = 268435456;//绐椾綋鍙
+ public const int WS_MINIMIZEBOX = 131072;//鏈夋渶灏忓寲鎸夐挳
+ public const int WS_MAXIMIZEBOX = 65536;//鏈夋渶澶у寲鎸夐挳
+ public const int WS_BORDER = 8388608;//绐椾綋鏈夎竟妗�
+ public const int GWL_STYLE = (-16);//绐椾綋鏍峰紡
+ public const int GW_HWNDFIRST = 0;
+ public const int GW_HWNDNEXT = 2;
+ public const int SW_HIDE = 0;
+ public const int SW_SHOW = 5;
+
+ [DllImport("User32.Dll")]
+ public static extern void GetClassName(IntPtr hwnd, StringBuilder s, int nMaxCount);
+
+ [DllImport("user32.dll", EntryPoint = "SetForegroundWindow", SetLastError = true)]
+ public static extern void SetForegroundWindow(IntPtr hwnd);
+
+ [DllImport("user32.dll", EntryPoint = "GetDlgItem", SetLastError = true)]
+ public static extern IntPtr GetDlgItem(int nID, IntPtr phWnd);
+
+ [DllImport("user32.dll", CharSet = CharSet.Auto)]
+ public static extern int RegisterWindowMessage(string msg);
+
+ [DllImport("kernel32", EntryPoint = "OpenProcess")]
+ public static extern IntPtr OpenProcess(int dwDesiredAccess, IntPtr bInheritHandle, IntPtr dwProcessId);
+
+ [DllImport("kernel32", EntryPoint = "CloseHandle")]
+ public static extern int CloseHandle(IntPtr hObject);
+
+ [DllImport("user32", EntryPoint = "GetWindowThreadProcessId")]
+ public static extern IntPtr GetWindowThreadProcessId(IntPtr hwnd, ref IntPtr lpdwProcessId);
+
+ [DllImport("user32.dll")]
+ public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
+
+ [DllImport("user32", EntryPoint = "SendMessage")]
+ public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
+
+ [DllImport("user32", EntryPoint = "SendMessage")]
+ public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, IntPtr lParam);
+
+ [DllImport("kernel32", EntryPoint = "ReadProcessMemory")]
+ public static extern int ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, ref IntPtr lpBuffer, int nSize, int lpNumberOfBytesWritten);
+
+ [DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")]
+ public static extern bool ReadProcessMemoryEx(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, int nSize, ref uint vNumberOfBytesRead);
+
+ [DllImport("kernel32", EntryPoint = "ReadProcessMemory")]
+ public static extern int ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, int nSize, int lpNumberOfBytesWritten);
+
+ [DllImport("kernel32", EntryPoint = "WriteProcessMemory")]
+ public static extern int WriteProcessMemory(IntPtr hProcess, ref int lpBaseAddress, ref int lpBuffer, int nSize, ref int lpNumberOfBytesWritten);
+
+ [DllImport("kernel32", EntryPoint = "VirtualAllocEx")]
+ public static extern IntPtr VirtualAllocEx(IntPtr hProcess, int lpAddress, int dwSize, int flAllocationType, int flProtect);
+
+ [DllImport("kernel32", EntryPoint = "VirtualFreeEx")]
+ public static extern int VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress, int dwSize, int dwFreeType);
+
+ [DllImport("User32.dll")]
+ public extern static int GetWindow(int hWnd, int wCmd);
+
+ [DllImport("User32.dll")]
+ public extern static int GetWindowLongA(int hWnd, int wIndx);
+
+ [DllImport("user32.dll")]
+ public static extern bool GetWindowText(int hWnd, StringBuilder title, int maxBufSize);
+
+ [DllImport("user32.dll", CharSet = CharSet.Auto)]
+ public extern static int GetWindowTextLength(IntPtr hWnd);
+
+ [DllImport("User32.dll", EntryPoint = "FindWindow")]
+ public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
+
+ [DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true)]
+ public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
+
+ [DllImport("user32.dll", EntryPoint = "ShowWindow", SetLastError = true)]
+ public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
+
+ [DllImport("user32.dll", EntryPoint = "SendMessageA")]
+ public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
+
+ }
+}
diff --git a/HalconTools/CalibrationModule/CalibImage.cs b/HalconTools/CalibrationModule/CalibImage.cs
new file mode 100644
index 0000000..300d0a6
--- /dev/null
+++ b/HalconTools/CalibrationModule/CalibImage.cs
@@ -0,0 +1,285 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public class CalibImage
+ {
+ /// <summary>
+ /// Reference to the controller class that performs all
+ /// calibration operations and interacts with the GUI.
+ /// </summary>
+ private CalibrationAssistant mAssistant;
+ /// <summary>Calibration image</summary>
+ private HImage mImage;
+ /// <summary>
+ /// Width of calibration image
+ /// </summary>
+ public int mWidth;
+ /// <summary>
+ /// Height of calibration image
+ /// </summary>
+ public int mHeight;
+
+
+ /// <summary>
+ /// Tuple with row coordinates of the detected marks
+ /// </summary>
+ private HTuple mMarkCenterRows;
+ /// <summary>
+ /// Tuple with column coordinates of the detected marks
+ /// </summary>
+ private HTuple mMarkCenterCols;
+
+ private HTuple mWorldX;
+ private HTuple mWorldY;
+
+ /// <summary>
+ /// Estimation for the external camera parameters (position and
+ /// orientation)
+ /// </summary>
+ private HPose mEstimatedPose;
+
+
+ /// <summary>
+ /// HALCON error message that occurs when calculating the
+ /// basic information for the calibration image
+ /// (plate region, marks and pose).
+ /// </summary>
+ public string mErrorMessage;
+ /// <summary>
+ /// Flag that describes the degree of success or failure
+ /// after an update of the basic information.
+ /// </summary>
+ public string mPlateStatus;
+ /// <summary>
+ /// Flag that permits or forbids this calibration image
+ /// to be part of the calibration process
+ /// </summary>
+ public int mCanCalib; // true = 0 || false = 1
+
+
+ /// <summary>
+ /// Region of the plane calibration plate in the calibration image
+ /// </summary>
+ private HRegion mCaltabRegion;
+ /// <summary>
+ /// XLD contour points of the marks detected in
+ /// the calibration image, generated from the row and
+ /// column values <c>mMarkCenterRows</c> and
+ /// <c>mMarkCenterCols</c>
+ /// </summary>
+ private HXLDCont mMarkCenter;
+ /// <summary>
+ /// Estimated world coordinate system (pose of the calibration plate
+ /// in camera coordinates), based on the
+ /// <c>mEstimatedPose</c> and the camera parameters
+ /// for this calibration image
+ /// </summary>
+ private HObject mEstimatedWCS;
+
+ private double mEstimatedPlateSize;
+
+ // for quality measurement
+ private ArrayList mQualityIssuesList;
+
+ /// <summary>
+ /// Initializes all status flags and objects to set up
+ /// this image for the calibration process
+ /// </summary>
+ /// <param name="img">Calibration image</param>
+ /// <param name="assist">Reference to the Calibration Assistant</param>
+ public CalibImage(HImage img, CalibrationAssistant assist)
+ {
+ string tmp;
+ mImage = img;
+
+ mAssistant = assist;
+ mCanCalib = 1; //labeled as 'for not having been evaluated'
+ mPlateStatus = CalibrationAssistant.PS_NOT_FOUND;// "No Plate found" yet
+ mImage.GetImagePointer1(out tmp, out mWidth, out mHeight);
+ mEstimatedPlateSize = 0;
+ mErrorMessage = "";
+
+ // initialize all instances
+ mCaltabRegion = new HRegion();
+ mMarkCenter = new HXLDCont();
+ mEstimatedWCS = new HObject();
+ mQualityIssuesList = new ArrayList(15);
+
+ mMarkCenterRows = new HTuple();
+ mMarkCenterCols = new HTuple();
+ mEstimatedPose = new HPose();
+ }
+
+
+ /************** getter-methods *************/
+ /********************************************/
+ public HImage getImage()
+ {
+ return mImage;
+ }
+
+ public HTuple getMarkCenterRows()
+ {
+ return mMarkCenterRows;
+ }
+ public HTuple getMarkCenterColumns()
+ {
+ return mMarkCenterCols;
+ }
+ public HTuple getWorldX()
+ {
+ return mWorldX;
+ }
+ public HTuple getWorldY()
+ {
+ return mWorldY;
+ }
+ public HXLDCont getMarkCenters()
+ {
+ return mMarkCenter;
+ }
+ public HTuple getEstimatedPose()
+ {
+ return mEstimatedPose;
+ }
+ public HObject getEstimatedWCS()
+ {
+ return mEstimatedWCS;
+ }
+ public double getEstimatedPlateSize()
+ {
+ return mEstimatedPlateSize;
+ }
+ public HObject getCaltabRegion()
+ {
+ return mCaltabRegion;
+ }
+ public ArrayList getQualityIssueList()
+ {
+ return mQualityIssuesList;
+ }
+ public string getPlateStatus()
+ {
+ return mPlateStatus;
+ }
+
+
+
+ /// <summary>
+ /// Determine s(or updates) the basic information for this
+ /// calibration image, which are the values for the region
+ /// plate, the center marks, and the estimated pose.
+ /// The flag <c>mPlateStatus</c> describes the evaluation
+ /// of the computation process.
+ /// If desired the quality assessment can be recalculated
+ /// as well.
+ /// </summary>
+ /// <param name="updateQuality">
+ /// Triggers the recalculation of the quality assessment for
+ /// this calibration image
+ /// </param>
+ public void UpdateCaltab(bool updateQuality)
+ {
+ HTuple unit = new HTuple("mm");
+
+ bool failed = false;
+ QualityProcedures proc = new QualityProcedures();
+ string descrFile;
+ HTuple startCamp;
+ mErrorMessage = "";
+
+
+ mCaltabRegion.Dispose();
+ mMarkCenter.Dispose();
+ mEstimatedWCS.Dispose();
+
+ //reset this variable
+ mMarkCenterRows = new HTuple();
+
+ mPlateStatus = CalibrationAssistant.PS_NOT_FOUND;
+
+ descrFile = mAssistant.getDesrcFile();
+
+ try
+ {
+ mCaltabRegion = mImage.FindCaltab(descrFile,
+ (int)mAssistant.mFilterSize,
+ (int)mAssistant.mMarkThresh,
+ (int)mAssistant.mMinMarkDiam);
+
+ mPlateStatus = CalibrationAssistant.PS_MARKS_FAILED;
+
+ //-- Quality issue measurements --
+ if (updateQuality)
+ {
+ mQualityIssuesList.Clear();
+ failed = mAssistant.testQualityIssues(this);
+ }
+
+ startCamp = mAssistant.getCameraParams(this);
+ mMarkCenterRows = mImage.FindMarksAndPose(mCaltabRegion,
+ descrFile,
+ startCamp,
+ (int)mAssistant.mInitThresh,
+ (int)mAssistant.mThreshDecr,
+ (int)mAssistant.mMinThresh,
+ mAssistant.mSmoothing,
+ mAssistant.mMinContLength,
+ mAssistant.mMaxMarkDiam,
+ out mMarkCenterCols,
+ out mEstimatedPose);
+
+
+ mMarkCenter.GenCrossContourXld(mMarkCenterRows,
+ mMarkCenterCols,
+ new HTuple(6.0),
+ 0.785398);
+
+ if (failed)
+ mAssistant.addQualityIssue(this, CalibrationAssistant.QUALITY_ISSUE_FAILURE, 0.0);
+
+
+ HOperatorSet.ImagePointsToWorldPlane(startCamp, mEstimatedPose,
+ mMarkCenterRows, mMarkCenterCols,
+ unit, out mWorldX, out mWorldY);
+ mEstimatedPlateSize = HMisc.DistancePp(mWorldY[0].D, mWorldX[0].D,
+ mWorldY[1].D, mWorldX[1].D);
+ mEstimatedPlateSize *= 10.0;
+ proc.get_3d_coord_system(mImage, out mEstimatedWCS,
+ startCamp, mEstimatedPose,
+ new HTuple(mEstimatedPlateSize / 2.0));
+
+ mPlateStatus = mQualityIssuesList.Count > 0 ? CalibrationAssistant.PS_QUALITY_ISSUES : CalibrationAssistant.PS_OK; // "Quality Issues found": "OK";
+ mCanCalib = 0;
+ }
+ catch (HOperatorException e)
+ {
+ this.mErrorMessage = e.Message;
+ mCanCalib = 1;
+
+ /* if exception was raised due to lack of memory,
+ * forward the error to the calling method */
+ if (e.Message.IndexOf("not enough") != -1)
+ throw (e);
+ }
+ }
+
+
+ /// <summary>
+ /// Releases the memory for all iconic HALCON objects contained in
+ /// this instance.
+ /// </summary>
+ public void Clear()
+ {
+ mImage.Dispose();
+ mCaltabRegion.Dispose();
+ }
+
+ }
+}
diff --git a/HalconTools/CalibrationModule/CalibrationAssistant.cs b/HalconTools/CalibrationModule/CalibrationAssistant.cs
new file mode 100644
index 0000000..7b136ac
--- /dev/null
+++ b/HalconTools/CalibrationModule/CalibrationAssistant.cs
@@ -0,0 +1,1751 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public delegate void CalibDelegate(int value);
+
+ public class CalibrationAssistant
+ {
+ /// <summary>
+ /// Constant indicating the camera model to be of type
+ /// line scan camera.
+ /// </summary>
+ public const int CAMERA_TYP_LINE_SCAN = 3;
+ /// <summary>
+ /// Constant indicating the camera model to be of type
+ /// area scan camera with the division
+ /// model to describe the lens distortions
+ /// </summary>
+ public const int CAMERA_TYP_AREA_SCAN_DIV = 4;
+ /// <summary>
+ /// Constant indicating the camera model to be of type
+ /// area scan camera with the polynomial
+ /// model to describe the lens distortions
+ /// </summary>
+ public const int CAMERA_TYP_AREA_SCAN_POLY = 5;
+
+ /// <summary>
+ /// Constant indicating a change in the set of
+ /// <c>CalibImage</c> instances regarding the parameters
+ /// marks and poses.
+ /// </summary>
+ public const int UPDATE_MARKS_POSE = 10;
+ /// <summary>
+ /// Constant indicating a change in the set of
+ /// <c>CalibImage</c> instances regarding the
+ /// quality assessment.
+ /// </summary>
+ public const int UPDATE_QUALITY_TABLE = 12;
+ /// <summary>
+ /// Constant indicating a change in the evaluation grades
+ /// of the <c>CalibImage</c> set. The grades measure the results
+ /// of the calibration preparations prior to the calibration
+ /// process itself.
+ /// </summary>
+ public const int UPDATE_CALTAB_STATUS = 13;
+ /// <summary>
+ /// Constant indicating an update of the calibration
+ /// results.
+ /// </summary>
+ public const int UPDATE_CALIBRATION_RESULTS = 14;
+
+ /// <summary>
+ /// Constant indicating that the quality measurement
+ /// includes all quality assessment operators for
+ /// evaluating the set of calibration images.
+ /// </summary>
+ public const int QUALITY_ISSUE_TEST_ALL = 0;
+ /// <summary>
+ /// Constant indicating that the quality measurement uses only the
+ /// basic quality assessment operators for speedup purposes.
+ /// </summary>
+ public const int QUALITY_ISSUE_TEST_QUICK = 1;
+ /// <summary>
+ /// Constant indicating no quality measurement
+ /// for the set of calibration images.
+ /// </summary>
+ public const int QUALITY_ISSUE_TEST_NONE = 2;
+
+ /// <summary>
+ /// Constant indicating the image quality feature 'exposure'
+ /// </summary>
+ public const int QUALITY_ISSUE_IMG_EXPOSURE = 20;
+ /// <summary>
+ /// Constant indicating the image quality feature 'homogeneity'
+ /// </summary>
+ public const int QUALITY_ISSUE_IMG_HOMOGENEITY = 21;
+ /// <summary>
+ /// Constant indicating the image quality feature 'contrast'
+ /// </summary>
+ public const int QUALITY_ISSUE_IMG_CONTRAST = 22;
+ /// <summary>
+ /// Constant indicating the image quality feature 'sharpness'
+ /// </summary>
+ public const int QUALITY_ISSUE_IMG_FOCUS = 23;
+ /// <summary>
+ /// Constant indicating the size of the depicted
+ /// calibration plate in the calibration image, to evaluate
+ /// the distance used to the camera
+ /// </summary>
+ public const int QUALITY_ISSUE_IMG_CALTAB_SIZE = 24;
+
+ /// <summary>
+ /// Constant indicating the coverage of the view field.
+ /// This is assured only by a sufficient number of
+ /// calibration images and its correct distribution in the space.
+ /// </summary>
+ public const int QUALITY_ISSUE_SEQ_MARKS_DISTR = 25;
+ /// <summary>
+ /// Constant indicating the amount of distortions covered,
+ /// described by the set of images showing tilted calibration
+ /// plates
+ /// </summary>
+ public const int QUALITY_ISSUE_SEQ_CALTAB_TILT = 26;
+ /// <summary>
+ /// Constant indicating whether the number of provided calibration
+ /// images is sufficient enough to obtain stable calibration results.
+ /// </summary>
+ public const int QUALITY_ISSUE_SEQ_NUMBER = 27;
+ /// <summary>
+ /// Constant indicating the all over quality performance,
+ /// being best for a value close or equal to 1
+ /// </summary>
+ public const int QUALITY_ISSUE_SEQ_ALL_OVER = 28;
+ /// <summary>
+ /// Constant that indicates an error in the calibration
+ /// preprocessing step, which has to perform well for the
+ /// whole sequence of calibration images in order to start
+ /// the calibration process.
+ /// </summary>
+ public const int QUALITY_ISSUE_SEQ_ERROR = 29;
+ /// <summary>
+ /// Constant indicating an error in the preprocessing step
+ /// for a single calibration image, i.e., that the
+ /// marks and pose values might be missing or the region
+ /// plate couldn't be detected
+ /// </summary>
+ public const int QUALITY_ISSUE_FAILURE = 30;
+
+ /// <summary>
+ /// Constant describing an error while reading a
+ /// calibration image from file
+ /// </summary>
+ public const int ERR_READING_FILE = 31;
+ /// <summary>
+ /// Constant describing an error exception raised during
+ /// the calibration process
+ /// </summary>
+ public const int ERR_IN_CALIBRATION = 32;
+ /// <summary>
+ /// Constant indicating an invalid reference index. The
+ /// index is needed to define the reference image for
+ /// the camera calibration.
+ /// </summary>
+ public const int ERR_REFINDEX_INVALID = 33;
+ /// <summary>
+ /// Constant describing an error exception raised
+ /// during quality assessment.
+ /// </summary>
+ public const int ERR_QUALITY_ISSUES = 34;
+ /// <summary>
+ /// Constant describing an error that occurred while
+ /// writing the calibration parameters into file
+ /// </summary>
+ public const int ERR_WRITE_CALIB_RESULTS = 35;
+
+
+ /// <summary>
+ /// Constant indicating the result status of the
+ /// calibration preparation step:
+ /// Plate region couldn't be detected in the
+ /// calibration image.
+ /// </summary>
+ public const string PS_NOT_FOUND = "Plate not found";
+ /// <summary>
+ /// Constant that describes the results of the
+ /// calibration preparation step:
+ /// Plate region was detected, but the marks could not
+ /// be extracted in the plate region.
+ /// </summary>
+ public const string PS_MARKS_FAILED = "Marks not found";
+ /// <summary>
+ /// Constant indicating the result status of the
+ /// calibration preparation step:
+ /// Plate region and marks were detected,
+ /// but the quality assessment delivered bad scores.
+ /// </summary>
+ public const string PS_QUALITY_ISSUES = "Quality issues detected";
+ /// <summary>
+ /// Constant indicating the result status of the
+ /// calibration preparation step:
+ /// The preprocessing step was successful.
+ /// </summary>
+ public const string PS_OK = "Ok";
+
+ /// <summary>
+ /// List of calibration images that are used
+ /// to perform the camera calibration.
+ /// </summary>
+ private ArrayList CalibData;
+ /// <summary>
+ /// Index to the reference image that is used to
+ /// determine the initial values for the internal camera
+ /// parameters for the camera calibration
+ /// </summary>
+ public int mReferenceIndex;
+
+ private QualityProcedures procedure;
+
+
+ // CALIBRATION RESULTS -----------------------------------------
+ /// <summary>
+ /// Flag indicating that the calibration was successful and
+ /// the present calibration results are up to date
+ /// </summary>
+ public bool mCalibValid;
+ /// <summary>
+ /// The average error give an impression of the accuracy of the
+ /// calibration. The error (deviations in x and y coordinates) are
+ /// measured in pixels
+ /// </summary>
+ public double mErrorMean;
+
+ /// <summary>
+ /// Ordered tuple with the external camera parameters for all
+ /// calibration images, i.e., the position and orientation of the
+ /// calibration plate in camera coordinates.
+ /// </summary>
+ public HTuple mPoses;
+ /// <summary>
+ /// Internal camera parameters
+ /// </summary>
+ public HTuple mCameraParams;
+ /// <summary>
+ /// Error contents that caused an exception
+ /// </summary>
+ public string mErrorMessage;
+
+ /// <summary>
+ /// Calibration image at index <c>mReferenceIndex</c>
+ /// </summary>
+ public HImage mReferenceImage;
+ /// <summary>
+ /// Synthetic calibration images with calibrated camera
+ /// parameters to test the quality of the calibration
+ /// algorithm
+ /// </summary>
+ public HImage mSimulatedImage;
+ /// <summary>
+ /// Reference world coordinate system, based on
+ /// <c>mPose</c> and the calibrated camera parameters
+ /// </summary>
+ public HObject mReferenceWCS;
+
+ /// <summary>
+ /// Flag describing whether all calibration images
+ /// have a sufficient quality, i.e. whether the region plate and
+ /// marks have been detected in all calibration images,
+ /// so that a camera calibration can be invoked
+ /// </summary>
+ public bool mCanCalib;
+ /// <summary>
+ /// Flag indicating that the origin of the reference world coordinate
+ /// system <c>mReferenceWCS</c> is mapped to the origin of the image
+ /// coordinate system.
+ /// </summary>
+ public bool mAtImgCoord;
+
+
+ // FIRST TAB -----------------------------------------------
+ /// <summary>
+ /// Name of the calibration plate description file to read
+ /// the mark center points from
+ /// </summary>
+ public string mDescrFileName;
+ /// <summary>
+ /// Thickness of the calibration plate that was used in the
+ /// calibration images
+ /// </summary>
+ public double mThickness;
+ /// <summary>
+ /// Camera type, which can either be an area scan camera
+ /// (using the division or polynomial model) or a linescan camera
+ /// </summary>
+ public int mCameraType;
+ /// <summary>
+ /// Horizontal distance between two neighboring CCD
+ /// sensor cells
+ /// </summary>
+ public double mCellWidth; // Sx
+ /// <summary>
+ /// Vertical distance between two neighboring CCD
+ /// sensor cells
+ /// </summary>
+ public double mCellHeight; // Sy
+ /// <summary>
+ /// Nominal focal length of the camera lense
+ /// </summary>
+ public double mFocalLength;
+ /// <summary>
+ /// Parameter to model the radial distortion described by
+ /// the division model
+ /// </summary>
+ public double mKappa;
+ /// <summary>
+ /// First parameter to model the radial distortion described by
+ /// the polynomial model
+ /// </summary>
+ public double mK1;
+ /// <summary>
+ /// Second parameter to model the radial distortion described by
+ /// the polynomial model
+ /// </summary>
+ public double mK2;
+ /// <summary>
+ /// Third parameter to model the radial distortion described by
+ /// the polynomial model
+ /// </summary>
+ public double mK3;
+ /// <summary>
+ /// First parameter to model the decentering distortion described by
+ /// the polynomial model
+ /// </summary>
+ public double mP1;
+ /// <summary>
+ /// Second parameter to model the decentering distortion described by
+ /// the polynomial model
+ /// </summary>
+ public double mP2;
+ /// <summary>
+ /// Flag indicating the type of camera lense used:
+ /// telecentric, which means a parallel projection with the focal
+ /// length equal to 0, or a perspective projection
+ /// </summary>
+ public bool isTelecentric;
+
+ /// <summary>
+ /// X component of the motion vector, which describes the motion
+ /// between the linescan camera and the object.
+ /// </summary>
+ public double mMotionVx;
+ /// <summary>
+ /// Y component of the motion vector, which describes the motion
+ /// between the linescan camera and the object.
+ /// </summary>
+ public double mMotionVy;
+ /// <summary>
+ /// Z component of the motion vector, which describes the motion
+ /// between the linescan camera and the object.
+ /// </summary>
+ public double mMotionVz;
+
+ // SECOND TAB ---------------------------------------------
+ private int mWarnLevel;
+ private int mImageTests;
+ private int mSequenceTests;
+
+ /// <summary>
+ /// List of quality assessment scores of the whole set of calibration
+ /// images.
+ /// </summary>
+ public ArrayList mSeqQualityList;
+
+ /// <summary>
+ /// Size of the filter mask that is used to smooth the
+ /// image before determining the region plate in the
+ /// calibration image
+ /// </summary>
+ public double mFilterSize;
+ /// <summary>
+ /// Threshold value for mark extraction
+ /// </summary>
+ public double mMarkThresh;
+ /// <summary>
+ /// Expected minimum diameter of the marks on the
+ /// calibration plate
+ /// </summary>
+ public double mMinMarkDiam;
+ /// <summary>
+ /// Initial threshold value for contour detection
+ /// </summary>
+ public double mInitThresh;
+ /// <summary>
+ /// Loop value for successive reduction of
+ /// the initial threshold <c>mInitThresh</c>
+ /// </summary>
+ public double mThreshDecr;
+ /// <summary>
+ /// Minimum threshold for contour detection
+ /// </summary>
+ public double mMinThresh;
+ /// <summary>
+ /// Filter parameter for contour detection
+ /// </summary>
+ public double mSmoothing;
+ /// <summary>
+ /// Minimum length of the contours of the marks
+ /// </summary>
+ public double mMinContLength;
+ /// <summary>
+ /// Maximum expected diameter of the marks
+ /// </summary>
+ public double mMaxMarkDiam;
+
+ // reset vals
+ public int resetFilterSize = 9;
+ public int resetMarkThresh = 180;
+ public int resetMinMarkDiam = 5;
+ public int resetInitThresh = 128;
+ public int resetThreshDecr = 10;
+ public int resetMinThresh = 18;
+ public double resetSmoothing = 0.9; /* 90*0.01 */
+ public int resetMinContL = 15;
+ public int resetMaxMarkDiam = 500;
+
+ /// <summary>
+ /// Delegate to notify the GUI about changes in the data models
+ /// </summary>
+ public CalibDelegate NotifyCalibObserver;
+
+
+ /* Constructor, in which all calibration parameters
+ * and auxiliary variables, flags and lists are initilized */
+ public CalibrationAssistant()
+ {
+ CalibData = new ArrayList(15);
+ mReferenceIndex = -1;
+ mDescrFileName = "caltab_10mm.descr";
+ mCalibValid = false;
+ mCanCalib = true;
+ mAtImgCoord = false;
+
+ mReferenceImage = new HImage();
+ mSimulatedImage = new HImage();
+
+ mFilterSize = resetFilterSize;
+ mMarkThresh = resetMarkThresh;
+ mMinMarkDiam = resetMinMarkDiam;
+ mInitThresh = resetInitThresh;
+ mThreshDecr = resetThreshDecr;
+ mMinThresh = resetMinThresh;
+ mSmoothing = resetSmoothing;
+ mMinContLength = resetMinContL;
+ mMaxMarkDiam = resetMaxMarkDiam;
+
+ mWarnLevel = 70;
+ mImageTests = QUALITY_ISSUE_TEST_ALL;
+ mSequenceTests = QUALITY_ISSUE_TEST_ALL;
+ mSeqQualityList = new ArrayList(15);
+ procedure = new QualityProcedures();
+
+
+ mThickness = 1.00; // millimeter
+ mCameraType = CAMERA_TYP_AREA_SCAN_DIV;
+ mCellWidth = 8.300; // micrometer
+ mCellHeight = 8.300; // micrometer
+ mFocalLength = 8.000; // millimeter
+ isTelecentric = false;
+ mKappa = 0.0;
+ mK1 = 0.0;
+ mK2 = 0.0;
+ mK3 = 0.0;
+ mP1 = 0.0;
+ mP2 = 0.0;
+ mMotionVx = 0.0;
+ mMotionVy = 500.0;
+ mMotionVz = 0.0;
+
+ NotifyCalibObserver = new CalibDelegate(dummy);
+ }
+
+ /*******************************************/
+ /********** Tab.1 ************/
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the reference index to the supplied value
+ /// </summary>
+ public void setReferenceIdx(int val)
+ {
+ mReferenceIndex = val;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the file path for the description file to
+ /// the supplied value
+ /// </summary>
+ /// <param name="fileName">
+ /// Absolute path to the description file
+ /// </param>
+ public void setDesrcFile(string fileName)
+ {
+ mDescrFileName = fileName;
+ Update();
+ }
+ /// <summary>
+ /// Gets the path to the description file used
+ /// with the calibration
+ /// </summary>
+ public string getDesrcFile()
+ {
+ return mDescrFileName;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the thickness parameter to the supplied value
+ /// </summary>
+ public void setThickness(double val)
+ {
+ mThickness = val;
+ UpdateResultVisualization();
+ }
+ /// <summary>
+ /// Returns the current value for the thickness of the calibration
+ /// plate.
+ /// </summary>
+ public double getThickness()
+ {
+ return mThickness;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the camera type to the supplied value and
+ /// invokes an update to adjust data for the calibration images.
+ ///
+ /// </summary>
+ public void setCameraType(int mode)
+ {
+ mCameraType = mode;
+ Update(true);
+ }
+ /// <summary>
+ /// Returns the current camera type.
+ /// </summary>
+ public int getCameraType()
+ {
+ return mCameraType;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the parameter for the CCD sensor cell width
+ /// to the supplied value.
+ /// </summary>
+ public void setCellWidth(double val)
+ {
+ mCellWidth = val;
+ Update();
+ }
+ /// <summary>
+ /// Returns the value for the CCD sensor cell width
+ /// </summary>
+ public double getCellWidth()
+ {
+ return mCellWidth;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the parameter for the CCD sensor cell height
+ /// to the supplied value.
+ /// </summary>
+ public void setCellHeight(double val)
+ {
+ mCellHeight = val;
+ Update();
+ }
+ /// <summary>
+ /// Returns the value for the CCD sensor cell height
+ /// </summary>
+ public double getCellHeight()
+ {
+ return mCellHeight;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the parameter for the focal length to the
+ /// supplied value
+ /// </summary>
+ public void setFocalLength(double val)
+ {
+ mFocalLength = val;
+ Update();
+ }
+ /// <summary>
+ /// Returns the current value for the focal length
+ /// </summary>
+ public double getFocalLength()
+ {
+ return mFocalLength;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the boolean flag to indicate the use of telecentric
+ /// lense
+ /// </summary>
+ public void setIsTelecentric(bool val)
+ {
+ isTelecentric = val;
+ Update();
+ }
+ /// <summary>
+ /// Returns whether the current camera lense is defined to
+ /// be telecentric or not
+ /// </summary>
+ public bool IsTelecentric()
+ {
+ return isTelecentric;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the motion vector Vx to the supplied
+ /// value
+ /// </summary>
+ public void setMotionX(double val)
+ {
+ mMotionVx = val;
+ Update();
+ }
+ /// <summary>
+ /// Gets the current value for the motion vector Vx
+ /// </summary>
+ public double getMotionX()
+ {
+ return mMotionVx;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the motion vector Vy to the supplied
+ /// value
+ /// </summary>
+ public void setMotionY(double val)
+ {
+ mMotionVy = val;
+ Update();
+ }
+ /// <summary>
+ /// Gets the current value for the motion vector Vy
+ /// </summary>
+ public double getMotionY()
+ {
+ return mMotionVy;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the motion vector Vz to the supplied
+ /// value
+ /// </summary>
+ public void setMotionZ(double val)
+ {
+ mMotionVz = val;
+ Update();
+ }
+ /// <summary>
+ /// Gets the current value for the motion vector Vz
+ /// </summary>
+ public double getMotionZ()
+ {
+ return mMotionVz;
+ }
+
+ /*******************************************/
+ /********** Tab.2 ************/
+ /*******************************************/
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the parameter for the warn level to
+ /// the supplied value.
+ /// </summary>
+ public void setWarnLevel(int val)
+ {
+ mWarnLevel = val;
+ Update(true);
+ }
+ /// <summary>
+ /// Gets the current value for the warn level
+ /// </summary>
+ public double getWarnLevel()
+ {
+ return mWarnLevel;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the parameter to define the mode (accuracy) of
+ /// the quality assessment for single
+ /// calibration images
+ /// </summary>
+ /// <param name="mode">
+ /// mode (accuracy) of the quality assessment; one of the constants
+ /// starting with QUALITY_ISSUE_TEST_*.
+ /// </param>
+ public void setImageTests(int mode)
+ {
+ mImageTests = mode;
+ Update(true);
+ }
+ /// <summary>
+ /// Gets the current value that describes the
+ /// accuracy of the quality assessment
+ /// </summary>
+ public double getImageTests()
+ {
+ return mImageTests;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the parameter to define the mode (accuracy) of
+ /// the quality assessment for the whole sequence
+ /// of calibration images
+ /// </summary>
+ /// <param name="mode">
+ /// mode (accuracy) of the quality assessment; one of the constants
+ /// starting with QUALITY_ISSUE_TEST_*.
+ /// </param>
+ public void setSequenceTests(int mode)
+ {
+ mSequenceTests = mode;
+ Update(true);
+ }
+ /// <summary>
+ /// Gets the current value that describes the
+ /// accuracy of the quality assessment
+ /// </summary>
+ public double getSequenceTests()
+ {
+ return mSequenceTests;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the parameter for the filter size to
+ /// the supplied value.
+ /// </summary>
+ public void setFilterSize(double val)
+ {
+ mFilterSize = val;
+ Update();
+ }
+ /// <summary>
+ /// Gets the current value for the parameter
+ /// describing the filter size
+ /// </summary>
+ public double getFilterSize()
+ {
+ return mFilterSize;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the parameter for mark threshold to
+ /// the supplied value.
+ /// </summary>
+ public void setMarkThresh(double val)
+ {
+ mMarkThresh = val;
+ Update();
+ }
+ /// <summary>
+ /// Gets the current value for the parameter
+ /// describing the mark threshold
+ /// </summary>
+ public double getMarkThresh()
+ {
+ return mMarkThresh;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the parameter for the minimum mark
+ /// diameter to the supplied value.
+ /// </summary>
+ public void setMinMarkDiam(double val)
+ {
+ mMinMarkDiam = val;
+ Update();
+ }
+ /// <summary>
+ /// Gets the current value for the parameter
+ /// describing the minimum mark diameter
+ /// </summary>
+ public double getMinMarkDiam()
+ {
+ return mMinMarkDiam;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the parameter for the start threshold
+ /// to the supplied value.
+ /// </summary>
+ public void setInitThresh(double val)
+ {
+ mInitThresh = val;
+ Update();
+ }
+ /// <summary>
+ /// Gets the current value for the parameter
+ /// describing the start threshold
+ /// </summary>
+ public double getInitThresh()
+ {
+ return mInitThresh;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the parameter for the threshold
+ /// decrement to the supplied value.
+ /// </summary>
+ public void setThreshDecr(double val)
+ {
+ mThreshDecr = val;
+ Update();
+ }
+ /// <summary>
+ /// Gets the current value for the parameter
+ /// describing the threshold decrement
+ /// </summary>
+ public double getThreshDecr()
+ {
+ return mThreshDecr;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the parameter for the minimum
+ /// threshold to the supplied value.
+ /// </summary>
+ public void setMinThresh(double val)
+ {
+ mMinThresh = val;
+ Update();
+ }
+ /// <summary>
+ /// Gets the current value for the parameter
+ /// describing the minimum threshold
+ /// </summary>
+ public double getMinThresh()
+ {
+ return mMinThresh;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the parameter describing the smoothing
+ /// factor to the supplied value.
+ /// </summary>
+ public void setSmoothing(double val)
+ {
+ mSmoothing = val;
+ Update();
+ }
+ /// <summary>
+ /// Gets the parameter describing the smoothing
+ /// factor
+ /// </summary>
+ public double getSmoothing()
+ {
+ return mSmoothing;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the parameter describing the minimum
+ /// contour length to the supplied value.
+ /// </summary>
+ public void setMinContLength(double val)
+ {
+ mMinContLength = val;
+ Update();
+ }
+ /// <summary>
+ /// Gets the parameter describing the minimum
+ /// contour length
+ /// </summary>
+ public double getMinContLength()
+ {
+ return mMinContLength;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the parameter describing the maximum
+ /// mark diameter to the supplied value.
+ /// </summary>
+ public void setMaxMarkDiam(double val)
+ {
+ mMaxMarkDiam = val;
+ Update();
+ }
+ /// <summary>
+ /// Gets the parameter describing the maximum
+ /// mark diameter
+ /// </summary>
+ public double getMaxMarkDiam()
+ {
+ return mMaxMarkDiam;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Sets the flag defining the origin of
+ /// the reference world coordinate system
+ /// to be in the image coordinate system
+ /// </summary>
+ public void setAtImgCoord(bool val)
+ {
+ mAtImgCoord = val;
+ UpdateResultVisualization();
+
+ }
+ /// <summary>
+ /// Gets the current value for the flag
+ /// </summary>
+ public bool getAtImgCoord()
+ {
+ return mAtImgCoord;
+ }
+
+
+ public void dummy(int val) { }
+
+ /*******************************************/
+ /*******************************************/
+ /*******************************************/
+ /*******************************************/
+
+ /// <summary>
+ /// Gets the calibration image for the index <c>i</c>
+ /// from the list <c>CalibData</c>
+ /// </summary>
+ public CalibImage getCalibDataAt(int i)
+ {
+ if (CalibData.Count > 0)
+ return (CalibImage)CalibData[i];
+ else
+ return null;
+ }
+
+ public int getCalibDataLength()
+ {
+ return CalibData.Count;
+ }
+
+ /// <summary>
+ /// Add a new calibration image to the list <c>CalibData</c>.
+ /// The image is read from the location <c>filename</c>
+ /// and a new calibration image instance is then
+ /// generated, embedding this image.
+ /// As a preparation step prior to the calibration process, the
+ /// basic information for the calibration image are determined,
+ /// in terms of: detection of the region plate and the marks
+ /// and pose.
+ /// </summary>
+ /// <returns>
+ /// Instance of a calibration image model created for
+ /// the calibration image, supplied by <c>filename</c>
+ /// </returns>
+ public CalibImage addImage(string filename)
+ {
+ HImage image = null;
+ CalibImage data = null;
+
+ try
+ {
+ image = new HImage(filename);
+ data = new CalibImage(image, this);
+ CalibData.Add(data);
+ data.UpdateCaltab(true);
+ mCanCalib = (mCanCalib && (data.mCanCalib == 0));
+ mCalibValid = false;
+ }
+ catch (HOperatorException e)
+ {
+ mErrorMessage = e.Message;
+ NotifyCalibObserver(CalibrationAssistant.ERR_READING_FILE);
+ }
+
+ return data;
+ }
+
+ /// <summary>
+ /// Removes the instance of the calibration images
+ /// at the index <c>index</c> from the list <c>CalibData</c>
+ /// </summary>
+ public void removeImage(int index)
+ {
+ ((CalibImage)CalibData[index]).Clear();
+ CalibData.RemoveAt(index);
+ mCalibValid = false;
+ getCanCalibrate();
+ NotifyCalibObserver(CalibrationAssistant.UPDATE_CALIBRATION_RESULTS);
+ }
+
+ /// <summary>
+ /// Removes all instances of the calibration images
+ /// from the list <c>CalibData</c>
+ /// </summary>
+ public void removeImage()
+ {
+ int count = CalibData.Count;
+ for (int i = 0; i < count; i++)
+ ((CalibImage)CalibData[i]).Clear();
+
+ CalibData.Clear();
+ mCalibValid = false;
+ mCanCalib = false;
+ NotifyCalibObserver(CalibrationAssistant.UPDATE_CALIBRATION_RESULTS);
+ }
+
+ /// <summary>
+ /// Gets the HALCON image with the index <c>index</c> in the list of
+ /// calibration images <c>CalibData</c>.
+ /// </summary>
+ public HImage getImageAt(int index)
+ {
+ if (CalibData.Count > 0)
+ return ((CalibImage)CalibData[index]).getImage();
+ return null;
+ }
+
+ /// <summary>
+ /// Resets the flag <c>mCanCalib</c> to the boolean 'true'
+ /// </summary>
+ public void resetCanCalib()
+ {
+ mCanCalib = true;
+ }
+
+ /// <summary>
+ /// Returns the reference image for the calibration process
+ /// </summary>
+ public HImage getRefImage()
+ {
+ return (HImage)mReferenceImage;
+ }
+
+ /// <summary>
+ /// Returns the simulated image obtained from
+ /// the calibration process
+ /// </summary>
+ public HImage getSimulatedImage()
+ {
+ return mSimulatedImage;
+ }
+
+ /// <summary>
+ /// Returns the reference world coordinate system
+ /// obtained from the calibration process
+ /// </summary>
+ /// <returns></returns>
+ public HObject getReferenceWCS()
+ {
+ return mReferenceWCS;
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Auxiliary method prior to the actual update
+ /// routine. Calls the actual update method
+ /// omitting the quality assessment for the
+ /// set of calibration image models.
+ /// </summary>
+ public void Update()
+ {
+ bool doQuality = false;
+ Update(doQuality);
+ }
+
+ /// <summary>
+ /// Updates the data of the calibration images
+ /// if a change occurred in the calibration parameters.
+ /// The quality assessment is performed if the
+ /// supplied value is positive; otherwise, it is omited.
+ /// </summary>
+ /// <param name="doQuality">
+ /// If the flag is positive, an update of the
+ /// quality assessment is invoked, otherwise not.
+ /// </param>
+ public void Update(bool doQuality)
+ {
+ int count;
+
+ if ((count = CalibData.Count) == 0)
+ return;
+
+ try
+ {
+ for (int i = 0; i < count; i++)
+ ((CalibImage)CalibData[i]).UpdateCaltab(doQuality);
+
+ if (doQuality)
+ UpdateSequenceIssues();
+
+
+ mCanCalib = getCanCalibrate();
+
+ NotifyCalibObserver(CalibrationAssistant.UPDATE_CALTAB_STATUS);
+ NotifyCalibObserver(CalibrationAssistant.UPDATE_MARKS_POSE);
+
+ if (doQuality)
+ NotifyCalibObserver(CalibrationAssistant.UPDATE_QUALITY_TABLE);
+ }
+ catch (HOperatorException e)
+ {
+ mErrorMessage = (string)e.Message;
+ mCanCalib = false;
+ NotifyCalibObserver(CalibrationAssistant.ERR_QUALITY_ISSUES);
+ }
+
+ if (mCalibValid)
+ {
+ mCalibValid = false;
+ NotifyCalibObserver(CalibrationAssistant.UPDATE_CALIBRATION_RESULTS);
+ }
+ }
+
+ /*******************************************/
+
+ /// <summary>
+ /// Checks the whole set of calibration image models for
+ /// the quality of the preprocessing step. If the basic
+ /// information, i.e. the region plate and the marks
+ /// and pose, was extracted in all images, then the
+ /// flag <c>mCanCalib</c> is positive, which means
+ /// the actual calibration process can be initiated
+ /// </summary>
+ /// <returns>
+ /// Flag indicating the feasibility of the calibration
+ /// process
+ /// </returns>
+ public bool getCanCalibrate()
+ {
+ int count = CalibData.Count;
+ int val = 0;
+
+ for (int i = 0; i < count; i++)
+ val += ((CalibImage)CalibData[i]).mCanCalib;
+
+ if (val == 0 && count > 0)
+ mCanCalib = true;
+ else
+ mCanCalib = false;
+
+ return mCanCalib;
+ }
+
+ /// <summary>
+ /// Gets the mark centers and the poses extracted from
+ /// the set of calibration images
+ /// </summary>
+ /// <param name="rows">
+ /// Tuple of row coordinates of all marks from
+ /// the entire set of calibration images
+ /// </param>
+ /// <param name="cols">
+ /// Tuple of column coordinates of all marks from
+ /// the entire set of calibration images
+ /// </param>
+ /// <returns>
+ /// Tuple of estimated poses for the entire set
+ /// of calibration images
+ /// </returns>
+ public HTuple getCalibrationData(out HTuple rows, out HTuple cols)
+ {
+ int count = CalibData.Count;
+ HTuple pose = new HTuple();
+ rows = new HTuple();
+ cols = new HTuple();
+ CalibImage image;
+
+ for (int i = 0; i < count; i++)
+ {
+ image = (CalibImage)CalibData[i];
+ pose = pose.TupleConcat(image.getEstimatedPose());
+ rows = rows.TupleConcat(image.getMarkCenterRows());
+ cols = cols.TupleConcat(image.getMarkCenterColumns());
+ }
+ return pose;
+ }
+
+ /// <summary>
+ /// Gets the camera parameters corresponding to
+ /// the supplied calibration image.
+ /// </summary>
+ /// <returns>Camera parameters</returns>
+ public HTuple getCameraParams(CalibImage image)
+ {
+ HTuple campar;
+ int paramsListSize = 8;
+ int offset = 0;
+ bool areaScanPoly = false;
+
+ if (mCameraType == CalibrationAssistant.CAMERA_TYP_AREA_SCAN_POLY)
+ {
+ paramsListSize = 12;
+ offset = 4;
+ areaScanPoly = true;
+ }
+
+ paramsListSize += (mCameraType == CalibrationAssistant.CAMERA_TYP_LINE_SCAN) ? 3 : 0;
+
+ campar = new HTuple(paramsListSize);
+ campar[0] = (isTelecentric ? 0.0 : ((double)mFocalLength / 1000.0));
+
+ if (areaScanPoly)
+ {
+ campar[1] = mK1;
+ campar[2] = mK2;
+ campar[3] = mK3;
+ campar[4] = mP1;
+ campar[5] = mP2;
+ }
+ else
+ {
+ campar[1] = mKappa;
+ }
+
+ campar[2 + offset] = (double)mCellWidth / 1000000.0; // Sx -width -> * 10^ -6
+ campar[3 + offset] = (double)mCellHeight / 1000000.0; // Sy -height -> * 10^ -6
+ campar[4 + offset] = (double)image.mWidth * 0.5; // x -principal point
+ campar[5 + offset] = (double)image.mHeight * 0.5; // y -principal point
+ campar[6 + offset] = image.mWidth; // imagewidth
+ campar[7 + offset] = image.mHeight; // imageheight
+
+ if (paramsListSize == 11)
+ {
+ campar[8] = mMotionVx / 1000000.0;
+ campar[9] = mMotionVy / 1000000.0;
+ campar[10] = mMotionVz / 1000000.0;
+
+ campar[5 + offset] = 0; // y -principal point = 0 for line scan camera
+ }
+
+ return campar;
+ }
+
+ /// <summary>
+ /// Tests different quality features for the calibration image
+ /// <c>cImg</c>
+ /// </summary>
+ /// <returns>
+ /// Returns a value indicating the success or failure
+ /// of the quality assessment
+ /// </returns>
+ public bool testQualityIssues(CalibImage cImg)
+ {
+ ArrayList qList;
+
+ HObject markContours;
+ HObject plateRegion;
+ HImage mImg;
+ HTuple score, score2, contrast;
+ int numRegions, numContours;
+ bool qualityFailure;
+
+
+
+ mImg = cImg.getImage();
+ qList = cImg.getQualityIssueList();
+ procedure = new QualityProcedures();
+ contrast = new HTuple();
+ qualityFailure = false;
+ // DescriptionFileName = mDescrFileName;
+ ;
+
+ try
+ {
+ procedure.find_caltab_edges(mImg, out plateRegion,
+ out markContours,
+ new HTuple(mDescrFileName));
+ numRegions = plateRegion.CountObj();
+ numContours = markContours.CountObj();
+
+ if (mImageTests < QUALITY_ISSUE_TEST_NONE)
+ {
+ if (numRegions == 0)
+ {
+ qualityFailure = true;
+ }
+ else
+ {
+ procedure.eval_caltab_overexposure(mImg, plateRegion, out score);
+ addQualityIssue(qList, QUALITY_ISSUE_IMG_EXPOSURE, score.D);
+ }
+
+ if (numContours == 0)
+ {
+ qualityFailure = true;
+ }
+ else
+ {
+ procedure.eval_caltab_contrast_homogeneity(mImg, markContours, out contrast, out score, out score2);
+ addQualityIssue(qList, QUALITY_ISSUE_IMG_CONTRAST, score.D);
+ addQualityIssue(qList, QUALITY_ISSUE_IMG_HOMOGENEITY, score2.D);
+
+ procedure.eval_caltab_size(mImg, plateRegion, markContours, out score);
+ addQualityIssue(qList, QUALITY_ISSUE_IMG_CALTAB_SIZE, score.D);
+ }
+
+ if (mImageTests == QUALITY_ISSUE_TEST_ALL)
+ {
+ procedure.eval_caltab_focus(mImg, markContours, contrast, out score);
+ addQualityIssue(qList, QUALITY_ISSUE_IMG_FOCUS, score.D);
+ }
+ }
+ }
+ catch (HOperatorException e)
+ {
+ throw (e);
+ }
+
+ return qualityFailure;
+ }
+
+ /// <summary>
+ /// Tests for quality features concerning the performance
+ /// of the entire sequence of calibration images provided by
+ /// the list <c>CalibData</c>
+ /// </summary>
+ public void UpdateSequenceIssues()
+ {
+ HTuple markRows, marksCols, startPose, width, height, hScore;
+ bool hasIssue;
+ bool hasError;
+ double minScore, score;
+ int count, countL;
+ CalibImage imgC;
+ ArrayList qList;
+
+ mSeqQualityList.Clear();
+
+ try
+ {
+ if (mSequenceTests < QUALITY_ISSUE_TEST_NONE)
+ {
+ hasIssue = false;
+ hasError = false;
+ minScore = 1.0;
+
+ if ((count = CalibData.Count) == 0)
+ return;
+
+ for (int i = 0; i < count; i++)
+ {
+ imgC = (CalibImage)CalibData[i];
+
+ if (imgC.getPlateStatus() == PS_QUALITY_ISSUES)
+ {
+ hasIssue = true;
+ qList = imgC.getQualityIssueList();
+ countL = qList.Count;
+
+ for (int j = 0; j < countL; j++)
+ {
+ score = ((QualityIssue)qList[j]).getScore();
+
+ if (score < minScore)
+ minScore = score;
+ }
+ }
+ else if (imgC.getPlateStatus() != PS_OK)
+ {
+ hasError = true;
+ }
+ }//for
+
+ if (hasError)
+ {
+ addQualityIssue(mSeqQualityList, QUALITY_ISSUE_SEQ_ERROR, 0.0);
+ }
+ else if (hasIssue)
+ {
+ addQualityIssue(mSeqQualityList, QUALITY_ISSUE_SEQ_ALL_OVER, minScore);
+ }
+
+ if (count < 20)
+ {
+ score = (count <= 10) ? 0.0 : (0.1 * ((double)count - 10.0));
+ addQualityIssue(mSeqQualityList, QUALITY_ISSUE_SEQ_NUMBER, score);
+ }
+
+ if (mSequenceTests == QUALITY_ISSUE_TEST_ALL && count > 0)
+ {
+ startPose = getCalibrationData(out markRows, out marksCols);
+ width = new HTuple(((CalibImage)CalibData[0]).mWidth);
+ height = new HTuple(((CalibImage)CalibData[0]).mHeight);
+
+ procedure.eval_marks_distribution(markRows, marksCols, width, height, out hScore);
+ addQualityIssue(mSeqQualityList, QUALITY_ISSUE_SEQ_MARKS_DISTR, hScore[0].D);
+
+ procedure.eval_caltab_tilt(startPose, out hScore);
+ addQualityIssue(mSeqQualityList, QUALITY_ISSUE_SEQ_CALTAB_TILT, hScore[0].D);
+ }
+ }//if!=None
+ }
+ catch (HOperatorException e)
+ {
+ mErrorMessage = e.Message;
+ }
+ }
+
+ /// <summary>
+ /// Adds the calculated score <c>score</c> for the quality feature
+ /// <c>type</c> to the supplied feature list <c>qList</c>
+ /// </summary>
+ /// <param name="qList">
+ /// Quality feature list
+ /// </param>
+ /// <param name="type">
+ /// Constant starting with QUALITY_*, describing one of the quality
+ /// features
+ /// </param>
+ /// <param name="score">
+ /// Score determined for the quality feature
+ /// </param>
+ public void addQualityIssue(ArrayList qList, int type, double score)
+ {
+ if ((int)(score * 100) <= mWarnLevel)
+ qList.Add(new QualityIssue(type, score));
+ }
+
+ /// <summary>
+ /// Calls the actual <c>addQualityIssue</c>
+ /// method, with the feature list obtained from the
+ /// calibration image <c>cImg</c>
+ /// </summary>
+ /// <param name="cImg">
+ /// Calibration image model, which has been tested for
+ /// the quality feature defined with <c>type</c>
+ /// </param>
+ /// <param name="type">
+ /// Constant starting with QUALITY_* describing one of the quality
+ /// features
+ /// </param>
+ /// <param name="score">
+ /// Score determined for the quality feature
+ /// </param>
+ public void addQualityIssue(CalibImage cImg, int type, double score)
+ {
+ ArrayList qList = cImg.getQualityIssueList();
+ addQualityIssue(qList, type, score);
+ }
+
+ /// <summary>
+ /// Applies the calibration on the set of calibration
+ /// images <c>CalibData</c>
+ /// </summary>
+ public void applyCalibration()
+ {
+ HTuple x, y, z, marksR, marksC;
+ HTuple error, startPoses, startCampar, parameters;
+ CalibImage refImg;
+
+ mCalibValid = false;
+ mErrorMean = -1;
+
+ if (mReferenceIndex >= 0)
+ {
+ try
+ {
+ refImg = (CalibImage)CalibData[mReferenceIndex];
+ HOperatorSet.CaltabPoints(mDescrFileName, out x, out y, out z);
+ startPoses = getCalibrationData(out marksR, out marksC);
+ startCampar = getCameraParams(refImg);
+ parameters = new HTuple("all");
+
+ HOperatorSet.CameraCalibration(x, y, z,
+ marksR, marksC,
+ startCampar,
+ startPoses,
+ parameters,
+ out mCameraParams,
+ out mPoses,
+ out error);
+ mErrorMean = error[0].D;
+ mCalibValid = true;
+
+ UpdateResultVisualization();
+ }
+ catch (HOperatorException e)
+ {
+ mErrorMessage = e.Message;
+ NotifyCalibObserver(CalibrationAssistant.ERR_IN_CALIBRATION);
+ }
+ }
+ else
+ {
+ NotifyCalibObserver(CalibrationAssistant.ERR_REFINDEX_INVALID);
+ }//if-else
+ }
+
+ /// <summary>
+ /// Generates the iconic objects of the calibration results
+ /// for display
+ /// </summary>
+ public void UpdateResultVisualization()
+ {
+ HTuple refPose, correctedPose;
+ double axisLen;
+ HObject obj;
+
+ if (!mCalibValid)
+ return;
+
+ mSimulatedImage.Dispose();
+
+ mReferenceImage = ((CalibImage)CalibData[mReferenceIndex]).getImage();
+ refPose = getCalibratedPose(false);
+
+ HOperatorSet.SimCaltab(out obj, new HTuple(mDescrFileName),
+ mCameraParams, refPose, new HTuple(128),
+ new HTuple(224), new HTuple(80), new HTuple(1));
+
+ mSimulatedImage = new HImage(obj);
+
+ correctedPose = getCalibratedPose(true);
+ axisLen = ((CalibImage)CalibData[mReferenceIndex]).getEstimatedPlateSize();
+
+ procedure.get_3d_coord_system(mReferenceImage, out mReferenceWCS, mCameraParams,
+ correctedPose, new HTuple(axisLen / 2));
+
+ NotifyCalibObserver(CalibrationAssistant.UPDATE_CALIBRATION_RESULTS);
+ }
+
+ /// <summary>
+ /// Saves the calibrated camera parameters in the file
+ /// defined by <c>filename</c>
+ /// </summary>
+ public void saveCamParams(string filename)
+ {
+ if (mCalibValid)
+ {
+ try
+ {
+ HOperatorSet.WriteCamPar(mCameraParams, new HTuple(filename));
+ }
+ catch (HOperatorException e)
+ {
+ mErrorMessage = e.Message;
+ NotifyCalibObserver(CalibrationAssistant.ERR_WRITE_CALIB_RESULTS);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Saves the pose obtained from the camera calibration
+ /// in the file, defined by <c>filename</c>
+ /// </summary>
+ public void saveCamPose(string filename)
+ {
+ HTuple Pose;
+ if (mCalibValid)
+ {
+ try
+ {
+ Pose = getCalibratedPose(true);
+ HOperatorSet.WritePose(Pose, new HTuple(filename));
+ }
+ catch (HOperatorException e)
+ {
+ mErrorMessage = e.Message;
+ NotifyCalibObserver(CalibrationAssistant.ERR_WRITE_CALIB_RESULTS);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Returns calibration results
+ /// </summary>
+ /// <param name="camParams">
+ /// Calibrated internal camera parameters
+ /// </param>
+ /// <param name="refPose">
+ /// Calibrated external camera parameters
+ /// </param>
+ public void getCalibrationResult(out HTuple camParams,
+ out HTuple refPose)
+ {
+ camParams = new HTuple(mCameraParams);
+ refPose = getCalibratedPose(true);
+ }
+
+ /// <summary>
+ /// Returns the calibrated reference pose
+ /// </summary>
+ public HTuple getCalibratedPose(bool corrected)
+ {
+ HTuple tX, tY, tZ, correctedPose, refPose = null;
+
+ if (!mCalibValid)
+ return new HTuple(1.0, -1.0, 0.0);
+
+
+ if (mPoses.Length >= 7 * (mReferenceIndex + 1))
+ refPose = mPoses.TupleSelectRange(new HTuple(7 * mReferenceIndex),
+ new HTuple(7 * mReferenceIndex + 6));
+
+ if (!corrected)
+ return refPose;
+
+ tX = new HTuple(0);
+ tY = new HTuple(0);
+ tZ = new HTuple(this.mThickness / 1000.0);
+
+ if (mAtImgCoord)
+ {
+ HOperatorSet.ImagePointsToWorldPlane(mCameraParams, refPose,
+ new HTuple(0), new HTuple(0),
+ new HTuple("mm"), out tX, out tY);
+ }
+ HOperatorSet.SetOriginPose(refPose, tX, tY, tZ, out correctedPose);
+
+ return correctedPose;
+ }
+
+ /// <summary>Loads camera parameters from file</summary>
+ /// <param name="camParFile">File name</param>
+ /// <returns>Success or failure of load process</returns>
+ public bool importCamParams(string camParFile)
+ {
+ HTuple campar;
+ int offset = 0;
+ bool areaScanPoly = false;
+
+
+ try
+ {
+ HOperatorSet.ReadCamPar(new HTuple(camParFile), out campar);
+
+ // -- load camera parameters --
+ switch (campar.Length)
+ {
+ case 8:
+ mCameraType = CAMERA_TYP_AREA_SCAN_DIV;
+ break;
+ case 11:
+ mCameraType = CAMERA_TYP_LINE_SCAN;
+ break;
+ case 12:
+ mCameraType = CAMERA_TYP_AREA_SCAN_POLY;
+ offset = 4;
+ areaScanPoly = true;
+ break;
+ default:
+ mCameraType = -1;
+ break;
+ }
+
+ mFocalLength = campar[0] * 1000.0;
+
+ if (mFocalLength == 0.0)
+ isTelecentric = true;
+ else
+ isTelecentric = false;
+
+ if (areaScanPoly)
+ {
+ mK1 = campar[1];
+ mK2 = campar[2];
+ mK3 = campar[3];
+ mP1 = campar[4];
+ mP2 = campar[5];
+ }
+ else
+ {
+ mKappa = campar[1];
+ }
+
+ mCellWidth = campar[2 + offset] * 1000000.0;
+ mCellHeight = campar[3 + offset] * 1000000.0;
+
+ // line scan camera
+ if (campar.Length == 11)
+ {
+ mMotionVx = campar[8].D * 1000000.0;
+ mMotionVy = campar[9].D * 1000000.0;
+ mMotionVz = campar[10].D * 1000000.0;
+ }
+
+ Update(true);
+ }
+ catch (HOperatorException e)
+ {
+ mErrorMessage = e.Message;
+ NotifyCalibObserver(CalibrationAssistant.ERR_READING_FILE);
+ return false;
+ }
+
+ return true;
+ }
+
+ /// <summary>
+ /// Resets the camera parameters to the default settings.
+ /// </summary>
+ /// <param name="camTyp">
+ /// Flag to change camera type to the default as well
+ /// </param>
+ public void resetCameraSetup(bool camTyp)
+ {
+ if (camTyp)
+ mCameraType = CAMERA_TYP_AREA_SCAN_DIV;
+
+ mThickness = 1.00;
+ mCellWidth = 8.300;
+ mCellHeight = 8.300;
+ mFocalLength = 8.000;
+ isTelecentric = false;
+ mKappa = 0.0;
+ mK1 = 0.0;
+ mK2 = 0.0;
+ mK3 = 0.0;
+ mP1 = 0.0;
+ mP2 = 0.0;
+ mMotionVx = 0.0;
+ mMotionVy = 500.0;
+ mMotionVz = 0.0;
+
+ Update(true);
+ }
+
+ }
+}
diff --git a/HalconTools/CalibrationModule/QualityIssue.cs b/HalconTools/CalibrationModule/QualityIssue.cs
new file mode 100644
index 0000000..6290aa7
--- /dev/null
+++ b/HalconTools/CalibrationModule/QualityIssue.cs
@@ -0,0 +1,46 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HalconTools
+{
+ public class QualityIssue
+ {
+ /// <summary>
+ /// Constant starting with QUALITY_ISSUE_*, defined in the class
+ /// CalibrationAssistant.
+ /// </summary>
+ private int qIssue;
+ /// <summary>
+ /// Score obtained from the quality assessment
+ /// </summary>
+ private double qScore;
+
+ /// <summary>Initialize an instance</summary>
+ /// <param name="IType">
+ /// Constant starting with QUALITY_ISSUE_*, defined in
+ /// the class CalibrationAssistant.
+ /// </param>
+ /// <param name="scr">
+ /// Score achieved for this quality measurement.
+ /// </param>
+ public QualityIssue(int IType, double scr)
+ {
+ qIssue = IType;
+ qScore = scr;
+ }
+
+ // getter-setter methods
+ public double getScore()
+ {
+ return qScore;
+ }
+
+ public int getIssueType()
+ {
+ return qIssue;
+ }
+
+ }
+}
diff --git a/HalconTools/CalibrationModule/QualityProcedures.cs b/HalconTools/CalibrationModule/QualityProcedures.cs
new file mode 100644
index 0000000..406536a
--- /dev/null
+++ b/HalconTools/CalibrationModule/QualityProcedures.cs
@@ -0,0 +1,1034 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public class QualityProcedures
+ {
+ /// <summary>
+ /// Evaluates the sharpness of the calibration plate in the calibration
+ /// image.
+ /// </summary>
+ public void eval_caltab_focus(HObject ho_Image,
+ HObject ho_Marks,
+ HTuple hv_Contrast,
+ out HTuple hv_FocusScore)
+ {
+ // Local iconic variables
+
+ HObject ho_Region, ho_RegionUnion, ho_ImageReduced;
+ HObject ho_DerivGauss;
+
+ // Local control variables
+
+ HTuple hv_Number, hv_MeanGradient, hv_Deviation;
+ HTuple hv_MinScore, hv_RawResult;
+
+ // Initialize local and output iconic variables
+ HOperatorSet.GenEmptyObj(out ho_Region);
+ HOperatorSet.GenEmptyObj(out ho_RegionUnion);
+ HOperatorSet.GenEmptyObj(out ho_ImageReduced);
+ HOperatorSet.GenEmptyObj(out ho_DerivGauss);
+
+ hv_FocusScore = 0.0;
+ if ((int)(new HTuple(hv_Contrast.TupleEqual(0))) != 0)
+ {
+ ho_Region.Dispose();
+ ho_RegionUnion.Dispose();
+ ho_ImageReduced.Dispose();
+ ho_DerivGauss.Dispose();
+
+ return;
+ }
+ HOperatorSet.CountObj(ho_Marks, out hv_Number);
+ if ((int)(new HTuple(hv_Number.TupleLess(3))) != 0)
+ {
+ ho_Region.Dispose();
+ ho_RegionUnion.Dispose();
+ ho_ImageReduced.Dispose();
+ ho_DerivGauss.Dispose();
+
+ return;
+ }
+ ho_Region.Dispose();
+ HOperatorSet.GenRegionContourXld(ho_Marks, out ho_Region, "margin");
+ ho_RegionUnion.Dispose();
+ HOperatorSet.Union1(ho_Region, out ho_RegionUnion);
+ ho_ImageReduced.Dispose();
+ HOperatorSet.ReduceDomain(ho_Image, ho_RegionUnion, out ho_ImageReduced);
+ ho_DerivGauss.Dispose();
+ HOperatorSet.DerivateGauss(ho_ImageReduced, out ho_DerivGauss, 0.7, "gradient");
+ HOperatorSet.Intensity(ho_Region, ho_DerivGauss, out hv_MeanGradient, out hv_Deviation);
+ hv_MinScore = 0.25;
+ //Normalize the Gradient with the contrast
+ hv_RawResult = hv_MeanGradient / hv_Contrast;
+ hv_FocusScore = (((hv_RawResult * 4.5)).TupleSort())[(new HTuple((new HTuple(hv_RawResult.TupleLength()
+ )) / 20.0)).TupleRound()];
+ hv_FocusScore = ((((((((hv_FocusScore - hv_MinScore)).TupleConcat(0.0))).TupleMax()
+ )).TupleConcat(1.0))).TupleMin();
+ ho_Region.Dispose();
+ ho_RegionUnion.Dispose();
+ ho_ImageReduced.Dispose();
+ ho_DerivGauss.Dispose();
+
+ return;
+ }
+
+
+
+ /// <summary>
+ /// Extracts the calibration plate and the marks on this plate
+ /// for the supplied image
+ /// </summary>
+ public void find_caltab_edges(HObject ho_Image,
+ out HObject ho_Caltab,
+ out HObject ho_Marks,
+ HTuple hv_DescriptionFileName)
+ {
+
+
+ // Stack for temporary objects
+ HObject[] OTemp = new HObject[20];
+
+ // Local iconic variables
+
+ HObject ho_ImageMean, ho_RegionDynThresh, ho_RegionBorder;
+ HObject ho_RegionOpening1, ho_ConnectedRegions1, ho_SelectedRegions4;
+ HObject ho_SelectedRegions5, ho_RegionBorder2, ho_RegionTrans;
+ HObject ho_RegionErosion, ho_RegionBorder1, ho_RegionDilation2;
+ HObject ho_RegionDifference1, ho_RegionOpening, ho_ConnectedRegions;
+ HObject ho_SelectedRegions2, ho_SelectedRegions, ho_RegionFillUp;
+ HObject ho_SelectedRegions1, ho_RegionIntersection, ho_RegionFillUp1;
+ HObject ho_RegionDifference, ho_CaltabCandidates, ho_ObjectSelected = null;
+ HObject ho_ConnectedMarks = null, ho_ObjectSelectedCaltab = null;
+ HObject ho_RegionFillUpCand, ho_MarksCand, ho_RegionDilation1;
+ HObject ho_ImageReduced, ho_DefaultEdges, ho_UnionContours;
+ HObject ho_SelectedXLD, ho_SelectedXLD1;
+
+
+ // Local control variables
+
+ HTuple hv_Width, hv_Height, hv_EstimatedCaltabSize;
+ HTuple hv_EstimatedMarkSize, hv_Number, hv_X, hv_Y, hv_Z;
+ HTuple hv_NumDescrMarks, hv_Index, hv_NumberMarks = new HTuple();
+ HTuple hv_Anisometry = new HTuple(), hv_Bulkiness = new HTuple();
+ HTuple hv_StructureFactor = new HTuple(), hv_AreaMarks = new HTuple();
+ HTuple hv_Row = new HTuple(), hv_Column = new HTuple(), hv_Rectangularity;
+ HTuple hv_SortedIndex, hv_IndexBest, hv_MinContrast, hv_NumberCand;
+ HTuple hv_Area, hv_Dummy, hv_DummyS, hv_AreaMedian;
+
+ // Initialize local and output iconic variables
+ HOperatorSet.GenEmptyObj(out ho_Caltab);
+ HOperatorSet.GenEmptyObj(out ho_Marks);
+ HOperatorSet.GenEmptyObj(out ho_ImageMean);
+ HOperatorSet.GenEmptyObj(out ho_RegionDynThresh);
+ HOperatorSet.GenEmptyObj(out ho_RegionBorder);
+ HOperatorSet.GenEmptyObj(out ho_RegionOpening1);
+ HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1);
+ HOperatorSet.GenEmptyObj(out ho_SelectedRegions4);
+ HOperatorSet.GenEmptyObj(out ho_SelectedRegions5);
+ HOperatorSet.GenEmptyObj(out ho_RegionBorder2);
+ HOperatorSet.GenEmptyObj(out ho_RegionTrans);
+ HOperatorSet.GenEmptyObj(out ho_RegionErosion);
+ HOperatorSet.GenEmptyObj(out ho_RegionBorder1);
+ HOperatorSet.GenEmptyObj(out ho_RegionDilation2);
+ HOperatorSet.GenEmptyObj(out ho_RegionDifference1);
+ HOperatorSet.GenEmptyObj(out ho_RegionOpening);
+ HOperatorSet.GenEmptyObj(out ho_ConnectedRegions);
+ HOperatorSet.GenEmptyObj(out ho_SelectedRegions2);
+ HOperatorSet.GenEmptyObj(out ho_SelectedRegions);
+ HOperatorSet.GenEmptyObj(out ho_RegionFillUp);
+ HOperatorSet.GenEmptyObj(out ho_SelectedRegions1);
+ HOperatorSet.GenEmptyObj(out ho_RegionIntersection);
+ HOperatorSet.GenEmptyObj(out ho_RegionFillUp1);
+ HOperatorSet.GenEmptyObj(out ho_RegionDifference);
+ HOperatorSet.GenEmptyObj(out ho_CaltabCandidates);
+ HOperatorSet.GenEmptyObj(out ho_ObjectSelected);
+ HOperatorSet.GenEmptyObj(out ho_ConnectedMarks);
+ HOperatorSet.GenEmptyObj(out ho_ObjectSelectedCaltab);
+ HOperatorSet.GenEmptyObj(out ho_RegionFillUpCand);
+ HOperatorSet.GenEmptyObj(out ho_MarksCand);
+ HOperatorSet.GenEmptyObj(out ho_RegionDilation1);
+ HOperatorSet.GenEmptyObj(out ho_ImageReduced);
+ HOperatorSet.GenEmptyObj(out ho_DefaultEdges);
+ HOperatorSet.GenEmptyObj(out ho_UnionContours);
+ HOperatorSet.GenEmptyObj(out ho_SelectedXLD);
+ HOperatorSet.GenEmptyObj(out ho_SelectedXLD1);
+
+ //
+ ho_Marks.Dispose();
+ HOperatorSet.GenEmptyObj(out ho_Marks);
+ ho_Caltab.Dispose();
+ HOperatorSet.GenEmptyObj(out ho_Caltab);
+ HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
+ hv_EstimatedCaltabSize = (((((hv_Width.TupleConcat(hv_Height))).TupleMax()) / 2.5)).TupleRound()
+ ;
+ hv_EstimatedMarkSize = ((hv_EstimatedCaltabSize / 12.0)).TupleRound();
+ ho_ImageMean.Dispose();
+ HOperatorSet.MeanImage(ho_Image, out ho_ImageMean, hv_EstimatedMarkSize * 3, hv_EstimatedMarkSize * 3);
+ ho_RegionDynThresh.Dispose();
+ HOperatorSet.DynThreshold(ho_Image, ho_ImageMean, out ho_RegionDynThresh, 3,
+ "light");
+ ho_RegionBorder.Dispose();
+ HOperatorSet.DynThreshold(ho_Image, ho_ImageMean, out ho_RegionBorder, 20, "dark");
+ ho_RegionOpening1.Dispose();
+ HOperatorSet.OpeningCircle(ho_RegionBorder, out ho_RegionOpening1, 1.5);
+ ho_ConnectedRegions1.Dispose();
+ HOperatorSet.Connection(ho_RegionOpening1, out ho_ConnectedRegions1);
+ ho_SelectedRegions4.Dispose();
+ HOperatorSet.SelectShape(ho_ConnectedRegions1, out ho_SelectedRegions4, "compactness",
+ "and", 17, 50);
+ ho_SelectedRegions5.Dispose();
+ HOperatorSet.SelectShape(ho_SelectedRegions4, out ho_SelectedRegions5, "anisometry",
+ "and", 1, 1.4);
+ ho_RegionBorder2.Dispose();
+ HOperatorSet.Boundary(ho_SelectedRegions5, out ho_RegionBorder2, "outer");
+ ho_SelectedRegions5.Dispose();
+ HOperatorSet.SelectShape(ho_RegionBorder2, out ho_SelectedRegions5, "circularity",
+ "and", 0.006, 1);
+ ho_RegionTrans.Dispose();
+ HOperatorSet.ShapeTrans(ho_SelectedRegions5, out ho_RegionTrans, "rectangle2");
+ ho_RegionErosion.Dispose();
+ HOperatorSet.ErosionCircle(ho_RegionTrans, out ho_RegionErosion, (hv_Width / 640.0) * 5.5);
+ ho_RegionBorder1.Dispose();
+ HOperatorSet.Boundary(ho_RegionErosion, out ho_RegionBorder1, "inner");
+ ho_RegionDilation2.Dispose();
+ HOperatorSet.DilationCircle(ho_RegionBorder1, out ho_RegionDilation2, 3.5);
+ ho_RegionDifference1.Dispose();
+ HOperatorSet.Difference(ho_RegionDynThresh, ho_RegionDilation2, out ho_RegionDifference1
+ );
+ ho_RegionOpening.Dispose();
+ HOperatorSet.OpeningCircle(ho_RegionDifference1, out ho_RegionOpening, (hv_Width / 640) * 1.5);
+ ho_ConnectedRegions.Dispose();
+ HOperatorSet.Connection(ho_RegionOpening, out ho_ConnectedRegions);
+ ho_SelectedRegions2.Dispose();
+ HOperatorSet.SelectShape(ho_ConnectedRegions, out ho_SelectedRegions2, "area",
+ "and", (hv_EstimatedCaltabSize.TuplePow(2)) / 10, (hv_EstimatedCaltabSize.TuplePow(
+ 2)) * 5);
+ ho_SelectedRegions.Dispose();
+ HOperatorSet.SelectShape(ho_SelectedRegions2, out ho_SelectedRegions, "compactness",
+ "and", 1.4, 10);
+ ho_RegionFillUp.Dispose();
+ HOperatorSet.FillUp(ho_SelectedRegions, out ho_RegionFillUp);
+ ho_SelectedRegions1.Dispose();
+ HOperatorSet.SelectShape(ho_RegionFillUp, out ho_SelectedRegions1, "rectangularity",
+ "and", 0.6, 1);
+ ho_RegionIntersection.Dispose();
+ HOperatorSet.Intersection(ho_SelectedRegions1, ho_RegionDynThresh, out ho_RegionIntersection
+ );
+ ho_RegionFillUp1.Dispose();
+ HOperatorSet.FillUp(ho_RegionIntersection, out ho_RegionFillUp1);
+ ho_RegionDifference.Dispose();
+ HOperatorSet.Difference(ho_RegionFillUp1, ho_RegionIntersection, out ho_RegionDifference
+ );
+ HOperatorSet.CountObj(ho_RegionDifference, out hv_Number);
+ ho_CaltabCandidates.Dispose();
+ HOperatorSet.GenEmptyObj(out ho_CaltabCandidates);
+ HOperatorSet.CaltabPoints(hv_DescriptionFileName, out hv_X, out hv_Y, out hv_Z);
+ hv_NumDescrMarks = new HTuple(hv_X.TupleLength());
+ for (hv_Index = 1; hv_Index.Continue(hv_Number, 1); hv_Index = hv_Index.TupleAdd(1))
+ {
+ ho_ObjectSelected.Dispose();
+ HOperatorSet.SelectObj(ho_RegionDifference, out ho_ObjectSelected, hv_Index);
+ ho_ConnectedMarks.Dispose();
+ HOperatorSet.Connection(ho_ObjectSelected, out ho_ConnectedMarks);
+ HOperatorSet.CountObj(ho_ConnectedMarks, out hv_NumberMarks);
+ HOperatorSet.Eccentricity(ho_ConnectedMarks, out hv_Anisometry, out hv_Bulkiness,
+ out hv_StructureFactor);
+ HOperatorSet.AreaCenter(ho_ConnectedMarks, out hv_AreaMarks, out hv_Row, out hv_Column);
+ ho_ObjectSelectedCaltab.Dispose();
+ HOperatorSet.SelectObj(ho_RegionIntersection, out ho_ObjectSelectedCaltab,
+ hv_Index);
+ if ((int)((new HTuple((new HTuple((new HTuple(hv_NumberMarks.TupleGreaterEqual(
+ 10))).TupleAnd(new HTuple(hv_NumberMarks.TupleLess(hv_NumDescrMarks + 20))))).TupleAnd(
+ new HTuple(((((hv_Anisometry.TupleSort())).TupleSelect((new HTuple(hv_Anisometry.TupleLength()
+ )) / 2))).TupleLess(2))))).TupleAnd(new HTuple((new HTuple(hv_AreaMarks.TupleMean()
+ )).TupleGreater(20)))) != 0)
+ {
+ HOperatorSet.ConcatObj(ho_CaltabCandidates, ho_ObjectSelectedCaltab, out OTemp[0]
+ );
+ ho_CaltabCandidates.Dispose();
+ ho_CaltabCandidates = OTemp[0];
+ }
+ }
+ ho_RegionFillUpCand.Dispose();
+ HOperatorSet.FillUp(ho_CaltabCandidates, out ho_RegionFillUpCand);
+ HOperatorSet.Rectangularity(ho_RegionFillUpCand, out hv_Rectangularity);
+ if ((int)(new HTuple((new HTuple(hv_Rectangularity.TupleLength())).TupleEqual(
+ 0))) != 0)
+ {
+ ho_ImageMean.Dispose();
+ ho_RegionDynThresh.Dispose();
+ ho_RegionBorder.Dispose();
+ ho_RegionOpening1.Dispose();
+ ho_ConnectedRegions1.Dispose();
+ ho_SelectedRegions4.Dispose();
+ ho_SelectedRegions5.Dispose();
+ ho_RegionBorder2.Dispose();
+ ho_RegionTrans.Dispose();
+ ho_RegionErosion.Dispose();
+ ho_RegionBorder1.Dispose();
+ ho_RegionDilation2.Dispose();
+ ho_RegionDifference1.Dispose();
+ ho_RegionOpening.Dispose();
+ ho_ConnectedRegions.Dispose();
+ ho_SelectedRegions2.Dispose();
+ ho_SelectedRegions.Dispose();
+ ho_RegionFillUp.Dispose();
+ ho_SelectedRegions1.Dispose();
+ ho_RegionIntersection.Dispose();
+ ho_RegionFillUp1.Dispose();
+ ho_RegionDifference.Dispose();
+ ho_CaltabCandidates.Dispose();
+ ho_ObjectSelected.Dispose();
+ ho_ConnectedMarks.Dispose();
+ ho_ObjectSelectedCaltab.Dispose();
+ ho_RegionFillUpCand.Dispose();
+ ho_MarksCand.Dispose();
+ ho_RegionDilation1.Dispose();
+ ho_ImageReduced.Dispose();
+ ho_DefaultEdges.Dispose();
+ ho_UnionContours.Dispose();
+ ho_SelectedXLD.Dispose();
+ ho_SelectedXLD1.Dispose();
+
+ return;
+ }
+ hv_SortedIndex = hv_Rectangularity.TupleSortIndex();
+ hv_IndexBest = (((hv_SortedIndex.TupleInverse())).TupleSelect(0)) + 1;
+ ho_Caltab.Dispose();
+ HOperatorSet.SelectObj(ho_RegionFillUpCand, out ho_Caltab, hv_IndexBest);
+ ho_RegionFillUp.Dispose();
+ HOperatorSet.FillUp(ho_Caltab, out ho_RegionFillUp);
+ ho_MarksCand.Dispose();
+ HOperatorSet.Difference(ho_RegionFillUp, ho_RegionDynThresh, out ho_MarksCand
+ );
+ ho_RegionBorder.Dispose();
+ HOperatorSet.Boundary(ho_MarksCand, out ho_RegionBorder, "inner");
+ ho_RegionDilation1.Dispose();
+ HOperatorSet.DilationCircle(ho_RegionBorder, out ho_RegionDilation1, 9.5);
+ ho_ImageReduced.Dispose();
+ HOperatorSet.ReduceDomain(ho_Image, ho_RegionDilation1, out ho_ImageReduced);
+ hv_MinContrast = 10;
+ ho_DefaultEdges.Dispose();
+ HOperatorSet.EdgesSubPix(ho_ImageReduced, out ho_DefaultEdges, "canny", 2, hv_MinContrast / 2,
+ hv_MinContrast);
+ HOperatorSet.CountObj(ho_DefaultEdges, out hv_NumberCand);
+ if ((int)(new HTuple(hv_NumberCand.TupleLess(10))) != 0)
+ {
+ ho_ImageMean.Dispose();
+ ho_RegionDynThresh.Dispose();
+ ho_RegionBorder.Dispose();
+ ho_RegionOpening1.Dispose();
+ ho_ConnectedRegions1.Dispose();
+ ho_SelectedRegions4.Dispose();
+ ho_SelectedRegions5.Dispose();
+ ho_RegionBorder2.Dispose();
+ ho_RegionTrans.Dispose();
+ ho_RegionErosion.Dispose();
+ ho_RegionBorder1.Dispose();
+ ho_RegionDilation2.Dispose();
+ ho_RegionDifference1.Dispose();
+ ho_RegionOpening.Dispose();
+ ho_ConnectedRegions.Dispose();
+ ho_SelectedRegions2.Dispose();
+ ho_SelectedRegions.Dispose();
+ ho_RegionFillUp.Dispose();
+ ho_SelectedRegions1.Dispose();
+ ho_RegionIntersection.Dispose();
+ ho_RegionFillUp1.Dispose();
+ ho_RegionDifference.Dispose();
+ ho_CaltabCandidates.Dispose();
+ ho_ObjectSelected.Dispose();
+ ho_ConnectedMarks.Dispose();
+ ho_ObjectSelectedCaltab.Dispose();
+ ho_RegionFillUpCand.Dispose();
+ ho_MarksCand.Dispose();
+ ho_RegionDilation1.Dispose();
+ ho_ImageReduced.Dispose();
+ ho_DefaultEdges.Dispose();
+ ho_UnionContours.Dispose();
+ ho_SelectedXLD.Dispose();
+ ho_SelectedXLD1.Dispose();
+
+ return;
+ }
+ ho_UnionContours.Dispose();
+ HOperatorSet.UnionCocircularContoursXld(ho_DefaultEdges, out ho_UnionContours,
+ 0.5, 0.1, 0.2, 30, 10, 10, "true", 1);
+ ho_SelectedXLD.Dispose();
+ HOperatorSet.SelectShapeXld(ho_UnionContours, out ho_SelectedXLD, "area", "and",
+ 30, 10000);
+ ho_SelectedXLD1.Dispose();
+ HOperatorSet.SelectShapeXld(ho_SelectedXLD, out ho_SelectedXLD1, "circularity",
+ "and", 0.4, 1);
+ ho_MarksCand.Dispose();
+ HOperatorSet.SelectShapeXld(ho_SelectedXLD1, out ho_MarksCand, "compactness",
+ "and", 1, 1.5);
+ HOperatorSet.AreaCenterXld(ho_MarksCand, out hv_Area, out hv_Dummy, out hv_Dummy,
+ out hv_DummyS);
+ HOperatorSet.CountObj(ho_MarksCand, out hv_Number);
+ if ((int)(new HTuple(hv_Number.TupleLess(4))) != 0)
+ {
+ ho_ImageMean.Dispose();
+ ho_RegionDynThresh.Dispose();
+ ho_RegionBorder.Dispose();
+ ho_RegionOpening1.Dispose();
+ ho_ConnectedRegions1.Dispose();
+ ho_SelectedRegions4.Dispose();
+ ho_SelectedRegions5.Dispose();
+ ho_RegionBorder2.Dispose();
+ ho_RegionTrans.Dispose();
+ ho_RegionErosion.Dispose();
+ ho_RegionBorder1.Dispose();
+ ho_RegionDilation2.Dispose();
+ ho_RegionDifference1.Dispose();
+ ho_RegionOpening.Dispose();
+ ho_ConnectedRegions.Dispose();
+ ho_SelectedRegions2.Dispose();
+ ho_SelectedRegions.Dispose();
+ ho_RegionFillUp.Dispose();
+ ho_SelectedRegions1.Dispose();
+ ho_RegionIntersection.Dispose();
+ ho_RegionFillUp1.Dispose();
+ ho_RegionDifference.Dispose();
+ ho_CaltabCandidates.Dispose();
+ ho_ObjectSelected.Dispose();
+ ho_ConnectedMarks.Dispose();
+ ho_ObjectSelectedCaltab.Dispose();
+ ho_RegionFillUpCand.Dispose();
+ ho_MarksCand.Dispose();
+ ho_RegionDilation1.Dispose();
+ ho_ImageReduced.Dispose();
+ ho_DefaultEdges.Dispose();
+ ho_UnionContours.Dispose();
+ ho_SelectedXLD.Dispose();
+ ho_SelectedXLD1.Dispose();
+
+ return;
+ }
+ hv_AreaMedian = ((hv_Area.TupleSort())).TupleSelect(hv_Number / 2);
+ ho_Marks.Dispose();
+ HOperatorSet.SelectShapeXld(ho_MarksCand, out ho_Marks, "area", "and", hv_AreaMedian - (hv_AreaMedian * 0.5),
+ hv_AreaMedian + (hv_AreaMedian * 0.5));
+ ho_ImageMean.Dispose();
+ ho_RegionDynThresh.Dispose();
+ ho_RegionBorder.Dispose();
+ ho_RegionOpening1.Dispose();
+ ho_ConnectedRegions1.Dispose();
+ ho_SelectedRegions4.Dispose();
+ ho_SelectedRegions5.Dispose();
+ ho_RegionBorder2.Dispose();
+ ho_RegionTrans.Dispose();
+ ho_RegionErosion.Dispose();
+ ho_RegionBorder1.Dispose();
+ ho_RegionDilation2.Dispose();
+ ho_RegionDifference1.Dispose();
+ ho_RegionOpening.Dispose();
+ ho_ConnectedRegions.Dispose();
+ ho_SelectedRegions2.Dispose();
+ ho_SelectedRegions.Dispose();
+ ho_RegionFillUp.Dispose();
+ ho_SelectedRegions1.Dispose();
+ ho_RegionIntersection.Dispose();
+ ho_RegionFillUp1.Dispose();
+ ho_RegionDifference.Dispose();
+ ho_CaltabCandidates.Dispose();
+ ho_ObjectSelected.Dispose();
+ ho_ConnectedMarks.Dispose();
+ ho_ObjectSelectedCaltab.Dispose();
+ ho_RegionFillUpCand.Dispose();
+ ho_MarksCand.Dispose();
+ ho_RegionDilation1.Dispose();
+ ho_ImageReduced.Dispose();
+ ho_DefaultEdges.Dispose();
+ ho_UnionContours.Dispose();
+ ho_SelectedXLD.Dispose();
+ ho_SelectedXLD1.Dispose();
+
+ return;
+ }
+
+
+
+
+ /// <summary>
+ /// Determines whether the calibration image is overexposed
+ /// </summary>
+ public void eval_caltab_overexposure(HObject ho_Image,
+ HObject ho_Caltab,
+ out HTuple hv_OverexposureScore)
+ {
+
+ // Local iconic variables
+
+ HObject ho_ImageReduced, ho_Region;
+
+
+ // Local control variables
+
+ HTuple hv_AreaCaltab, hv_Row, hv_Column, hv_AreaOverExp;
+ HTuple hv_Thresh, hv_Ratio;
+
+ // Initialize local and output iconic variables
+ HOperatorSet.GenEmptyObj(out ho_ImageReduced);
+ HOperatorSet.GenEmptyObj(out ho_Region);
+
+ //returns a measure of the amount of saturation of the plate
+ hv_OverexposureScore = 0.0;
+ HOperatorSet.AreaCenter(ho_Caltab, out hv_AreaCaltab, out hv_Row, out hv_Column);
+ if ((int)((new HTuple(hv_AreaCaltab.TupleEqual(0))).TupleOr(new HTuple(hv_AreaCaltab.TupleEqual(
+ new HTuple())))) != 0)
+ {
+ ho_ImageReduced.Dispose();
+ ho_Region.Dispose();
+
+ return;
+ }
+ ho_ImageReduced.Dispose();
+ HOperatorSet.ReduceDomain(ho_Image, ho_Caltab, out ho_ImageReduced);
+ ho_Region.Dispose();
+ HOperatorSet.Threshold(ho_ImageReduced, out ho_Region, 255, 255);
+ HOperatorSet.AreaCenter(ho_Region, out hv_AreaOverExp, out hv_Row, out hv_Column);
+ hv_Thresh = 0.15;
+ hv_Ratio = (hv_AreaOverExp.TupleReal()) / hv_AreaCaltab;
+ if ((int)(new HTuple(hv_Ratio.TupleLess(hv_Thresh))) != 0)
+ {
+ hv_OverexposureScore = (((new HTuple(1.0)).TupleConcat(1 - (hv_Ratio / hv_Thresh)))).TupleMin()
+ ;
+ }
+ ho_ImageReduced.Dispose();
+ ho_Region.Dispose();
+
+ return;
+ }
+
+
+ /// <summary>
+ /// Evaluates the gray value contrast between the marks and the calibration
+ /// plate and the homogeneity of the used illumination.
+ /// </summary>
+ public void eval_caltab_contrast_homogeneity(HObject ho_Image,
+ HObject ho_Marks,
+ out HTuple hv_Contrast,
+ out HTuple hv_ContrastScore,
+ out HTuple hv_HomogeneityScore)
+ {
+
+ // Local iconic variables
+
+ HObject ho_Region, ho_RegionDilation;
+
+
+ // Local control variables
+
+ HTuple hv_Number, hv_Min, hv_Max, hv_Range;
+ HTuple hv_MinContrast, hv_MaxContrast, hv_DeviationMax;
+
+ // Initialize local and output iconic variables
+ HOperatorSet.GenEmptyObj(out ho_Region);
+ HOperatorSet.GenEmptyObj(out ho_RegionDilation);
+
+ hv_ContrastScore = 0.0;
+ hv_Contrast = 0.0;
+ hv_HomogeneityScore = 0.0;
+ HOperatorSet.CountObj(ho_Marks, out hv_Number);
+ if ((int)(new HTuple(hv_Number.TupleLess(4))) != 0)
+ {
+ ho_Region.Dispose();
+ ho_RegionDilation.Dispose();
+
+ return;
+ }
+ ho_Region.Dispose();
+ HOperatorSet.GenRegionContourXld(ho_Marks, out ho_Region, "margin");
+ ho_RegionDilation.Dispose();
+ HOperatorSet.DilationCircle(ho_Region, out ho_RegionDilation, 5.5);
+ HOperatorSet.MinMaxGray(ho_RegionDilation, ho_Image, 3, out hv_Min, out hv_Max,
+ out hv_Range);
+ //Calculate contrast score
+ hv_Contrast = hv_Range.TupleMean();
+ hv_MinContrast = 70;
+ hv_MaxContrast = 160;
+ if ((int)(new HTuple(hv_Contrast.TupleGreater(hv_MinContrast))) != 0)
+ {
+ hv_ContrastScore = (hv_Contrast - hv_MinContrast) / (hv_MaxContrast - hv_MinContrast);
+ hv_ContrastScore = ((hv_ContrastScore.TupleConcat(1.0))).TupleMin();
+ }
+ //Now for the homogeneity score
+ HOperatorSet.TupleDeviation(hv_Max, out hv_DeviationMax);
+ hv_HomogeneityScore = 1.1 - (hv_DeviationMax / 40.0);
+ hv_HomogeneityScore = ((((((hv_HomogeneityScore.TupleConcat(1.0))).TupleMin()
+ )).TupleConcat(0.0))).TupleMax();
+ ho_Region.Dispose();
+ ho_RegionDilation.Dispose();
+
+ return;
+
+ }
+
+ /// <summary>
+ /// Evaluates the area covered by the calibration plate in the calibration
+ /// image.
+ /// </summary>
+ public void eval_caltab_size(HObject ho_Image,
+ HObject ho_Caltab,
+ HObject ho_Marks,
+ out HTuple hv_SizeScore)
+ {
+
+
+ // Local iconic variables
+
+ HObject ho_Region = null, ho_RegionUnion = null;
+
+
+ // Local control variables
+
+ HTuple hv_Width, hv_Height, hv_Number, hv_Row1 = new HTuple();
+ HTuple hv_Column1 = new HTuple(), hv_Phi1 = new HTuple(), hv_Length1 = new HTuple();
+ HTuple hv_Length2 = new HTuple(), hv_Area = new HTuple(), hv_Row = new HTuple();
+ HTuple hv_Column = new HTuple(), hv_MinRatio, hv_MaxRatio;
+ HTuple hv_Ratio;
+
+ // Initialize local and output iconic variables
+ HOperatorSet.GenEmptyObj(out ho_Region);
+ HOperatorSet.GenEmptyObj(out ho_RegionUnion);
+
+ hv_SizeScore = 0.0;
+ HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
+ HOperatorSet.CountObj(ho_Marks, out hv_Number);
+ if ((int)(new HTuple(hv_Number.TupleGreaterEqual(4))) != 0)
+ {
+ //Best approach: Use the surrounding box of the marks as reference size
+ ho_Region.Dispose();
+ HOperatorSet.GenRegionContourXld(ho_Marks, out ho_Region, "filled");
+ ho_RegionUnion.Dispose();
+ HOperatorSet.Union1(ho_Region, out ho_RegionUnion);
+ HOperatorSet.SmallestRectangle2(ho_RegionUnion, out hv_Row1, out hv_Column1,
+ out hv_Phi1, out hv_Length1, out hv_Length2);
+ hv_Area = (hv_Length2 * hv_Length1) * 4;
+ }
+ else
+ {
+ //If no marks could be found: use the caltab as reference size
+ HOperatorSet.AreaCenter(ho_Caltab, out hv_Area, out hv_Row, out hv_Column);
+ if ((int)((new HTuple(hv_Area.TupleEqual(0))).TupleOr(new HTuple(hv_Area.TupleEqual(
+ new HTuple())))) != 0)
+ {
+ ho_Region.Dispose();
+ ho_RegionUnion.Dispose();
+
+ return;
+ }
+ }
+ hv_MinRatio = 0.015;
+ hv_MaxRatio = 0.075;
+ hv_Ratio = (hv_Area.TupleReal()) / (hv_Width * hv_Height);
+ if ((int)(new HTuple(hv_Ratio.TupleGreater(hv_MinRatio))) != 0)
+ {
+ hv_SizeScore = (hv_Ratio - hv_MinRatio) / (hv_MaxRatio - hv_MinRatio);
+ hv_SizeScore = (((new HTuple(1.0)).TupleConcat(hv_SizeScore))).TupleMin();
+ }
+ ho_Region.Dispose();
+ ho_RegionUnion.Dispose();
+
+ return;
+ }
+
+
+ /// <summary>
+ /// Display the axes of a 3d coordinate system.
+ /// </summary>
+ private void disp_3d_coord_system(HTuple hv_WindowHandle,
+ HTuple hv_CamParam,
+ HTuple hv_Pose,
+ HTuple hv_CoordAxesLength)
+ {
+
+ // Local iconic variables
+
+ HObject ho_ContX, ho_ContY, ho_ContZ;
+
+
+ // Local control variables
+
+ HTuple hv_TransWorld2Cam, hv_OrigCamX, hv_OrigCamY;
+ HTuple hv_OrigCamZ, hv_Row0, hv_Column0, hv_X, hv_Y, hv_Z;
+ HTuple hv_RowAxX, hv_ColumnAxX, hv_RowAxY, hv_ColumnAxY;
+ HTuple hv_RowAxZ, hv_ColumnAxZ;
+
+ // Initialize local and output iconic variables
+ HOperatorSet.GenEmptyObj(out ho_ContX);
+ HOperatorSet.GenEmptyObj(out ho_ContY);
+ HOperatorSet.GenEmptyObj(out ho_ContZ);
+
+ if ((int)(new HTuple((new HTuple(hv_Pose.TupleLength())).TupleNotEqual(7))) != 0)
+ {
+ ho_ContX.Dispose();
+ ho_ContY.Dispose();
+ ho_ContZ.Dispose();
+
+ return;
+ }
+ if ((int)(new HTuple(((hv_Pose.TupleSelect(5))).TupleEqual(0.0))) != 0)
+ {
+ ho_ContX.Dispose();
+ ho_ContY.Dispose();
+ ho_ContZ.Dispose();
+
+ return;
+ }
+ HOperatorSet.PoseToHomMat3d(hv_Pose, out hv_TransWorld2Cam);
+ //Project the world origin into the image
+ HOperatorSet.AffineTransPoint3d(hv_TransWorld2Cam, 0, 0, 0, out hv_OrigCamX,
+ out hv_OrigCamY, out hv_OrigCamZ);
+ HOperatorSet.Project3dPoint(hv_OrigCamX, hv_OrigCamY, hv_OrigCamZ, hv_CamParam,
+ out hv_Row0, out hv_Column0);
+ //Project the coordinate axes into the image
+ HOperatorSet.AffineTransPoint3d(hv_TransWorld2Cam, hv_CoordAxesLength, 0, 0,
+ out hv_X, out hv_Y, out hv_Z);
+ HOperatorSet.Project3dPoint(hv_X, hv_Y, hv_Z, hv_CamParam, out hv_RowAxX, out hv_ColumnAxX);
+ HOperatorSet.AffineTransPoint3d(hv_TransWorld2Cam, 0, hv_CoordAxesLength, 0,
+ out hv_X, out hv_Y, out hv_Z);
+ HOperatorSet.Project3dPoint(hv_X, hv_Y, hv_Z, hv_CamParam, out hv_RowAxY, out hv_ColumnAxY);
+ HOperatorSet.AffineTransPoint3d(hv_TransWorld2Cam, 0, 0, hv_CoordAxesLength,
+ out hv_X, out hv_Y, out hv_Z);
+ HOperatorSet.Project3dPoint(hv_X, hv_Y, hv_Z, hv_CamParam, out hv_RowAxZ, out hv_ColumnAxZ);
+ ho_ContX.Dispose();
+ gen_arrow_cont(out ho_ContX, hv_Row0, hv_Column0, hv_RowAxX, hv_ColumnAxX);
+ ho_ContY.Dispose();
+ gen_arrow_cont(out ho_ContY, hv_Row0, hv_Column0, hv_RowAxY, hv_ColumnAxY);
+ ho_ContZ.Dispose();
+ gen_arrow_cont(out ho_ContZ, hv_Row0, hv_Column0, hv_RowAxZ, hv_ColumnAxZ);
+ if (HDevWindowStack.IsOpen())
+ {
+ //dev_display (ContX)
+ }
+ if (HDevWindowStack.IsOpen())
+ {
+ //dev_display (ContY)
+ }
+ if (HDevWindowStack.IsOpen())
+ {
+ //dev_display (ContZ)
+ }
+ HOperatorSet.DispObj(ho_ContX, hv_WindowHandle);
+ HOperatorSet.DispObj(ho_ContY, hv_WindowHandle);
+ HOperatorSet.DispObj(ho_ContZ, hv_WindowHandle);
+ HOperatorSet.SetTposition(hv_WindowHandle, hv_RowAxX + 3, hv_ColumnAxX + 3);
+ HOperatorSet.WriteString(hv_WindowHandle, "X");
+ HOperatorSet.SetTposition(hv_WindowHandle, hv_RowAxY + 3, hv_ColumnAxY + 3);
+ HOperatorSet.WriteString(hv_WindowHandle, "Y");
+ HOperatorSet.SetTposition(hv_WindowHandle, hv_RowAxZ + 3, hv_ColumnAxZ + 3);
+ HOperatorSet.WriteString(hv_WindowHandle, "Z");
+ ho_ContX.Dispose();
+ ho_ContY.Dispose();
+ ho_ContZ.Dispose();
+
+ return;
+ }
+
+ /// <summary>
+ /// Generate a contour in form of an arrow.
+ /// </summary>
+ private void gen_arrow_cont(out HObject ho_Arrow,
+ HTuple hv_Row1,
+ HTuple hv_Column1,
+ HTuple hv_Row2,
+ HTuple hv_Column2)
+ {
+
+ // Local iconic variables
+
+ HObject ho_Cross1, ho_Cross2, ho_CrossP1, ho_CrossP2;
+
+
+ // Local control variables
+
+ HTuple hv_Length, hv_Angle, hv_MinArrowLength;
+ HTuple hv_DRow, hv_DCol, hv_ArrowLength, hv_Phi, hv_P1R;
+ HTuple hv_P1C, hv_P2R, hv_P2C;
+
+ // Initialize local and output iconic variables
+ HOperatorSet.GenEmptyObj(out ho_Arrow);
+ HOperatorSet.GenEmptyObj(out ho_Cross1);
+ HOperatorSet.GenEmptyObj(out ho_Cross2);
+ HOperatorSet.GenEmptyObj(out ho_CrossP1);
+ HOperatorSet.GenEmptyObj(out ho_CrossP2);
+
+ //Generate a contour in form of a arrow
+ hv_Length = 7;
+ hv_Angle = 40;
+ hv_MinArrowLength = 2;
+ hv_DRow = hv_Row2 - hv_Row1;
+ hv_DCol = hv_Column2 - hv_Column1;
+ hv_ArrowLength = (((hv_DRow * hv_DRow) + (hv_DCol * hv_DCol))).TupleSqrt();
+ if ((int)(new HTuple(hv_ArrowLength.TupleLess(hv_MinArrowLength))) != 0)
+ {
+ hv_Length = 0;
+ }
+ HOperatorSet.TupleAtan2(hv_DRow, -hv_DCol, out hv_Phi);
+ hv_P1R = hv_Row2 - (hv_Length * (((hv_Phi - (hv_Angle.TupleRad()))).TupleSin()));
+ hv_P1C = hv_Column2 + (hv_Length * (((hv_Phi - (hv_Angle.TupleRad()))).TupleCos()));
+ hv_P2R = hv_Row2 - (hv_Length * (((hv_Phi + (hv_Angle.TupleRad()))).TupleSin()));
+ hv_P2C = hv_Column2 + (hv_Length * (((hv_Phi + (hv_Angle.TupleRad()))).TupleCos()));
+ ho_Cross1.Dispose();
+ HOperatorSet.GenCrossContourXld(out ho_Cross1, hv_Row1, hv_Column1, 6, 0.785398);
+ ho_Cross2.Dispose();
+ HOperatorSet.GenCrossContourXld(out ho_Cross2, hv_Row2, hv_Column2, 6, 0.785398);
+ ho_CrossP1.Dispose();
+ HOperatorSet.GenCrossContourXld(out ho_CrossP1, hv_P1R, hv_P1C, 6, 0.785398);
+ ho_CrossP2.Dispose();
+ HOperatorSet.GenCrossContourXld(out ho_CrossP2, hv_P2R, hv_P2C, 6, 0.785398);
+ ho_Arrow.Dispose();
+ HOperatorSet.GenContourPolygonXld(out ho_Arrow, ((((((hv_Row1.TupleConcat(hv_Row2))).TupleConcat(
+ hv_P1R))).TupleConcat(hv_Row2))).TupleConcat(hv_P2R), ((((((hv_Column1.TupleConcat(
+ hv_Column2))).TupleConcat(hv_P1C))).TupleConcat(hv_Column2))).TupleConcat(
+ hv_P2C));
+ ho_Cross1.Dispose();
+ ho_Cross2.Dispose();
+ ho_CrossP1.Dispose();
+ ho_CrossP2.Dispose();
+
+ return;
+ }
+
+ private void tuple_equal_greater(HTuple hv_Tuple,
+ HTuple hv_Threshold,
+ out HTuple hv_Selected,
+ out HTuple hv_Indices)
+ {
+
+ // Local control variables
+
+ HTuple hv_Sgn;
+
+ // Initialize local and output iconic variables
+
+ hv_Selected = new HTuple();
+ HOperatorSet.TupleSgn(hv_Tuple - hv_Threshold, out hv_Sgn);
+ HOperatorSet.TupleFind(hv_Sgn, 1, out hv_Indices);
+ if ((int)((new HTuple((new HTuple(hv_Indices.TupleLength())).TupleGreater(1))).TupleOr(
+ new HTuple(((hv_Indices.TupleSelect(0))).TupleNotEqual(-1)))) != 0)
+ {
+ HOperatorSet.TupleSelect(hv_Tuple, hv_Indices, out hv_Selected);
+ }
+
+ return;
+ }
+
+ private void gen_fuzzy_weight_funct(HTuple hv_NPoints,
+ HTuple hv_Min,
+ HTuple hv_Max,
+ HTuple hv_LowPass,
+ HTuple hv_HighPass,
+ out HTuple hv_FuzzyFunct)
+ {
+
+ // Local control variables
+
+ HTuple hv_Ones, hv_Index, hv_X, hv_Y, hv_Dummy;
+ HTuple hv_IndicesTrans, hv_IndicesHigh, hv_i, hv_NTransPoints;
+
+ // Initialize local and output iconic variables
+
+ //generates a function which is 0.0 for values lower than LowPass, 1.0 for
+ //values over HighPass, and grows linearly for values in between the two
+ HOperatorSet.TupleGenConst(hv_NPoints, 1, out hv_Ones);
+ hv_Index = ((hv_Ones.TupleCumul()) - 1) / ((new HTuple(hv_Ones.TupleLength())).TupleReal()
+ );
+ hv_X = (hv_Index * (hv_Max - hv_Min)) + hv_Min;
+ HOperatorSet.TupleGenConst(new HTuple(hv_X.TupleLength()), 0.0, out hv_Y);
+ tuple_equal_greater(hv_X, hv_LowPass, out hv_Dummy, out hv_IndicesTrans);
+ tuple_equal_greater(hv_X, hv_HighPass, out hv_Dummy, out hv_IndicesHigh);
+ //ramp from LowPass (0.0) to Highpass (1.0)
+ hv_i = 0;
+ while ((int)(new HTuple(((hv_IndicesTrans.TupleSelect(hv_i))).TupleLess(hv_IndicesHigh.TupleSelect(
+ 0)))) != 0)
+ {
+ hv_i = hv_i + 1;
+ }
+ hv_NTransPoints = hv_i.Clone();
+ for (hv_i = 0; hv_i.Continue(hv_NTransPoints - 1, 1); hv_i = hv_i.TupleAdd(1))
+ {
+ if (hv_Y == null)
+ hv_Y = new HTuple();
+ hv_Y[hv_IndicesTrans.TupleSelect(hv_i)] = (hv_i.TupleReal()) / hv_NTransPoints;
+ }
+ for (hv_i = hv_IndicesTrans.TupleSelect(hv_NTransPoints); hv_i.Continue((new HTuple(hv_Y.TupleLength()
+ )) - 1, 1); hv_i = hv_i.TupleAdd(1))
+ {
+ if (hv_Y == null)
+ hv_Y = new HTuple();
+ hv_Y[hv_i] = 1.0;
+ }
+ HOperatorSet.CreateFunct1dPairs(hv_X, hv_Y, out hv_FuzzyFunct);
+
+ return;
+ }
+
+
+ /// <summary>
+ /// Measures the tilt that is used for the plates in the set
+ /// of calibration images. The more tilted plates are used
+ /// in the image set, the better you can correct the radial
+ /// distortion of the lense by performing the calibration.
+ /// </summary>
+ public void eval_caltab_tilt(HTuple hv_FinalPoses,
+ out HTuple hv_TiltScore)
+ {
+
+ // Local control variables
+
+ HTuple hv_NImages, hv_Ones, hv_Index, hv_Slant;
+ HTuple hv_Pan, hv_FuzzyFunct, hv_SlantWeight, hv_PanWeight;
+ HTuple hv_TmpPan, hv_TmpSlant;
+
+ // Initialize local and output iconic variables
+
+ hv_NImages = (new HTuple(hv_FinalPoses.TupleLength())) / 7;
+ HOperatorSet.TupleGenConst(hv_NImages, 1, out hv_Ones);
+ hv_Index = (hv_Ones.TupleCumul()) - 1;
+ HOperatorSet.TupleSelect(hv_FinalPoses, (7 * hv_Index) + 3, out hv_Slant);
+ HOperatorSet.TupleSelect(hv_FinalPoses, (7 * hv_Index) + 4, out hv_Pan);
+ for (hv_Index = 0; (int)hv_Index <= (int)((new HTuple(hv_Slant.TupleLength())) - 1); hv_Index = (int)hv_Index + 1)
+ {
+ if ((int)(new HTuple(((hv_Slant.TupleSelect(hv_Index))).TupleGreater(180))) != 0)
+ {
+ if (hv_Slant == null)
+ hv_Slant = new HTuple();
+ hv_Slant[hv_Index] = 360 - (hv_Slant.TupleSelect(hv_Index));
+ }
+ }
+ for (hv_Index = 0; (int)hv_Index <= (int)((new HTuple(hv_Pan.TupleLength())) - 1); hv_Index = (int)hv_Index + 1)
+ {
+ if ((int)(new HTuple(((hv_Pan.TupleSelect(hv_Index))).TupleGreater(180))) != 0)
+ {
+ if (hv_Pan == null)
+ hv_Pan = new HTuple();
+ hv_Pan[hv_Index] = 360 - (hv_Pan.TupleSelect(hv_Index));
+ }
+ }
+ hv_Pan = hv_Pan.TupleRad();
+ hv_Slant = hv_Slant.TupleRad();
+ //function acting as a fuzzy weighting
+ gen_fuzzy_weight_funct(256, (new HTuple(0.0)).TupleRad(), (new HTuple(90.0)).TupleRad()
+ , (new HTuple(15.0)).TupleRad(), (new HTuple(40.0)).TupleRad(), out hv_FuzzyFunct);
+ HOperatorSet.GetYValueFunct1d(hv_FuzzyFunct, hv_Slant, "constant", out hv_SlantWeight);
+ HOperatorSet.GetYValueFunct1d(hv_FuzzyFunct, hv_Pan, "constant", out hv_PanWeight);
+ //Calculate score value
+ hv_TmpPan = (hv_PanWeight.TupleSum()) / 6;
+ hv_TmpPan = ((hv_TmpPan.TupleConcat(0.5))).TupleMin();
+ hv_TmpSlant = (hv_SlantWeight.TupleSum()) / 6;
+ hv_TmpSlant = ((hv_TmpSlant.TupleConcat(0.5))).TupleMin();
+ hv_TiltScore = hv_TmpSlant + hv_TmpPan;
+
+ return;
+ }
+
+
+ /// <summary>
+ /// Evaluates the distribution of the marks and hence the plates
+ /// used for the calibration images. Precise measurements can only be
+ /// achieved if the field view of the camera is covered well by the
+ /// calibration plate in the images.
+ /// </summary>
+ public void eval_marks_distribution(HTuple hv_NRCoord,
+ HTuple hv_NCCoord,
+ HTuple hv_Width,
+ HTuple hv_Height,
+ out HTuple hv_MarksDistributionScore)
+ {
+ // Local iconic variables
+
+ HObject ho_Region, ho_DistanceImage, ho_Mask;
+
+
+ // Local control variables
+
+ HTuple hv_Border, hv_Min, hv_Max, hv_Range;
+ HTuple hv_ImageDiagonal, hv_MinThresh, hv_MaxThresh, hv_Ratio;
+ HTuple hv_Tmp1, hv_Tmp2;
+
+ // Initialize local and output iconic variables
+ HOperatorSet.GenEmptyObj(out ho_Region);
+ HOperatorSet.GenEmptyObj(out ho_DistanceImage);
+ HOperatorSet.GenEmptyObj(out ho_Mask);
+
+ //Determine the distances between the marks centers
+ ho_Region.Dispose();
+ HOperatorSet.GenRegionPoints(out ho_Region, hv_NRCoord, hv_NCCoord);
+ ho_DistanceImage.Dispose();
+ HOperatorSet.DistanceTransform(ho_Region, out ho_DistanceImage, "octagonal",
+ "false", hv_Width, hv_Height);
+ //A clipping is needed because the marks cannot come close to the border
+ hv_Border = (((hv_Width.TupleConcat(hv_Height))).TupleMax()) / 15;
+ ho_Mask.Dispose();
+ HOperatorSet.GenRectangle1(out ho_Mask, hv_Border, hv_Border, (hv_Height - 1) - hv_Border,
+ (hv_Width - 1) - hv_Border);
+ HOperatorSet.MinMaxGray(ho_Mask, ho_DistanceImage, 0, out hv_Min, out hv_Max,
+ out hv_Range);
+ HOperatorSet.DistancePp(0, 0, hv_Height - 1, hv_Width - 1, out hv_ImageDiagonal);
+ hv_MinThresh = 0.3;
+ hv_MaxThresh = 0.85;
+ hv_Ratio = (hv_Max / hv_ImageDiagonal) * 2.5;
+ hv_Tmp1 = 1 - hv_Ratio;
+ hv_Tmp2 = (hv_Tmp1 - hv_MinThresh) / (hv_MaxThresh - hv_MinThresh);
+ hv_MarksDistributionScore = ((((((hv_Tmp2.TupleConcat(1.0))).TupleMin())).TupleConcat(
+ 0.0))).TupleMax();
+ ho_Region.Dispose();
+ ho_DistanceImage.Dispose();
+ ho_Mask.Dispose();
+
+ return;
+
+ }
+
+ /// <summary>
+ /// Auxiliary method for display purposes. Returns the coordinate system
+ /// described by the parameters <c>hv_CamParam</c> and <c>hv_Pose</c>
+ /// as an iconic object.
+ /// </summary>
+ public void get_3d_coord_system(HObject ho_ImageReference,
+ out HObject ho_CoordSystemRegion,
+ HTuple hv_CamParam,
+ HTuple hv_Pose,
+ HTuple hv_CoordAxesLength)
+ {
+
+ // Local iconic variables
+
+ HObject ho_CoordSystemImage;
+
+
+ // Local control variables
+
+ HTuple hv_Width, hv_Height, hv_OldBG, hv_WindowHandle;
+
+ // Initialize local and output iconic variables
+ HOperatorSet.GenEmptyObj(out ho_CoordSystemRegion);
+ HOperatorSet.GenEmptyObj(out ho_CoordSystemImage);
+
+ HOperatorSet.GetImageSize(ho_ImageReference, out hv_Width, out hv_Height);
+ HOperatorSet.GetWindowAttr("background_color", out hv_OldBG);
+ HOperatorSet.SetWindowAttr("background_color", "black");
+ HOperatorSet.OpenWindow(0, 0, hv_Width, hv_Height, 0, "buffer", "", out hv_WindowHandle);
+ HOperatorSet.SetWindowAttr("background_color", hv_OldBG);
+ HOperatorSet.SetColor(hv_WindowHandle, "white");
+ HOperatorSet.SetPart(hv_WindowHandle, 0, 0, hv_Height - 1, hv_Width - 1);
+ disp_3d_coord_system(hv_WindowHandle, hv_CamParam, hv_Pose, hv_CoordAxesLength);
+ ho_CoordSystemImage.Dispose();
+ HOperatorSet.DumpWindowImage(out ho_CoordSystemImage, hv_WindowHandle);
+ HOperatorSet.CloseWindow(hv_WindowHandle);
+ ho_CoordSystemRegion.Dispose();
+ HOperatorSet.Threshold(ho_CoordSystemImage, out ho_CoordSystemRegion, 255, 255);
+ ho_CoordSystemImage.Dispose();
+
+ return;
+ }
+ }
+}
diff --git a/HalconTools/ContourModule/ContourAssistant.cs b/HalconTools/ContourModule/ContourAssistant.cs
new file mode 100644
index 0000000..c93a411
--- /dev/null
+++ b/HalconTools/ContourModule/ContourAssistant.cs
@@ -0,0 +1,224 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.IO;
+using HalconDotNet;
+using System.ComponentModel;
+
+namespace HalconTools
+{
+ public delegate void ContourDelegate(object sender, HImage image, ContourResult result);
+
+ public class ContourAssistant
+ {
+ public event ContourDelegate ContourDone;
+
+ /// <summary>HALCON image used for .</summary>
+ public HImage mImage;
+ public int mWidth;
+ public int mHeight;
+
+ public HWndCtrl viewController;
+ public ROIController roiController;
+
+ public ContourParam mContourPara = new ContourParam();
+ public HObject mObject;
+ public HObject mThresholdObj;
+ public HObject mSelectObj;
+
+ public ContourResult mContourResult = new ContourResult();
+
+ public ContourAssistant()
+ {
+ initObj();
+ }
+
+ public ContourAssistant(HWindowControl viewPort)
+ {
+ viewController = new HWndCtrl(viewPort);
+ roiController = new ROIController();
+
+ initObj();
+ }
+
+ public void initObj()
+ {
+ HOperatorSet.GenEmptyObj(out mObject);
+ mObject.Dispose();
+ HOperatorSet.GenEmptyObj(out mThresholdObj);
+ mThresholdObj.Dispose();
+ HOperatorSet.GenEmptyObj(out mSelectObj);
+ mSelectObj.Dispose();
+ }
+
+ public bool SetImage(string filename)
+ {
+ string tmp;
+
+ try
+ {
+ mImage = new HImage(filename);
+ mImage.GetImagePointer1(out tmp, out mWidth, out mHeight);
+ }
+ catch (HOperatorException e)
+ {
+ mImage = null;
+ return false;
+ }
+ return true;
+ }
+
+ public bool SetImage(HImage image)
+ {
+ string tmp;
+
+ try
+ {
+ mImage = image;
+ mImage.GetImagePointer1(out tmp, out mWidth, out mHeight);
+ }
+ catch (HOperatorException e)
+ {
+ mImage = null;
+ return false;
+ }
+ return true;
+ }
+
+ public HImage GetImage()
+ {
+ return mImage;
+ }
+
+ /// <summary>
+ /// Writes the new image to graphic window
+ /// </summary>
+ public void UpdateImage()
+ {
+ viewController.resetAll();
+ viewController.useROIController(roiController);
+ viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
+
+ viewController.addIconicVar(mImage);
+ viewController.repaint();
+ }
+
+ public void UpdateObj(HObject obj)
+ {
+ viewController.resetAll();
+ viewController.useROIController(roiController);
+ viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
+
+ viewController.changeGraphicSettings(GraphicsContext.GC_COLOR, "blue");
+ viewController.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 1);
+
+ viewController.addIconicVar(obj);
+ viewController.repaint();
+ }
+
+ public void UpdateObj(HObject obj, string color)
+ {
+ viewController.resetAll();
+ viewController.useROIController(roiController);
+ viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
+
+ viewController.changeGraphicSettings(GraphicsContext.GC_COLOR, color);
+ viewController.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 1);
+
+ viewController.addIconicVar(obj);
+ viewController.repaint();
+ }
+
+ public void SetPara(ContourParam para)
+ {
+ this.mContourPara.AreaMax = para.AreaMax;
+ this.mContourPara.AreaMin = para.AreaMin;
+ this.mContourPara.ThresholdMax = para.ThresholdMax;
+ this.mContourPara.ThresholdMin = para.ThresholdMin;
+ this.mContourPara.SelectObj = para.SelectObj;
+ }
+
+ /// <summary>
+ /// 浜屽�煎寲鍥惧儚
+ /// </summary>
+ /// <param name="image">鍥惧儚</param>
+ /// <returns></returns>
+ public HObject ThresholdObj(HImage image)
+ {
+ HObject tmpObj;
+ HOperatorSet.GenEmptyObj(out tmpObj);
+ tmpObj.Dispose();
+
+ HOperatorSet.Threshold(image, out tmpObj, mContourPara.ThresholdMin, mContourPara.ThresholdMax);
+
+ return tmpObj;
+ }
+
+ /// <summary>
+ /// 鏍规嵁闈㈢Н鍓旈櫎鐗╀綋
+ /// </summary>
+ /// <param name="obj"></param>
+ /// <returns></returns>
+ public HObject SelectObj(HObject obj)
+ {
+ HObject tmpObj1, tmpObj2;
+
+ //鍏堝皢鐗╀綋鍒嗗紑
+ HOperatorSet.GenEmptyObj(out tmpObj1);
+ tmpObj1.Dispose();
+ HOperatorSet.Connection(obj, out tmpObj1);
+ //閫夋嫨鐗╀綋
+ HOperatorSet.GenEmptyObj(out tmpObj2);
+ tmpObj2.Dispose();
+ HOperatorSet.SelectShape(tmpObj1, out tmpObj2, "area", "and", mContourPara.AreaMin, mContourPara.AreaMax);
+
+ return tmpObj2;
+ }
+
+ /// <summary>
+ /// 鏍规嵁搴忓彿閫夋嫨鐗╀綋
+ /// </summary>
+ /// <param name="obj"></param>
+ /// <returns></returns>
+ public HObject Select(HObject obj)
+ {
+ HObject tmpObj;
+ HOperatorSet.GenEmptyObj(out tmpObj);
+ tmpObj.Dispose();
+ HOperatorSet.SelectObj(obj, out tmpObj, mContourPara.SelectObj);
+
+ return tmpObj;
+ }
+
+ public void Run()
+ {
+ mThresholdObj = ThresholdObj(mImage);
+ mSelectObj = SelectObj(mThresholdObj);
+
+ if (mSelectObj.CountObj() == 0) return;
+
+ mObject = Select(mSelectObj);
+
+ mContourResult.mObject = mObject;
+
+ //鑾峰緱鍚勭缁撴灉
+ HTuple Area = null, Row = null, Col = null, hv_Rows1 = null, hv_Columns1 = null;
+
+ HOperatorSet.AreaCenter(mObject, out Area, out Row, out Col);
+ mContourResult.mArea = Area;
+ mContourResult.center_Row = Row;
+ mContourResult.center_Column =Col;
+
+ HOperatorSet.GetRegionContour(mObject, out hv_Rows1, out hv_Columns1);
+ mContourResult.hv_Columns = hv_Columns1;
+ mContourResult.hv_Rows = hv_Rows1;
+
+ if (ContourDone != null)
+ {
+ ContourDone(this, mImage, mContourResult);
+ }
+ }
+
+ }
+}
diff --git a/HalconTools/ContourModule/ContourParam.cs b/HalconTools/ContourModule/ContourParam.cs
new file mode 100644
index 0000000..6d827dc
--- /dev/null
+++ b/HalconTools/ContourModule/ContourParam.cs
@@ -0,0 +1,33 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HalconTools
+{
+ public class ContourParam
+ {
+ public int ThresholdMin { set; get; }
+
+ public int ThresholdMax { set; get; }
+
+ public int AreaMin { set; get; }
+
+ public int AreaMax { set; get; }
+
+ public int SelectObj { set; get; }
+
+ public ContourParam()
+ {
+ }
+
+ public ContourParam(int thresholdMin, int thresholdMax, int areaMin, int areaMax, int selectObj)
+ {
+ this.ThresholdMax = thresholdMax;
+ this.ThresholdMin = thresholdMin;
+ this.AreaMax = areaMax;
+ this.AreaMin = areaMin;
+ this.SelectObj = selectObj;
+ }
+ }
+}
\ No newline at end of file
diff --git a/HalconTools/ContourModule/ContourResult.cs b/HalconTools/ContourModule/ContourResult.cs
new file mode 100644
index 0000000..4c457fa
--- /dev/null
+++ b/HalconTools/ContourModule/ContourResult.cs
@@ -0,0 +1,43 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public class ContourResult
+ {
+ public ContourResult()
+ {
+ mContours = new HXLDCont();
+ mContLine = new HXLDCont();
+ mContPoints = new HXLDCont();
+
+ HOperatorSet.GenEmptyObj(out mObject);
+ // mObject.Dispose();
+ }
+
+ /// <summary>
+ /// Model contour applied for model detection
+ /// </summary>
+ public HXLDCont mContours;
+
+ public HXLDCont mContLine;
+
+ public HXLDCont mContPoints;
+
+ public HTuple hv_Rows;
+
+ public HTuple hv_Columns;
+
+ public HTuple center_Row;
+
+ public HTuple center_Column;
+
+ public HTuple mArea;
+
+ public HObject mObject;
+
+ }
+}
diff --git a/HalconTools/FitModule/CirclePosition.cs b/HalconTools/FitModule/CirclePosition.cs
new file mode 100644
index 0000000..45190c2
--- /dev/null
+++ b/HalconTools/FitModule/CirclePosition.cs
@@ -0,0 +1,29 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public class CirclePosition
+ {
+ public double hv_Row { get; set; }
+
+ public double hv_Column { get; set; }
+
+ public double hv_Radius { get; set; }
+
+ public CirclePosition(HTuple roiData)
+ {
+ this.hv_Row = roiData[0].D;
+ this.hv_Column = roiData[1].D;
+ this.hv_Radius = roiData[2].D;
+ }
+
+ public CirclePosition()
+ {
+
+ }
+ }
+}
diff --git a/HalconTools/FitModule/FitAssistant.cs b/HalconTools/FitModule/FitAssistant.cs
new file mode 100644
index 0000000..4fee8e3
--- /dev/null
+++ b/HalconTools/FitModule/FitAssistant.cs
@@ -0,0 +1,419 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HalconDotNet;
+using System.ComponentModel;
+
+namespace HalconTools
+{
+ public delegate void FitMessageDelegate(int value);
+
+ public delegate void SetImageDelegate(object sender, HImage image);
+ public delegate void FitLineDelegate(object sender, HImage image, FitLineResult result);
+ public delegate void FitCircleDelegate(object sender,HImage image,FitCircleResult result);
+ public class FitAssistant
+ {
+ public event FitLineDelegate FitLineDone;
+ public event FitCircleDelegate FitCircleDone;
+ public event FitMessageDelegate NotifyIconObserverMessage;
+
+ private const int ERR_READING_FILE = 0;
+
+ private const int ERR_NO_IMAGE = 1;
+
+ private const int ERR_PARAMSET = 2;
+
+ private const int ERR_FITLINE = 3;
+
+ private const int ERR_FITCIRCLE = 4;
+
+
+
+ /// <summary>HALCON image used for .</summary>
+ public HImage mImage;
+ public int mWidth;
+ public int mHeight;
+
+
+ public HWndCtrl viewController;
+ public ROIController roiController;
+
+ /// <summary>Error messages for failed measure actions.</summary>
+ public HTuple exceptionText;
+
+ private object someEventLock;
+
+ public FitAssistant()
+ {
+ NotifyIconObserverMessage = new FitMessageDelegate(UpdateMessage);
+ someEventLock = new object();
+ roiController = new ROIController();
+ }
+
+ public FitAssistant(HWindowControl viewPort)
+ {
+ NotifyIconObserverMessage = new FitMessageDelegate(UpdateMessage);
+ someEventLock = new object();
+
+ viewController = new HWndCtrl(viewPort);
+ roiController = new ROIController();
+ }
+
+ public void UpdateMessage(int val)
+ {
+ switch (val)
+ {
+ case FitAssistant.ERR_READING_FILE:
+ System.Windows.Forms.MessageBox.Show("Error Imge File!",
+ "Fit Wizard",
+ System.Windows.Forms.MessageBoxButtons.OK,
+ System.Windows.Forms.MessageBoxIcon.Information);
+ break;
+ case FitAssistant.ERR_NO_IMAGE:
+ System.Windows.Forms.MessageBox.Show("No Imge!",
+ "Fit Wizard",
+ System.Windows.Forms.MessageBoxButtons.OK,
+ System.Windows.Forms.MessageBoxIcon.Information);
+ break;
+ case FitAssistant.ERR_PARAMSET:
+ System.Windows.Forms.MessageBox.Show("Error param set!",
+ "Fit Wizard",
+ System.Windows.Forms.MessageBoxButtons.OK,
+ System.Windows.Forms.MessageBoxIcon.Information);
+ break;
+ case FitAssistant.ERR_FITLINE:
+ System.Windows.Forms.MessageBox.Show("Error fit line!",
+ "Fit Wizard",
+ System.Windows.Forms.MessageBoxButtons.OK,
+ System.Windows.Forms.MessageBoxIcon.Information);
+ break;
+ case FitAssistant.ERR_FITCIRCLE:
+ System.Windows.Forms.MessageBox.Show("Error fit circle!",
+ "Fit Wizard",
+ System.Windows.Forms.MessageBoxButtons.OK,
+ System.Windows.Forms.MessageBoxIcon.Information);
+ break;
+ default:
+ break;
+ }
+ }
+
+ public bool SetImage(string filename)
+ {
+ string tmp;
+
+ exceptionText = "";
+ try
+ {
+ mImage = new HImage(filename);
+ mImage.GetImagePointer1(out tmp, out mWidth, out mHeight);
+ }
+ catch (HOperatorException e)
+ {
+ mImage = null;
+ exceptionText = e.Message;
+ NotifyIconObserverMessage(FitAssistant.ERR_READING_FILE);
+ return false;
+ }
+ return true;
+ }
+
+ public bool SetImage(HImage image)
+ {
+ string tmp;
+
+ exceptionText = "";
+ try
+ {
+ mImage = image;
+ mImage.GetImagePointer1(out tmp, out mWidth, out mHeight);
+ }
+ catch (HOperatorException e)
+ {
+ mImage = null;
+ exceptionText = e.Message;
+ NotifyIconObserverMessage(FitAssistant.ERR_READING_FILE);
+ return false;
+ }
+ return true;
+ }
+
+ /// <summary>
+ /// Writes the new image to graphic window
+ /// </summary>
+ public void UpdateImage()
+ {
+ //viewController = new HWndCtrl(viewPort);
+ //roiController = new ROIController();
+ viewController.resetAll();
+ viewController.useROIController(roiController);
+ viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
+
+ viewController.addIconicVar(mImage);
+ viewController.repaint();
+ }
+
+ public LinePosition GetLinePosition()
+ {
+ LinePosition position;
+ int activeROIIdx = roiController.getActiveROIIdx();
+ if (activeROIIdx > -1)
+ {
+ ROI line = roiController.getActiveROI();
+ HTuple ss = line.getModelData();
+ if (ss.Length == 4)
+ {
+ position = new LinePosition(ss);
+ }
+ else
+ {
+ position = null;
+ }
+ }
+ else
+ {
+ position = null;
+ }
+ return position;
+ }
+
+ public CirclePosition GetCirClePosition()
+ {
+ CirclePosition position;
+ int activeROIIdx = roiController.getActiveROIIdx();
+ if (activeROIIdx > -1)
+ {
+ ROI circle = roiController.getActiveROI();
+ HTuple ss = circle.getModelData();
+ if (ss.Length == 3)
+ {
+ position = new CirclePosition(ss);
+ }
+ else
+ {
+ position = null;
+ }
+ }
+ else
+ {
+ position = null;
+ }
+
+ return position;
+ }
+
+ /// <summary>
+ /// 鍦ㄦ寚瀹氱獥浣撲腑鏄剧ずFit鍒扮殑缁撴灉
+ /// </summary>
+ /// <param name="viewPort">鍥惧儚鏄剧ず绐椾綋</param>
+ /// <param name="CurrentImg">鍥惧儚</param>
+ /// <param name="result">鍖归厤缁撴灉</param>
+ public void FitLineGraphics(HWndCtrl viewController, HImage CurrentImg, FitLineResult result)
+ {
+ //Window control that manages visualization
+
+ viewController.resetAll();
+ viewController.repaint();
+
+ viewController.changeGraphicSettings(GraphicsContext.GC_LINESTYLE, new HTuple());
+ viewController.addIconicVar(CurrentImg);
+ HXLD DetectionContour = result.mFitLineResult;
+ if (DetectionContour != null)
+ {
+ viewController.changeGraphicSettings(GraphicsContext.GC_COLOR, "green");
+ viewController.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 2);
+ viewController.addIconicVar(DetectionContour);
+
+ viewController.repaint();
+ }
+ }
+
+ public void FitCircleGraphics(HWndCtrl viewController, HImage CurrentImg, FitCircleResult result)
+ {
+ //Window control that manages visualization
+
+ viewController.resetAll();
+ viewController.repaint();
+
+ viewController.changeGraphicSettings(GraphicsContext.GC_LINESTYLE, new HTuple());
+ viewController.addIconicVar(CurrentImg);
+ HXLD DetectionContour = result.mFitCircleResult;
+ if (DetectionContour != null)
+ {
+ viewController.changeGraphicSettings(GraphicsContext.GC_COLOR, "green");
+ viewController.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 2);
+ viewController.addIconicVar(DetectionContour);
+
+ viewController.repaint();
+ }
+ }
+
+ public FitLineResult FitLine(FitLineParam param)
+ {
+ double t2, t1;
+ //HTuple hv_rows=null,hv_column=null;
+ FitLineResult result = new FitLineResult();
+
+ if (mImage == null)
+ {
+ if (NotifyIconObserverMessage != null)
+ {
+ NotifyIconObserverMessage(FitAssistant.ERR_NO_IMAGE);
+ }
+ return result;
+ }
+
+ if (param == null)
+ {
+ if (NotifyIconObserverMessage != null)
+ {
+ NotifyIconObserverMessage(FitAssistant.ERR_PARAMSET);
+ }
+ return result;
+ }
+
+ try
+ {
+ lock (someEventLock)
+ {
+ t1 = HSystem.CountSeconds();
+
+ mImage.GetImageSize(out result.mWidth,out result.mHeight);
+ HMetrologyModel hv_MetrologyHandle = new HMetrologyModel();
+ hv_MetrologyHandle.CreateMetrologyModel();
+ hv_MetrologyHandle.SetMetrologyModelImageSize(result.mWidth, result.mHeight);
+ hv_MetrologyHandle.AddMetrologyObjectLineMeasure((HTuple)param.hv_RowBegin, (HTuple)param.hv_ColumnBegin,
+ (HTuple)param.hv_RowEnd, (HTuple)param.hv_ColumnEnd, (HTuple)param.hv_measure_Length1, (HTuple)param.hv_measure_Length2,
+ (HTuple)param.hv_measure_sigma, (HTuple)param.hv_measure_threshold, new HTuple(), new HTuple());
+
+ hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_length1", (HTuple)param.hv_measure_Length1);
+ hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_length2", (HTuple)param.hv_measure_Length2);
+ hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"num_measures", (HTuple)param.hv_measure_number);
+ hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_select", (HTuple)param.hv_measure_position.ToString());
+ hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_transition", (HTuple)param.hv_measure_transition.ToString());
+
+ hv_MetrologyHandle.ApplyMetrologyModel(mImage);
+
+ result.mContours = hv_MetrologyHandle.GetMetrologyObjectMeasures("all", "all", out result.hv_Rows, out result.hv_Columns);
+ result.mContLine.GenContourPolygonXld((HTuple)result.hv_Rows, (HTuple)result.hv_Columns);
+ result.mContPoints.GenCrossContourXld((HTuple)result.hv_Rows, (HTuple)result.hv_Columns, 6, 0.785398);
+
+ result.mContLine.FitLineContourXld("tukey", (int)(param.hv_measure_number - 10), 3, 5, 2.0,
+ out result.mRowStart, out result.mColumnStart, out result.mRowEnd, out result.mColumnEnd,
+ out result.mVector, out result.mNC, out result.mDist);
+
+ HTuple rows, cols;
+
+ rows = new HTuple(new HTuple[] { result.mRowStart, result.mRowEnd });
+ cols = new HTuple(new HTuple[] { result.mColumnStart, result.mColumnEnd });
+
+ result.mFitLineResult.GenContourPolygonXld(rows, cols);
+
+ //result.mAngle = result.mFitLineResult.GetContourAttribXld("angle");
+
+ //result.mAngle = result.mFitLineResult.GetContourAngleXld("abs", "range", 3);
+
+ t2 = HSystem.CountSeconds();
+ result.mTime = 1000.0 * (t2 - t1);
+
+ if (FitLineDone != null)
+ {
+ FitLineDone(this, mImage, result);
+ }
+ }
+ }
+ catch(HOperatorException e)
+ {
+ if (NotifyIconObserverMessage != null)
+ {
+ //NotifyIconObserverMessage(FitAssistant.ERR_FITLINE);
+ }
+ result = null;
+ return result;
+ }
+
+ return result;
+ }
+
+ public FitCircleResult FitCircle(FitCircleParam param)
+ {
+ double t2, t1;
+ FitCircleResult result = new FitCircleResult();
+
+ if (mImage == null)
+ {
+ if (NotifyIconObserverMessage != null)
+ {
+ NotifyIconObserverMessage(FitAssistant.ERR_NO_IMAGE);
+ }
+ return result;
+ }
+
+ if (param == null)
+ {
+ if (NotifyIconObserverMessage != null)
+ {
+ NotifyIconObserverMessage(FitAssistant.ERR_PARAMSET);
+ }
+ return result;
+ }
+
+ try
+ {
+ lock (someEventLock)
+ {
+ t1 = HSystem.CountSeconds();
+
+ mImage.GetImageSize(out result.mWidth, out result.mHeight);
+ HMetrologyModel hv_MetrologyHandle = new HMetrologyModel();
+ hv_MetrologyHandle.CreateMetrologyModel();
+ hv_MetrologyHandle.SetMetrologyModelImageSize(result.mWidth, result.mHeight);
+ hv_MetrologyHandle.AddMetrologyObjectCircleMeasure((HTuple)param.hv_RowCenter, (HTuple)param.hv_ColumnCenter, (HTuple)param.hv_Radius,
+ (HTuple)param.hv_measure_Length1, (HTuple)param.hv_measure_Length2, (HTuple)param.hv_measure_sigma, (HTuple)param.hv_measure_threshold,
+ new HTuple(), new HTuple());
+
+ hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_length1", (HTuple)param.hv_measure_Length1);
+ hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_length2", (HTuple)param.hv_measure_Length2);
+ hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"num_measures", (HTuple)param.hv_measure_number);
+ hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_select", (HTuple)param.hv_measure_position.ToString());
+ hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_transition", (HTuple)param.hv_measure_transition.ToString());
+
+ hv_MetrologyHandle.ApplyMetrologyModel(mImage);
+
+ result.mContours = hv_MetrologyHandle.GetMetrologyObjectMeasures("all", "all", out result.hv_Rows, out result.hv_Columns);
+ result.mContCircle.GenContourPolygonXld((HTuple)result.hv_Rows, (HTuple)result.hv_Columns);
+ result.mContPoints.GenCrossContourXld((HTuple)result.hv_Rows, (HTuple)result.hv_Columns, 6, 0.785398);
+
+ result.mContCircle.FitCircleContourXld("ahuber", -1, 2.0, 4, 3, 2.0,
+ out result.mRowCenter, out result.mColumnCenter, out result.mRadius,
+ out result.mStartPhi, out result.mEndPhi, out result.mPointOrder);
+
+ result.mFitCircleResult.GenCircleContourXld(result.mRowCenter, result.mColumnCenter, result.mRadius,
+ 0, (new HTuple(360)).TupleRad(), (HTuple)"positive", 1.0);
+
+ t2 = HSystem.CountSeconds();
+ result.mTime = 1000.0 * (t2 - t1);
+
+ if (FitCircleDone != null)
+ {
+ FitCircleDone(this, mImage, result);
+ }
+ }
+ }
+ catch(HOperatorException e)
+ {
+ if (NotifyIconObserverMessage != null)
+ {
+ //NotifyIconObserverMessage(FitAssistant.ERR_FITCIRCLE);
+ }
+ result = null;
+ return result;
+ }
+
+ return result;
+ }
+
+ }
+
+}
diff --git a/HalconTools/FitModule/FitCircleParam.cs b/HalconTools/FitModule/FitCircleParam.cs
new file mode 100644
index 0000000..078ada2
--- /dev/null
+++ b/HalconTools/FitModule/FitCircleParam.cs
@@ -0,0 +1,38 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HalconTools
+{
+ public class FitCircleParam
+ {
+ public double hv_RowCenter { get; set; }
+
+ public double hv_ColumnCenter { get; set; }
+
+ public double hv_Radius { get; set; }
+
+ /// <summary>
+ /// ROI height
+ /// </summary>
+ public double hv_measure_Length1 { get; set; }
+
+ /// <summary>
+ /// ROI width
+ /// </summary>
+ public double hv_measure_Length2 { get; set; }
+
+ public double hv_measure_sigma { get; set; }
+
+ public double hv_measure_threshold { get; set; }
+
+ public double hv_measure_number { get; set; }
+
+ public string hv_measure_position { get; set; }
+
+ public string hv_measure_transition { get; set; }
+
+ public string hv_measure_interpolation { get; set; }
+ }
+}
diff --git a/HalconTools/FitModule/FitCircleResult.cs b/HalconTools/FitModule/FitCircleResult.cs
new file mode 100644
index 0000000..5528d36
--- /dev/null
+++ b/HalconTools/FitModule/FitCircleResult.cs
@@ -0,0 +1,118 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public class FitCircleResult
+ {
+ /// <summary>
+ /// Model contour applied for model detection
+ /// </summary>
+ public HXLD mContours;
+
+ public HXLDCont mContCircle;
+
+ public HXLDCont mContPoints;
+
+ /// <summary>
+ /// All circle contours detected
+ /// </summary>
+ public HXLDCont mFitCircleResult;
+
+ /// <summary>
+ /// Row coordinate of the found instances of the model
+ /// </summary>
+ public HTuple mRow;
+ /// <summary>
+ /// Column coordinate of the found instances of the model
+ /// </summary>
+ public HTuple mCol;
+
+ //Fit result
+ public HTuple mRowCenter;
+
+ public HTuple mColumnCenter;
+
+ public HTuple mRadius;
+
+ public HTuple mStartPhi;
+
+ public HTuple mEndPhi;
+
+ public HTuple mPointOrder;
+
+ /// <summary>
+ /// Rotation angle of the found instances of the model
+ /// </summary>
+ public HTuple mAngle;
+
+ public HTuple hv_Rows;
+
+ public HTuple hv_Columns;
+
+ /// <summary>
+ /// Image Width
+ /// </summary>
+ public int mWidth;
+
+ /// <summary>
+ /// Image Height
+ /// </summary>
+ public int mHeight;
+
+ /// <summary>
+ /// Time needed to detect <c>count</c> numbers of model instances
+ /// </summary>
+ public double mTime;
+ /// <summary>
+ /// Number of model instances found
+ /// </summary>
+ public int count;
+ /// <summary>
+ /// 2D homogeneous transformation matrix that can be used to transform
+ /// data from the model into the test image.
+ /// </summary>
+ public HHomMat2D hmat;
+
+ /// <summary>Constructor</summary>
+ public FitCircleResult()
+ {
+ hmat = new HHomMat2D();
+ mFitCircleResult = new HXLDCont();
+ mContCircle = new HXLDCont();
+ mContPoints = new HXLDCont();
+ }
+
+
+ /// <summary>
+ /// Gets the detected contour.
+ /// </summary>
+ /// <returns>Detected contour</returns>
+ public HXLDCont getDetectionResults()
+ {
+ HXLDCont rContours = new HXLDCont();
+ hmat.HomMat2dIdentity();
+ mFitCircleResult.GenEmptyObj();
+
+ //for (int i = 0; i < count; i++)
+ //{
+ // hmat.VectorAngleToRigid(0, 0, 0, mRow[i].D, mCol[i].D, mAngle[i].D);
+ // rContours = hmat.AffineTransContourXld(mContour);
+ // mFitLineResult = mFitLineResult.ConcatObj(rContours);
+ //}
+ return mFitCircleResult;
+ }
+
+
+ /// <summary>
+ /// Resets the detection results and sets count to 0.
+ /// </summary>
+ public void reset()
+ {
+ count = 0;
+ }
+ }
+}
diff --git a/HalconTools/FitModule/FitLineParam.cs b/HalconTools/FitModule/FitLineParam.cs
new file mode 100644
index 0000000..e430c97
--- /dev/null
+++ b/HalconTools/FitModule/FitLineParam.cs
@@ -0,0 +1,41 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HalconTools
+{
+ public class FitLineParam
+ {
+ public double hv_RowBegin { get; set; }
+
+ public double hv_ColumnBegin { get; set; }
+
+ public double hv_RowEnd { get; set; }
+
+ public double hv_ColumnEnd { get; set; }
+
+ /// <summary>
+ /// ROI height
+ /// </summary>
+ public double hv_measure_Length1 { get; set; }
+
+ /// <summary>
+ /// ROI width
+ /// </summary>
+ public double hv_measure_Length2 { get; set; }
+
+ public double hv_measure_sigma { get; set; }
+
+ public double hv_measure_threshold { get; set; }
+
+ public double hv_measure_number { get; set; }
+
+ public string hv_measure_position { get; set; }
+
+ public string hv_measure_transition { get; set; }
+
+ public string hv_measure_interpolation { get; set; }
+
+ }
+}
diff --git a/HalconTools/FitModule/FitLineResult.cs b/HalconTools/FitModule/FitLineResult.cs
new file mode 100644
index 0000000..6a7ba34
--- /dev/null
+++ b/HalconTools/FitModule/FitLineResult.cs
@@ -0,0 +1,117 @@
+锘縰sing System;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public class FitLineResult
+ {
+ /// <summary>
+ /// Model contour applied for model detection
+ /// </summary>
+ public HXLDCont mContours;
+
+ public HXLDCont mContLine;
+
+ public HXLDCont mContPoints;
+
+ /// <summary>
+ /// All model contours detected
+ /// </summary>
+ public HXLDCont mFitLineResult;
+
+ /// <summary>
+ /// Row coordinate of the found instances of the model
+ /// </summary>
+ public HTuple mRow;
+ /// <summary>
+ /// Column coordinate of the found instances of the model
+ /// </summary>
+ public HTuple mCol;
+
+ //Fit result
+ public HTuple mRowStart;
+
+ public HTuple mColumnStart;
+
+ public HTuple mRowEnd;
+
+ public HTuple mColumnEnd;
+
+ public HTuple mVector;
+
+ public HTuple mNC;
+
+ public HTuple mDist;
+
+ /// <summary>
+ /// Rotation angle of the found instances of the model
+ /// </summary>
+ public HTuple mAngle;
+
+ public HTuple hv_Rows;
+
+ public HTuple hv_Columns;
+
+ /// <summary>
+ /// Image Width
+ /// </summary>
+ public int mWidth;
+
+ /// <summary>
+ /// Image Height
+ /// </summary>
+ public int mHeight;
+
+ /// <summary>
+ /// Time needed to detect <c>count</c> numbers of model instances
+ /// </summary>
+ public double mTime;
+ /// <summary>
+ /// Number of model instances found
+ /// </summary>
+ public int count;
+ /// <summary>
+ /// 2D homogeneous transformation matrix that can be used to transform
+ /// data from the model into the test image.
+ /// </summary>
+ public HHomMat2D hmat;
+
+ /// <summary>Constructor</summary>
+ public FitLineResult()
+ {
+ hmat = new HHomMat2D();
+ mFitLineResult = new HXLDCont();
+ mContLine = new HXLDCont();
+ mContPoints = new HXLDCont();
+ }
+
+
+ /// <summary>
+ /// Gets the detected contour.
+ /// </summary>
+ /// <returns>Detected contour</returns>
+ public HXLDCont getDetectionResults()
+ {
+ HXLDCont rContours = new HXLDCont();
+ hmat.HomMat2dIdentity();
+ mFitLineResult.GenEmptyObj();
+
+ //for (int i = 0; i < count; i++)
+ //{
+ // hmat.VectorAngleToRigid(0, 0, 0, mRow[i].D, mCol[i].D, mAngle[i].D);
+ // rContours = hmat.AffineTransContourXld(mContour);
+ // mFitLineResult = mFitLineResult.ConcatObj(rContours);
+ //}
+ return mFitLineResult;
+ }
+
+
+ /// <summary>
+ /// Resets the detection results and sets count to 0.
+ /// </summary>
+ public void reset()
+ {
+ count = 0;
+ }
+ }
+}
diff --git a/HalconTools/FitModule/FitModule.csproj b/HalconTools/FitModule/FitModule.csproj
new file mode 100644
index 0000000..476dd2d
--- /dev/null
+++ b/HalconTools/FitModule/FitModule.csproj
@@ -0,0 +1,107 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>9.0.21022</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{4C6E72DB-DEF1-4F3F-94E4-883FDEDBB7C8}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>FitModule</RootNamespace>
+ <AssemblyName>FitModule</AssemblyName>
+ <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <StartupObject>
+ </StartupObject>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="halcondotnet, Version=11.0.2.0, Culture=neutral, PublicKeyToken=4973bed59ddbf2b8, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>C:\Program Files\MVTec\HALCON-11.0\bin\dotnet35\halcondotnet.dll</HintPath>
+ </Reference>
+ <Reference Include="System" />
+ <Reference Include="System.Core">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Xml.Linq">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Data.DataSetExtensions">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Data" />
+ <Reference Include="System.Deployment" />
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Windows.Forms" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="CirclePosition.cs" />
+ <Compile Include="FitAssistant.cs" />
+ <Compile Include="FitCircleParam.cs" />
+ <Compile Include="FitCircleResult.cs" />
+ <Compile Include="FitLineParam.cs" />
+ <Compile Include="FitLineResult.cs" />
+ <Compile Include="FitResult.cs" />
+ <Compile Include="Form1.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Form1.Designer.cs">
+ <DependentUpon>Form1.cs</DependentUpon>
+ </Compile>
+ <Compile Include="LineMetrology.cs" />
+ <Compile Include="LinePosition.cs" />
+ <Compile Include="Program.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Resources.resx</DependentUpon>
+ </Compile>
+ <None Include="Properties\Settings.settings">
+ <Generator>SettingsSingleFileGenerator</Generator>
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+ </None>
+ <Compile Include="Properties\Settings.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Settings.settings</DependentUpon>
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
+ </Compile>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\ViewROI\ViewROI.csproj">
+ <Project>{C4F5C5DE-7EA8-47FE-8218-48138F48965F}</Project>
+ <Name>ViewROI</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project>
\ No newline at end of file
diff --git a/HalconTools/FitModule/FitResult.cs b/HalconTools/FitModule/FitResult.cs
new file mode 100644
index 0000000..a3991b2
--- /dev/null
+++ b/HalconTools/FitModule/FitResult.cs
@@ -0,0 +1,15 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HalconTools
+{
+ public class FitResult
+ {
+ public FitLineResult LineResult { get; set; }
+
+ public FitCircleResult CircleResult { get; set; }
+
+ }
+}
diff --git a/HalconTools/FitModule/LineMetrology.cs b/HalconTools/FitModule/LineMetrology.cs
new file mode 100644
index 0000000..46ef865
--- /dev/null
+++ b/HalconTools/FitModule/LineMetrology.cs
@@ -0,0 +1,52 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.ComponentModel;
+
+namespace HalconTools
+{
+ public class LineMetrology
+ {
+ public double hv_RowBegin { get; set; }
+
+ public double hv_ColumnBegin { get; set; }
+
+ public double hv_RowEnd { get; set; }
+
+ public double hv_ColumnEnd { get; set; }
+
+ [DefaultValue(1.0)]
+ public double hv_measure_sigma = 1.0;
+
+ [DefaultValue(40.0)]
+ public double hv_measure_threshold = 40.0;
+
+ [DefaultValue(10)]
+ public double hv_num_measures = 10;
+
+ public measure_select hv_measure_select { get; set; }
+
+ public measure_transition hv_measure_transition { get; set; }
+
+
+ [DefaultValue("first")]
+ public enum measure_select
+ {
+ first,
+ last,
+ all
+ }
+
+ [DefaultValue("positive")]
+ public enum measure_transition
+ {
+ positive,
+ negative,
+ all
+ }
+
+
+
+ }
+}
diff --git a/HalconTools/FitModule/LinePosition.cs b/HalconTools/FitModule/LinePosition.cs
new file mode 100644
index 0000000..ee64049
--- /dev/null
+++ b/HalconTools/FitModule/LinePosition.cs
@@ -0,0 +1,33 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public class LinePosition
+ {
+ public double hv_RowBegin { get; set; }
+
+ public double hv_ColumnBegin { get; set; }
+
+ public double hv_RowEnd { get; set; }
+
+ public double hv_ColumnEnd { get; set; }
+
+
+ public LinePosition(HTuple position)
+ {
+ this.hv_RowBegin = position[0].D;
+ this.hv_ColumnBegin = position[1].D;
+ this.hv_RowEnd = position[2].D;
+ this.hv_ColumnEnd = position[3].D;
+ }
+
+ public LinePosition()
+ {
+
+ }
+ }
+}
diff --git a/HalconTools/HalconTool.cs b/HalconTools/HalconTool.cs
new file mode 100644
index 0000000..d9a91b4
--- /dev/null
+++ b/HalconTools/HalconTool.cs
@@ -0,0 +1,624 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Windows.Forms;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public class HalconTool
+ {
+ #region 鍚勭鍗曟柟娉曚互鍙婂畾涔�
+
+ #region 瀹氫箟
+ public HWndCtrl viewController;
+
+ public ListenEventCreater resultCreater = new ListenEventCreater();
+
+ public struct FindLineResult
+ {
+ public string SerialNumer;
+ public FitLineResult fitLineResult;
+ }
+
+ public struct FindCircleResult
+ {
+ public string SerialNumber;
+ public FitCircleResult fitCircleResult;
+ }
+
+ public struct PatternMatchResult
+ {
+ public string SerialNumber;
+ public MatchingResult matchingResult;
+ }
+
+ public struct FindContourResult
+ {
+ public string SerialNumber;
+ public ContourResult contourResult;
+ }
+
+ public List<FindLineResult> findLineResults = new List<FindLineResult>();
+ public List<FindCircleResult> findCircleResults = new List<FindCircleResult>();
+ public List<PatternMatchResult> patternMatchResults = new List<PatternMatchResult>();
+
+ public FindLineResult findLineResult = new FindLineResult();
+ public FindCircleResult findCircleResult = new FindCircleResult();
+ public PatternMatchResult patternMatchResult = new PatternMatchResult();
+ public FindContourResult contourResult = new FindContourResult();
+
+ public FitAssistant mFitAssistant = new FitAssistant();
+ public HImage image;
+ public FitLineResult result;
+ public MatchingAssistant mMatchingAssistant = new MatchingAssistant();
+ public ContourAssistant mContourAssistant = new ContourAssistant();
+
+
+ public FitLineParam fitLinePara = new FitLineParam();
+ public FitCircleParam fitCirclePara = new FitCircleParam();
+ public MatchingParam matchingPara = new MatchingParam();
+ public ContourParam contourPara = new ContourParam();
+ public HImage hImage;
+
+ public List<FitLineParam> fitLineParas = new List<FitLineParam>();
+ public List<FitCircleParam> fitCircleParas = new List<FitCircleParam>();
+ SerializeFileTool<List<FitLineParam>> sft1 = new SerializeFileTool<List<FitLineParam>>();
+ SerializeFileTool<List<FitCircleParam>> sft2 = new SerializeFileTool<List<FitCircleParam>>();
+ #endregion
+
+ #region 鍒濆鍖�
+ public void initHalconTool()
+ {
+ mFitAssistant.FitLineDone += new FitLineDelegate(mFitAssistant_FitLineDone);
+ mFitAssistant.FitCircleDone += new FitCircleDelegate(mFitAssistant_FitCircleDone);
+ mFitAssistant.NotifyIconObserverMessage += new FitMessageDelegate(mFitAssistant_NotifyIconObserverMessage);
+ mMatchingAssistant.FindShapeModelDone += new FindShapeModelDelegate(mMatchingAssistant_FindShapeModelDone);
+ mContourAssistant.ContourDone += new ContourDelegate(mContourAssistant_ContourDone);
+ //mMatchingAssistant .NotifyIconObserver+=
+
+ string FolderPath = Application.StartupPath + "\\FitConfig";
+ string FilePath;
+
+ FilePath = FolderPath + "\\fitLineConfig.xml";
+ fitLineParas = sft1.GetConfig(FilePath);
+
+ FilePath = FolderPath + "\\fitCircleConfig.xml";
+ fitCircleParas = sft2.GetConfig(FilePath);
+ }
+
+
+
+ public HalconTool()
+ {
+ JobImage = new HImage();
+ mFitAssistant = new FitAssistant();
+ mMatchingAssistant = new MatchingAssistant();
+ initHalconTool();
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="viewPort">fit绠楁硶鐨勭獥鍙�</param>
+ /// <param name="ModuleNum">鍖归厤鐨勬ā鏉挎暟閲�</param>
+ public HalconTool(HWindowControl viewPort, int ModuleNum)
+ {
+ mFitAssistant = new FitAssistant(viewPort);
+ mMatchingAssistant = new MatchingAssistant(ModuleNum);
+ initHalconTool();
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="viewPort">fit绠楁硶鐨勭獥鍙�</param>
+ public HalconTool(HWindowControl viewPort)
+ {
+ mFitAssistant = new FitAssistant(viewPort);
+ initHalconTool();
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="ModuleNum">鍖归厤鐨勬ā鏉挎暟閲�</param>
+ public HalconTool(int ModuleNum)
+ {
+ mMatchingAssistant = new MatchingAssistant(ModuleNum);
+ initHalconTool();
+ }
+ #endregion
+
+ #region 娑堟伅澶勭悊閮ㄥ垎
+ void mFitAssistant_FitCircleDone(object sender, HImage image, FitCircleResult result)
+ {
+ if (findCircleResults == null) findCircleResults = new List<FindCircleResult>();
+ findCircleResult.fitCircleResult = result;
+
+ findCircleResults.Add(findCircleResult);
+
+ //鍙嶉娑堟伅
+ resultCreater.ChangeValue(new EventData("FindCircleDone"));
+ }
+
+ void mFitAssistant_FitLineDone(object sender, HImage image, FitLineResult result)
+ {
+ ////鐢讳笂鎵惧埌鐨勭粨鏋�
+ //mFitAssistant.FitLineGraphics(mFitAssistant.viewController, image, result);
+
+ //缁撴灉澶勭悊
+ if (findLineResults == null) findLineResults = new List<FindLineResult>();
+ findLineResult.fitLineResult = result;
+
+ findLineResults.Add(findLineResult);
+
+ //鍙嶉娑堟伅
+ resultCreater.ChangeValue(new EventData("FindLineDone"));
+ }
+
+
+ void mMatchingAssistant_FindShapeModelDone(object sender, HImage image, MatchingResult result)
+ {
+ if (patternMatchResults == null) patternMatchResults = new List<PatternMatchResult>();
+ patternMatchResult.matchingResult = result;
+
+ patternMatchResults.Add(patternMatchResult);
+
+ resultCreater.ChangeValue(new EventData("MatchDone"));
+ }
+
+ void mFitAssistant_NotifyIconObserverMessage(int value)
+ {
+ //鍙嶉娌℃湁鎵惧埌鐨勬秷鎭�
+ resultCreater.ChangeValue(new EventData("CanNotFind"));
+ }
+
+ void mContourAssistant_ContourDone(object sender, HImage image, ContourResult result)
+ {
+ contourResult.contourResult = result;
+ resultCreater.ChangeValue(new EventData("ContourDone"));
+ }
+ #endregion
+
+ #region 鎵剧嚎鎵惧渾閮ㄥ垎
+ /// <summary>
+ /// 鎵剧洿绾�
+ /// </summary>
+ /// <param name="sn">搴忓垪鍙�</param>
+ /// <param name="image">Halcon鍥惧儚</param>
+ /// <param name="para">鎵剧洿绾垮弬鏁�</param>
+ public void FindLine(string sn, HImage image, FitLineParam para)
+ {
+ findLineResult.SerialNumer = sn;
+ mFitAssistant.mImage = image;
+ mFitAssistant.FitLine(para);
+ }
+
+ /// <summary>
+ /// 鎵惧渾
+ /// </summary>
+ /// <param name="sn">搴忓垪鍙�</param>
+ /// <param name="image">Halcon鍥惧儚</param>
+ /// <param name="para">鎵惧渾鍙傛暟</param>
+ public void FindCircle(string sn, HImage image, FitCircleParam para)
+ {
+ findCircleResult.SerialNumber = sn;
+ mFitAssistant.mImage = image;
+ mFitAssistant.FitCircle(para);
+ }
+
+ /// <summary>
+ /// 閫氳繃鍏ㄥ眬鍙橀噺鍙傛暟鎵剧洿绾�
+ /// </summary>
+ private void ThFindLine()
+ {
+ mFitAssistant.mImage = hImage;
+ mFitAssistant.FitLine(fitLinePara);
+ }
+
+ /// <summary>
+ /// 閫氳繃鍏ㄥ眬鍙橀噺鍙傛暟鎵惧渾
+ /// </summary>
+ private void ThFindCircle()
+ {
+ mFitAssistant.mImage = hImage;
+ mFitAssistant.FitCircle(fitCirclePara);
+ }
+
+ /// <summary>
+ /// 鐢ㄨ繘绋嬫壘鐩寸嚎
+ /// </summary>
+ /// <param name="sn"></param>
+ /// <param name="image"></param>
+ /// <param name="para"></param>
+ public void ThreadFindLine(string sn, HImage image, FitLineParam para)
+ {
+ hImage = image;
+ fitLinePara = para;
+
+ Thread findLineThread = new Thread(ThFindLine);
+ findLineThread.Start();
+ }
+
+ /// <summary>
+ /// 鐢ㄨ繘绋嬫壘鍦�
+ /// </summary>
+ /// <param name="sn"></param>
+ /// <param name="image"></param>
+ /// <param name="para"></param>
+ public void ThreadFindCircle(string sn, HImage image, FitCircleParam para)
+ {
+ hImage = image;
+ fitCirclePara = para;
+
+ Thread findCircleThread = new Thread(ThFindCircle);
+ findCircleThread.Start();
+ }
+ #endregion
+
+ #region 鍖归厤閮ㄥ垎
+ /// <summary>
+ /// 鍒涘缓妯℃澘锛堣幏鍙栨ā鏉縄D锛�
+ /// </summary>
+ /// <param name="sn">搴忓垪鍙�</param>
+ /// <param name="image">鍥惧儚</param>
+ /// <param name="para">鍙傛暟</param>
+ public void CreateModule(string sn, HImage image, MatchingParam para)
+ {
+ patternMatchResult.SerialNumber = sn;
+ mMatchingAssistant.mImage = image;
+ mMatchingAssistant.parameterSet = para;
+
+ mMatchingAssistant.createShapeModel();
+ }
+
+ /// <summary>
+ /// 鍖归厤妯℃澘锛堝凡寰楀埌妯℃澘ID锛�
+ /// </summary>
+ /// <param name="sn">搴忓垪鍙�</param>
+ /// <param name="image">鍥惧儚</param>
+ /// <param name="para">鍙傛暟</param>
+ public void FindModule(string sn, HImage image, MatchingParam para)
+ {
+ patternMatchResult.SerialNumber = sn;
+ mMatchingAssistant.mImage = image;
+ mMatchingAssistant.parameterSet = para;
+
+ mMatchingAssistant.detectShapeModel();
+ }
+
+ /// <summary>
+ /// 鏍规嵁妯℃澘鐨勫湴鍧�鍖归厤
+ /// </summary>
+ /// <param name="sn">搴忓垪鍙�</param>
+ /// <param name="image">鍥惧儚</param>
+ /// <param name="para">鍙傛暟</param>
+ /// <param name="modulePath">妯℃澘鏂囦欢鍦板潃</param>
+ public void PatterMatchWithModule(string sn, HImage image, MatchingParam para, string modulePath)
+ {
+ patternMatchResult.SerialNumber = sn;
+ mMatchingAssistant.tImage = image;
+ mMatchingAssistant.parameterSet = para;
+
+
+ mMatchingAssistant.loadShapeModel(modulePath);
+ mMatchingAssistant.detectShapeModel();
+ }
+ #endregion
+
+ #region 鎵捐疆寤撻儴鍒�
+ public void FindContour(string sn, HImage image, ContourParam para)
+ {
+ contourResult.SerialNumber = sn;
+ mContourAssistant.mImage = image;
+ mContourAssistant.mContourPara = para;
+ mContourAssistant.Run();
+ }
+ #endregion
+
+ #region 鍔犺浇鍙傛暟
+ /// <summary>
+ /// 鍔犺浇鍖归厤鍙傛暟
+ /// </summary>
+ /// <param name="ParaPath"></param>
+ public void LoadMatchingParameter(string ParaPath)
+ {
+ mMatchingAssistant.LoadPara(ParaPath);
+ matchingPara = mMatchingAssistant.parameterSet;
+ }
+
+ /// <summary>
+ /// 鍔犺浇鎵剧洿绾跨殑鍙傛暟
+ /// </summary>
+ /// <param name="ParaPath">鍙傛暟鏂囦欢鍦板潃</param>
+ public void LoadFitLineParameter(string ParaPath)
+ {
+ MeasureParamSave paramSave = new HalconTools.MeasureParamSave();
+ paramSave = paramSave.Load(ParaPath);
+
+ fitLinePara.hv_measure_Length1 = paramSave.hv_measure_Length1;
+ fitLinePara.hv_measure_Length2 = paramSave.hv_measure_Length2;
+ fitLinePara.hv_measure_sigma = paramSave.hv_measure_sigma;
+ fitLinePara.hv_measure_position = paramSave.hv_measure_position;
+ fitLinePara.hv_measure_transition = paramSave.hv_measure_transition;
+ fitLinePara.hv_measure_number = paramSave.hv_measure_number;
+ fitLinePara.hv_measure_threshold = paramSave.hv_measure_threshold;
+ fitLinePara.hv_measure_interpolation = paramSave.hv_measure_interpolation;
+ }
+
+ /// <summary>
+ /// 鍔犺浇鎵惧渾鍙傛暟
+ /// </summary>
+ /// <param name="ParaPath">鍙傛暟鏂囦欢鍦板潃</param>
+ public void LoadFitCircleParameter(string ParaPath)
+ {
+ MeasureParamSave paramSave = new HalconTools.MeasureParamSave();
+ paramSave = paramSave.Load(ParaPath);
+
+ fitCirclePara.hv_measure_Length1 = paramSave.hv_measure_Length1;
+ fitCirclePara.hv_measure_Length2 = paramSave.hv_measure_Length2;
+ fitCirclePara.hv_measure_sigma = paramSave.hv_measure_sigma;
+ fitCirclePara.hv_measure_position = paramSave.hv_measure_position;
+ fitCirclePara.hv_measure_transition = paramSave.hv_measure_transition;
+ fitCirclePara.hv_measure_number = paramSave.hv_measure_number;
+ fitCirclePara.hv_measure_threshold = paramSave.hv_measure_threshold;
+ fitCirclePara.hv_measure_interpolation = paramSave.hv_measure_interpolation;
+ }
+
+ /// <summary>
+ /// 鍔犺浇杞粨鍙傛暟
+ /// </summary>
+ /// <param name="ParaPath">鍙傛暟鏂囦欢鍦板潃</param>
+ public void LoadContourParameter(string ParaPath)
+ {
+ SerializeFileTool<ContourParam> sft = new SerializeFileTool<ContourParam>();
+ contourPara = sft.GetConfig(ParaPath);
+ }
+ #endregion
+ #endregion
+
+ #region Job
+
+ #region 瀹氫箟
+
+ public SerializeFileTool<List<Job>> sftJobs = new SerializeFileTool<List<Job>>();
+ public List<Job> Jobs = new List<Job>();
+ public List<JobResults> JobResults = new List<JobResults>();
+ private JobResults tmpJobResults = new JobResults();
+ private JobResult tmpJobResult = new JobResult();
+ private FitLineResult tmpFitLineResult = new FitLineResult();
+ public HImage JobImage;
+ private JobAssistance mJobAssistance = new JobAssistance();
+
+ #endregion
+
+ public void LoadJobs()
+ {
+ string path = System.Windows.Forms.Application.StartupPath + "\\JobConfige\\JobConfige.xml";
+ Jobs = sftJobs.GetConfig(path);
+ }
+
+ public void LoadJobs(string path)
+ {
+ Jobs = sftJobs.GetConfig(path);
+ }
+
+ /// <summary>
+ /// 鍗曚釜job杩愯鏂规硶锛堥渶绋嬪簭鍛樿嚜宸辩紪鍐欏弬鏁颁紶閫掞級
+ /// </summary>
+ /// <param name="index">搴忓彿</param>
+ public void Run(int index)
+ {
+ if (JobImage == null) return;
+
+ tmpJobResults = new JobResults();
+ tmpJobResults.results = new List<JobResult>();
+ tmpJobResults.name = Jobs[index].name;
+
+ switch (index)
+ {
+ case 0:
+
+ for (int j = 0; j < 2; j++)
+ {
+ tmpJobResult = new JobResult();
+ tmpJobResult = mJobAssistance.ToolRun(JobImage, Jobs[index].tools[j]);
+ tmpJobResults.results.Add(tmpJobResult);
+ }
+ JobResults.Add(tmpJobResults);
+
+ break;
+
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+
+ for (int j = 0; j < 4; j++)
+ {
+ tmpJobResult = new JobResult();
+ tmpJobResult = mJobAssistance.ToolRun(JobImage, Jobs[index].tools[j]);
+ tmpJobResults.results.Add(tmpJobResult);
+ }
+ JobResults.Add(tmpJobResults);
+
+ break;
+
+ default:
+ break;
+ }
+
+ resultCreater.ChangeValue(new EventData(Jobs[index].name + "_Done"));
+ }
+
+ /// <summary>
+ /// 鍗曚釜job杩愯鏂规硶锛堥渶绋嬪簭鍛樿嚜宸辩紪鍐欏弬鏁颁紶閫掞級
+ /// </summary>
+ /// <param name="JobName">Job鍚嶇О</param>
+ public void Run(string JobName)
+ {
+ if (JobImage == null) return;
+
+ tmpJobResults = new JobResults();
+ tmpJobResults.results = new List<JobResult>();
+
+ for (int i = 0; i < Jobs.Count; i++)
+ {
+ if (Jobs[i].name.Equals(JobName))
+ {
+ tmpJobResults.name = Jobs[i].name;
+
+ switch (JobName)
+ {
+ case "JobLLMF":
+
+ for (int j = 0; j < 1; j++)
+ {
+ tmpJobResult = new JobResult();
+ tmpJobResult = mJobAssistance.ToolRun(JobImage, Jobs[i].tools[j]);
+
+ if (tmpJobResult.fitLineResult == null)
+ {
+ resultCreater.ChangeValue(new EventData(JobName + "_Undone"));
+ return;
+ }
+
+ tmpJobResults.results.Add(tmpJobResult);
+ }
+ JobResults.Add(tmpJobResults);
+
+ break;
+ default:
+ break;
+ }
+
+ break;
+ }
+ }
+
+ resultCreater.ChangeValue(new EventData(JobName + "_Done"));
+ JobImage.Dispose();
+ }
+
+ /// <summary>
+ /// 娓呯┖缁撴灉
+ /// </summary>
+ public void Clear_JobResults()
+ {
+ JobResults.Clear();
+ }
+
+ #endregion
+
+ #region 璁$畻鏂规硶
+ /// <summary>
+ /// 璁$畻2鐩寸嚎璺濈
+ /// </summary>
+ /// <param name="l1">鐩寸嚎1</param>
+ /// <param name="l2">鐩寸嚎2</param>
+ /// <returns>璺濈</returns>
+ public double DistanceLine2Line(FitLineResult l1, FitLineResult l2)
+ {
+ HTuple tmp = new HTuple();
+
+ HOperatorSet.DistancePl((l1.mRowStart + l1.mRowEnd) / 2, (l1.mColumnStart + l1.mColumnEnd) / 2,
+ l2.mRowStart, l2.mColumnStart, l2.mRowEnd, l2.mColumnEnd, out tmp);
+
+ return tmp.D;
+ }
+
+ /// <summary>
+ /// 璁$畻2鐩寸嚎浜ょ偣
+ /// </summary>
+ /// <param name="l1">鐩寸嚎1</param>
+ /// <param name="l2">鐩寸嚎2</param>
+ /// <param name="x">浜ょ偣x</param>
+ /// <param name="y">浜ょ偣y</param>
+ public void IntersectionLine2Line(FitLineResult l1, FitLineResult l2, out double x, out double y)
+ {
+ HTuple row, col, isP;
+
+ HOperatorSet.IntersectionLl(l1.mRowStart, l1.mColumnStart, l1.mRowEnd, l1.mColumnEnd,
+ l2.mRowStart, l2.mColumnStart, l2.mRowEnd, l2.mColumnEnd,
+ out row, out col, out isP);
+
+ x = col.D;
+ y = row.D;
+ }
+
+ /// <summary>
+ /// 璁$畻2鐩寸嚎浜ょ偣
+ /// </summary>
+ /// <param name="Line1StartX"></param>
+ /// <param name="Line1StartY"></param>
+ /// <param name="Line1EndX"></param>
+ /// <param name="Line1EndY"></param>
+ /// <param name="Line2StartX"></param>
+ /// <param name="Line2StartY"></param>
+ /// <param name="Line2EndX"></param>
+ /// <param name="Line2EndY"></param>
+ /// <param name="x"></param>
+ /// <param name="y"></param>
+ public void IntersectionLine2Line(double Line1StartX, double Line1StartY, double Line1EndX, double Line1EndY,
+ double Line2StartX, double Line2StartY, double Line2EndX, double Line2EndY, out double x, out double y)
+ {
+ HTuple row, col, isP;
+
+ HOperatorSet.IntersectionLl((HTuple)Line1StartY, (HTuple)Line1StartX, (HTuple)Line1EndY, (HTuple)Line1EndX,
+ (HTuple)Line2StartY, (HTuple)Line2StartX, (HTuple)Line2EndY, (HTuple)Line2EndX,
+ out row, out col, out isP);
+
+ x = col.D;
+ y = row.D;
+ }
+ /// <summary>
+ /// 璁$畻鐩寸嚎涓庢按骞冲潗鏍囩殑瑙掑害
+ /// </summary>
+ /// <param name="l1">鐩寸嚎1</param>
+ /// <returns>瑙掑害</returns>
+ public double AngleLine2HorizontialAxis(FitLineResult l1)
+ {
+ HTuple tmp;
+
+ HOperatorSet.AngleLx(l1.mRowStart, l1.mColumnStart, l1.mRowEnd, l1.mColumnEnd, out tmp);
+
+ return tmp.D / Math.PI * 180;
+ }
+
+ /// <summary>
+ /// 璁$畻鐐瑰埌鐐硅窛绂�
+ /// </summary>
+ /// <param name="x1"></param>
+ /// <param name="y1"></param>
+ /// <param name="x2"></param>
+ /// <param name="y2"></param>
+ /// <returns></returns>
+ public double DistanceP2P(double x1, double y1, double x2, double y2)
+ {
+ HTuple dis;
+ HOperatorSet.DistancePp((HTuple)y1, (HTuple)x1, (HTuple)y2, (HTuple)x2, out dis);
+
+ return dis.D;
+ }
+
+ /// <summary>
+ /// 璁$畻2鐩寸嚎鐨勮搴�
+ /// </summary>
+ /// <param name="r1"></param>
+ /// <param name="r2"></param>
+ /// <returns></returns>
+ public double AngleLine2Line(FitLineResult r1, FitLineResult r2)
+ {
+ HTuple angle;
+ HOperatorSet.AngleLl(r1.mRowStart, r1.mColumnStart, r1.mRowEnd, r1.mColumnEnd,
+ r2.mRowStart, r2.mColumnStart, r2.mRowEnd, r2.mColumnEnd, out angle);
+
+ return angle.D / Math.PI * 180;
+ }
+
+ #endregion
+ }
+}
diff --git a/HalconTools/HalconTools.csproj b/HalconTools/HalconTools.csproj
new file mode 100644
index 0000000..ee5e505
--- /dev/null
+++ b/HalconTools/HalconTools.csproj
@@ -0,0 +1,240 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>9.0.21022</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{461F5DE4-F558-41B7-9494-F76854E0E7C7}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>HalconTools</RootNamespace>
+ <AssemblyName>HalconTools</AssemblyName>
+ <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <StartupObject>
+ </StartupObject>
+ <FileUpgradeFlags>
+ </FileUpgradeFlags>
+ <UpgradeBackupLocation>
+ </UpgradeBackupLocation>
+ <OldToolsVersion>3.5</OldToolsVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="halcondotnet, Version=11.0.1.0, Culture=neutral, PublicKeyToken=4973bed59ddbf2b8, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\Lib\halcon\halcondotnet.dll</HintPath>
+ </Reference>
+ <Reference Include="System" />
+ <Reference Include="System.Core">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Data" />
+ <Reference Include="System.Deployment" />
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Runtime.Serialization.Formatters.Soap" />
+ <Reference Include="System.Windows.Forms" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="CalibrationModule\CalibImage.cs" />
+ <Compile Include="CalibrationModule\CalibrationAssistant.cs" />
+ <Compile Include="CalibrationModule\QualityIssue.cs" />
+ <Compile Include="CalibrationModule\QualityProcedures.cs" />
+ <Compile Include="ContourModule\ContourAssistant.cs" />
+ <Compile Include="ContourModule\ContourParam.cs" />
+ <Compile Include="ContourModule\ContourResult.cs" />
+ <Compile Include="FitModule\CirclePosition.cs" />
+ <Compile Include="FitModule\FitAssistant.cs" />
+ <Compile Include="FitModule\FitCircleParam.cs" />
+ <Compile Include="FitModule\FitCircleResult.cs" />
+ <Compile Include="FitModule\FitLineParam.cs" />
+ <Compile Include="FitModule\FitLineResult.cs" />
+ <Compile Include="FitModule\FitResult.cs" />
+ <Compile Include="FitModule\LineMetrology.cs" />
+ <Compile Include="FitModule\LinePosition.cs" />
+ <Compile Include="frmCalibration.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmCalibration.Designer.cs">
+ <DependentUpon>frmCalibration.cs</DependentUpon>
+ </Compile>
+ <Compile Include="frmContourAssistant.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmContourAssistant.Designer.cs">
+ <DependentUpon>frmContourAssistant.cs</DependentUpon>
+ </Compile>
+ <Compile Include="frmFitCircleAndLine.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmFitCircleAndLine.Designer.cs">
+ <DependentUpon>frmFitCircleAndLine.cs</DependentUpon>
+ </Compile>
+ <Compile Include="frmJobManager.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmJobManager.Designer.cs">
+ <DependentUpon>frmJobManager.cs</DependentUpon>
+ </Compile>
+ <Compile Include="frmMain.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmMain.Designer.cs">
+ <DependentUpon>frmMain.cs</DependentUpon>
+ </Compile>
+ <Compile Include="frmMatchingAssistant.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmMeasureAssistant.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmScrewAssistant.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmScrewAssistant.Designer.cs">
+ <DependentUpon>frmScrewAssistant.cs</DependentUpon>
+ </Compile>
+ <Compile Include="HalconTool.cs" />
+ <Compile Include="JobModule\Job.cs" />
+ <Compile Include="JobModule\JobAssistance.cs" />
+ <Compile Include="JobModule\ToolType.cs" />
+ <Compile Include="MatchingModule\MatchingAssistant.cs" />
+ <Compile Include="MatchingModule\MatchingOpt.cs" />
+ <Compile Include="MatchingModule\MatchingOptSpeed.cs" />
+ <Compile Include="MatchingModule\MatchingOptStatistics.cs" />
+ <Compile Include="MatchingModule\MatchingParam.cs" />
+ <Compile Include="MatchingModule\MatchingParamSave.cs" />
+ <Compile Include="MatchingModule\MatchingResult.cs" />
+ <Compile Include="MeasureModule\MeasureAssistant.cs" />
+ <Compile Include="MeasureModule\Measurement.cs" />
+ <Compile Include="MeasureModule\MeasurementEdge.cs" />
+ <Compile Include="MeasureModule\MeasurementPair.cs" />
+ <Compile Include="MeasureModule\MeasurementResult.cs" />
+ <Compile Include="MeasureModule\MeasureParamSave.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <EmbeddedResource Include="frmCalibration.resx">
+ <DependentUpon>frmCalibration.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmContourAssistant.resx">
+ <DependentUpon>frmContourAssistant.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmFitCircleAndLine.resx">
+ <DependentUpon>frmFitCircleAndLine.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmJobManager.resx">
+ <DependentUpon>frmJobManager.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmMain.resx">
+ <DependentUpon>frmMain.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmMain.zh-CHS.resx">
+ <DependentUpon>frmMain.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmMatchingAssistant.resx">
+ <DependentUpon>frmMatchingAssistant.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmMeasureAssistant.resx">
+ <DependentUpon>frmMeasureAssistant.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmScrewAssistant.resx">
+ <DependentUpon>frmScrewAssistant.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Resources\Resource.en-US.resx">
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Resources\Resource.zh-CN.resx">
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Resources.resx</DependentUpon>
+ <DesignTime>True</DesignTime>
+ </Compile>
+ <None Include="Properties\Settings.settings">
+ <Generator>SettingsSingleFileGenerator</Generator>
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+ </None>
+ <Compile Include="Properties\Settings.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Settings.settings</DependentUpon>
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
+ </Compile>
+ <Compile Include="ResourceCulture.cs" />
+ <Compile Include="ScrewModule\ScrewAssistant.cs" />
+ <Compile Include="ScrewModule\ScrewParam.cs" />
+ <Compile Include="ScrewModule\ScrewResult.cs" />
+ <Compile Include="ToolKit\Counter.cs" />
+ <Compile Include="ToolKit\EventData.cs" />
+ <Compile Include="ToolKit\FileOperationResult.cs" />
+ <Compile Include="ToolKit\IniTool.cs" />
+ <Compile Include="ToolKit\KillApplication.cs" />
+ <Compile Include="ToolKit\ListenEventArgs.cs" />
+ <Compile Include="ToolKit\ListenEventCreater.cs" />
+ <Compile Include="ToolKit\LkSensor.cs" />
+ <Compile Include="ToolKit\Log.cs" />
+ <Compile Include="ToolKit\LogManager.cs" />
+ <Compile Include="ToolKit\LogType.cs" />
+ <Compile Include="ToolKit\NetWorkTool.cs" />
+ <Compile Include="ToolKit\SerializeFileTool.cs" />
+ <Compile Include="ToolKit\SerializeTool.cs" />
+ <Compile Include="ToolKit\SerialPort.cs" />
+ <Compile Include="ToolKit\SocketTools.cs" />
+ <Compile Include="ToolKit\StarterTool.cs" />
+ <Compile Include="ToolKit\StyleSetTools.cs" />
+ <Compile Include="ToolKit\Win32API.cs" />
+ <Compile Include="ViewROI\FunctionPlot.cs" />
+ <Compile Include="ViewROI\GraphicsContext.cs" />
+ <Compile Include="ViewROI\HObjectEntry.cs" />
+ <Compile Include="ViewROI\HWndCtrl.cs" />
+ <Compile Include="ViewROI\ROI.cs" />
+ <Compile Include="ViewROI\ROICircle.cs" />
+ <Compile Include="ViewROI\ROICircularArc.cs" />
+ <Compile Include="ViewROI\ROIController.cs" />
+ <Compile Include="ViewROI\ROILine.cs" />
+ <Compile Include="ViewROI\ROIRectangle1.cs" />
+ <Compile Include="ViewROI\ROIRectangle2.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="FitModule\FitModule.csproj" />
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project>
\ No newline at end of file
diff --git a/HalconTools/JobModule/Job.cs b/HalconTools/JobModule/Job.cs
new file mode 100644
index 0000000..be55e96
--- /dev/null
+++ b/HalconTools/JobModule/Job.cs
@@ -0,0 +1,42 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.IO;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ /// <summary>
+ /// 姣忎釜Job涓璗ool鐨勭被鍨嬪弬鏁�
+ /// </summary>
+ public struct JobTool
+ {
+ public ToolType type;
+ public FitLineParam fitLineParam;
+ public FitCircleParam fitCircleParam;
+ public MatchingParam matchingParam;
+ public string modelPath;
+ public ScrewParam screwParam;
+ }
+
+ public struct JobResult
+ {
+ public FitLineResult fitLineResult;
+ public FitCircleResult fitCircleResult;
+ public MatchingResult matchingResult;
+ public ScrewResult screwResult;
+ }
+
+ public struct Job
+ {
+ public string name;
+ public List<JobTool> tools;
+ }
+
+ public struct JobResults
+ {
+ public string name;
+ public List<JobResult> results;
+ }
+}
diff --git a/HalconTools/JobModule/JobAssistance.cs b/HalconTools/JobModule/JobAssistance.cs
new file mode 100644
index 0000000..ff837e5
--- /dev/null
+++ b/HalconTools/JobModule/JobAssistance.cs
@@ -0,0 +1,72 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public class JobAssistance
+ {
+ public JobAssistance()
+ {
+ }
+
+ /// <summary>
+ /// 鍗曠嫭宸ュ叿杩愯
+ /// </summary>
+ /// <param name="tool"></param>
+ public JobResult ToolRun(HImage image,JobTool tool)
+ {
+ JobResult tmpResult = new JobResult();
+ FitAssistant mfit = new FitAssistant();
+ MatchingAssistant mMatch = new MatchingAssistant();
+ ScrewAssistant mScrew = new ScrewAssistant();
+
+ switch (tool.type)
+ {
+ case ToolType.FindCircle:
+
+ tmpResult.fitCircleResult = new FitCircleResult();
+ mfit.mImage = image;
+ tmpResult.fitCircleResult = mfit.FitCircle(tool.fitCircleParam);
+
+ break;
+
+ case ToolType.FindLine:
+
+ tmpResult.fitLineResult = new FitLineResult();
+ mfit.mImage = image;
+ tmpResult.fitLineResult = mfit.FitLine(tool.fitLineParam);
+
+ break;
+
+ case ToolType.Matching:
+
+ tmpResult.matchingResult = new MatchingResult();
+ mMatch.mImage = image;
+ mMatch.parameterSet = tool.matchingParam;
+
+ mMatch.loadShapeModel(tool.modelPath);
+ mMatch.detectShapeModel();
+
+ tmpResult.matchingResult = mMatch.tResult;
+
+ break;
+
+ case ToolType.Screw:
+
+ tmpResult.screwResult = new ScrewResult();
+ mScrew.mImage = image;
+ mScrew.SetPara(tool.screwParam);
+ mScrew.Run();
+ tmpResult.screwResult = mScrew.mScrewResult;
+
+ break;
+ }
+
+ return tmpResult;
+ }
+
+ }
+}
diff --git a/HalconTools/JobModule/ToolType.cs b/HalconTools/JobModule/ToolType.cs
new file mode 100644
index 0000000..e4ca05a
--- /dev/null
+++ b/HalconTools/JobModule/ToolType.cs
@@ -0,0 +1,29 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HalconTools
+{
+ public enum ToolType
+ {
+ /// <summary>
+ /// 鎵剧洿绾�
+ /// </summary>
+ FindLine = 0,
+
+ /// <summary>
+ /// 鎵惧渾
+ /// </summary>
+ FindCircle = 1,
+
+ /// <summary>
+ /// 鍖归厤
+ /// </summary>
+ Matching = 2,
+
+ /// <summary>
+ /// 铻轰笣瀛斿畾浣�
+ /// </summary>
+ Screw = 3,
+ }
+}
diff --git a/HalconTools/MatchingModule/MatchingAssistant.cs b/HalconTools/MatchingModule/MatchingAssistant.cs
new file mode 100644
index 0000000..c53cc2e
--- /dev/null
+++ b/HalconTools/MatchingModule/MatchingAssistant.cs
@@ -0,0 +1,1544 @@
+using System;
+using System.Collections;
+using HalconDotNet;
+using System.ComponentModel;
+
+namespace HalconTools
+{
+ public delegate void MatchingDelegate(int value);
+ public delegate void AutoParamDelegate(string value);
+ public delegate void FindShapeModelDelegate(object sender,HImage image, MatchingResult result);
+
+ [DefaultEvent("SetImageDone")]
+ /// <summary>
+ /// This is a controller class, which receives the
+ /// GUI component changes made by the user and forwards
+ /// the actions according to the internal settings.
+ /// To notify the GUI about semantic changes, we use two delegates. One
+ /// notifies about changes regarding the display objects
+ /// (like a change of image or change in model or contour). It is also used
+ /// to forward errors to the user, which might occur during a processing step.
+ /// The second delegate notifies the GUI to correct its sliders and trackbars
+ /// according to the new parameter setting, computed along with the
+ /// 'auto'-mechanism.
+ /// </summary>
+ public class MatchingAssistant
+ {
+ /// <summary>
+ /// Constant indicating that the model contour display should be
+ /// updated.
+ /// </summary>
+ public const int UPDATE_XLD = 0;
+ /// <summary>
+ /// Constant indicating that the pyramid (display-)level should be
+ /// updated.
+ /// </summary>
+ public const int UPDATE_DISPLEVEL = 1;
+ /// <summary>
+ /// Constant indicating that the pyramid should be updated.
+ /// </summary>
+ public const int UPDATE_PYRAMID = 2;
+ /// <summary>
+ /// Constant indicating that the detection results should be updated.
+ /// </summary>
+ public const int UPDATE_DETECTION_RESULT= 3;
+ /// <summary>
+ /// Constant indicating that the test image display should be updated.
+ /// </summary>
+ public const int UPDATE_TESTVIEW = 4;
+
+ /// <summary>
+ /// Constant indicating an error if a wrong file extension is used for
+ /// a model file.
+ /// </summary>
+ public const int ERR_NO_VALID_FILE = 5;
+ /// <summary>
+ /// Constant indicating an error when writing a model file
+ /// </summary>
+ public const int ERR_WRITE_SHAPEMODEL = 6;
+ /// <summary>
+ /// Constant indicating an error when reading from model file
+ /// </summary>
+ public const int ERR_READ_SHAPEMODEL = 7;
+ /// <summary>
+ /// Constant indicating an error if operations are performed that
+ /// need a shape-based model, though no model has been created, yet
+ /// </summary>
+ public const int ERR_NO_MODEL_DEFINED = 8;
+ /// <summary>
+ /// Constant indicating an error if operations are performed that
+ /// need a model image, though no model image has been loaded, yet
+ /// </summary>
+ public const int ERR_NO_IMAGE = 9;
+ /// <summary>
+ /// Constant indicating an error if operations are performed that
+ /// need test images, though no test image has been loaded, yet
+ /// </summary>
+ public const int ERR_NO_TESTIMAGE = 10;
+ /// <summary>
+ /// Constant indicating an error when reading an image file.
+ /// </summary>
+ public const int ERR_READING_IMG = 11;
+ /// <summary>
+ /// 指示查找错误
+ /// </summary>
+ public const int ERR_FINDSHAPEMODEL = 12;
+ /// <summary>
+ /// 错误的参数
+ /// </summary>
+ public const int ERR_PARAMSET = 13;
+
+ /// <summary>
+ /// Region of interest defined by the sum of
+ /// the positive and negative ROIs
+ /// </summary>
+ private HRegion mROIModel;
+
+ /// <summary>Training image with full domain</summary>
+ private HImage oImage;
+
+ /// <summary>
+ /// 给FindShapeModel使用
+ /// </summary>
+ private HImage OriginalImage;
+
+ readonly object someEventLock;
+
+ /// <summary>
+ /// The model image is the training image with
+ /// a domain reduced by the region mROIModel
+ /// </summary>
+ public HImage mImage;
+
+ /// <summary>
+ /// Test image in which the model is searched.
+ /// </summary>
+ public HImage tImage;
+
+ /// <summary>List of test images</summary>
+ public Hashtable TestImages;
+
+ //matching parameters
+ public MatchingParam parameterSet;
+
+ public MatchingParam getParameterSet
+ {
+ get
+ {
+ return parameterSet;
+ }
+ //set;
+ }
+
+ //matching result
+ public MatchingResult tResult;
+ //model handle
+ private HShapeModel ModelID;
+ //model handle FindShapeModel使用
+ private HShapeModel[] FindShapeModelID;
+ //
+ public MatchingResult findShapeResult { get; set; }
+
+ // flags to control processing
+ private bool findAlways;
+ private bool createNewModelID;
+
+ //flags to control the inspection and recognition process
+ public bool onExternalModelID;
+ public bool onTimer = false;
+
+ // display purposes
+ private int oWidth;
+ private int oHeight;
+ private double scaleW = 1.0;
+ private double scaleH = 1.0;
+
+ private HImage PyramidImages;
+ private HRegion PyramidROIs;
+ private int currentImgLevel = 1; //mNumLevel
+ private int maxPyramidLevel = 6;
+ private HHomMat2D homSc2D;
+
+ /// <summary>Stores exception message for display</summary>
+ public string exceptionText = "";
+
+
+ // upper and lower range
+ private int contrastLowB;
+ private int contrastUpB;
+ private double scaleStepLowB;
+ private double scaleStepUpB;
+ private double angleStepLowB;
+ private double angleStepUpB;
+ private int pyramLevLowB;
+ private int pyramLevUpB;
+ private int minContrastLowB;
+ private int minContrastUpB;
+
+ // auxiliary value table to store intermediate states
+ private int mCachedNumLevel;
+ private double mCachedStartAng;
+ private double mCachedAngExt;
+ private double mCachedAngStep;
+ private double mCachedMinScale;
+ private double mCachedMaxScale;
+ private double mCachedScaleStep;
+ private string mCachedMetric;
+ private int mCachedMinCont;
+
+
+
+ /// <summary>
+ /// Delegate to forward changes for the display, which means changes
+ /// in the model contour, image level etc.
+ /// </summary>
+ public MatchingDelegate NotifyIconObserver;
+ /// <summary>
+ /// Delegate to forward changes in the matching parameters determined
+ /// with the 'auto-' mechanism
+ /// </summary>
+ public AutoParamDelegate NotifyParamObserver;
+
+ private MatchingDelegate NotifyIconObserverMessage;
+
+ /// <summary>
+ /// 图像设定完成事件
+ /// </summary>
+ public event SetImageDelegate SetImageDone;
+
+ /// <summary>
+ /// 匹配完成事件
+ /// </summary>
+ public event FindShapeModelDelegate FindShapeModelDone;
+
+ /// <summary>
+ /// Initializes flags, lists, and delegates to have a valid
+ /// starting point to start the assistant.
+ /// </summary>
+ public MatchingAssistant(MatchingParam parSet)
+ {
+ parameterSet = parSet;
+ NotifyIconObserver = new MatchingDelegate(dummy);
+ NotifyParamObserver = new AutoParamDelegate(dummyS);
+ homSc2D = new HHomMat2D();
+ TestImages = new Hashtable(10);
+ tResult = new MatchingResult();
+
+ contrastLowB = 0;
+ contrastUpB = 255;
+ scaleStepLowB = 0.0;
+ scaleStepUpB = (double)19.0/1000.0;
+ angleStepLowB = 0.0;
+ angleStepUpB = (double)(112.0/10.0)*Math.PI/180.0;
+ pyramLevLowB = 1;
+ pyramLevUpB = 6;
+ minContrastLowB = 0;
+ minContrastUpB = 30;
+
+ findAlways = false;
+ createNewModelID = true;
+ ModelID = new HShapeModel();
+ onExternalModelID = false;
+ }
+
+ public MatchingAssistant(int num)
+ {
+ someEventLock = new object();
+ FindShapeModelID = new HShapeModel[num];
+ NotifyIconObserverMessage = new MatchingDelegate(UpdateMessage);
+
+ initMatch();
+ }
+
+ public MatchingAssistant()
+ {
+ someEventLock = new object();
+ FindShapeModelID = new HShapeModel[1];
+ NotifyIconObserverMessage = new MatchingDelegate(UpdateMessage);
+
+ initMatch();
+ }
+
+ private void initMatch()
+ {
+ tResult = new MatchingResult();
+ ModelID = new HShapeModel();
+ }
+
+ public void UpdateMessage(int val)
+ {
+ switch (val)
+ {
+ case MatchingAssistant.ERR_NO_MODEL_DEFINED:
+ System.Windows.Forms.MessageBox.Show("Please define a Model!",
+ "Matching Wizard",
+ System.Windows.Forms.MessageBoxButtons.OK,
+ System.Windows.Forms.MessageBoxIcon.Information);
+ break;
+ case MatchingAssistant.ERR_NO_IMAGE:
+ System.Windows.Forms.MessageBox.Show("Please load an image",
+ "Matching Wizard",
+ System.Windows.Forms.MessageBoxButtons.OK,
+ System.Windows.Forms.MessageBoxIcon.Information);
+ break;
+ case MatchingAssistant.ERR_NO_VALID_FILE:
+ System.Windows.Forms.MessageBox.Show("Selected file is not a HALCON ShapeModel file .shm",
+ "Matching Wizard",
+ System.Windows.Forms.MessageBoxButtons.OK,
+ System.Windows.Forms.MessageBoxIcon.Information);
+ break;
+ case MatchingAssistant.ERR_FINDSHAPEMODEL:
+ System.Windows.Forms.MessageBox.Show("模板匹配失败",
+ "Matching Wizard",
+ System.Windows.Forms.MessageBoxButtons.OK,
+ System.Windows.Forms.MessageBoxIcon.Information);
+ break;
+ case MatchingAssistant.ERR_PARAMSET:
+ System.Windows.Forms.MessageBox.Show("错误的参数设置",
+ "Matching Wizard",
+ System.Windows.Forms.MessageBoxButtons.OK,
+ System.Windows.Forms.MessageBoxIcon.Information);
+ break;
+ default:
+ break;
+ }
+ }
+
+ /// <summary>Sets <c>image</c> to be the training image <c>oImage</c> </summary>
+ public void setImage(HImage image)
+ {
+ string tmp;
+ image.GetImagePointer1(out tmp,
+ out oWidth,
+ out oHeight);
+
+ oImage = image;
+ reset();
+ }
+
+ /// <summary>
+ /// Loads the training image from the file supplied by <c>filename</c>
+ /// </summary>
+ public bool setImage(string filename)
+ {
+ HImage image;
+
+ try
+ {
+ image = new HImage(filename);
+ setImage(image);
+ }
+ catch(HOperatorException e)
+ {
+ exceptionText = e.Message;
+ NotifyIconObserver(MatchingAssistant.ERR_READING_IMG);
+ return false;
+ }
+
+ return true;
+ }
+
+ /// <summary>
+ /// Compute the model image and the model contour for the applied ROI.
+ /// </summary>
+ public void setModelROI(HRegion roi)
+ {
+ mROIModel = roi;
+ PyramidROIs = null;
+ createNewModelID = true;
+
+ if(mROIModel==null)
+ {
+ mImage = null;
+ return;
+ }
+
+ mImage = oImage.ReduceDomain(mROIModel);
+
+ determineStepRanges();
+
+ if(parameterSet.isOnAuto())
+ determineShapeParameter();
+
+ inspectShapeModel();
+ }
+
+ /********************************************************************/
+ /* methods for test image */
+ /********************************************************************/
+
+ /// <summary>
+ /// Loads and adds test image files to the list of test images
+ /// </summary>
+ public bool addTestImages(string fileKey)
+ {
+ if(TestImages.ContainsKey(fileKey))
+ return false;
+
+ try
+ {
+ HImage image = new HImage(fileKey);
+ TestImages.Add(fileKey, image);
+ }
+ catch(HOperatorException e)
+ {
+ exceptionText = e.Message;
+ NotifyIconObserver(MatchingAssistant.ERR_READING_IMG);
+ return false;
+ }
+ return true;
+ }
+
+ /// <summary>
+ /// Sets an image from the list of test images to be the current
+ /// test image. The filename is given by the value fileKey.
+ /// </summary>
+ public void setTestImage(string fileKey)
+ {
+ tImage = (HImage)TestImages[fileKey];
+ NotifyIconObserver(MatchingAssistant.UPDATE_TESTVIEW);
+ }
+
+ /// <summary>
+ /// Removes an image from the list of test images,
+ /// using the file name
+ /// </summary>
+ public void removeTestImage(string fileName)
+ {
+ if(TestImages.ContainsKey(fileName))
+ TestImages.Remove(fileName);
+
+ if(TestImages.Count==0)
+ tImage = null;
+ }
+
+ /// <summary>
+ /// Removes all images from the list of test images
+ /// </summary>
+ public void removeTestImage()
+ {
+ TestImages.Clear();
+ tImage = null;
+ }
+
+ /// <summary>
+ /// Sets the current test image to the image defined by
+ /// <c>fileName</c> and return it
+ /// </summary>
+ public HImage getTestImage(string fileName)
+ {
+ if((tImage == null) && (TestImages.ContainsKey(fileName)))
+ tImage = (HImage)TestImages[fileName];
+
+ return tImage;
+ }
+
+ /// <summary>
+ /// Returns the current test image
+ /// </summary>
+ public HImage getCurrTestImage()
+ {
+ return tImage;
+ }
+
+
+ /******************************************************************/
+ /* auto options */
+ /******************************************************************/
+
+ /// <summary>
+ /// Adds the parameter name given by <c>mode</c>
+ /// to the list of matching parameters that are
+ /// set to be determined automatically
+ /// </summary>
+ public void setAuto(string mode)
+ {
+ if(parameterSet.setAuto(mode))
+ determineShapeParameter();
+ }
+
+ /// <summary>
+ /// Removes the parameter name given by <c>mode</c> from the
+ /// list of matching parameters that are determined
+ /// automatically
+ /// </summary>
+ public bool removeAuto(string mode)
+ {
+ return parameterSet.removeAuto(mode);
+ }
+
+
+ /************************ set matching values ********************/
+ /******************************************************************/
+
+ /// <summary>
+ /// Sets Contrast to the input value <c>val</c>
+ /// and recreates the model.
+ /// </summary>
+ public void setContrast(int val)
+ {
+ parameterSet.setContrast(val);
+ minContrastUpB = (int)val;
+
+ inspectShapeModel();
+
+ if(parameterSet.isOnAuto())
+ determineShapeParameter();
+
+ createNewModelID = true;
+ }
+
+ /// <summary>
+ /// Sets ScaleStep to the input value <c>val</c>
+ /// </summary>
+ public void setScaleStep(double val)
+ {
+ parameterSet.setScaleStep(val);
+
+ if(parameterSet.isOnAuto())
+ determineShapeParameter();
+
+ createNewModelID = true;
+ }
+
+ /// <summary>
+ /// Sets AngleStep to the input value <c>val</c>
+ /// </summary>
+ public void setAngleStep(double val)
+ {
+ parameterSet.setAngleStep(val);
+
+ if(parameterSet.isOnAuto())
+ determineShapeParameter();
+
+ createNewModelID = true;
+ }
+
+ /// <summary>
+ /// Sets PyramidLevel to the input value <c>val</c>
+ /// </summary>
+ public void setPyramidLevel(double val)
+ {
+ parameterSet.setNumLevel(val);
+
+ if(parameterSet.isOnAuto())
+ determineShapeParameter();
+
+ createNewModelID = true;
+ }
+
+ /// <summary>
+ /// Sets Optimization to the input value <c>val</c>
+ /// </summary>
+ public void setOptimization(string val)
+ {
+ parameterSet.setOptimization(val);
+
+ if(parameterSet.isOnAuto())
+ determineShapeParameter();
+
+ createNewModelID = true;
+ }
+
+ /// <summary>
+ /// Sets MinContrast to the input value <c>val</c>
+ /// </summary>
+ public void setMinContrast(int val)
+ {
+ parameterSet.setMinContrast(val);
+
+ if(parameterSet.isOnAuto())
+ determineShapeParameter();
+
+ createNewModelID = true;
+ }
+
+ /*******************************************************/
+
+ /// <summary>
+ /// Sets Metric to the input value <c>val</c>
+ /// </summary>
+ public void setMetric(string val)
+ {
+ parameterSet.setMetric(val);
+ createNewModelID = true;
+ }
+
+ /// <summary>
+ /// Sets MinScale to the input value <c>val</c>
+ /// </summary>
+ public void setMinScale(double val)
+ {
+ parameterSet.setMinScale(val);
+ createNewModelID = true;
+ }
+
+ /// <summary>
+ /// Sets MaxScale to the input value <c>val</c>
+ /// </summary>
+ public void setMaxScale(double val)
+ {
+ parameterSet.setMaxScale(val);
+ createNewModelID = true;
+ }
+
+ /// <summary>
+ /// Sets StartingAngle to the input value <c>val</c>
+ /// </summary>
+ public void setStartingAngle(double val)
+ {
+ parameterSet.setStartingAngle(val);
+ createNewModelID = true;
+ }
+
+ /// <summary>
+ /// Sets AngleExtent to the input value <c>val</c>
+ /// </summary>
+ public void setAngleExtent(double val)
+ {
+ parameterSet.setAngleExtent(val);
+ createNewModelID = true;
+ }
+
+ /// <summary>
+ /// Changes the currentImgLevel to the input parameter
+ /// <c>val</c> and triggers an update in the GUI display
+ /// </summary>
+ public void setDispLevel(int val)
+ {
+ this.currentImgLevel = val;
+ NotifyIconObserver(MatchingAssistant.UPDATE_DISPLEVEL);
+ }
+
+ /****************** set findmodel parameters *****************/
+ /**************************************************************/
+ /// <summary>
+ /// Sets MinScore to the input value and starts model detection
+ /// if the flag <c>findAlways</c> is checked
+ /// </summary>
+ public void setMinScore(double val)
+ {
+ parameterSet.setMinScore(val);
+
+ if(findAlways)
+ detectShapeModel();
+ }
+
+ /// <summary>
+ /// Sets NumMatches to the input value and starts model detection
+ /// if the flag <c>findAlways</c> is checked
+ /// </summary>
+ public void setNumMatches(int val)
+ {
+ parameterSet.setNumMatches(val);
+
+ if(findAlways)
+ detectShapeModel();
+ }
+
+ /// <summary>
+ /// Sets Greediness to the input value and starts model detection
+ /// if the flag <c>findAlways</c> is checked
+ /// </summary>
+ public void setGreediness(double val)
+ {
+ parameterSet.setGreediness(val);
+
+ if(findAlways)
+ detectShapeModel();
+ }
+
+ /// <summary>
+ /// Sets MaxOverlap to the input value and starts model detection
+ /// if the flag <c>findAlways</c> is checked
+ /// </summary>
+ public void setMaxOverlap(double val)
+ {
+ parameterSet.setMaxOverlap(val);
+
+ if(findAlways)
+ detectShapeModel();
+ }
+
+ /// <summary>
+ /// Sets SubPixel to the input value and starts model detection
+ /// if the flag <c>findAlways</c> is checked
+ /// </summary>
+ public void setSubPixel(string val)
+ {
+ parameterSet.setSubPixel(val);
+
+ if(findAlways)
+ detectShapeModel();
+ }
+
+ /// <summary>
+ /// Sets LastPyramLevel to the input value and starts model detection
+ /// if the flag <c>findAlways</c> is checked
+ /// </summary>
+ public void setLastPyramLevel(int val)
+ {
+ parameterSet.setLastPyramLevel(val);
+
+ if(findAlways)
+ detectShapeModel();
+ }
+
+ /// <summary>
+ /// Sets the flag <c>findAlways</c> to the input value <c>flag</c>
+ /// </summary>
+ public void setFindAlways(bool flag)
+ {
+ findAlways = flag;
+
+ if(findAlways && tImage != null)
+ detectShapeModel();
+ }
+
+ /// <summary>
+ /// Triggers model detection, if a test image is defined
+ /// </summary>
+ public bool applyFindModel()
+ {
+ bool success = false;
+
+ if(tImage != null)
+ success = detectShapeModel();
+ else
+ NotifyIconObserver(MatchingAssistant.ERR_NO_TESTIMAGE);
+
+ return success;
+ }
+
+ /// <summary>
+ /// Gets detected model contours
+ /// </summary>
+ public HXLD getDetectionResults()
+ {
+ return tResult.getDetectionResults();
+ }
+
+ /// <summary>
+ /// Gets matching results
+ /// </summary>
+ public MatchingResult getMatchingResults()
+ {
+ return tResult;
+ }
+
+ /******************** optimize recognition speed *****************/
+ /******************************************************************/
+
+ /// <summary>
+ /// Sets the RecognitionRateOption to the input
+ /// value <c>idx</c>
+ /// </summary>
+ public void setRecogRateOption(int idx)
+ {
+ parameterSet.setRecogRateOption(idx);
+ }
+
+ /// <summary>
+ /// Sets the RecognitionRate to the input value <c>val</c>
+ /// </summary>
+ public void setRecogitionRate(int val)
+ {
+ parameterSet.setRecogitionRate(val);
+ }
+
+ /// <summary>
+ /// Sets the RecognitionSpeedMode to the input
+ /// value <c>val</c>
+ /// </summary>
+ public void setRecogSpeedMode(string val)
+ {
+ parameterSet.setRecogSpeedMode(val);
+ }
+
+ /// <summary>
+ /// Sets the RecognitionManualSelection to the input .
+ /// value <c>val</c>
+ /// </summary>
+ public void setRecogManualSelection(int val)
+ {
+ parameterSet.setRecogManualSelection(val);
+ }
+
+
+ /********************************************************************/
+ /* getter methods */
+ /********************************************************************/
+
+ /// <summary>
+ /// Gets the model for the current image level
+ /// </summary>
+ public HXLD getModelContour()
+ {
+ if(PyramidROIs==null)
+ return null;
+
+ homSc2D.HomMat2dIdentity();
+ homSc2D = homSc2D.HomMat2dScaleLocal(scaleW, scaleH);
+
+ return ((PyramidROIs.SelectObj(currentImgLevel)).
+ GenContourRegionXld("center")).
+ AffineTransContourXld(homSc2D);
+ }
+
+ /// <summary>
+ /// Gets the model supplied by a loaded shapebased model file (.shm)
+ /// </summary>
+ public HXLD getLoadedModelContour()
+ {
+ HTuple row1, col1, row2, col2, row, col;
+ HHomMat2D homMat2D = new HHomMat2D();
+
+ try
+ {
+ tResult.mContour.SmallestRectangle1Xld(out row1, out col1, out row2, out col2);
+ row2 = row1.TupleMin();
+ col2 = col1.TupleMin();
+ row = row2.TupleFloor()-5;
+ col = col2.TupleFloor()-5;
+ homMat2D.HomMat2dIdentity();
+ homMat2D = homMat2D.HomMat2dTranslate(-row,-col);
+
+ return homMat2D.AffineTransContourXld(tResult.mContour);
+ }
+ catch(HOperatorException e)
+ {
+ exceptionText = e.Message;
+ NotifyIconObserver(MatchingAssistant.ERR_READ_SHAPEMODEL);
+ return null;
+ }
+ }
+
+ /// <summary>
+ /// Gets the model region for the current image level.
+ /// </summary>
+ public HRegion getModelRegion()
+ {
+ if(PyramidROIs==null)
+ return null;
+
+ HRegion reg = PyramidROIs.SelectObj(currentImgLevel);
+ return reg.ZoomRegion(scaleW, scaleH);
+ }
+
+ /// <summary>
+ /// Gets the model image for the current image level.
+ /// </summary>
+ public HImage getDispImage()
+ {
+ int fW, fH;
+ string tmp;
+
+ if (PyramidImages ==null)
+ return oImage;
+
+ HImage img = PyramidImages.SelectObj(currentImgLevel);
+ img.GetImagePointer1(out tmp, out fW, out fH);
+
+ scaleW = (double)oWidth/fW;
+ scaleH = (double)oHeight/fH;
+
+ return img.ZoomImageFactor(scaleW, scaleH, "nearest_neighbor");
+ }
+
+ /// <summary>
+ /// Clears all model creation and detection results
+ /// and resets flags to their initial values.
+ /// </summary>
+ public void reset()
+ {
+ mROIModel = null;
+ currentImgLevel = 1;
+ PyramidROIs = null;
+ PyramidImages = null;
+ mImage = null;
+ scaleH = 1;
+ scaleW = 1;
+ createNewModelID = true;
+
+ tResult.reset();
+ NotifyIconObserver(MatchingAssistant.UPDATE_XLD);
+ }
+
+
+ /********************************************************************/
+ /********************************************************************/
+
+ /// <summary>
+ /// Writes model to the file specified by <c>fileName</c>.
+ /// </summary>
+ public void saveShapeModel(string fileName)
+ {
+ if(mImage == null)
+ {
+ NotifyIconObserver(MatchingAssistant.ERR_NO_MODEL_DEFINED);
+ return;
+ }
+
+ if (createNewModelID)
+ if (!createShapeModel())
+ return;
+ try
+ {
+ ModelID.WriteShapeModel(fileName);
+ }
+ catch(HOperatorException e)
+ {
+ exceptionText = e.Message;
+ NotifyIconObserver(MatchingAssistant.ERR_WRITE_SHAPEMODEL);
+ }
+ }
+
+ /// <summary>
+ /// Loads model from the file specified by <c>fileName</c>
+ /// </summary>
+ public bool loadShapeModel(string fileName)
+ {
+ onExternalModelID = false;
+
+ try
+ {
+ ModelID.ReadShapeModel(fileName);
+ }
+ catch(HOperatorException e)
+ {
+ exceptionText = e.Message;
+ NotifyIconObserver(MatchingAssistant.ERR_READ_SHAPEMODEL);
+ return false;
+ }
+
+ onExternalModelID = true;
+ tResult.mContour = ModelID.GetShapeModelContours(1);
+
+ cacheModelParams();
+
+ parameterSet.mNumLevel = ModelID.GetShapeModelParams(out parameterSet.mStartingAngle,
+ out parameterSet.mAngleExtent,
+ out parameterSet.mAngleStep,
+ out parameterSet.mMinScale,
+ out parameterSet.mMaxScale,
+ out parameterSet.mScaleStep,
+ out parameterSet.mMetric,
+ out parameterSet.mMinContrast);
+ return true;
+ }
+
+ /***************************************************************/
+ /***************************************************************/
+ private void cacheModelParams()
+ {
+ mCachedNumLevel = parameterSet.mNumLevel;
+ mCachedStartAng = parameterSet.mStartingAngle;
+ mCachedAngExt = parameterSet.mAngleExtent;
+ mCachedAngStep = parameterSet.mAngleStep;
+ mCachedMinScale = parameterSet.mMinScale;
+ mCachedMaxScale = parameterSet.mMaxScale;
+ mCachedScaleStep = parameterSet.mScaleStep;
+ mCachedMetric = parameterSet.mMetric;
+ mCachedMinCont = parameterSet.mMinContrast;
+ }
+
+
+ public void resetCachedModelParams()
+ {
+ parameterSet.mNumLevel = mCachedNumLevel;
+ parameterSet.mStartingAngle = mCachedStartAng;
+ parameterSet.mAngleExtent = mCachedAngExt;
+ parameterSet.mAngleStep = mCachedAngStep;
+ parameterSet.mMinScale = mCachedMinScale;
+ parameterSet.mMaxScale = mCachedMaxScale;
+ parameterSet.mScaleStep = mCachedScaleStep;
+ parameterSet.mMetric = mCachedMetric;
+ parameterSet.mMinContrast = mCachedMinCont;
+ createNewModelID = true;
+ }
+
+ /// <summary>
+ /// Creates the shape-based model. If the region of interest
+ /// <c>mROIModel</c> is missing or not well defined using the
+ /// interactive ROIs, then an error message is returned.
+ /// </summary>
+ public bool createShapeModel()
+ {
+ if(mImage==null)
+ {
+ if(!onTimer)
+ NotifyIconObserver(MatchingAssistant.ERR_NO_MODEL_DEFINED);
+ return false;
+ }
+
+ try
+ {
+ ModelID = mImage.CreateScaledShapeModel(parameterSet.mNumLevel,
+ parameterSet.mStartingAngle,
+ parameterSet.mAngleExtent,
+ parameterSet.mAngleStep,
+ parameterSet.mMinScale,
+ parameterSet.mMaxScale,
+ parameterSet.mScaleStep,
+ parameterSet.mOptimization,
+ parameterSet.mMetric,
+ parameterSet.mContrast,
+ parameterSet.mMinContrast);
+ }
+ catch(HOperatorException e)
+ {
+
+ if(!onTimer)
+ {
+ exceptionText = e.Message;
+ NotifyParamObserver(MatchingParam.H_ERR_MESSAGE);
+ }
+ return false;
+ }
+
+ tResult.mContour = ModelID.GetShapeModelContours(1);
+
+ createNewModelID = false;
+ return true;
+ }
+
+ /// <summary>
+ /// Finds the model in the test image. If the model
+ /// hasn't been created or needs to be recreated (due to
+ /// user changes made to the GUI components),
+ /// then the model is created first.
+ /// </summary>
+ public bool detectShapeModel()
+ {
+ HTuple levels, rtmp;
+ rtmp = new HTuple();
+ double t2, t1;
+
+ if(tImage == null)
+ return false;
+
+ if(createNewModelID && !onExternalModelID)
+ if(!createShapeModel())
+ return false;
+
+ try
+ {
+ levels = new HTuple(new int [] {parameterSet.mNumLevel,
+ parameterSet.mLastPyramidLevel});
+ t1 = HSystem.CountSeconds();
+ tImage.FindScaledShapeModel(ModelID,
+ parameterSet.mStartingAngle,
+ parameterSet.mAngleExtent,
+ parameterSet.mMinScale,
+ parameterSet.mMaxScale,
+ parameterSet.mMinScore,
+ parameterSet.mNumMatches,
+ parameterSet.mMaxOverlap,
+ new HTuple(parameterSet.mSubpixel),
+ levels,
+ parameterSet.mGreediness,
+ out tResult.mRow,
+ out tResult.mCol,
+ out tResult.mAngle,
+ out tResult.mScaleRow,
+ out tResult.mScore);
+ t2 = HSystem.CountSeconds();
+ tResult.mTime = 1000.0 * (t2 - t1);
+ tResult.count = tResult.mRow.Length;
+ tResult.mScaleCol = tResult.mScaleRow;
+ }
+ catch(HOperatorException e)
+ {
+ if(!onTimer)
+ {
+ exceptionText = e.Message;
+ NotifyParamObserver(MatchingParam.H_ERR_MESSAGE);
+ }
+
+ return false;
+ }
+
+ if (NotifyIconObserver != null) NotifyIconObserver(MatchingAssistant.UPDATE_DETECTION_RESULT);
+ if (FindShapeModelDone != null)FindShapeModelDone(this, tImage, tResult);
+
+ return true;
+ }
+
+ /// <summary>
+ /// 设定图像,后续FindShapeModel使用
+ /// </summary>
+ /// <param name="image"></param>
+ /// <returns></returns>
+ public bool SetImage_FindShapeModel(HImage image)
+ {
+ lock (someEventLock)
+ {
+ if (image != null)
+ {
+ OriginalImage = image;
+
+ if (SetImageDone != null)
+ {
+ SetImageDone(this,OriginalImage);
+ }
+
+ return OriginalImage.IsInitialized();
+ }
+ else
+ {
+ NotifyIconObserver(MatchingAssistant.ERR_NO_IMAGE);
+ return false;
+ }
+ }
+ }
+
+ /// <summary>
+ /// 使用指定的模板ID在SetImage_FindShapeModel设定的图像中查找目标
+ /// </summary>
+ /// <param name="IDindext">指定模板ID编号</param>
+ /// <param name="parameterSet">参数</param>
+ /// <returns></returns>
+ public MatchingResult FindShapeModel(int IDindext, MatchingParamSave parameterSet)
+ {
+ HTuple levels;
+ double t2, t1;
+ MatchingResult result = new MatchingResult();
+
+ if (OriginalImage == null)
+ {
+ if (NotifyIconObserverMessage != null)
+ {
+ NotifyIconObserverMessage(MatchingAssistant.ERR_NO_IMAGE);
+ }
+
+ if (NotifyIconObserver != null)
+ {
+ NotifyIconObserver(MatchingAssistant.ERR_NO_IMAGE);
+ }
+
+ return result;
+ }
+
+ if (parameterSet == null)
+ {
+ if (NotifyIconObserverMessage != null)
+ {
+ NotifyIconObserverMessage(MatchingAssistant.ERR_PARAMSET);
+ }
+
+ if (NotifyIconObserver != null)
+ {
+ NotifyIconObserver(MatchingAssistant.ERR_PARAMSET);
+ }
+ return result;
+ }
+
+ if (FindShapeModelID[IDindext] == null)
+ {
+ if (NotifyIconObserverMessage != null)
+ {
+ NotifyIconObserverMessage(MatchingAssistant.ERR_NO_MODEL_DEFINED);
+ }
+
+ if (NotifyIconObserver != null)
+ {
+ NotifyIconObserver(MatchingAssistant.ERR_NO_MODEL_DEFINED);
+ }
+
+ return result;
+ }
+
+ try
+ {
+ lock (someEventLock)
+ {
+ result.mContour = FindShapeModelID[IDindext].GetShapeModelContours(1);
+
+ levels = new HTuple(new int[] {parameterSet.NumLevel,
+ parameterSet.LastPyramidLevel});
+ t1 = HSystem.CountSeconds();
+ OriginalImage.FindScaledShapeModel(FindShapeModelID[IDindext],
+ parameterSet.StartingAngle,
+ parameterSet.AngleExtent,
+ parameterSet.MinScale,
+ parameterSet.MaxScale,
+ parameterSet.MinScore,
+ parameterSet.NumMatches,
+ parameterSet.MaxOverlap,
+ new HTuple(parameterSet.Subpixel),
+ levels,
+ parameterSet.Greediness,
+ out result.mRow,
+ out result.mCol,
+ out result.mAngle,
+ out result.mScaleRow,
+ out result.mScore);
+
+ t2 = HSystem.CountSeconds();
+ result.mTime = 1000.0 * (t2 - t1);
+ result.count = result.mRow.Length;
+ result.mScaleCol = result.mScaleRow;
+ }
+
+ if (FindShapeModelDone != null)
+ {
+ FindShapeModelDone(this, OriginalImage,result);
+ }
+ }
+ catch (HOperatorException e)
+ {
+ if (NotifyIconObserverMessage != null)
+ {
+ NotifyIconObserverMessage(MatchingAssistant.ERR_FINDSHAPEMODEL);
+ }
+
+ if (NotifyIconObserver != null)
+ {
+ NotifyIconObserver(MatchingAssistant.ERR_FINDSHAPEMODEL);
+ }
+ return result;
+ }
+
+ return result;
+ }
+
+ /// <summary>
+ /// 在指定窗体中显示匹配到的结果
+ /// </summary>
+ /// <param name="viewPort">图像显示窗体</param>
+ /// <param name="CurrentImg">图像</param>
+ /// <param name="result">匹配结果</param>
+ public void FindModelGraphics(HalconDotNet.HWindowControl viewPort, HImage CurrentImg,MatchingResult result)
+ {
+ //Window control that manages visualization
+ HWndCtrl mView = new HWndCtrl(viewPort);
+
+ mView.resetAll();
+ mView.repaint();
+
+ mView.clearList();
+ mView.changeGraphicSettings(GraphicsContext.GC_LINESTYLE, new HTuple());
+ mView.addIconicVar(CurrentImg);
+ HXLD DetectionContour = result.getDetectionResults();
+ if (DetectionContour != null)
+ {
+ mView.changeGraphicSettings(GraphicsContext.GC_COLOR, "green");
+ mView.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 2);
+ mView.addIconicVar(DetectionContour);
+ mView.repaint();
+ }
+ }
+
+ public void FindModelGraphics_1(HalconDotNet.HWindowControl hDisplayControl, HImage CurrentImg, MatchingResult result)
+ {
+ hDisplayControl.HalconWindow.ClearWindow();
+
+ hDisplayControl.HalconWindow.DispImage(CurrentImg);
+
+ HXLD DetectionContour = result.getDetectionResults();
+ if (DetectionContour != null)
+ {
+ hDisplayControl.HalconWindow.SetColor("green");
+ hDisplayControl.HalconWindow.SetLineWidth(1);
+ hDisplayControl.HalconWindow.DispXld(DetectionContour);
+ //hDisplayControl.HalconWindow.DispObj(DetectionContour);
+ }
+
+
+ //ViewROI.HWndCtrl mView = new HWndCtrl(viewPort);
+
+ //mView.resetAll();
+ //mView.repaint();
+
+ //mView.clearList();
+ //mView.changeGraphicSettings(GraphicsContext.GC_LINESTYLE, new HTuple());
+ //mView.addIconicVar(CurrentImg);
+ //HXLD DetectionContour = result.getDetectionResults();
+ //if (DetectionContour != null)
+ //{
+ // mView.changeGraphicSettings(GraphicsContext.GC_COLOR, "green");
+ // mView.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 2);
+ // mView.addIconicVar(DetectionContour);
+ // mView.repaint();
+ //}
+ }
+
+
+ /// <summary>
+ /// 读取模板文件
+ /// </summary>
+ /// <param name="indext">模板编号</param>
+ /// <param name="fileName">模板文件完整路径</param>
+ /// <returns></returns>
+ public bool ReadShapeModel(int indext,string fileName)
+ {
+ FindShapeModelID[indext] = null;
+ try
+ {
+ FindShapeModelID[indext] = new HShapeModel();
+ FindShapeModelID[indext].ReadShapeModel(fileName);
+ }
+ catch (HOperatorException e)
+ {
+ if (NotifyIconObserverMessage != null)
+ {
+ NotifyIconObserverMessage(MatchingAssistant.ERR_READ_SHAPEMODEL);
+ }
+
+ if (NotifyIconObserver != null)
+ {
+ NotifyIconObserver(MatchingAssistant.ERR_READ_SHAPEMODEL);
+ }
+
+ return false;
+ }
+
+ return true;
+ }
+
+
+ /// <summary>
+ /// Creates the model contour.
+ /// </summary>
+ public void inspectShapeModel()
+ {
+ HRegion tmpReg;
+ HImage tmpImg;
+
+ if(mImage == null)
+ {
+ NotifyIconObserver(MatchingAssistant.ERR_NO_MODEL_DEFINED);
+ return;
+ }
+
+ PyramidImages = oImage.InspectShapeModel(out tmpReg,
+ (int)maxPyramidLevel,
+ parameterSet.mContrast);
+ tmpImg = mImage.InspectShapeModel(out PyramidROIs,
+ (int)maxPyramidLevel,
+ parameterSet.mContrast);
+
+ NotifyIconObserver(MatchingAssistant.UPDATE_XLD);
+ NotifyIconObserver(MatchingAssistant.UPDATE_PYRAMID);
+ }
+
+ /// <summary>
+ /// Adjusts the range of ScaleStep and AngleStep according to the
+ /// current set of matching parameters.
+ /// </summary>
+ public void determineStepRanges()
+ {
+ double vald = 0.0;
+ HTuple paramValue = new HTuple();
+ HTuple paramList = new HTuple();
+ string [] paramRange = {"scale_step", "angle_step"};
+
+ if(mImage == null)
+ {
+ NotifyIconObserver(MatchingAssistant.ERR_NO_MODEL_DEFINED);
+ return;
+ }
+
+ try
+ {
+ paramList = mImage.DetermineShapeModelParams(parameterSet.mNumLevel,
+ (double)parameterSet.mStartingAngle,
+ (double)parameterSet.mAngleExtent,
+ parameterSet.mMinScale,
+ parameterSet.mMaxScale,
+ parameterSet.mOptimization,
+ parameterSet.mMetric,
+ (int)parameterSet.mContrast,
+ (int)parameterSet.mMinContrast,
+ paramRange,
+ out paramValue);
+ }
+ catch(HOperatorException e)
+ {
+ exceptionText = e.Message;
+ NotifyParamObserver(MatchingParam.H_ERR_MESSAGE);
+ return;
+ }
+
+ for(int i =0; i<paramList.Length; i++)
+ {
+ switch ((string)paramList[i])
+ {
+ case MatchingParam.AUTO_ANGLE_STEP:
+ vald = (double)paramValue[i];
+
+ angleStepUpB = vald * 3.0;
+ angleStepLowB = vald / 3.0;
+ parameterSet.mAngleStep = vald;
+ NotifyParamObserver(MatchingParam.RANGE_ANGLE_STEP);
+ break;
+ case MatchingParam.AUTO_SCALE_STEP:
+ vald = (double)paramValue[i];
+
+ scaleStepUpB = vald * 3.0;
+ scaleStepLowB = vald / 3.0;
+ parameterSet.mScaleStep = vald;
+ NotifyParamObserver(MatchingParam.RANGE_SCALE_STEP);
+ break;
+ default:
+ break;
+ }//end of switch
+ }//end of for
+ }
+
+
+ /// <summary>
+ /// Determines the values for the matching parameters
+ /// contained in the auto-list automatically.
+ /// </summary>
+ public void determineShapeParameter()
+ {
+ double vald;
+ int vali, count;
+ HTuple paramValue = new HTuple();
+ HTuple paramList = new HTuple();
+
+ if(mImage == null)
+ {
+ NotifyIconObserver(MatchingAssistant.ERR_NO_MODEL_DEFINED);
+ return;
+ }
+
+ try
+ {
+ paramList = mImage.DetermineShapeModelParams(parameterSet.mNumLevel,
+ (double)parameterSet.mStartingAngle,
+ (double)parameterSet.mAngleExtent,
+ parameterSet.mMinScale,
+ parameterSet.mMaxScale,
+ parameterSet.mOptimization,
+ parameterSet.mMetric,
+ (int)parameterSet.mContrast,
+ (int)parameterSet.mMinContrast,
+ parameterSet.getAutoParList(),
+ out paramValue);
+ }
+ catch(HOperatorException e)
+ {
+ exceptionText = e.Message;
+ NotifyParamObserver(MatchingParam.H_ERR_MESSAGE);
+ return;
+ }
+
+ count = paramList.Length;
+
+ for(int i =0; i<count; i++)
+ {
+ switch ((string)paramList[i])
+ {
+ case MatchingParam.AUTO_ANGLE_STEP:
+ vald = (double)paramValue[i];
+
+ if(vald > angleStepUpB)
+ vald = angleStepUpB;
+ else if(vald < angleStepLowB)
+ vald = angleStepLowB;
+
+ parameterSet.mAngleStep = vald;
+ break;
+ case MatchingParam.AUTO_CONTRAST:
+ vali = (int)paramValue[i];
+
+ if(vali > contrastUpB)
+ vali = contrastUpB;
+ else if (vali < contrastLowB)
+ vali = contrastLowB;
+
+ minContrastUpB = vali;
+ parameterSet.mContrast= vali;
+
+ inspectShapeModel();
+ break;
+ case MatchingParam.AUTO_MIN_CONTRAST:
+ vali = (int)paramValue[i];
+
+ if(vali > minContrastUpB)
+ vali = minContrastUpB;
+ else if(vali < minContrastLowB)
+ vali = minContrastLowB;
+
+ parameterSet.mMinContrast = vali;
+ break;
+ case MatchingParam.AUTO_NUM_LEVEL:
+ vali = (int)paramValue[i];
+
+ if(vali > pyramLevUpB)
+ vali = pyramLevUpB;
+ else if(vali < pyramLevLowB)
+ vali = pyramLevLowB;
+
+ parameterSet.mNumLevel = vali;
+ break;
+ case MatchingParam.AUTO_OPTIMIZATION:
+ parameterSet.mOptimization = (string)paramValue[i];
+ break;
+ case MatchingParam.AUTO_SCALE_STEP:
+ vald = (double)paramValue[i];
+
+ if(vald > scaleStepUpB)
+ vald = scaleStepUpB;
+ else if (vald < scaleStepLowB)
+ vald = scaleStepLowB;
+
+ parameterSet.mScaleStep = vald;
+ break;
+ default:
+ break;
+ }
+ NotifyParamObserver((string)paramList[i]);
+ }//end of for
+
+ if (count!=0)
+ createNewModelID = true;
+ }
+
+ /// <summary>
+ /// Gets the range of either one of the parameters
+ /// AngleStep and ScaleStep, defined by <c>param</c>
+ /// </summary>
+ public int [] getStepRange(string param)
+ {
+ int [] range = new int[2];
+
+ switch (param)
+ {
+ case MatchingParam.RANGE_ANGLE_STEP:
+ range [0] = (int)(angleStepLowB * 10.0 *180.0/Math.PI); //low
+ range [1] = (int)(angleStepUpB * 10.0 *180.0/Math.PI); //up
+ break;
+ case MatchingParam.RANGE_SCALE_STEP:
+ range [0] = (int) (scaleStepLowB * 1000.0); //low
+ range [1] = (int) (scaleStepUpB * 1000.0); //up
+ break;
+ default:
+ break;
+ }
+ return range;
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void dummy(int val)
+ {
+ return;
+ }
+ private void dummyS(string val)
+ {
+ return;
+ }
+
+ public void LoadPara(string path)
+ {
+ MatchingParamSave paraSave = new MatchingParamSave();
+ paraSave = paraSave.Load(path);
+ this.parameterSet = paraSave.TranParam(paraSave);
+ }
+
+ }//end of class
+}//end of namespace
+
diff --git a/HalconTools/MatchingModule/MatchingOpt.cs b/HalconTools/MatchingModule/MatchingOpt.cs
new file mode 100644
index 0000000..a5be302
--- /dev/null
+++ b/HalconTools/MatchingModule/MatchingOpt.cs
@@ -0,0 +1,147 @@
+using System;
+using System.Collections;
+
+
+
+namespace HalconTools
+{
+ public delegate void StatisticsDelegate(int val);
+
+ /// <summary>
+ /// This class and its derived classes MatchingOptSpeed and
+ /// MatchingOptStatistics implement the optimization process for the
+ /// matching parameters in terms of the recognition speed and the
+ /// recognition rate. Similar to the processing in HDevelop, a timer
+ /// is used to be able to abort the processing during a run.
+ /// </summary>
+ public class MatchingOpt
+ {
+
+ /// <summary>
+ /// Delegate to notify about the state of the optimization process
+ /// </summary>
+ public StatisticsDelegate NotifyStatisticsObserver;
+ /// <summary>
+ /// Information about the optimization process
+ /// (e.g. Success or Failure) to be displayed in the GUI
+ /// </summary>
+ public string statusString;
+ /// <summary>
+ /// Statistics for the parameter optimization
+ /// </summary>
+ public string [] recogTabOptimizationData = new string[8];
+ /// <summary>
+ /// Statistics for the recognition rate
+ /// </summary>
+ public string [] inspectTabRecogRateData = new string[5];
+ /// <summary>
+ /// Statistics of detection results for the optimal
+ /// recognition rate
+ /// </summary>
+ public string [] inspectTabStatisticsData = new string[21];
+
+ /// <summary>
+ /// Reference to instance of MatchingAssistant,
+ /// which triggers the optimization performance.
+ /// </summary>
+ public MatchingAssistant mAssistant;
+ /// <summary>
+ /// Result of detection
+ /// </summary>
+ public MatchingResult mResults;
+ /// <summary>
+ /// Set of matching parameters
+ /// </summary>
+ public MatchingParam mParams;
+ /// <summary>
+ /// Number of all test images to be inspected
+ /// </summary>
+ public int tImageCount;
+ /// <summary>
+ /// Index of test image, being inspected currently
+ /// </summary>
+ public int mCurrentIndex;
+ /// <summary>
+ /// Flag, indicating success or failure of optimization process
+ /// </summary>
+ public bool mOptSuccess;
+
+ public IEnumerator iterator;
+
+ /// <summary>
+ /// Constant describing a change in the status line
+ /// </summary>
+ public const int UPDATE_RECOG_STATISTICS_STATUS= 21;
+ /// <summary>
+ /// Constant describing a change in the statistics of
+ /// the last recognition run
+ /// </summary>
+ public const int UPDATE_RECOG_UPDATE_VALS = 22;
+ /// <summary>
+ /// Constant describing a change in the statistics of
+ /// the optimal recognition run
+ /// </summary>
+ public const int UPDATE_RECOG_OPTIMUM_VALS = 23;
+ /// <summary>
+ /// Constant describing an error during the optimization
+ /// run, concerning the test image data or matching model
+ /// </summary>
+ public const int UPDATE_TEST_ERR = 24;
+ /// <summary>
+ /// Constant describing an error, which says that there is
+ /// no possible combination of matching parameters to obtain
+ /// a detection result
+ /// </summary>
+ public const int UPDATE_RECOG_ERR = 25;
+
+ /// <summary>
+ /// Constant describing a change in the statistics of
+ /// the recognition rate
+ /// </summary>
+ public const int UPDATE_INSP_RECOGRATE = 26;
+ /// <summary>
+ /// Constant describing a change in the statics of
+ /// the average recognition results
+ /// </summary>
+ public const int UPDATE_INSP_STATISTICS = 27;
+ /// <summary>
+ /// Constant describing an update of the
+ /// detection results
+ /// </summary>
+ public const int UPDATE_TESTVIEW = 28;
+ /// <summary>
+ /// Constant describing the success of the optimization
+ /// process and triggering the adjustment of the GUI
+ /// components to the optimal parameter setting
+ /// </summary>
+ public const int RUN_SUCCESSFUL = 29;
+ /// <summary>
+ /// Constant describing the failure of the optimization
+ /// process and reseting the matching parameters to the
+ /// initial setup
+ /// </summary>
+ public const int RUN_FAILED = 30;
+
+ /// <summary>
+ /// Constructor
+ /// </summary>
+ public MatchingOpt(){}
+
+ /// <summary>
+ /// Performs an optimization step.
+ /// </summary>
+ public virtual bool ExecuteStep(){ return true; }
+
+ /// <summary>
+ /// Resets all parameters for evaluating the performance to their initial values.
+ /// </summary>
+ public virtual void reset(){}
+
+ /// <summary>
+ ///
+ /// </summary>
+ public virtual void stop(){}
+
+ public void dummy(int val) { }
+ }//class
+}//end of namespace
diff --git a/HalconTools/MatchingModule/MatchingOptSpeed.cs b/HalconTools/MatchingModule/MatchingOptSpeed.cs
new file mode 100644
index 0000000..c71437d
--- /dev/null
+++ b/HalconTools/MatchingModule/MatchingOptSpeed.cs
@@ -0,0 +1,245 @@
+using System;
+using HalconDotNet;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+
+
+namespace HalconTools
+{
+ /// <summary>
+ /// This class optimizes the performance of a defined shape-based model
+ /// for a given set of test images.
+ /// To perform an optimization of the detection parameters, the instance
+ /// has to know the used set of matching parameters and the calling
+ /// MatchingAssistant, to retrieve the set of test images and to call
+ /// the methods for finding the model.
+ /// The optimization is performed in the sense that the two detection
+ /// parameters ScoreMin and Greediness are iteratively increased and
+ /// decreased, respectively, and every new parameter combination is used
+ /// to detect the model in the set of test images. Each performance is
+ /// then measured and compared with the best performance so far.
+ /// The single execution steps are triggered by a timer from the
+ /// class MatchingAssistant, so that you can stop the optimization anytime
+ /// during the run.
+ /// </summary>
+ public class MatchingOptSpeed: MatchingOpt
+ {
+ // private class members
+ private int mCurrScoreMin;
+ private int mCurrGreediness;
+ private double mCurrMeanTime;
+ private int mScoreMinStep;
+ private int mGreedinessStep;
+
+ private int mOptScoreMin;
+ private int mOptGreediness;
+ private double mOptMeanTime;
+
+ private int mMatchesNum;
+ private int mExpMatchesNum;
+
+
+ /// <summary>Constructor</summary>
+ /// <param name="mAss">MatchingAssistant that created this instance</param>
+ /// <param name="mPars">Current set of matching parameters</param>
+ public MatchingOptSpeed(MatchingAssistant mAss, MatchingParam mPars)
+ {
+ mAssistant = mAss;
+ mParams = mPars;
+ NotifyStatisticsObserver = new StatisticsDelegate(dummy);
+
+ mScoreMinStep = -10;
+ mGreedinessStep = 10;
+ reset();
+
+ tImageCount = mAssistant.TestImages.Count;
+ }
+
+
+ /// <summary>
+ /// In each execution step a certain parameter set is applied
+ /// to the whole set of test images and the performance is then
+ /// evaluated.
+ /// </summary>
+ public override bool ExecuteStep()
+ {
+ double cScoreMin, cGreed, recogRate;
+ string fileName;
+ int actualMatches, expectedMatches;
+ bool success;
+
+ if(!iterator.MoveNext())
+ return false;
+
+
+ cScoreMin = mCurrScoreMin / 100.0;
+ cGreed = mCurrGreediness / 100.0;
+
+ statusString = "Testing Image " + (mCurrentIndex + 1) +
+ " - Minimum Score: " + cScoreMin +
+ " - Greediness: " + cGreed;
+
+ NotifyStatisticsObserver(MatchingOpt.UPDATE_RECOG_STATISTICS_STATUS);
+
+ fileName = (string)iterator.Current;
+
+ mAssistant.setTestImage(fileName);
+
+ mAssistant.setMinScore(cScoreMin);
+ mAssistant.setGreediness(cGreed);
+
+ if(!mAssistant.applyFindModel())
+ return false;
+
+
+ mResults = mAssistant.getMatchingResults();
+ actualMatches = mResults.count;
+
+ expectedMatches = 0;
+
+ switch(mParams.mRecogSpeedMode)
+ {
+ case MatchingParam.RECOGM_MANUALSELECT:
+ expectedMatches = mParams.mRecogManualSel;
+ break;
+ case MatchingParam.RECOGM_ATLEASTONE:
+ expectedMatches = 1;
+ if(actualMatches > 1)
+ actualMatches = 1;
+ break;
+ case MatchingParam.RECOGM_MAXNUMBER:
+ expectedMatches = mParams.mNumMatches;
+ break;
+ default:
+ break;
+ }
+
+ mMatchesNum += actualMatches;
+ mExpMatchesNum += expectedMatches;
+
+
+ recogRate = (mExpMatchesNum > 0) ?
+ (100.0 * mMatchesNum / mExpMatchesNum) : 0.0;
+
+ mCurrMeanTime = mCurrMeanTime * mCurrentIndex + mResults.mTime;
+ mCurrMeanTime /= ++mCurrentIndex;
+
+ //write data into strings and call for update
+ recogTabOptimizationData [0] = "" + Math.Round(cScoreMin, 2);
+ recogTabOptimizationData [1] = "" + Math.Round(cGreed, 2);
+ recogTabOptimizationData [2] = "" + Math.Round(recogRate, 2) + " %";
+
+ if( mCurrMeanTime < 1000.0 )
+ recogTabOptimizationData [3] = Math.Round(mCurrMeanTime, 2) + " ms";
+ else
+ recogTabOptimizationData [3] = Math.Round(mCurrMeanTime/1000.0, 2)+ " s";
+
+ NotifyStatisticsObserver(MatchingOpt.UPDATE_RECOG_UPDATE_VALS);
+
+ if(mCurrentIndex < tImageCount)
+ return true;
+
+ iterator.Reset();
+ mCurrentIndex = 0;
+ mMatchesNum = 0;
+ mExpMatchesNum = 0;
+
+ success = (mParams.mRecogRateOpt == 0) ?
+ (Math.Abs((double)recogRate - mParams.mRecogRate) < 0.001)
+ : (recogRate >= (mParams.mRecogRate - 0.000001));
+
+
+ if(success)
+ {
+ mOptSuccess = true;
+ if(mCurrMeanTime < mOptMeanTime)
+ {
+ mOptScoreMin = mCurrScoreMin;
+ mOptGreediness = mCurrGreediness;
+
+ this.recogTabOptimizationData[4] = "" + Math.Round(mOptScoreMin/100.0, 2);
+ this.recogTabOptimizationData[5] = "" + Math.Round(mOptGreediness/100.0, 2);
+ this.recogTabOptimizationData[6] = Math.Round(recogRate, 2) + " %";
+
+ mOptMeanTime = mCurrMeanTime;
+ recogTabOptimizationData[7] = recogTabOptimizationData[3];
+ NotifyStatisticsObserver(MatchingOpt.UPDATE_RECOG_OPTIMUM_VALS);
+ }
+ mCurrGreediness += mGreedinessStep;
+ return (mCurrGreediness <= 100);
+ }
+
+ mCurrScoreMin += mScoreMinStep;
+
+ if(mOptSuccess)
+ return (mCurrScoreMin >= 10);
+
+ return (mCurrScoreMin > 0);
+ }
+
+
+ /// <summary>
+ /// Resets all parameters for evaluating the performance to their initial values.
+ /// </summary>
+ public override void reset()
+ {
+ mOptSuccess = false;
+
+ for(int i=0; i<8; i++)
+ this.recogTabOptimizationData[i]="-";
+
+ statusString = "Optimization Status:";
+
+ mCurrScoreMin = 100;
+ mCurrGreediness = 0;
+ mCurrMeanTime = 0.0;
+
+ mOptScoreMin = 100;
+ mOptGreediness = 0;
+ mOptMeanTime = Double.MaxValue;
+
+ mMatchesNum = 0;
+ mExpMatchesNum = 0;
+
+ tImageCount = mAssistant.TestImages.Count;
+ iterator = mAssistant.TestImages.Keys.GetEnumerator();
+ mCurrentIndex = 0;
+ }
+
+
+ /// <summary>
+ /// If the optimization has stopped, then check whether it was
+ /// completed successfully or whether it was aborted due to errors or
+ /// to user interaction.
+ /// Depending on the failure or success of the run, the GUI is notified
+ /// for visual update of the results and obtained statistics.
+ /// </summary>
+ public override void stop()
+ {
+ if(tImageCount==0)
+ {
+ NotifyStatisticsObserver(MatchingAssistant.ERR_NO_TESTIMAGE);
+ NotifyStatisticsObserver(MatchingOpt.RUN_FAILED);
+ }
+ else if(!mOptSuccess && (mCurrScoreMin==0.0))
+ {
+ NotifyStatisticsObserver(MatchingOpt.UPDATE_RECOG_ERR);
+ NotifyStatisticsObserver(MatchingOpt.RUN_FAILED);
+ }
+ else if(!mOptSuccess)
+ {
+ NotifyStatisticsObserver(MatchingOpt.UPDATE_TEST_ERR);
+ NotifyStatisticsObserver(MatchingOpt.RUN_FAILED);
+ }
+ else
+ {
+ statusString = "Optimization finished successfully";
+ NotifyStatisticsObserver(MatchingOpt.UPDATE_RECOG_STATISTICS_STATUS);
+ mAssistant.setMinScore(mOptScoreMin/100.0);
+ mAssistant.setGreediness(mOptGreediness/100.0);
+ NotifyStatisticsObserver(MatchingOpt.RUN_SUCCESSFUL);
+ }
+ }
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/MatchingModule/MatchingOptStatistics.cs b/HalconTools/MatchingModule/MatchingOptStatistics.cs
new file mode 100644
index 0000000..36e8bba
--- /dev/null
+++ b/HalconTools/MatchingModule/MatchingOptStatistics.cs
@@ -0,0 +1,283 @@
+using System;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ /// <summary>
+ /// To determine the performance of a shape-based model, given
+ /// a parameter setup for model creation and detection,
+ /// this class applies a model detection for the whole set
+ /// of test images loaded and computes an all-over statistics.
+ /// </summary>
+ public class MatchingOptStatistics: MatchingOpt
+ {
+ // recognize - group
+ private int mMatchesNumProb;
+ private bool mModelFound;
+ private int mSpecMatchesNum;
+ private int mMaxMatchesNum;
+ private int mFoundMatchesNum;
+ private int mImagesWithOneMatchNum;
+ private int mImagesWithSpecMatchesNum;
+ private int mImagesWithMaxMatchesNum;
+
+ // statistic - group
+ private double mScoreMin;
+ private double mScoreMax;
+ private double mTimeMin;
+ private double mTimeMax;
+ private double mRowMin;
+ private double mRowMax;
+ private double mColMin;
+ private double mColMax;
+ private double mAngleMin;
+ private double mAngleMax;
+ private double mScaleRowMin;
+ private double mScaleRowMax;
+ private double mScaleColMin;
+ private double mScaleColMax;
+
+
+ /// <summary>Constructor</summary>
+ /// <param name="mAss">MatchingAssistant that created this instance</param>
+ /// <param name="mPars">Current set of matching parameters</param>
+ public MatchingOptStatistics(MatchingAssistant mAss, MatchingParam mPars)
+ {
+ mAssistant = mAss;
+ mParams = mPars;
+ NotifyStatisticsObserver = new StatisticsDelegate(dummy);
+
+ reset();
+ tImageCount = mAssistant.TestImages.Count;
+ }
+
+ /// <summary>
+ /// With each execution step the shape-based model is searched in
+ /// the current test image. The detection result is then compared
+ /// with the previous results and the overall statistics is adjusted.
+ /// </summary>
+ public override bool ExecuteStep()
+ {
+ string fileName, imgNumStr;
+ int val, i;
+ string matchFormatStr;
+ int actualMatches;
+ int expectedMatches;
+ int maxNumMatches;
+ double score, time, row, col, angle, angleB, scaleR, scaleC;
+
+ if(!iterator.MoveNext())
+ return false;
+
+ fileName = (string)iterator.Current;
+ mAssistant.setTestImage(fileName);
+
+ if(!(mOptSuccess = mAssistant.applyFindModel()))
+ return false;
+
+ mResults = mAssistant.getMatchingResults();
+ actualMatches = mResults.count;
+
+ // determine recognition rate ------------------
+ expectedMatches = mParams.mRecogManualSel;
+ maxNumMatches = mParams.mNumMatches;
+
+ mSpecMatchesNum += expectedMatches;
+ mMaxMatchesNum += maxNumMatches;
+ mFoundMatchesNum += actualMatches;
+
+ if(actualMatches > 0)
+ mImagesWithOneMatchNum++;
+
+ if(actualMatches >= expectedMatches)
+ mImagesWithSpecMatchesNum++;
+
+ if(actualMatches == maxNumMatches)
+ mImagesWithMaxMatchesNum++;
+
+ mCurrentIndex++;
+
+ this.inspectTabRecogRateData[2] = "-";
+ this.inspectTabRecogRateData[3] = "-";
+ this.inspectTabRecogRateData[4] = "-";
+
+ imgNumStr = " of " + mCurrentIndex + " images)";
+
+ val = mImagesWithOneMatchNum;
+ this.inspectTabRecogRateData[0] = Math.Round(100.0* ((double)val / mCurrentIndex), 2)
+ + " % (" + val + imgNumStr;
+ val = mImagesWithSpecMatchesNum;
+ this.inspectTabRecogRateData[1] = Math.Round(100.0* ((double) val / mCurrentIndex), 2)
+ + " % (" + val + imgNumStr;
+ if(mMaxMatchesNum > 0)
+ {
+ matchFormatStr = " of " + mMaxMatchesNum + " models)";
+
+ val = mImagesWithMaxMatchesNum;
+ this.inspectTabRecogRateData[2] = Math.Round(100.0* ((double)val / mCurrentIndex), 2)
+ + " % (" + val + imgNumStr;
+ val = mFoundMatchesNum;
+ this.inspectTabRecogRateData[3] = Math.Round(100.0*((double) val / mMaxMatchesNum), 2)
+ + " % (" + val + matchFormatStr;
+ }
+
+ if(mSpecMatchesNum > 0)
+ {
+ matchFormatStr = " of " + mSpecMatchesNum + " models)";
+ val = mFoundMatchesNum;
+ this.inspectTabRecogRateData[4] = Math.Round(100.0* ((double)val / mSpecMatchesNum), 2)
+ + " % (" + val + matchFormatStr;
+ }
+ NotifyStatisticsObserver(MatchingOpt.UPDATE_INSP_RECOGRATE);
+
+ // determine statistics data ------------
+ if(actualMatches > 0)
+ {
+ i=0;
+ if(!mModelFound)
+ {
+ mScoreMin = mScoreMax = mResults.mScore[0].D;
+ mTimeMin = mTimeMax = mResults.mTime;
+ mRowMin = mRowMax = mResults.mRow[0].D;
+ mColMin = mColMax = mResults.mCol[0].D;
+ mAngleMin = mAngleMax = mResults.mAngle[0].D;
+ mScaleRowMin= mScaleRowMax= mResults.mScaleRow[0].D;
+ mScaleColMin= mScaleColMax= mResults.mScaleCol[0].D;
+ mModelFound = true;
+ i++;
+ }
+
+ for(; i < actualMatches; i++)
+ {
+ score = mResults.mScore[i].D;
+ if(score < mScoreMin)
+ mScoreMin = score;
+ else if(score > mScoreMax)
+ mScoreMax = score;
+
+ row = mResults.mRow[i].D;
+ if(row < mRowMin)
+ mRowMin = row;
+ else if(row > mRowMax)
+ mRowMax = row;
+
+ col = mResults.mCol[i].D;
+ if(col < mColMin)
+ mColMin = col;
+ else if(col > mColMax)
+ mColMax = col;
+
+ angle = mResults.mAngle[i].D;
+ if(angle < mAngleMin)
+ mAngleMin = angle;
+ else if(angle > mAngleMax)
+ mAngleMax = angle;
+
+ scaleR = mResults.mScaleRow[i].D;
+ if(scaleR < mScaleRowMin)
+ mScaleRowMin = scaleR;
+ else if(scaleR > mScaleRowMax)
+ mScaleRowMax = scaleR;
+
+ scaleC = mResults.mScaleCol[i].D;
+ if(scaleC < mScaleColMin)
+ mScaleColMin = scaleC;
+ else if(scaleC > mScaleColMax)
+ mScaleColMax = scaleC;
+ }//end of for
+
+ time = mResults.mTime;
+ if(time < mTimeMin)
+ mTimeMin = time;
+ else if(time > mTimeMax)
+ mTimeMax = time;
+ }//end of if
+
+
+ if(mModelFound)
+ {
+ this.inspectTabStatisticsData[0] = "" + Math.Round(mScoreMin, 2);
+ this.inspectTabStatisticsData[1] = "" + Math.Round(mScoreMax, 2);
+ this.inspectTabStatisticsData[2] = "" + Math.Round((mScoreMax - mScoreMin),2);
+
+ this.inspectTabStatisticsData[3] = "" + Math.Round(mTimeMin, 2);
+ this.inspectTabStatisticsData[4] = "" + Math.Round(mTimeMax, 2);
+ this.inspectTabStatisticsData[5] = "" + Math.Round((mTimeMax - mTimeMin),2);
+
+ this.inspectTabStatisticsData[6] = "" + Math.Round(mRowMin, 2);
+ this.inspectTabStatisticsData[7] = "" + Math.Round(mRowMax, 2);
+ this.inspectTabStatisticsData[8] = "" + Math.Round((mRowMax - mRowMin), 2);
+
+ this.inspectTabStatisticsData[9] = "" + Math.Round(mColMin, 2);
+ this.inspectTabStatisticsData[10] = "" + Math.Round(mColMax, 2);
+ this.inspectTabStatisticsData[11] = "" + Math.Round((mColMax - mColMin), 2);
+
+ angle = (double)mAngleMin*180.0/Math.PI;
+ angleB = (double)mAngleMax*180.0/Math.PI;
+ this.inspectTabStatisticsData[12] = "" + Math.Round(angle, 2);
+ this.inspectTabStatisticsData[13] = "" + Math.Round(angleB, 2) ;
+ this.inspectTabStatisticsData[14] = "" + Math.Round((angleB - angle), 2) ;
+
+ this.inspectTabStatisticsData[15] = "" + Math.Round(mScaleRowMin, 2);
+ this.inspectTabStatisticsData[16] = "" + Math.Round(mScaleRowMax, 2);
+ this.inspectTabStatisticsData[17] = "" + Math.Round((mScaleRowMax - mScaleRowMin),2);
+
+ this.inspectTabStatisticsData[18] = "" + Math.Round(mScaleColMin, 2);
+ this.inspectTabStatisticsData[19] = "" + Math.Round(mScaleColMax, 2);
+ this.inspectTabStatisticsData[20] = "" + Math.Round((mScaleColMax - mScaleColMin), 2);
+
+ NotifyStatisticsObserver(MatchingOpt.UPDATE_INSP_STATISTICS);
+ }
+ return (mCurrentIndex < tImageCount);
+ }
+
+
+ /// <summary>
+ /// Resets all parameters for evaluating the performance to their initial values.
+ /// </summary>
+ public override void reset()
+ {
+ mMatchesNumProb = mParams.mNumMatches;
+ mModelFound = false;
+ mSpecMatchesNum = 0;
+ mMaxMatchesNum = 0;
+ mFoundMatchesNum = 0;
+ mImagesWithOneMatchNum = 0;
+ mImagesWithSpecMatchesNum = 0;
+ mImagesWithMaxMatchesNum = 0;
+ mOptSuccess = false;
+
+ for(int i=0; i < 21;i++)
+ this.inspectTabStatisticsData[i]="-";
+
+ inspectTabRecogRateData[0] = "100.00 % (1 of 1 image)";
+ inspectTabRecogRateData[1] = "100.00 % (1 of 1 image)";
+ inspectTabRecogRateData[2] = "100.00 % (1 of 1 image)";
+ inspectTabRecogRateData[3] = "100.00 % (1 of 1 model)";
+ inspectTabRecogRateData[4] = "100.00 % (1 of 1 model)";
+
+ tImageCount = mAssistant.TestImages.Count;
+ iterator = mAssistant.TestImages.Keys.GetEnumerator();
+ mCurrentIndex = 0;
+ }
+
+ /// <summary>
+ /// If the optimization has stopped, then check whether it was
+ /// completed successfully or whether it was aborted
+ /// due to errors or to user interaction.
+ /// Depending on the failure or success of the run, the GUI is notified
+ /// for visual update of the results and obtained statistics.
+ /// </summary>
+ public override void stop()
+ {
+ if(tImageCount==0)
+ {
+ NotifyStatisticsObserver(MatchingAssistant.ERR_NO_TESTIMAGE);
+ }
+ else if(!mOptSuccess)
+ {
+ NotifyStatisticsObserver(MatchingOpt.UPDATE_TEST_ERR);
+ }
+ }
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/MatchingModule/MatchingParam.cs b/HalconTools/MatchingModule/MatchingParam.cs
new file mode 100644
index 0000000..56042d5
--- /dev/null
+++ b/HalconTools/MatchingModule/MatchingParam.cs
@@ -0,0 +1,641 @@
+using System;
+using System.Collections;
+using HalconDotNet;
+
+
+namespace HalconTools
+{
+
+ /// <summary>
+ /// This class contains the parameters that are used to
+ /// create and detect the shape-based model.
+ /// Besides auxiliary methods to set and get the parameters, there
+ /// is a set of methods to handle the parameters for 'automatic'
+ /// determination.
+ /// </summary>
+ public class MatchingParam
+ {
+
+ // --------------- create model ---------------------
+
+ /// <summary>
+ /// Defines the maximum number of pyramid levels
+ /// </summary>
+ public int mNumLevel;
+ /// <summary>
+ /// Measure for local gray value differences between
+ /// the object and the background and between
+ /// different parts of the object
+ /// </summary>
+ public int mContrast;
+ /// <summary>
+ /// Minimum scale of the model
+ /// </summary>
+ public double mMinScale;
+ /// <summary>
+ /// Maximum scale of the model
+ /// </summary>
+ public double mMaxScale;
+ /// <summary>
+ /// Step length within the selected range of scales
+ /// </summary>
+ public double mScaleStep;
+ /// <summary>
+ /// Smallest rotation of the model
+ /// </summary>
+ public double mStartingAngle;
+ /// <summary>
+ /// Extent of the rotation angles
+ /// </summary>
+ public double mAngleExtent;
+ /// <summary>
+ /// Step length within the selected range of angles
+ /// </summary>
+ public double mAngleStep;
+ /// <summary>
+ /// Used to separate the model from the noise in the image
+ /// </summary>
+ public int mMinContrast;
+ /// <summary>
+ /// Conditions determining how the model is supposed to be
+ /// recognized in the image
+ /// </summary>
+ public string mMetric;
+ /// <summary>
+ /// Defines the kind of optimization and optionally the
+ /// kind of method used for generating the model
+ /// </summary>
+ public string mOptimization;
+
+
+ // -------------------- find model -----------------------
+
+ /// <summary>
+ /// Defines the score a potential match must have at least
+ /// to be accepted as an instance of the model in the image
+ /// </summary>
+ public double mMinScore;
+ /// <summary>
+ /// Number of instances of the model to be found
+ /// </summary>
+ public int mNumMatches;
+ /// <summary>
+ /// 'Greediness' of the search heuristic (0 means safe but slow -
+ /// 1 means fast but matches may be missed).
+ /// </summary>
+ public double mGreediness;
+ /// <summary>
+ /// Defines fraction two instances may at most overlap in order
+ /// to consider them as different instances, and hence
+ /// to be returned separately
+ /// </summary>
+ public double mMaxOverlap;
+ /// <summary>
+ /// Determines whether the instances should be extracted with
+ /// subpixel accuracy
+ /// </summary>
+ public string mSubpixel;
+ /// <summary>
+ /// Determines the lowest pyramid level to which the
+ /// found matches are tracked. Mechanism is used to
+ /// speed up the matching.
+ /// </summary>
+ public int mLastPyramidLevel;
+
+ //----------------- optimize recognition speed ----------------
+
+ /// <summary>
+ /// Defines heuristic for evaluating the detection results
+ /// </summary>
+ public int mRecogRateOpt; /* opt=0 => '=' und opt=1 => '>='*/
+ /// <summary>
+ /// Defines rate for the model recognition
+ /// </summary>
+ public int mRecogRate;
+ /// <summary>
+ /// Defines mode to determine accuracy of recognition
+ /// </summary>
+ public string mRecogSpeedMode;
+ /// <summary>
+ /// Manual selection of number of matches to be found.
+ /// </summary>
+ public int mRecogManualSel;
+
+ // ---------------------- inspect vals -----------------------
+
+ /// <summary>
+ /// Is equal to the value of the parameter mNumMatches
+ /// </summary>
+ public int mInspectMaxNoMatch;
+ /// <summary>
+ /// List of parameters to be determined automatically
+ /// </summary>
+ public ArrayList paramAuto;
+
+
+ /// <summary>
+ /// Constant defining the auto-mode for the parameter NumLevels
+ /// </summary>
+ public const string AUTO_NUM_LEVEL = "num_levels";
+ /// <summary>
+ /// Constant defining the auto-mode for the parameter Contrast
+ /// </summary>
+ public const string AUTO_CONTRAST = "contrast";
+ /// <summary>
+ /// Constant defining the auto-mode for the parameter ScaleStep
+ /// </summary>
+ public const string AUTO_SCALE_STEP = "scale_step";
+ /// <summary>
+ /// Constant defining the auto-mode for the parameter AngleStep
+ /// </summary>
+ public const string AUTO_ANGLE_STEP = "angle_step";
+ /// <summary>
+ /// Constant defining the auto-mode for the parameter MinContrast
+ /// </summary>
+ public const string AUTO_MIN_CONTRAST = "min_contrast";
+ /// <summary>
+ /// Constant defining the auto-mode for the parameter Optimization
+ /// </summary>
+ public const string AUTO_OPTIMIZATION = "optimization";
+
+ /// <summary>
+ /// Constant indicating an update for the button representation of
+ /// AngleStart.
+ /// </summary>
+ public const string BUTTON_ANGLE_START = "angle_start";
+ /// <summary>
+ /// Constant indicating an update for the button representation of
+ /// AngleExtent.
+ /// </summary>
+ public const string BUTTON_ANGLE_EXTENT = "angle_extent";
+ /// <summary>
+ /// Constant indicating an update for the button representation of
+ /// ScaleMin.
+ /// </summary>
+ public const string BUTTON_SCALE_MIN = "scale_min";
+ /// <summary>
+ /// Constant indicating an update for the button representation of
+ /// ScaleMax.
+ /// </summary>
+ public const string BUTTON_SCALE_MAX = "scale_max";
+ /// <summary>
+ /// Constant indicating an update for the button representation of
+ /// Metric.
+ /// </summary>
+ public const string BUTTON_METRIC = "metric";
+ /// <summary>
+ /// Constant indicating an update for the button representation of
+ /// MinScore.
+ /// </summary>
+ public const string BUTTON_MINSCORE = "min_score";
+ /// <summary>
+ /// Constant indicating an update for the button representation of
+ /// Greediness.
+ /// </summary>
+ public const string BUTTON_GREEDINESS = "greediness";
+
+ /// <summary>
+ /// Constant defining the number of instances to be detected:
+ /// Find number of models specified by the user
+ /// </summary>
+ public const string RECOGM_MANUALSELECT = "RecognFindSpecifiedNumber";
+ /// <summary>
+ /// Constant defining the number of instances to be detected:
+ /// Find at least one model instance per image
+ /// </summary>
+ public const string RECOGM_ATLEASTONE = "RecognAtLeast";
+ /// <summary>
+ /// Constant defining the number of instances to be detected:
+ /// Find maximum number of model instances per image
+ /// </summary>
+ public const string RECOGM_MAXNUMBER = "RecognFindMaximum";
+
+ /// <summary>
+ /// Constant indicating a change of ScaleStep for
+ /// its GUI component representation
+ /// </summary>
+ public const string RANGE_SCALE_STEP = "RangeScaleStep";
+ /// <summary>
+ /// Constant indicating a change of AngleStep for
+ /// its GUI component representation
+ /// </summary>
+ public const string RANGE_ANGLE_STEP = "RangeAngleStep";
+
+ /// <summary>
+ /// Constant indicating an error regarding the parameter set.
+ /// It is forwarded for HALCON errors that occur during the
+ /// creation of the shape-based model or detection of instances
+ /// of the model
+ /// </summary>
+ public const string H_ERR_MESSAGE = "Halcon Error";
+
+
+ /// <summary>Constructor</summary>
+ public MatchingParam()
+ {
+ paramAuto = new ArrayList(10);
+ }
+
+ /*******************************************************************/
+ /* Setter-methods for the set of values, that can be determined
+ * automatically. If a parameter gets assigned a new value
+ * it can be only caused by user interaction, which means, the
+ * auto-modus for these particular parameters needs to be
+ * canceled, to avoid further automatic adjustment
+ /*******************************************************************/
+
+ /// <summary>
+ /// Sets the parameter <c>NumLevel</c> to the supplied value;
+ /// if the parameter has been in auto-mode, cancel this option
+ /// </summary>
+ public void setNumLevel(double val)
+ {
+ mNumLevel = (int)val;
+ if(paramAuto.Contains(AUTO_NUM_LEVEL))
+ paramAuto.Remove(AUTO_NUM_LEVEL);
+ }
+
+ /// <summary>
+ /// Sets the parameter <c>Contrast</c> to the supplied value;
+ /// if the parameter has been in auto-mode, cancel this option
+ /// </summary>
+ public void setContrast(int val)
+ {
+ mContrast = val;
+
+ if(paramAuto.Contains(AUTO_CONTRAST))
+ paramAuto.Remove(AUTO_CONTRAST);
+ }
+
+ /// <summary>
+ /// Sets the parameter <c>MinScale</c> to the supplied value;
+ /// if the parameter has been in auto-mode, cancel this option
+ /// </summary>
+ public void setMinScale(double val)
+ {
+ mMinScale = val;
+ }
+
+ /// <summary>
+ /// Sets the parameter <c>MaxScale</c> to the supplied value;
+ /// if the parameter has been in auto-mode, cancel this option
+ /// </summary>
+ public void setMaxScale(double val)
+ {
+ mMaxScale = val;
+ }
+
+ /// <summary>
+ /// Sets the parameter <c>ScaleStep</c> to the supplied value;
+ /// if the parameter has been in auto-mode, cancel this option
+ /// </summary>
+ public void setScaleStep(double val)
+ {
+ mScaleStep = val;
+
+ if(paramAuto.Contains(AUTO_SCALE_STEP))
+ paramAuto.Remove(AUTO_SCALE_STEP);
+
+ }
+
+ /// <summary>
+ /// Sets the parameter <c>AngleStep</c> to the supplied value;
+ /// if the parameter has been in auto-mode, cancel this option
+ /// </summary>
+ public void setAngleStep(double val)
+ {
+ mAngleStep = val;
+
+ if(paramAuto.Contains(AUTO_ANGLE_STEP))
+ paramAuto.Remove(AUTO_ANGLE_STEP);
+ }
+
+ /// <summary>
+ /// Sets the parameter <c>MinContrast</c> to the supplied value;
+ /// if the parameter has been in auto-mode, cancel this option
+ /// </summary>
+ public void setMinContrast(int val)
+ {
+ mMinContrast = val;
+
+ if(paramAuto.Contains(AUTO_MIN_CONTRAST))
+ paramAuto.Remove(AUTO_MIN_CONTRAST);
+ }
+
+ /// <summary>
+ /// Sets the parameter <c>Optimization</c> to the supplied value;
+ /// if the parameter has been in auto-mode, cancel this option
+ /// </summary>
+ /// <param name="val"></param>
+ public void setOptimization(string val)
+ {
+ mOptimization = val;
+
+ if(paramAuto.Contains(AUTO_OPTIMIZATION))
+ paramAuto.Remove(AUTO_OPTIMIZATION);
+ }
+
+
+ /*******************************************************************/
+ /* Setter-methods for the other values */
+ /*******************************************************************/
+
+ /// <summary>
+ /// Sets the parameter <c>StartingAngle</c> to the supplied value
+ /// </summary>
+ public void setStartingAngle(double val)
+ {
+ mStartingAngle = val;
+ }
+
+ /// <summary>
+ /// Sets the parameter <c>AngleExtent</c> to the supplied value
+ /// </summary>
+ public void setAngleExtent(double val)
+ {
+ mAngleExtent = val;
+ }
+
+ /// <summary>
+ /// Sets the parameter <c>Metric</c> to the supplied value
+ /// </summary>
+ public void setMetric(string val)
+ {
+ mMetric = val;
+ }
+
+ /// <summary>
+ /// Sets the parameter <c>MinScore</c> to the supplied value
+ /// </summary>
+ public void setMinScore(double val)
+ {
+ mMinScore = val;
+ }
+
+ /// <summary>
+ /// Sets the parameter <c>NumMatches</c> to the supplied value
+ /// </summary>
+ public void setNumMatches(int val)
+ {
+ mNumMatches = val;
+ }
+
+
+ /// <summary>
+ /// Sets the parameter <c>Greediness</c> to the supplied value
+ /// </summary>
+ public void setGreediness(double val)
+ {
+ mGreediness = val;
+ }
+
+ /// <summary>
+ /// Sets the parameter <c>MaxOverlap</c> to the supplied value
+ /// </summary>
+ public void setMaxOverlap(double val)
+ {
+ mMaxOverlap = val;
+ }
+
+ /// <summary>
+ /// Sets the parameter <c>Subpixel</c> to the supplied value
+ /// </summary>
+ public void setSubPixel(string val)
+ {
+ mSubpixel = val;
+ }
+
+ /// <summary>
+ /// Sets the parameter <c>LastPyramidLevel</c> to the supplied value
+ /// </summary>
+ public void setLastPyramLevel(int val)
+ {
+ mLastPyramidLevel = val;
+ }
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+
+ /// <summary>
+ /// Sets the parameter defining the options for the recognition rate
+ /// to the supplied value
+ /// </summary>
+ public void setRecogRateOption(int val)
+ {
+ mRecogRateOpt = val;
+ }
+
+ /// <summary>
+ /// Sets the parameter defining the rate for the recognition to the
+ /// supplied value.
+ /// </summary>
+ public void setRecogitionRate(int val)
+ {
+ mRecogRate = val;
+ }
+
+ /// <summary>
+ /// Sets the parameter to define the mode of accuracy
+ /// </summary>
+ public void setRecogSpeedMode(string val)
+ {
+ mRecogSpeedMode = val;
+ }
+
+ /// <summary>
+ /// Sets the number of matches to be recognized to the supplied value.
+ /// </summary>
+ public void setRecogManualSelection(int val)
+ {
+ mRecogManualSel = val;
+ }
+
+ /// <summary>
+ /// Sets the parameter <c>NumMatches</c> to the supplied value.
+ /// </summary>
+ public void setInspectMaxNoMatchValue(int val)
+ {
+ mInspectMaxNoMatch = val;
+ }
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+
+
+ /// <summary>
+ /// Checks if the parameter referenced by <c>mode</c> is
+ /// in the auto-mode list, i.e., that it is determined automatically
+ /// </summary>
+ /// <param name="mode">
+ /// Constant starting with AUTO_*, describing one of the parameters
+ /// for the auto-mode.
+ /// </param>
+ public bool isAuto(string mode)
+ {
+ bool isAuto = false;
+
+ switch (mode)
+ {
+ case AUTO_ANGLE_STEP:
+ isAuto = paramAuto.Contains(AUTO_ANGLE_STEP);
+ break;
+ case AUTO_CONTRAST:
+ isAuto = paramAuto.Contains(AUTO_CONTRAST);
+ break;
+ case AUTO_MIN_CONTRAST:
+ isAuto = paramAuto.Contains(AUTO_MIN_CONTRAST);
+ break;
+ case AUTO_NUM_LEVEL:
+ isAuto = paramAuto.Contains(AUTO_NUM_LEVEL);
+ break;
+ case AUTO_OPTIMIZATION:
+ isAuto = paramAuto.Contains(AUTO_OPTIMIZATION);
+ break;
+ case AUTO_SCALE_STEP:
+ isAuto = paramAuto.Contains(AUTO_SCALE_STEP);
+ break;
+ default: break;
+ }
+
+ return isAuto;
+ }
+
+ /// <summary>
+ /// Checks if any parameter is registered for automatic
+ /// determination. If not, the call for automatic
+ /// determination can be skipped
+ /// </summary>
+ public bool isOnAuto()
+ {
+ if( paramAuto.Count > 0 )
+ return true;
+ else
+ return false;
+ }
+
+ /// <summary>
+ /// Adds the parameter <c>val</c> to the list of parameters that
+ /// will be determined automatically before the application.
+ /// </summary>
+ /// <param name="val">
+ /// Constant starting with AUTO_*, describing one of the parameters
+ /// for the auto-mode.
+ /// </param>
+ /// <returns>
+ /// Indicates whether the variable is already in auto-mode or
+ /// was added to the auto-list successfully.
+ /// </returns>
+ public bool setAuto(string val)
+ {
+ string mode = "";
+
+ switch (val)
+ {
+ case AUTO_ANGLE_STEP:
+ if(!paramAuto.Contains(AUTO_ANGLE_STEP))
+ mode = AUTO_ANGLE_STEP;
+ break;
+ case AUTO_CONTRAST:
+ if(!paramAuto.Contains(AUTO_CONTRAST))
+ mode = AUTO_CONTRAST;
+ break;
+ case AUTO_MIN_CONTRAST:
+ if(!paramAuto.Contains(AUTO_MIN_CONTRAST))
+ mode = AUTO_MIN_CONTRAST;
+ break;
+ case AUTO_NUM_LEVEL:
+ if(!paramAuto.Contains(AUTO_NUM_LEVEL))
+ mode = AUTO_NUM_LEVEL;
+ break;
+ case AUTO_OPTIMIZATION:
+ if(!paramAuto.Contains(AUTO_OPTIMIZATION))
+ mode = AUTO_OPTIMIZATION;
+ break;
+ case AUTO_SCALE_STEP:
+ if(!paramAuto.Contains(AUTO_SCALE_STEP))
+ mode = AUTO_SCALE_STEP;
+ break;
+ default: break;
+ }
+
+ if(mode == "")
+ return false;
+
+ paramAuto.Add(mode);
+ return true;
+ }
+
+ /// <summary>
+ /// Removes the parameter <c>val</c> from the list of parameters that
+ /// will be determined automatically.
+ /// </summary>
+ /// <param name="val">
+ /// Constant starting with AUTO_*, describing one of the parameters for
+ /// the auto-mode.
+ /// </param>
+ /// <returns>
+ /// Indicates if the variable was removed from the
+ /// auto-list successfully.
+ /// </returns>
+ public bool removeAuto(string val)
+ {
+ string mode = "";
+
+ switch (val)
+ {
+ case AUTO_ANGLE_STEP:
+ if(paramAuto.Contains(AUTO_ANGLE_STEP))
+ mode = AUTO_ANGLE_STEP;
+ break;
+ case AUTO_CONTRAST:
+ if(paramAuto.Contains(AUTO_CONTRAST))
+ mode = AUTO_CONTRAST;
+ break;
+ case AUTO_MIN_CONTRAST:
+ if(paramAuto.Contains(AUTO_MIN_CONTRAST))
+ mode = AUTO_MIN_CONTRAST;
+ break;
+ case AUTO_NUM_LEVEL:
+ if(paramAuto.Contains(AUTO_NUM_LEVEL))
+ mode = AUTO_NUM_LEVEL;
+ break;
+ case AUTO_OPTIMIZATION:
+ if(paramAuto.Contains(AUTO_OPTIMIZATION))
+ mode = AUTO_OPTIMIZATION;
+ break;
+ case AUTO_SCALE_STEP:
+ if(paramAuto.Contains(AUTO_SCALE_STEP))
+ mode = AUTO_SCALE_STEP;
+ break;
+ default: break;
+ }
+
+ if(mode == "")
+ return false;
+
+ paramAuto.Remove(mode);
+ return true;
+ }
+
+ /// <summary>
+ /// Gets the names of the parameters to be determined
+ /// automatically
+ /// </summary>
+ /// <returns>
+ /// List of parameter names being in auto-mode.
+ /// </returns>
+ public string [] getAutoParList()
+ {
+ int count = paramAuto.Count;
+ string [] paramList = new string[count];
+
+ for(int i=0; i<count; i++)
+ paramList[i] = (string)paramAuto[i];
+
+ return paramList;
+ }
+
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/MatchingModule/MatchingParamSave.cs b/HalconTools/MatchingModule/MatchingParamSave.cs
new file mode 100644
index 0000000..c96f742
--- /dev/null
+++ b/HalconTools/MatchingModule/MatchingParamSave.cs
@@ -0,0 +1,113 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.IO;
+
+namespace HalconTools
+{
+ [Serializable]
+ public class MatchingParamSave
+ {
+ public double StartingAngle { get; set; }
+ public double AngleExtent { get; set; }
+
+ public double MinScale { get; set; }
+ public double MaxScale { get; set; }
+
+ public double MinScore { get; set; }
+
+ public int NumMatches { get; set; }
+
+ public double MaxOverlap { get; set; }
+
+ public string Subpixel { get; set; }
+
+ public int NumLevel { get; set; }
+ public int LastPyramidLevel { get; set; }
+
+ public double Greediness { get; set; }
+
+ private MatchingParamSave SaveParam(MatchingAssistant param)//
+ {
+ MatchingParamSave paramSave = new MatchingParamSave();
+ paramSave.StartingAngle = param.getParameterSet.mStartingAngle;
+ paramSave.AngleExtent = param.getParameterSet.mAngleExtent;
+ paramSave.MinScale = param.getParameterSet.mMinScale;
+ paramSave.MaxScale = param.getParameterSet.mMaxScale;
+ paramSave.MinScore = param.getParameterSet.mMinScore;
+ paramSave.NumMatches = param.getParameterSet.mNumMatches;
+ paramSave.MaxOverlap = param.getParameterSet.mMaxOverlap;
+ paramSave.Subpixel = param.getParameterSet.mSubpixel;
+ paramSave.NumLevel = param.getParameterSet.mNumLevel;
+ paramSave.LastPyramidLevel = param.getParameterSet.mLastPyramidLevel;
+ paramSave.Greediness = param.getParameterSet.mGreediness;
+
+ return paramSave;
+ }
+
+ public MatchingParam TranParam(MatchingParamSave paramSave)
+ {
+ MatchingParam param = new MatchingParam();
+
+ param.mStartingAngle = paramSave.StartingAngle;
+ param.mAngleExtent = paramSave.AngleExtent;
+ param.mMinScale = paramSave.MinScale;
+ param.mMaxScale = paramSave.MaxScale;
+ param.mMinScore = paramSave.MinScore;
+ param.mNumMatches = paramSave.NumMatches;
+ param.mMaxOverlap = paramSave.MaxOverlap;
+ param.mSubpixel = paramSave.Subpixel;
+ param.mNumLevel = paramSave.NumLevel;
+ param.mLastPyramidLevel = paramSave.LastPyramidLevel;
+ param.mGreediness = paramSave.Greediness;
+
+ return param;
+ }
+
+ public bool Save(MatchingAssistant mAssistant)
+ {
+ string path = System.Windows.Forms.Application.StartupPath + "\\MatchingConfige";
+ if (!Directory.Exists(path))
+ {
+ Directory.CreateDirectory(path);
+ }
+
+ System.Windows.Forms.SaveFileDialog saveMatchingConfige = new System.Windows.Forms.SaveFileDialog();
+ saveMatchingConfige.InitialDirectory = System.Windows.Forms.Application.StartupPath + "\\MatchingConfige";
+ saveMatchingConfige.Filter = "xml|*.xml";
+ if (saveMatchingConfige.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+ {
+ string files = saveMatchingConfige.FileName;
+
+ SerializeFileTool<HalconTools.MatchingParamSave> MatchingConfige = new SerializeFileTool<HalconTools.MatchingParamSave>();
+ HalconTools.MatchingParamSave param = new HalconTools.MatchingParamSave();
+
+ param = param.SaveParam(mAssistant); ;
+ MatchingConfige.SetConfig(files, param);
+
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public MatchingParamSave Load(string path)
+ {
+ SerializeFileTool<HalconTools.MatchingParamSave> MatchingConfige = new SerializeFileTool<HalconTools.MatchingParamSave>();
+
+ MatchingParamSave param = new MatchingParamSave();
+ //if (!path.EndsWith(".xml"))
+ //{
+ // return param;
+ //}
+
+ param = MatchingConfige.GetConfig(path);
+
+ return param;
+ }
+
+ }
+}
diff --git a/HalconTools/MatchingModule/MatchingResult.cs b/HalconTools/MatchingModule/MatchingResult.cs
new file mode 100644
index 0000000..e455714
--- /dev/null
+++ b/HalconTools/MatchingModule/MatchingResult.cs
@@ -0,0 +1,101 @@
+using System;
+using HalconDotNet;
+
+
+namespace HalconTools
+{
+
+ /// <summary>
+ /// This class holds the result data from a model detection. For any new
+ /// detection run, it also remembers the time needed
+ /// for the model detection.
+ /// </summary>
+ public class MatchingResult
+ {
+
+ /// <summary>
+ /// Model contour applied for model detection
+ /// </summary>
+ public HXLDCont mContour;
+ /// <summary>
+ /// All model contours detected
+ /// </summary>
+ public HXLDCont mContResults;
+
+ /// <summary>
+ /// Row coordinate of the found instances of the model
+ /// </summary>
+ public HTuple mRow;
+ /// <summary>
+ /// Column coordinate of the found instances of the model
+ /// </summary>
+ public HTuple mCol;
+
+ /// <summary>
+ /// Rotation angle of the found instances of the model
+ /// </summary>
+ public HTuple mAngle;
+ /// <summary>
+ /// Scale of the found instances of the model in the row direction
+ /// </summary>
+ public HTuple mScaleRow;
+ /// <summary>
+ /// Scale of the found instances of the model in the column direction
+ /// </summary>
+ public HTuple mScaleCol;
+ /// <summary>
+ /// Score of the found instances of the model
+ /// </summary>
+ public HTuple mScore;
+ /// <summary>
+ /// Time needed to detect <c>count</c> numbers of model instances
+ /// </summary>
+ public double mTime;
+ /// <summary>
+ /// Number of model instances found
+ /// </summary>
+ public int count;
+ /// <summary>
+ /// 2D homogeneous transformation matrix that can be used to transform
+ /// data from the model into the test image.
+ /// </summary>
+ public HHomMat2D hmat;
+
+ /// <summary>Constructor</summary>
+ public MatchingResult()
+ {
+ // hmat = new HHomMat2D();
+ mContResults = new HXLDCont();
+ }
+
+
+ /// <summary>
+ /// Gets the detected contour.
+ /// </summary>
+ /// <returns>Detected contour</returns>
+ public HXLDCont getDetectionResults()
+ {
+ HXLDCont rContours = new HXLDCont();
+ hmat.HomMat2dIdentity();
+ mContResults.GenEmptyObj();
+
+ for(int i = 0; i<count; i++)
+ {
+ hmat.VectorAngleToRigid(0, 0, 0, mRow[i].D, mCol[i].D, mAngle[i].D);
+ rContours = hmat.AffineTransContourXld(mContour);
+ mContResults = mContResults.ConcatObj(rContours);
+ }
+ return mContResults;
+ }
+
+
+ /// <summary>
+ /// Resets the detection results and sets count to 0.
+ /// </summary>
+ public void reset()
+ {
+ count = 0;
+ }
+
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/MeasureModule/MeasureAssistant.cs b/HalconTools/MeasureModule/MeasureAssistant.cs
new file mode 100644
index 0000000..ec49558
--- /dev/null
+++ b/HalconTools/MeasureModule/MeasureAssistant.cs
@@ -0,0 +1,733 @@
+using System;
+using HalconDotNet;
+using System.Collections;
+
+namespace HalconTools
+{
+ public delegate void MeasureDelegate(int value);
+
+ /// <summary>
+ /// The controller class MeasureAssistant controls
+ /// the communication between the GUI and the model data that
+ /// is used to parameterize the measuring.
+ /// </summary>
+ public class MeasureAssistant
+ {
+ /// <summary>Index of the selected ROI.</summary>
+ public int mActRoiIdx;
+
+ /// <summary>Reference to the ROI controller instance.</summary>
+ private ROIController roiController;
+
+ /// <summary>List of measure handles created for the list of ROIs.</summary>
+ private ArrayList mMeasureList;
+
+ /// <summary>Reference to list of ROI instances.</summary>
+ private ArrayList mROIList;
+
+ /// <summary>HALCON image used for measuring.</summary>
+ public HImage mImage;
+ public int mWidth;
+ public int mHeight;
+
+ /// <summary>Flag indicating whether measurements are performed between
+ /// individual edges or edge pairs.</summary>
+ public bool mSelPair;
+
+ /// <summary>Minimum edge amplitude.</summary>
+ public double mThresh;
+
+ /// <summary>Sigma of Gaussian smoothing.</summary>
+ public double mSigma;
+
+ /// <summary>
+ /// Width of the measure ROI (circular ROI: radius (half width) of the
+ /// annulus; linear ROI: half height of the rectangle).
+ /// </summary>
+ public double mRoiWidth;
+
+ public double mRoiHeight;
+
+ /// <summary>Default value for the minimum edge amplitude.</summary>
+ public double mInitThresh;
+
+ /// <summary>Default value for the sigma of Gaussian smoothing.</summary>
+ public double mInitSigma;
+
+ /// <summary>Default value for the ROI width.</summary>
+ public double mInitRoiWidth;
+
+ /// <summary>
+ /// Type of gray-value transition; determines how edges are
+ /// selected (dark-light or light-dark transition).
+ /// </summary>
+ public string mTransition;
+
+ /// <summary>Position of edges to select.</summary>
+ public string mPosition;
+
+ /// <summary>Type of interpolation to be used.</summary>
+ public string mInterpolation;
+
+ /// <summary>
+ /// Length of the displayed edges.
+ /// </summary>
+ public int mDispEdgeLength;
+
+ /// <summary>Error messages for failed measure actions.</summary>
+ public HTuple exceptionText;
+
+ /// <summary>
+ /// Flag indicating whether files with internal camera parameters
+ /// and camera pose are present and valid.
+ /// </summary>
+ public bool mIsCalibValid;
+
+ /// <summary>
+ /// Flag indicating whether measure results should be transformed
+ /// into world coordinates.
+ /// </summary>
+ public bool mTransWorldCoord;
+
+ /// <summary>
+ /// Flag indicating whether the ROI width should be used for
+ /// displaying the extracted edges (instead of mDispEdgeLength).
+ /// </summary>
+ public bool mDispROIWidth;
+
+ /// <summary>
+ /// Flag to add position coordinates of the detected (and
+ /// selected) edges to the result table.
+ /// </summary>
+ public bool mDispPosition;
+
+ /// <summary>
+ /// Flag to add the pair width of the detected edge (and
+ /// selected) pairs to the result table.
+ /// </summary>
+ public bool mDispPairWidth;
+
+ /// <summary>
+ /// Flag to add the edge amplitude of the detected (and
+ /// selected) edge pairs to the result table.
+ /// </summary>
+ public bool mDispAmplitude;
+
+ /// <summary>
+ /// Flag to add the distance between consecutive detected (and
+ /// selected) edges to the result table.
+ /// </summary>
+ public bool mDispDistance;
+
+ /// <summary>File with internal camera parameters.</summary>
+ public HTuple mCamParameter;
+
+ /// <summary>Camera pose file.</summary>
+ public HTuple mCamPose;
+
+ /// <summary>Unit for transformation into world coordinates.</summary>
+ public string mUnit;
+
+ /// <summary>Constant indicating an update of measure instances.</summary>
+ public const int EVENT_UPDATE_MEASUREMENT = 2;
+
+ /// <summary>
+ /// Constant indicating the removal of measure instances from the
+ /// measure list mMeasureList.
+ /// </summary>
+ public const int EVENT_UPDATE_REMOVE = 3;
+
+ /// <summary>Constant indicating an update of measure results.</summary>
+ public const int EVENT_UPDATE_RESULT_XLD = 4;
+
+ /// <summary>Auxiliary constant.</summary>
+ public const int ALL_ROI =-1;
+
+ /// <summary>
+ /// Constant indicating an error while reading an image file.</summary>
+ public const int ERR_READING_FILE = 10;
+
+
+ public MeasureDelegate NotifyMeasureObserver;
+
+
+ /* To create the measure controller class the ROI
+ controller has to be provided for initialization */
+ public MeasureAssistant(ROIController CRoi)
+ {
+ exceptionText = "";
+ roiController = CRoi;
+ mROIList = roiController.getROIList();
+ mMeasureList = new ArrayList(15);
+ mIsCalibValid = false;
+ mActRoiIdx = -1;
+ }
+
+ /*********************************************************/
+ /* setter-methods */
+ /*********************************************************/
+
+ /// <summary>
+ /// Sets a flag to determine if measure detection is calculated
+ /// for edges or edge pairs
+ /// </summary>
+ public void setSelPair(bool mode)
+ {
+ mSelPair = mode;
+ UpdateMeasure();
+ mActRoiIdx = roiController.getActiveROIIdx();
+ }
+
+ /// <summary>
+ /// Sets the variable mThresh to the provided value and
+ /// triggers an update for the measure results
+ /// </summary>
+ public void setMinEdgeAmpl(double val)
+ {
+ mThresh = val;
+ UpdateExecute(ALL_ROI);
+ }
+
+ /// <summary>
+ /// Sets the variable mSigma to the provided value and
+ /// triggers an update for the measure results
+ /// </summary>
+ public void setSigma(double val)
+ {
+ mSigma = val;
+ UpdateExecute(ALL_ROI);
+ }
+
+ /// <summary>
+ /// Sets the variable mRoiWidth to the provided value and
+ /// triggers an update for the measure results
+ /// </summary>
+ public void setRoiWidth(double val)
+ {
+ mRoiWidth = val;
+ UpdateMeasure(ALL_ROI);
+ }
+
+ public void setRoiHeight(double val)
+ {
+ mRoiHeight = val;
+ UpdateMeasure(ALL_ROI);
+ }
+
+ /// <summary>
+ /// Sets the variable mInterpolation to the provided value and
+ /// triggers an update for the measure results
+ /// </summary>
+ public void setInterpolation(string mode)
+ {
+ mInterpolation = mode;
+ UpdateMeasure(ALL_ROI);
+ }
+
+ /// <summary>
+ /// Sets the variable mTransition to the provided value and
+ /// triggers an update for the measure results
+ /// </summary>
+ public void setTransition(string mode)
+ {
+ mTransition = mode;
+ UpdateExecute(ALL_ROI);
+ }
+
+ /// <summary>
+ /// Sets the position of edges to select to the provided value and
+ /// triggers an update od the measure results.
+ /// </summary>
+ public void setPosition(string mode)
+ {
+ mPosition = mode;
+ UpdateExecute(ALL_ROI);
+ }
+
+ /// <summary>
+ /// Sets the length of the displayed edges to the provided value
+ /// and triggers an update of the measure results.
+ /// </summary>
+ public void setDispEdgeLength(int val)
+ {
+ mDispEdgeLength = val;
+ UpdateXLD();
+ }
+
+ /// <summary>
+ /// Sets the width of the displayed ROI to the provided value
+ /// and triggers an update for the measure results
+ /// </summary>
+ public void setFlagDispROIWidth(bool mode)
+ {
+ mDispROIWidth = mode;
+ UpdateXLD();
+ }
+
+ /********************************************************/
+ /* determine list of result coordinates to be displayed */
+ /********************************************************/
+
+ /// <summary>
+ /// Sets a flag to determine if the edge positions of
+ /// measure results are added and displayed on the
+ /// measure result table
+ /// </summary>
+ public void showPosition(bool mode)
+ {
+ mDispPosition = mode;
+ }
+
+ /// <summary>
+ /// Sets a flag to determine if the intra distance for
+ /// measure edge pairs are added and displayed on the
+ /// measure result table
+ /// </summary>
+ public void showPairWidth(bool mode)
+ {
+ mDispPairWidth = mode;
+ }
+
+ /// <summary>
+ /// Sets a flag to determine if the edge amplitude of
+ /// measure results are added and displayed on the
+ /// measure result table
+ /// </summary>
+ public void showAmplitude(bool mode)
+ {
+ mDispAmplitude = mode;
+ }
+
+ /// <summary>
+ /// Sets a flag to determine if the edge distance of
+ /// measure results are added and displayed on the
+ /// measure result table
+ /// </summary>
+ public void showDistance(bool mode)
+ {
+ mDispDistance = mode;
+ }
+
+ /// <summary>
+ /// Sets the unit for world coordinate transformation to
+ /// the provided value and triggers an update of the
+ /// measure results
+ /// </summary>
+ public void setUnit(string val)
+ {
+ mUnit = val;
+ UpdateExecute(ALL_ROI);
+ }
+
+ /// <summary>
+ /// Sets the variable mTransWorldCoord to the provided
+ /// value and triggers an update for the measure results
+ /// </summary>
+ public void setTransWorldCoord(bool mode)
+ {
+ mTransWorldCoord = mode;
+ UpdateExecute(ALL_ROI);
+ }
+
+ /// <summary>
+ /// Load an HALCON image from the file filename and
+ /// delete the list of measure handles created for the
+ /// previous image setup
+ /// </summary>
+ /// <param name="filename">Location of image file</param>
+ /// <returns>Flag depicting success of the load process</returns>
+ public bool setImage(string filename)
+ {
+ string tmp;
+
+ RemoveAllMeasureObjects();
+ exceptionText = "";
+ try
+ {
+ mImage = new HImage(filename);
+ mImage.GetImagePointer1(out tmp, out mWidth, out mHeight);
+ }
+ catch (HOperatorException e)
+ {
+ mImage = null;
+ exceptionText = e.Message;
+ NotifyMeasureObserver(MeasureAssistant.ERR_READING_FILE);
+ return false;
+ }
+ return true;
+ }
+
+ /// <summary>
+ /// Sets the variable mImage to the HImage provided
+ /// </summary>
+ /// <param name="img">HALCON image instance</param>
+ public void setImage(HImage img)
+ {
+ string tmp;
+
+ RemoveAllMeasureObjects();
+ mImage = img;
+
+ if (mImage != null)
+ mImage.GetImagePointer1(out tmp, out mWidth, out mHeight);
+
+ }
+
+ /// <summary>
+ /// Returns the image currently used for measurement, described
+ /// by mImage
+ /// </summary>
+ public HImage getImage()
+ {
+ return mImage;
+ }
+
+ /// <summary>Load camera calibration data from file</summary>
+ /// <param name="file">Location of *.cal file</param>
+ public void LoadCamParFile(string file)
+ {
+ exceptionText = "";
+ try
+ {
+ mCamParameter = null;
+ mCamParameter = HMisc.ReadCamPar(file);
+ }
+ catch (HOperatorException e)
+ {
+ mIsCalibValid = false;
+ exceptionText = e.Message;
+ throw (e);
+ }
+
+ if (mCamParameter == null || !(mCamParameter.Length > 0) || mCamPose == null || !(mCamPose.Length > 0))
+ mIsCalibValid = false;
+ else
+ mIsCalibValid = true;
+
+ if (mIsCalibValid)
+ UpdateExecute(ALL_ROI);
+ }
+
+ /// <summary>Load camera pose data from file</summary>
+ /// <param name="file">Location of *.dat file</param>
+ public void LoadCamPoseFile(string file)
+ {
+ exceptionText = "";
+ try
+ {
+ HOperatorSet.ReadPose(new HTuple(file), out mCamPose);
+ }
+ catch (HOperatorException e)
+ {
+ mIsCalibValid = false;
+ exceptionText = e.Message;
+ throw (e);
+ }
+
+ if (mCamParameter == null || !(mCamParameter.Length > 0) || mCamPose == null || !(mCamPose.Length > 0))
+ mIsCalibValid = false;
+ else
+ mIsCalibValid = true;
+
+
+ if (mIsCalibValid)
+ UpdateExecute(ALL_ROI);
+ }
+
+ /// <summary>
+ /// Create a measure object for the new instance of an interactive
+ /// ROI at index mActRoiIdx
+ /// </summary>
+ public void AddMeasureObject()
+ {
+ mActRoiIdx = roiController.getActiveROIIdx();
+
+ if (mActRoiIdx != -1)
+ mMeasureList.Add(CreateMeasure((ROI)mROIList[mActRoiIdx], this));
+
+ NotifyMeasureObserver(EVENT_UPDATE_MEASUREMENT);
+ }
+
+ /// <summary>
+ /// Update measure object for the selected interactive ROI
+ /// at index or update measure handles for the
+ /// entire set of interactive ROIs
+ /// </summary>
+ public void UpdateMeasure(int index)
+ {
+
+ if (index == -1)
+ {
+ for (int i =0; i < mMeasureList.Count; i++)
+ ((Measurement)mMeasureList[i]).UpdateROI();
+ }
+ else
+ {
+ ((Measurement)mMeasureList[index]).UpdateROI();
+ }
+
+ NotifyMeasureObserver(EVENT_UPDATE_MEASUREMENT);
+ }
+
+ /// <summary>
+ /// Recreate the entire measure object list, if the
+ /// measure edge type changes from edge pose to
+ /// edge pairs or vice versa
+ /// </summary>
+ public void UpdateMeasure()
+ {
+ RemoveAllMeasureObjects();
+ for (int i =0; i < mROIList.Count; i++)
+ {
+ ROI roi = (ROI)mROIList[i];
+ mMeasureList.Add(CreateMeasure((ROI)mROIList[i], this));
+ }
+ NotifyMeasureObserver(EVENT_UPDATE_MEASUREMENT);
+ }
+
+ /// <summary>
+ /// Update measure results for a selected measure object instance
+ /// at index or the entire set of measure handles.
+ /// </summary>
+ public void UpdateExecute(int index)
+ {
+ if (index == -1)
+ {
+ for (int i =0; i < mMeasureList.Count; i++)
+ ((Measurement)mMeasureList[i]).UpdateResults();
+ }
+ else
+ {
+ ((Measurement)mMeasureList[index]).UpdateResults();
+ }
+
+ NotifyMeasureObserver(EVENT_UPDATE_MEASUREMENT);
+ }
+
+ /// <summary>
+ /// Update display objects of the measure results
+ /// for the entire set of measure handles
+ /// </summary>
+ public void UpdateXLD()
+ {
+ for (int i =0; i < mMeasureList.Count; i++)
+ ((Measurement)mMeasureList[i]).UpdateXLD();
+
+ NotifyMeasureObserver(EVENT_UPDATE_RESULT_XLD);
+ }
+
+ /// <summary>
+ /// Clear the entire list of measure handles and
+ /// releases the resources used
+ /// </summary>
+ public void RemoveAllMeasureObjects()
+ {
+ int count = mMeasureList.Count;
+ for (int i=0; i < count; i++)
+ RemoveMeasureObjectIdx(0);
+
+ NotifyMeasureObserver(EVENT_UPDATE_REMOVE);
+ }
+
+ /// <summary>
+ /// Clear the measure object corresponding to the deleted
+ /// interactive ROI and release the resources used
+ /// </summary>
+ public void RemoveMeasureObjectActIdx()
+ {
+ int DelIdx = roiController.getDelROIIdx();
+ RemoveMeasureObjectIdx(DelIdx);
+
+ NotifyMeasureObserver(EVENT_UPDATE_REMOVE);
+ }
+
+ /// <summary>
+ /// Clear the measure object at the index DelIdx from
+ /// the measure object list and release the resources used
+ /// </summary>
+ private void RemoveMeasureObjectIdx(int DelIdx)
+ {
+ Measurement m = (Measurement)mMeasureList[DelIdx];
+ mMeasureList.RemoveAt(DelIdx);
+ m.ClearMeasurement();
+ mActRoiIdx = -1;
+ }
+
+ /// <summary>
+ /// Factory method to create measure objects
+ /// </summary>
+ /// <param name="roi">Interactive ROI</param>
+ /// <param name="parent">
+ /// Reference to measure controller class
+ /// </param>
+ /// <returns>New measure object</returns>
+ public static Measurement CreateMeasure(ROI roi, MeasureAssistant parent)
+ {
+ if (parent.mSelPair)
+ return new MeasurementPair(roi, parent);
+ else
+ return new MeasurementEdge(roi, parent);
+ }
+
+ /// <summary>
+ /// Composes set of HALCON iconic objects to display
+ /// measure edge results
+ /// </summary>
+ /// <returns>Detected measure edges</returns>
+ public HXLDCont getMeasureResults()
+ {
+ HXLDCont val;
+ HXLDCont obj = new HXLDCont();
+ obj.GenEmptyObj();
+
+ for (int i=0; i < mMeasureList.Count; i++)
+ {
+ val = ((Measurement)mMeasureList[i]).getMeasureResults();
+ if (val.IsInitialized())
+ obj = obj.ConcatObj(val);
+ }
+ return obj;
+ }
+
+ /// <summary>
+ /// Composes set of HALCON iconic objects to display
+ /// dimension of measure object
+ /// </summary>
+ /// <returns>Surrounding contour of measure object</returns>
+ public HObject getMeasureRegions()
+ {
+ HObject val;
+ HObject obj = new HObject();
+ obj.GenEmptyObj();
+
+ for (int i=0; i < mMeasureList.Count; i++)
+ {
+ val = ((Measurement)mMeasureList[i]).getMeasureRegion();
+ if (val.IsInitialized())
+ obj = obj.ConcatObj(val);
+ }
+ return obj;
+ }
+
+ /// <summary>Returns number of measure objects</summary>
+ /// <returns>Length of mMeasureList</returns>
+ public int getMeasureListCount()
+ {
+ return mMeasureList.Count;
+ }
+
+ /// <summary>Change index for selected interactive ROI</summary>
+ public void ClickedActiveROI()
+ {
+ mActRoiIdx = roiController.getActiveROIIdx();
+ }
+
+ /// <summary>
+ /// Compose set of measure result data to display in the result table
+ /// </summary>
+ /// <returns>Composition of measure result information</returns>
+ public ArrayList getMeasureTableData()
+ {
+ MeasureResult resultData;
+ ArrayList table = new ArrayList(10);
+
+ if (mMeasureList.Count == 0 || mActRoiIdx == -1)
+ return table;
+
+ resultData = ((Measurement)mMeasureList[mActRoiIdx]).getMeasureResultData();
+
+ if (mSelPair)
+ {
+ if (mDispPosition)
+ {
+ table.Add(((PairResult)resultData).rowEdgeFirst);
+ table.Add(((PairResult)resultData).colEdgeFirst);
+ table.Add(((PairResult)resultData).rowEdgeSecond);
+ table.Add(((PairResult)resultData).colEdgeSecond);
+ }
+ if (mDispAmplitude)
+ {
+ table.Add(((PairResult)resultData).amplitudeFirst);
+ table.Add(((PairResult)resultData).amplitudeSecond);
+ }
+ if (mDispDistance)
+ table.Add(((PairResult)resultData).interDistance);
+
+ if (mDispPairWidth)
+ table.Add(((PairResult)resultData).intraDistance);
+ }
+ else
+ {
+ if (mDispPosition)
+ {
+ table.Add(((EdgeResult)resultData).rowEdge);
+ table.Add(((EdgeResult)resultData).colEdge);
+ }
+ if (mDispAmplitude)
+ table.Add(((EdgeResult)resultData).amplitude);
+ if (mDispDistance)
+ table.Add(((EdgeResult)resultData).distance);
+ }
+ return table;
+ }
+
+ /// <summary>
+ /// Compose the set of measure result types to be displayed
+ /// in the result table. The types are determined by the user,
+ /// who can check the corresponding flags in the GUI frontend
+ /// </summary>
+ /// <returns>Composition of measure result types</returns>
+ public ArrayList getMeasureResultComposition()
+ {
+ ArrayList composition = new ArrayList(5);
+
+ if (mSelPair)
+ {
+ if (mDispPosition)
+ {
+ composition.Add("Row 1st");
+ composition.Add("Col 1st");
+ composition.Add("Row 2nd");
+ composition.Add("Col 2nd");
+ }
+ if (mDispAmplitude)
+ {
+ composition.Add("Amplitude 1st");
+ composition.Add("Amplitude 2nd");
+ }
+ if (mDispDistance)
+ composition.Add("Distance");
+ if (mDispPairWidth)
+ composition.Add("Width");
+ }
+ else
+ {
+ if (mDispPosition)
+ {
+ composition.Add("Row");
+ composition.Add("Column");
+ }
+ if (mDispAmplitude)
+ composition.Add("Amplitude");
+ if (mDispDistance)
+ composition.Add("Distance");
+ }
+ return composition;
+ }
+
+ /// <summary>
+ /// Determine the gray value projection for the measure object
+ /// corresponding to the interactive ROI currently selected.
+ /// If no ROI is selected then return a null-object.
+ /// </summary>
+ /// <returns>Gray value profile</returns>
+ public double[] getMeasureProjection()
+ {
+ if (mActRoiIdx == -1)
+ return null;
+ else
+ return ((Measurement)mMeasureList[mActRoiIdx]).getGrayValueProj();
+ }
+
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/MeasureModule/MeasureParamSave.cs b/HalconTools/MeasureModule/MeasureParamSave.cs
new file mode 100644
index 0000000..9efb6f0
--- /dev/null
+++ b/HalconTools/MeasureModule/MeasureParamSave.cs
@@ -0,0 +1,94 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.IO;
+
+namespace HalconTools
+{
+ [Serializable]
+ public class MeasureParamSave
+ {
+ /// <summary>
+ /// ROI Height
+ /// </summary>
+ public double hv_measure_Length1 { get; set; }
+
+ /// <summary>
+ /// ROI Width
+ /// </summary>
+ public double hv_measure_Length2 { get; set; }
+
+ public double hv_measure_sigma { get; set; }
+
+ public double hv_measure_threshold { get; set; }
+
+ public int hv_measure_number { get; set; }
+
+ public string hv_measure_position { get; set; }
+
+ public string hv_measure_transition { get; set; }
+
+ public string hv_measure_interpolation { get; set; }
+
+
+ private MeasureParamSave SaveParam(MeasureAssistant param)
+ {
+ MeasureParamSave paramSave = new MeasureParamSave();
+ paramSave.hv_measure_number = 20;
+ paramSave.hv_measure_Length1 = param.mRoiHeight;
+ paramSave.hv_measure_Length2 = param.mRoiWidth;
+ paramSave.hv_measure_threshold = param.mThresh;
+ paramSave.hv_measure_sigma = param.mSigma;
+ paramSave.hv_measure_transition = param.mTransition;
+ paramSave.hv_measure_position = param.mPosition;
+ paramSave.hv_measure_interpolation = param.mInterpolation;
+
+ return paramSave;
+ }
+
+ public bool Save(MeasureAssistant mAssistant)
+ {
+ string path = System.Windows.Forms.Application.StartupPath + "\\MeasureConfige";
+ if (!Directory.Exists(path))
+ {
+ Directory.CreateDirectory(path);
+ }
+
+ System.Windows.Forms.SaveFileDialog saveMatchingConfige = new System.Windows.Forms.SaveFileDialog();
+ saveMatchingConfige.InitialDirectory = System.Windows.Forms.Application.StartupPath + "\\MeasureConfige";
+ saveMatchingConfige.Filter = "xml|*.xml";
+ if (saveMatchingConfige.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+ {
+ string files = saveMatchingConfige.FileName;
+
+ SerializeFileTool<HalconTools.MeasureParamSave> MeasureConfige = new SerializeFileTool<HalconTools.MeasureParamSave>();
+ HalconTools.MeasureParamSave param = new HalconTools.MeasureParamSave();
+
+ param = param.SaveParam(mAssistant); ;
+ MeasureConfige.SetConfig(files, param);
+
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public MeasureParamSave Load(string path)
+ {
+ SerializeFileTool<HalconTools.MeasureParamSave> MeasureConfige = new SerializeFileTool<HalconTools.MeasureParamSave>();
+
+ MeasureParamSave param = new MeasureParamSave();
+ //if (!path.EndsWith(".xml"))
+ //{
+ // return param;
+ //}
+
+ param = MeasureConfige.GetConfig(path);
+
+ return param;
+ }
+ }
+}
diff --git a/HalconTools/MeasureModule/Measurement.cs b/HalconTools/MeasureModule/Measurement.cs
new file mode 100644
index 0000000..66c5790
--- /dev/null
+++ b/HalconTools/MeasureModule/Measurement.cs
@@ -0,0 +1,516 @@
+using System;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ /// <summary>
+ /// This model data class holds general information about a measure
+ /// object. To define more specialized measure data objects the
+ /// classes MeasurementEdge and MeasurementPair are derived from this
+ /// class to be able to distinguish the measure
+ /// types and results for simple edges and for edge pairs. The base
+ /// class contains the methods to create measure handles and to create
+ /// the display results of a measure action. The derived classes
+ /// implement the specialized methods to perform a measure operation
+ /// and generate the measure results.
+ /// </summary>
+ public class Measurement
+ {
+ /// <summary>HALCON measure object (handle).</summary>
+ protected HMeasure mHandle;
+
+ /// <summary>
+ /// Flag to distinguish between a linear and circular measure object.
+ /// </summary>
+ protected int mROIType;
+
+ /// <summary>
+ /// Model coordinates obtained from the ROI instance.
+ /// This coordinates are the base to calculate the measuring field.
+ /// </summary>
+ protected HTuple mROICoord;
+
+ /// <summary>Reference to the ROI.</summary>
+ protected ROI mRoi;
+
+ /// <summary>
+ /// Auxiliary information about the
+ /// measuring field calculated using the ROI coordinates.
+ /// </summary>
+ protected HTuple mMeasROI;
+
+ /// <summary>Iconic object to display measure edge results.</summary>
+ protected HXLDCont mEdgeXLD;
+
+ /// <summary>Iconic object to display mMeasROI.</summary>
+ protected HRegion mMeasureRegion;
+
+ /// <summary>
+ /// Reference to controller class to obtain information about
+ /// the context of the measurement, e.g. image, parameter setups etc.
+ /// </summary>
+ protected MeasureAssistant mMeasAssist;
+
+ /// <summary>
+ /// Creates and initializes a measure object based on information the ROI object
+ /// about the ROI.
+ /// </summary>
+ /// <param name="roi">ROI instance</param>
+ /// <param name="mAssist">Reference to controller class</param>
+ public Measurement(ROI roi, MeasureAssistant mAssist)
+ {
+ mRoi = roi;
+ mMeasAssist = mAssist;
+ mROICoord = mRoi.getModelData();
+ mEdgeXLD = new HXLDCont();
+ mMeasureRegion = new HRegion();
+
+ if (mRoi is ROICircularArc)
+ mROIType = ROI.ROI_TYPE_CIRCLEARC;
+ else
+ mROIType = ROI.ROI_TYPE_LINE;
+ }
+
+ /// <summary>
+ /// Triggers an update of the measure object for all
+ /// changes concerning the shape of the ROI or the measurement
+ /// parameters.
+ /// </summary>
+ public void UpdateROI()
+ {
+ mROICoord = mRoi.getModelData();
+ UpdateMeasure();
+ }
+
+ /// <summary>
+ /// Creates a measure object based on the model data
+ /// defined by the ROI instance and the parameters
+ /// describing the measure context.
+ /// </summary>
+ protected void UpdateMeasure()
+ {
+ double extent, sPhi, radius;
+
+ if (mHandle != null)
+ mHandle.Dispose();
+
+ mMeasAssist.exceptionText = "";
+
+ try
+ {
+ switch (mROIType)
+ {
+ case ROI.ROI_TYPE_CIRCLEARC:
+
+ radius = mROICoord[2].D;
+ sPhi = mROICoord[3].D;
+ extent = mROICoord[4].D;
+
+
+ mMeasROI = GenSurCircle(mROICoord, mMeasAssist.mRoiWidth);
+ mHandle = new HMeasure(mROICoord[0].D, mROICoord[1].D, radius,
+ sPhi, extent,
+ mMeasAssist.mRoiWidth,
+ mMeasAssist.mWidth, mMeasAssist.mHeight,
+ mMeasAssist.mInterpolation);
+
+ break;
+ case ROI.ROI_TYPE_LINE:
+
+ mMeasROI = GenSurRect2(mROICoord, mMeasAssist.mRoiWidth);
+ mHandle = new HMeasure(mMeasROI[0].D, mMeasROI[1].D,
+ mMeasROI[2].D, mMeasROI[3].D, mMeasROI[4].D,
+ mMeasAssist.mWidth, mMeasAssist.mHeight,
+ mMeasAssist.mInterpolation);
+ break;
+ //case ROI.ROI_TYPE_LINE:
+
+ // mMeasROI = GenSurRect2(mROICoord,mMeasAssist.mRoiHeight, mMeasAssist.mRoiWidth);
+ // mHandle = new HMeasure(mMeasROI[0].D, mMeasROI[1].D,
+ // mMeasROI[2].D, mMeasROI[3].D, mMeasROI[4].D,
+ // mMeasAssist.mWidth, mMeasAssist.mHeight,
+ // mMeasAssist.mInterpolation);
+ break;
+ }
+ }
+ catch (HOperatorException e)
+ {
+ mEdgeXLD.Dispose();
+ mMeasureRegion.Dispose();
+ mMeasAssist.exceptionText = e.Message;
+ ClearResultData();
+ return;
+ }
+ UpdateResults();
+ UpdateMeasureRegion();
+ }
+
+ /// <summary>
+ /// Defines the measuring field of a linear ROI.
+ /// </summary>
+ /// <param name="line">
+ /// Model data for a linear interactive ROI
+ /// </param>
+ /// <param name="width">Half width of (rectangular) measure ROI</param>
+ /// <returns>Model data describing a linear measuring field</returns>
+ private HTuple GenSurRect2(HTuple line, double width)
+ {
+ double row1 = line[0];
+ double col1 = line[1];
+ double row2 = line[2];
+ double col2 = line[3];
+
+ double phi = HMisc.AngleLx(row1, col1, row2, col2);
+ double length1 = (HMisc.DistancePp(row1, col1, row2, col2)) / 2.0;
+ double length2 = width;
+ double rowM = (row1 + row2) / 2;
+ double colM = (col1 + col2) / 2;
+
+ return new HTuple(new double[] { rowM, colM, phi, length1, length2 });
+ }
+
+ private HTuple GenSurRect2(HTuple line,double height, double width)
+ {
+ double row1 = line[0];
+ double col1 = line[1];
+ double row2 = line[2];
+ double col2 = line[3];
+
+ double phi = HMisc.AngleLx(row1, col1, row2, col2);
+ double length1 = height / 2.0;
+ double length2 = width;
+ double rowM = (row1 + row2) / 2;
+ double colM = (col1 + col2) / 2;
+
+ return new HTuple(new double[] { rowM, colM, phi, length1, length2 });
+ }
+
+ /// <summary>
+ /// Defines the measuring field of a circular ROI.
+ /// </summary>
+ /// <param name="circle">
+ /// Model data for a circular ROI
+ /// </param>
+ /// <param name="width">Radius (half width) of the circular (ring-shaped) ROI</param>
+ /// <returns>Model data describing circular measuring field</returns>
+ private HTuple GenSurCircle(HTuple circle, double width)
+ {
+ double row1 = circle[0];
+ double col1 = circle[1];
+ double radius = circle[2];
+ double startPhi = circle[3];
+ double extent = circle[4];
+
+ if (radius <= width)
+ return new HTuple(new double[] { row1, col1, startPhi, extent, (radius + width), 0.0 });
+ else
+ return new HTuple(new double[] { row1, col1, startPhi, extent, (radius + width), (radius - width) });
+ }
+
+ /// <summary>Releases resources used for this measure object.</summary>
+ public void ClearMeasurement()
+ {
+ if (mHandle != null)
+ {
+ mHandle.Dispose();
+ mEdgeXLD.Dispose();
+ mMeasureRegion.Dispose();
+ }
+ }
+
+ /// <summary>
+ /// Creates the iconic object for displaying a measured
+ /// edge in a linear ROI.
+ /// </summary>
+ /// <returns>Contour depicting the measured edge</returns>
+ public static HXLDCont DetermineEdgeLine(double row, double col, double phi, double width)
+ {
+ double row1, row2, col1, col2;
+
+ row1 = row - width * Math.Sin(phi + 0.5 * Math.PI);
+ col1 = col + width * Math.Cos(phi + 0.5 * Math.PI);
+ row2 = row - width * Math.Sin(phi + 1.5 * Math.PI);
+ col2 = col + width * Math.Cos(phi + 1.5 * Math.PI);
+ return DetermineLine(row1, col1, row2, col2);
+ }
+
+ /// <summary>
+ /// Creates the iconic object for displaying a measured
+ /// edge from the coordinates of the end points.
+ /// </summary>
+ /// <returns>Contour depicting the measured edge</returns>
+ public static HXLDCont DetermineLine(double row1, double col1, double row2, double col2)
+ {
+ HXLDCont edge = new HXLDCont();
+ HTuple rows, cols;
+
+ rows = new HTuple(new double[] { row1, row2 });
+ cols = new HTuple(new double[] { col1, col2 });
+
+ edge.GenContourPolygonXld(rows, cols);
+ return edge;
+ }
+
+ /// <summary>
+ /// Creates the iconic object for displaying a measured
+ /// edge in a circular ROI.
+ /// </summary>
+ /// <returns>Edge contour depicting a measured edge</returns>
+ public static HXLDCont DetermineEdgeCircularArc(double row, double col, double center_row, double center_col, double radius, double width)
+ {
+ double row1, row2, col1, col2;
+
+ row1 = row + (center_row - row) / radius * width;
+ col1 = col + (center_col - col) / radius * width;
+ row2 = row - (center_row - row) / radius * width;
+ col2 = col - (center_col - col) / radius * width;
+
+ return DetermineLine(row1, col1, row2, col2);
+ }
+
+ /// <summary>
+ /// Creates the iconic object for displaying
+ /// the arc between edges of a pair.
+ /// </summary>
+ /// <returns>Edge contour depicting the arc between edges of a pair</returns>
+ public static HXLDCont DeterminePairCircularArc(double row1, double col1, double row2, double col2, double cRow, double cCol, double radius, double width, bool positive)
+ {
+ HXLDCont arc = new HXLDCont();
+ double startPhi, endPhi;
+
+ startPhi = Math.Atan2(cRow - row1, col1 - cCol);
+ endPhi = Math.Atan2(cRow - row2, col2 - cCol);
+
+ arc.GenEllipseContourXld(cRow, cCol, 0.0, radius, radius, startPhi, endPhi, (positive ? "positive" : "negative"), 1.5);
+ return arc;
+ }
+
+ /// <summary>
+ /// Creates an iconic object depicting the
+ /// measuring field.
+ /// </summary>
+ public void UpdateMeasureRegion()
+ {
+
+ mMeasureRegion.Dispose();
+ mMeasureRegion.GenEmptyObj();
+
+ if (mROIType == ROI.ROI_TYPE_CIRCLEARC)
+ {
+ double sPhi, extent, innerRad, outerRad;
+ HTuple innerR, outerR, innerC, outerC;
+ HXLDCont outCont, innerCont, contour;
+
+ outCont = new HXLDCont();
+ innerCont = new HXLDCont();
+
+ sPhi = mMeasROI[2].D;
+ extent = mMeasROI[3].D;
+ outerRad = mMeasROI[4].D;
+ innerRad = mMeasROI[5].D;
+
+
+ innerCont.GenCircleContourXld(mMeasROI[0].D, mMeasROI[1].D, innerRad, sPhi, (sPhi + extent), (extent > 0) ? "positive" : "negative", 1.0);
+ outCont.GenCircleContourXld(mMeasROI[0].D, mMeasROI[1].D, outerRad, (sPhi + extent), sPhi, (extent > 0) ? "negative" : "positive", 1.0);
+
+ innerCont.GetContourXld(out innerR, out innerC);
+ outCont.GetContourXld(out outerR, out outerC);
+ innerR = innerR.TupleConcat(outerR);
+ innerC = innerC.TupleConcat(outerC);
+
+ contour = new HXLDCont(innerR, innerC);
+ contour = contour.CloseContoursXld();
+
+ mMeasureRegion = contour.GenRegionContourXld("margin");
+
+ contour.Dispose();
+ innerCont.Dispose();
+ outCont.Dispose();
+ }
+ else
+ {
+ mMeasureRegion.GenRectangle2(mMeasROI[0].D, mMeasROI[1].D,
+ mMeasROI[2].D, mMeasROI[3].D,
+ mMeasROI[4].D);
+ }
+ }
+
+ /// <summary>
+ /// If calibration data is available and valid, then rectify
+ /// measure result coordinates, otherwise leave them the same
+ /// </summary>
+ public void Rectify(HTuple row, HTuple col, out HTuple rowRect, out HTuple colRect)
+ {
+ double unitScale=0.0;
+
+ if (mMeasAssist.mIsCalibValid)
+ {
+ switch (mMeasAssist.mUnit)
+ {
+ case "祄":
+ unitScale = 0.000001;
+ break;
+ case "mm":
+ unitScale = 0.001;
+ break;
+ case "cm":
+ unitScale = 0.01;
+ break;
+ case "m":
+ unitScale = 1.0;
+ break;
+ default:
+ break;
+ }
+
+ HOperatorSet.ImagePointsToWorldPlane(mMeasAssist.mCamParameter,
+ mMeasAssist.mCamPose,
+ row, col, new HTuple(unitScale),
+ out colRect, out rowRect);
+ }
+ else
+ {
+ rowRect = row;
+ colRect = col;
+ }
+
+ }
+
+ /// <summary>
+ /// If calibration data is available and valid, then transform the
+ /// distance between measure result edges into world coordinates,
+ /// else leave them the same.
+ /// </summary>
+ public HTuple Distance(HTuple row1, HTuple col1, HTuple row2, HTuple col2, int shift)
+ {
+ HTuple rows, cols, rowRect, colRect;
+ HTuple distance = new HTuple();
+ HXLDCont contour;
+
+
+ if (shift == 0)
+ {
+ if (mROIType == ROI.ROI_TYPE_CIRCLEARC)
+ {
+ double cRow, cCol, radius, extent, phi1, phi2, phi, res, length, tmp;
+
+ cRow = mROICoord[0].D;
+ cCol = mROICoord[1].D;
+ radius = mROICoord[2].D;
+ extent = mROICoord[4].D;
+
+ HOperatorSet.TupleGenConst(new HTuple(row1.Length), 0.0, out distance);
+
+ for (int i=0; i < distance.Length; i++)
+ {
+ phi1 = HMisc.AngleLx(cRow, cCol, row1[i].D, col1[i].D);
+ phi2 = HMisc.AngleLx(cRow, cCol, row2[i].D, col2[i].D);
+
+ if (extent < 0)
+ {
+ tmp = phi1;
+ phi1 = phi2;
+ phi2 = tmp;
+ }
+
+ phi = phi2 - phi1;
+
+ if (phi < 0)
+ phi += 2 * Math.PI;
+
+ res = 0.05 * 24.0 / (radius * phi);
+
+ contour = new HXLDCont();
+ contour.GenEllipseContourXld(cRow, cCol, 0, radius, radius, phi1, phi2, "positive", res);
+ contour.GetContourXld(out rows, out cols);
+ Rectify(rows, cols, out rowRect, out colRect);
+ contour.Dispose();
+ contour.GenContourPolygonXld(rowRect, colRect);
+ length = contour.LengthXld();
+ distance[i].D = length;
+ contour.Dispose();
+ }
+
+ }
+ else if (mROIType == ROI.ROI_TYPE_LINE)
+ {
+ HTuple rRect1, cRect1, rRect2, cRect2;
+ Rectify(row1, col1, out rRect1, out cRect1);
+ Rectify(row2, col2, out rRect2, out cRect2);
+ distance = HMisc.DistancePp(rRect1, cRect1, rRect2, cRect2);
+ }
+ return distance;
+
+ }
+ else
+ {
+ HTuple rClip1, cClip1, rShift2, cShift2;
+
+ rClip1 = row1.TupleSelectRange(new HTuple(0), new HTuple(row1.Length - shift - 1));
+ cClip1 = col1.TupleSelectRange(new HTuple(0), new HTuple(col1.Length - shift - 1));
+ rShift2 = row2.TupleSelectRange(new HTuple(shift), new HTuple(row2.Length - 1));
+ cShift2 = col2.TupleSelectRange(new HTuple(shift), new HTuple(col2.Length - 1));
+
+ return this.Distance(rClip1, cClip1, rShift2, cShift2, 0);
+ }
+ }
+
+ /// <summary>
+ /// Returns the iconic object describing the measuring field
+ /// of the measure object.
+ /// </summary>
+ public HRegion getMeasureRegion()
+ {
+ return mMeasureRegion;
+ }
+
+ /// <summary>
+ /// Returns the iconic object depicting the measured edges.
+ /// </summary>
+ public HXLDCont getMeasureResults()
+ {
+ return mEdgeXLD;
+ }
+
+ /// <summary>
+ /// Returns the gray-value profile obtained by the measure projection
+ /// operation.
+ /// </summary>
+ /// <returns>Gray-value profile</returns>
+ public double[] getGrayValueProj()
+ {
+ HTuple grayVal;
+
+ if (mHandle == null || (int)mHandle.Handle < 0)
+ return null;
+
+ grayVal = mHandle.MeasureProjection(mMeasAssist.mImage);
+ return grayVal.ToDArr();
+ }
+
+ /********************************************************/
+ /********************************************************/
+ /// <summary>
+ /// Virtual method to be implemented by the derived classes.
+ /// </summary>
+ public virtual void UpdateResults() { }
+ /// <summary>
+ /// Virtual method to be implemented by the derived classes.
+ /// </summary>
+ public virtual void UpdateXLD() { }
+ /// <summary>
+ /// Virtual method to be implemented by the derived classes.
+ /// </summary>
+ public virtual void ClearResultData() { }
+ /// <summary>
+ /// Virtual method to be implemented by the derived classes.
+ /// </summary>
+ public virtual MeasureResult getMeasureResultData()
+ {
+ return null;
+ }
+
+ }//end of class
+}//end of namespace
+
+
diff --git a/HalconTools/MeasureModule/MeasurementEdge.cs b/HalconTools/MeasureModule/MeasurementEdge.cs
new file mode 100644
index 0000000..a25a069
--- /dev/null
+++ b/HalconTools/MeasureModule/MeasurementEdge.cs
@@ -0,0 +1,134 @@
+using System;
+using HalconDotNet;
+
+namespace HalconTools
+{
+
+ /// <summary>
+ /// The class MeasurementEdge describes single-edge measurement
+ /// and inherits from the base class Measurement. Virtual methods
+ /// defined in the base class are customized here to apply
+ /// HALCON operators for single-edge extraction.
+ /// </summary>
+ public class MeasurementEdge : Measurement
+ {
+ /// <summary>
+ /// Result container for the edge information returned
+ /// by the HALCON measure operator.
+ /// </summary>
+ private EdgeResult mResult;
+ /// <summary>
+ /// Result container for the edge information converted
+ /// into world coordinates. If calibration data is not available,
+ /// the variable contains the same information as mResult.
+ /// </summary>
+ private EdgeResult mResultWorld;
+
+
+ /// <summary>
+ /// Creates a measurement object for the provided ROI instance.
+ /// </summary>
+ /// <param name="roi">ROI instance</param>
+ /// <param name="mAssist">Reference to controller class</param>
+ public MeasurementEdge(ROI roi, MeasureAssistant mAssist)
+ : base(roi, mAssist)
+ {
+ mResult = new EdgeResult();
+ mResultWorld = new EdgeResult();
+ UpdateMeasure();
+ }
+
+ /// <summary>
+ /// Triggers an update of the measure results because of
+ /// changes in the parameter setup or a recreation of the measure
+ /// object caused by an update in the ROI model.
+ /// </summary>
+ public override void UpdateResults()
+ {
+ if (mHandle == null)
+ return;
+
+ mMeasAssist.exceptionText = "";
+
+ try
+ {
+ mHandle.MeasurePos(mMeasAssist.mImage,
+ mMeasAssist.mSigma, mMeasAssist.mThresh,
+ mMeasAssist.mTransition, mMeasAssist.mPosition,
+ out mResult.rowEdge, out mResult.colEdge,
+ out mResult.amplitude, out mResult.distance);
+
+ if (mMeasAssist.mIsCalibValid && mMeasAssist.mTransWorldCoord)
+ {
+ Rectify(mResult.rowEdge, mResult.colEdge, out mResultWorld.rowEdge, out mResultWorld.colEdge);
+ mResultWorld.distance = Distance(mResult.rowEdge, mResult.colEdge, mResult.rowEdge, mResult.colEdge, 1);
+ mResultWorld.amplitude = mResult.amplitude;
+ }
+ else
+ {
+ mResultWorld = new EdgeResult(mResult);
+ }
+ }
+ catch (HOperatorException e)
+ {
+ mEdgeXLD.Dispose();
+ mMeasAssist.exceptionText = e.Message;
+ mResultWorld = new EdgeResult();
+ return;
+ }
+ UpdateXLD();
+ }
+
+ /// <summary>Updates display object for measured edge results</summary>
+ public override void UpdateXLD()
+ {
+ double width, phi, cRow, cCol, radius;
+
+ if (mHandle == null && ((int)mHandle.Handle < 0))
+ return;
+
+ mMeasAssist.exceptionText = "";
+ width = mMeasAssist.mDispROIWidth ? mMeasAssist.mRoiWidth : mMeasAssist.mDispEdgeLength;
+ mEdgeXLD.Dispose();
+ mEdgeXLD.GenEmptyObj();
+
+ try
+ {
+ if (mROIType == ROI.ROI_TYPE_LINE)
+ {
+ phi = mMeasROI[2].D;
+
+ for (int i = 0; i < mResult.rowEdge.Length; i++)
+ mEdgeXLD = mEdgeXLD.ConcatObj(DetermineEdgeLine(mResult.rowEdge[i].D, mResult.colEdge[i].D, phi, width));
+
+ }
+ else if (mROIType == ROI.ROI_TYPE_CIRCLEARC)
+ {
+ cRow = mROICoord[0].D;
+ cCol = mROICoord[1].D;
+ radius = mROICoord[2].D;
+
+ for (int i = 0; i < mResult.rowEdge.Length; i++)
+ mEdgeXLD = mEdgeXLD.ConcatObj(DetermineEdgeCircularArc(mResult.rowEdge[i].D, mResult.colEdge[i].D, cRow, cCol, radius, width));
+ }
+ }
+ catch (HOperatorException e)
+ {
+ mMeasAssist.exceptionText = e.Message;
+ }
+ }
+
+ /// <summary>Returns measurement result.</summary>
+ public override MeasureResult getMeasureResultData()
+ {
+ return mResultWorld;
+ }
+
+ /// <summary>Clears measurement result.</summary>
+ public override void ClearResultData()
+ {
+ mResultWorld = new EdgeResult();
+ }
+
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/MeasureModule/MeasurementPair.cs b/HalconTools/MeasureModule/MeasurementPair.cs
new file mode 100644
index 0000000..3d0fbb6
--- /dev/null
+++ b/HalconTools/MeasureModule/MeasurementPair.cs
@@ -0,0 +1,165 @@
+using System;
+using HalconDotNet;
+
+namespace HalconTools
+{
+
+ /// <summary>
+ /// The class MeasurementPair describes edge pair measurement
+ /// and inherits from the base class Measurement. Virtual methods
+ /// defined in the base class are customized here to apply
+ /// HALCON operators for edge pair measurement.
+ /// </summary>
+ public class MeasurementPair : Measurement
+ {
+ /// <summary>
+ /// Result container for the edge information returned
+ /// by the HALCON measure operator.
+ /// </summary>
+ private PairResult mResult;
+
+ /// <summary>
+ /// Result container for the edge information converted
+ /// into world coordinates. If calibration data is not available,
+ /// the variable contains the same information as mResult.
+ /// </summary>
+ private PairResult mResultWorld;
+
+ /// <summary>
+ /// Creates a measurement object for the provided ROI instance.
+ /// </summary>
+ /// <param name="roi">ROI instance</param>
+ /// <param name="mAssist">Reference to controller class</param>
+ public MeasurementPair(ROI roi, MeasureAssistant mAssist)
+ : base(roi, mAssist)
+ {
+ mResult = new PairResult();
+ mResultWorld = new PairResult();
+ UpdateMeasure();
+ }
+
+ /// <summary>
+ /// Triggers an update of the measure results because of
+ /// changes in the parameter setup or a recreation of the measure
+ /// object caused by an update in the ROI model.
+ /// </summary>
+ public override void UpdateResults()
+ {
+ if (mHandle == null)
+ return;
+
+ mMeasAssist.exceptionText = "";
+
+ try
+ {
+ mHandle.MeasurePairs(mMeasAssist.mImage,
+ mMeasAssist.mSigma, mMeasAssist.mThresh,
+ mMeasAssist.mTransition, mMeasAssist.mPosition,
+ out mResult.rowEdgeFirst, out mResult.colEdgeFirst, out mResult.amplitudeFirst,
+ out mResult.rowEdgeSecond, out mResult.colEdgeSecond, out mResult.amplitudeSecond,
+ out mResult.intraDistance, out mResult.interDistance);
+
+ if (mMeasAssist.mIsCalibValid && mMeasAssist.mTransWorldCoord)
+ {
+ Rectify(mResult.rowEdgeFirst, mResult.colEdgeFirst, out mResultWorld.rowEdgeFirst, out mResultWorld.colEdgeFirst);
+ Rectify(mResult.rowEdgeSecond, mResult.colEdgeSecond, out mResultWorld.rowEdgeSecond, out mResultWorld.colEdgeSecond);
+
+ mResultWorld.intraDistance = Distance(mResult.rowEdgeFirst, mResult.colEdgeFirst,
+ mResult.rowEdgeSecond, mResult.colEdgeSecond, 0);
+ mResultWorld.interDistance = Distance(mResult.rowEdgeSecond, mResult.colEdgeSecond,
+ mResult.rowEdgeFirst, mResult.colEdgeFirst, 1);
+
+ mResultWorld.amplitudeFirst = mResult.amplitudeFirst;
+ mResultWorld.amplitudeSecond = mResult.amplitudeSecond;
+ }
+ else
+ {
+ mResultWorld = new PairResult(mResult);
+ }
+ }
+ catch (HOperatorException e)
+ {
+ mEdgeXLD.Dispose();
+ mMeasAssist.exceptionText = e.Message;
+ mResultWorld = new PairResult();
+ return;
+ }
+ UpdateXLD();
+ }
+
+ /// <summary>Updates display object for measured edges.</summary>
+ public override void UpdateXLD()
+ {
+ HXLDCont val;
+ double width, phi, cRow, cCol, radius, extent;
+
+ if (mHandle == null && ((int)mHandle.Handle < 0))
+ return;
+
+ mMeasAssist.exceptionText = "";
+ width = mMeasAssist.mDispROIWidth ? mMeasAssist.mRoiWidth : mMeasAssist.mDispEdgeLength;
+ mEdgeXLD.Dispose();
+ mEdgeXLD.GenEmptyObj();
+
+ try
+ {
+
+ if (mROIType == ROI.ROI_TYPE_LINE)
+ {
+ phi = mMeasROI[2].D;
+
+ for (int i = 0; i < mResult.rowEdgeFirst.Length; i++)
+ {
+ val = DetermineEdgeLine(mResult.rowEdgeFirst[i].D, mResult.colEdgeFirst[i].D, phi, width);
+ mEdgeXLD = mEdgeXLD.ConcatObj(val);
+ val = DetermineEdgeLine(mResult.rowEdgeSecond[i].D, mResult.colEdgeSecond[i].D, phi, width);
+ mEdgeXLD = mEdgeXLD.ConcatObj(val);
+ val = DetermineLine(mResult.rowEdgeFirst[i].D, mResult.colEdgeFirst[i].D,
+ mResult.rowEdgeSecond[i].D, mResult.colEdgeSecond[i].D);
+ mEdgeXLD = mEdgeXLD.ConcatObj(val);
+ }
+ }
+ else if (mROIType == ROI.ROI_TYPE_CIRCLEARC)
+ {
+ cRow = mROICoord[0].D;
+ cCol = mROICoord[1].D;
+ radius = mROICoord[2].D;
+ extent = mROICoord[4].D;
+
+ for (int i = 0; i < mResult.rowEdgeFirst.Length; i++)
+ {
+ val = DetermineEdgeCircularArc(mResult.rowEdgeFirst[i].D,
+ mResult.colEdgeFirst[i].D,
+ cRow, cCol, radius, width);
+ mEdgeXLD = mEdgeXLD.ConcatObj(val);
+ val = DetermineEdgeCircularArc(mResult.rowEdgeSecond[i].D,
+ mResult.colEdgeSecond[i].D,
+ cRow, cCol, radius, width);
+ mEdgeXLD = mEdgeXLD.ConcatObj(val);
+ val = DeterminePairCircularArc(mResult.rowEdgeFirst[i].D, mResult.colEdgeFirst[i].D,
+ mResult.rowEdgeSecond[i].D, mResult.colEdgeSecond[i].D,
+ cRow, cCol, radius, width, (extent >= 0));
+ mEdgeXLD = mEdgeXLD.ConcatObj(val);
+ }
+ }
+ }
+ catch (HOperatorException e)
+ {
+ mMeasAssist.exceptionText = e.Message;
+ }
+ }
+
+ /// <summary>Returns measurement result.</summary>
+ public override MeasureResult getMeasureResultData()
+ {
+ return mResultWorld;
+ }
+
+ /// <summary>Clears measurement result.</summary>
+ public override void ClearResultData()
+ {
+ mResultWorld = new PairResult();
+ }
+
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/MeasureModule/MeasurementResult.cs b/HalconTools/MeasureModule/MeasurementResult.cs
new file mode 100644
index 0000000..98b19bc
--- /dev/null
+++ b/HalconTools/MeasureModule/MeasurementResult.cs
@@ -0,0 +1,164 @@
+using System;
+using HalconDotNet;
+
+namespace HalconTools
+{
+
+ /// <summary>
+ /// Base class to have a more abstract definition of a measure result.
+ /// </summary>
+ public class MeasureResult
+ {
+ public MeasureResult() { }
+ }
+
+ /****************************************************************/
+ /****************************************************************/
+
+ /// <summary>
+ /// Measure result class containing data obtained from the HALCON measure
+ /// operator for single-edge measurement
+ /// </summary>
+ public class EdgeResult : MeasureResult
+ {
+ /// <summary>Row coordinate of extracted edges.</summary>
+ public HTuple rowEdge;
+
+ /// <summary>Column coordinate of extracted edges.</summary>
+ public HTuple colEdge;
+
+ /// <summary>Amplitude of the extracted edges (with sign).</summary>
+ public HTuple amplitude;
+
+ /// <summary>Distance between consecutive edges.</summary>
+ public HTuple distance;
+
+ /// <summary>Creates empty instance.</summary>
+ public EdgeResult() { }
+
+ /// <summary>
+ /// Creates an edge result instance containing data from
+ /// the provided result value (deep copy).
+ /// </summary>
+ public EdgeResult(EdgeResult result)
+ : this(result.rowEdge, result.colEdge,
+ result.amplitude, result.distance)
+ {
+ }
+
+ /// <summary>
+ /// Creates an edge result instance using the passed values.
+ /// </summary>
+ public EdgeResult(HTuple Nrow, HTuple Ncol,
+ HTuple Nampl, HTuple Ndist)
+ {
+ rowEdge = new HTuple(Nrow);
+ colEdge = new HTuple(Ncol);
+ amplitude = new HTuple(Nampl);
+ distance = new HTuple(Ndist);
+ }
+
+ /// <summary>
+ /// Creates an edge result instance using the passed values.
+ /// </summary>
+ public EdgeResult(double Nrow, double Ncol,
+ double Nampl, double Ndist)
+ {
+ rowEdge = new HTuple(Nrow);
+ colEdge = new HTuple(Ncol);
+ amplitude = new HTuple(Nampl);
+ distance = new HTuple(Ndist);
+ }
+
+ }//end of class EdgeResult
+
+
+ /****************************************************************/
+ /****************************************************************/
+
+ /// <summary>
+ /// Measure result class containing data obtained from the HALCON measure
+ /// operator for edge pair measurement
+ /// </summary>
+ public class PairResult : MeasureResult
+ {
+
+ /// <summary>
+ /// Row coordinate of first extracted edges of a pair.
+ /// </summary>
+ public HTuple rowEdgeFirst;
+ /// <summary>
+ /// Column coordinate of first extracted edges of a pair.
+ /// </summary>
+ public HTuple colEdgeFirst;
+ /// <summary>
+ /// Row coordinate of second extracted edges of a pair.
+ /// </summary>
+ public HTuple rowEdgeSecond;
+ /// <summary>
+ /// Column coordinate of second extracted edges of a pair.
+ /// </summary>
+ public HTuple colEdgeSecond;
+ /// <summary>Amplitude of the first extracted edges of a pair (with sign).</summary>
+ public HTuple amplitudeFirst;
+ /// <summary>Amplitude of the second extracted edges of a pair (with sign).</summary>
+ public HTuple amplitudeSecond;
+ /// <summary>Distance between edges of a pair.</summary>
+ public HTuple intraDistance;
+ /// <summary>Distance between consecutive edge pairs</summary>
+ public HTuple interDistance;
+
+
+ /// <summary>Creates empty instance.</summary>
+ public PairResult() { }
+
+ /// <summary>
+ /// Creates an edge result instance containing data from
+ /// the provided result value (deep copy).
+ /// </summary>
+ public PairResult(PairResult result)
+ : this(result.rowEdgeFirst, result.colEdgeFirst,
+ result.rowEdgeSecond, result.colEdgeSecond,
+ result.amplitudeFirst, result.amplitudeSecond,
+ result.intraDistance, result.interDistance)
+ {
+ }
+
+ /// <summary>
+ /// Creates an edge result instance using the passed values.
+ /// </summary>
+ public PairResult(HTuple Nrow1, HTuple Ncol1,
+ HTuple Nrow2, HTuple Ncol2,
+ HTuple Nampl1, HTuple Nampl2,
+ HTuple Ndist, HTuple Nwidth)
+ {
+ rowEdgeFirst = new HTuple(Nrow1);
+ colEdgeFirst = new HTuple(Ncol1);
+ rowEdgeSecond = new HTuple(Nrow2);
+ colEdgeSecond = new HTuple(Ncol2);
+ amplitudeFirst = new HTuple(Nampl1);
+ amplitudeSecond = new HTuple(Nampl2);
+ intraDistance = new HTuple(Ndist);
+ interDistance = new HTuple(Nwidth);
+ }
+
+ /// <summary>
+ /// Creates an edge result instance using the passed values.
+ /// </summary>
+ public PairResult(double Nrow1, double Ncol1,
+ double Nrow2, double Ncol2,
+ double Nampl1, double Nampl2,
+ double Ndist, double Nwidth)
+ {
+ rowEdgeFirst = new HTuple(Nrow1);
+ colEdgeFirst = new HTuple(Ncol1);
+ rowEdgeSecond = new HTuple(Nrow2);
+ colEdgeSecond = new HTuple(Ncol2);
+ amplitudeFirst = new HTuple(Nampl1);
+ amplitudeSecond = new HTuple(Nampl2);
+ intraDistance = new HTuple(Ndist);
+ interDistance = new HTuple(Nwidth);
+ }
+
+ }//end of class PairResult
+}//end of namespace
diff --git a/HalconTools/Properties/AssemblyInfo.cs b/HalconTools/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..86adfd1
--- /dev/null
+++ b/HalconTools/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+锘縰sing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 鏈夊叧绋嬪簭闆嗙殑甯歌淇℃伅閫氳繃涓嬪垪灞炴�ч泦
+// 鎺у埗銆傛洿鏀硅繖浜涘睘鎬у�煎彲淇敼
+// 涓庣▼搴忛泦鍏宠仈鐨勪俊鎭��
+[assembly: AssemblyTitle("HalconTools")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("HalconTools")]
+[assembly: AssemblyCopyright("Copyright 漏 Microsoft 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 灏� ComVisible 璁剧疆涓� false 浣挎绋嬪簭闆嗕腑鐨勭被鍨�
+// 瀵� COM 缁勪欢涓嶅彲瑙併�傚鏋滈渶瑕佷粠 COM 璁块棶姝ょ▼搴忛泦涓殑绫诲瀷锛�
+// 鍒欏皢璇ョ被鍨嬩笂鐨� ComVisible 灞炴�ц缃负 true銆�
+[assembly: ComVisible(false)]
+
+// 濡傛灉姝ら」鐩悜 COM 鍏紑锛屽垯涓嬪垪 GUID 鐢ㄤ簬绫诲瀷搴撶殑 ID
+[assembly: Guid("5b85ceaa-5e9a-46bd-b3a4-bf71c9e420d3")]
+
+// 绋嬪簭闆嗙殑鐗堟湰淇℃伅鐢变笅闈㈠洓涓�肩粍鎴�:
+//
+// 涓荤増鏈�
+// 娆$増鏈�
+// 鍐呴儴鐗堟湰鍙�
+// 淇鍙�
+//
+// 鍙互鎸囧畾鎵�鏈夎繖浜涘�硷紝涔熷彲浠ヤ娇鐢ㄢ�滃唴閮ㄧ増鏈彿鈥濆拰鈥滀慨璁㈠彿鈥濈殑榛樿鍊硷紝
+// 鏂规硶鏄寜濡備笅鎵�绀轰娇鐢ㄢ��*鈥�:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/HalconTools/Properties/Resources.Designer.cs b/HalconTools/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..d46e502
--- /dev/null
+++ b/HalconTools/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+锘�//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.17929
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HalconTools.Properties {
+ using System;
+
+
+ /// <summary>
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ /// </summary>
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ /// <summary>
+ /// Returns the cached ResourceManager instance used by this class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HalconTools.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/HalconTools/Properties/Resources.resx b/HalconTools/Properties/Resources.resx
new file mode 100644
index 0000000..7080a7d
--- /dev/null
+++ b/HalconTools/Properties/Resources.resx
@@ -0,0 +1,120 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
\ No newline at end of file
diff --git a/HalconTools/Properties/Settings.Designer.cs b/HalconTools/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..7493244
--- /dev/null
+++ b/HalconTools/Properties/Settings.Designer.cs
@@ -0,0 +1,26 @@
+锘�//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.17929
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HalconTools.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/HalconTools/Properties/Settings.settings b/HalconTools/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/HalconTools/Properties/Settings.settings
@@ -0,0 +1,7 @@
+锘�<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+ <Profiles>
+ <Profile Name="(Default)" />
+ </Profiles>
+ <Settings />
+</SettingsFile>
diff --git a/HalconTools/ResourceCulture.cs b/HalconTools/ResourceCulture.cs
new file mode 100644
index 0000000..c3ef354
--- /dev/null
+++ b/HalconTools/ResourceCulture.cs
@@ -0,0 +1,124 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Reflection;
+using System.Resources;
+using System.Globalization;
+using System.Windows.Forms;
+
+namespace HalconTools
+{
+ class ResourceCulture
+ {
+ ///
+ /// Set current culture by name
+ ///
+ /// name
+ public static void SetCurrentCulture(string name)
+ {
+ if (string.IsNullOrEmpty(name))
+ {
+ name = "en-US";
+ }
+ Thread.CurrentThread.CurrentCulture = new CultureInfo(name);
+ }
+ ///
+ /// Get string by id
+ ///
+ /// id
+ /// current language string
+ public static string GetString(string id)
+ {
+ string strCurLanguage = "";
+ try
+ {
+ ResourceManager rm = new ResourceManager("HalconTools.Resources.Resource", Assembly.GetExecutingAssembly());
+ CultureInfo ci = Thread.CurrentThread.CurrentCulture;
+ strCurLanguage = rm.GetString(id, ci);
+ }
+ catch
+ {
+ //strCurLanguage = "No id:" + id + ", please add.";
+ strCurLanguage = "";
+ }
+ return strCurLanguage;
+ }
+
+ public static string formName;
+
+ public static void SetLanguage(System.Windows.Forms.Control control)
+ {
+ if (control.GetType().BaseType.Name == "Form")
+ {
+ formName = control.Name;
+ control.Text = GetString(control.Name);
+ }
+
+
+ for (int i = 0; i < control.Controls.Count; i++)
+ {
+ switch (control.Controls[i].GetType().Name)
+ {
+
+ case "Label":
+
+ case "Button":
+
+ case "CheckBox":
+
+ case "RadioButton":
+
+ case "LinkLabel":
+
+ control.Controls[i].Text = GetString(
+
+ formName + control.Controls[i].Name);
+
+ break;
+
+ case "GroupBox":
+
+ control.Controls[i].Text = GetString(
+
+ formName + control.Controls[i].Name);
+
+ SetLanguage(control.Controls[i]);
+
+ break;
+
+ case "Panel":
+
+ SetLanguage(control.Controls[i]);
+
+ break;
+
+ case "TabControl":
+
+ TabControl tbc = (TabControl)control.Controls[i];
+
+ for (int j = 0; j < tbc.TabCount; j++)
+ {
+
+ tbc.TabPages[j].Text = GetString(
+
+ formName + tbc.TabPages[j].Name);
+
+ SetLanguage(tbc.TabPages[j]);
+
+ }
+
+ break;
+
+ default:
+
+ break;
+
+ }
+
+ }
+
+ }
+ }
+}
diff --git a/HalconTools/Resources/Resource.en-US.resx b/HalconTools/Resources/Resource.en-US.resx
new file mode 100644
index 0000000..c0b4fea
--- /dev/null
+++ b/HalconTools/Resources/Resource.en-US.resx
@@ -0,0 +1,330 @@
+锘�<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <data name="frmFitCircleAndLinebtnLoadImage" xml:space="preserve">
+ <value>Load Image</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnResetView" xml:space="preserve">
+ <value>Reset View</value>
+ </data>
+ <data name="frmFitCircleAndLinefrmFitCircleAndLine" xml:space="preserve">
+ <value>frmFitCircleAndLine</value>
+ </data>
+ <data name="frmFitCircleAndLineRbMove" xml:space="preserve">
+ <value>Move</value>
+ </data>
+ <data name="frmFitCircleAndLineRbNone" xml:space="preserve">
+ <value>None</value>
+ </data>
+ <data name="frmFitCircleAndLineRbZoom" xml:space="preserve">
+ <value>Zoom</value>
+ </data>
+ <data name="frmFitCircleAndLinetabPageCircle" xml:space="preserve">
+ <value>Fit Circle</value>
+ </data>
+ <data name="frmFitCircleAndLinetabPageLine" xml:space="preserve">
+ <value>Fit Line</value>
+ </data>
+ <data name="frmFitCircleAndLine" xml:space="preserve">
+ <value>frmFitCircleAndLinebtn</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnCircleRoi" xml:space="preserve">
+ <value>Add Circle</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnFitCircle" xml:space="preserve">
+ <value>Fit Ciecle</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnFitLine" xml:space="preserve">
+ <value>Fit Line</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnFitZoom" xml:space="preserve">
+ <value>Fit Zoom</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnLineRoi" xml:space="preserve">
+ <value>Add Line</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnLoadConfige_Circle" xml:space="preserve">
+ <value>Load Confige</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnLoadConfige_Line" xml:space="preserve">
+ <value>Load Config</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnRoiHeightReset_Circle" xml:space="preserve">
+ <value>Reset</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnRoiHeightReset_Line" xml:space="preserve">
+ <value>Reset</value>
+ </data>
+ <data name="frmFitCircleAndLinegbxAddType" xml:space="preserve">
+ <value>Add Type</value>
+ </data>
+ <data name="frmFitCircleAndLinegbxFitCirclePara" xml:space="preserve">
+ <value>Parameter</value>
+ </data>
+ <data name="frmFitCircleAndLinegbxFitLinePara" xml:space="preserve">
+ <value>Parameter</value>
+ </data>
+ <data name="frmFitCircleAndLinegbxImage" xml:space="preserve">
+ <value>Image</value>
+ </data>
+ <data name="frmFitCircleAndLinegbxOption" xml:space="preserve">
+ <value>Option</value>
+ </data>
+ <data name="frmFitCircleAndLinelabColumnBegin" xml:space="preserve">
+ <value>Column Begin</value>
+ </data>
+ <data name="frmFitCircleAndLinelabColumnEnd" xml:space="preserve">
+ <value>Column End</value>
+ </data>
+ <data name="frmFitCircleAndLinelabInterpolation" xml:space="preserve">
+ <value>Interpolation</value>
+ </data>
+ <data name="frmFitCircleAndLinelabInterpolation_Circle" xml:space="preserve">
+ <value>ROIHeight</value>
+ </data>
+ <data name="frmFitCircleAndLinelabMinEdgeAmpl" xml:space="preserve">
+ <value>Min.EdgeAmpl</value>
+ </data>
+ <data name="frmFitCircleAndLinelabMinEdgeAmpl_Circle" xml:space="preserve">
+ <value>Min.EdgeAmpl</value>
+ </data>
+ <data name="frmFitCircleAndLinelabNumber" xml:space="preserve">
+ <value>Number</value>
+ </data>
+ <data name="frmFitCircleAndLinelabNumber_Circle" xml:space="preserve">
+ <value>Number</value>
+ </data>
+ <data name="frmFitCircleAndLinelabPosition" xml:space="preserve">
+ <value>Position</value>
+ </data>
+ <data name="frmFitCircleAndLinelabPosition_Circle" xml:space="preserve">
+ <value>Position</value>
+ </data>
+ <data name="frmFitCircleAndLinelabRecognition" xml:space="preserve">
+ <value>Recognition</value>
+ </data>
+ <data name="frmFitCircleAndLinelabRecognitionSet" xml:space="preserve">
+ <value>Recognition</value>
+ </data>
+ <data name="frmFitCircleAndLinelabRecognitionSet_Circle" xml:space="preserve">
+ <value>Recognition</value>
+ </data>
+ <data name="frmFitCircleAndLinelabRecognition_Circle" xml:space="preserve">
+ <value>Recognition</value>
+ </data>
+ <data name="frmFitCircleAndLinelabROIHeight" xml:space="preserve">
+ <value>ROIHeight</value>
+ </data>
+ <data name="frmFitCircleAndLinelabROIHeight_Circle" xml:space="preserve">
+ <value>ROIWidth</value>
+ </data>
+ <data name="frmFitCircleAndLinelabROIWidth" xml:space="preserve">
+ <value>ROIWidth</value>
+ </data>
+ <data name="frmFitCircleAndLinelabROIWidth_Circle" xml:space="preserve">
+ <value>ROIWidth</value>
+ </data>
+ <data name="frmFitCircleAndLinelabRowBegin" xml:space="preserve">
+ <value>Row Begin</value>
+ </data>
+ <data name="frmFitCircleAndLinelabRowEnd" xml:space="preserve">
+ <value>Row End</value>
+ </data>
+ <data name="frmFitCircleAndLinelabSmoothing" xml:space="preserve">
+ <value>Smoothing</value>
+ </data>
+ <data name="frmFitCircleAndLinelabSmoothing_Circle" xml:space="preserve">
+ <value>Smoothing</value>
+ </data>
+ <data name="frmFitCircleAndLinelabTransition" xml:space="preserve">
+ <value>Transition</value>
+ </data>
+ <data name="frmFitCircleAndLinelabTransition_Circle" xml:space="preserve">
+ <value>Transition</value>
+ </data>
+ <data name="frmMeasureAssistantCircArcButton" xml:space="preserve">
+ <value>Add Circle</value>
+ </data>
+ <data name="frmMeasureAssistantDeleteActRoiButton" xml:space="preserve">
+ <value>Delete</value>
+ </data>
+ <data name="frmMeasureAssistantgbxImage" xml:space="preserve">
+ <value>Image</value>
+ </data>
+ <data name="frmMeasureAssistantgbxRois" xml:space="preserve">
+ <value>ROIs</value>
+ </data>
+ <data name="frmMeasureAssistantgbxViewInteraction" xml:space="preserve">
+ <value>View Interaction</value>
+ </data>
+ <data name="frmMeasureAssistantLineButton" xml:space="preserve">
+ <value>Add Line</value>
+ </data>
+ <data name="frmMeasureAssistantLoadImgButton" xml:space="preserve">
+ <value>Load...</value>
+ </data>
+ <data name="frmMeasureAssistantMagnifyButton" xml:space="preserve">
+ <value>Magnify</value>
+ </data>
+ <data name="frmMeasureAssistantMoveButton" xml:space="preserve">
+ <value>Move</value>
+ </data>
+ <data name="frmMeasureAssistantNoneButton" xml:space="preserve">
+ <value>None</value>
+ </data>
+ <data name="frmMeasureAssistantResetROIButton" xml:space="preserve">
+ <value>Delete All</value>
+ </data>
+ <data name="frmMeasureAssistantResetViewButton" xml:space="preserve">
+ <value>Reset</value>
+ </data>
+ <data name="frmMeasureAssistanttabPageEdges" xml:space="preserve">
+ <value>Edges</value>
+ </data>
+ <data name="frmMeasureAssistanttabPageLineProfile" xml:space="preserve">
+ <value>Line Profile</value>
+ </data>
+ <data name="frmMeasureAssistanttabPageResults" xml:space="preserve">
+ <value>Results</value>
+ </data>
+ <data name="frmMeasureAssistanttabPageSaveConfige" xml:space="preserve">
+ <value>Save Parameter</value>
+ </data>
+ <data name="frmMeasureAssistantZoomButton" xml:space="preserve">
+ <value>Zoom</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnParaAdd" xml:space="preserve">
+ <value>Para Add</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnParaAdd_Circle" xml:space="preserve">
+ <value>Para Add</value>
+ </data>
+ <data name="frmFitCircleAndLinelabColumn_Circle" xml:space="preserve">
+ <value>Column</value>
+ </data>
+ <data name="frmFitCircleAndLinelabRadius_Circle" xml:space="preserve">
+ <value>Radius</value>
+ </data>
+ <data name="frmFitCircleAndLinelabRow_Circle" xml:space="preserve">
+ <value>Row</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnFrmMeasure" xml:space="preserve">
+ <value>Measure Form</value>
+ </data>
+</root>
\ No newline at end of file
diff --git a/HalconTools/Resources/Resource.zh-CN.resx b/HalconTools/Resources/Resource.zh-CN.resx
new file mode 100644
index 0000000..5a87dc1
--- /dev/null
+++ b/HalconTools/Resources/Resource.zh-CN.resx
@@ -0,0 +1,330 @@
+锘�<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <data name="frmFitCircleAndLinebtnLoadImage" xml:space="preserve">
+ <value>杞藉叆鍥剧墖</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnResetView" xml:space="preserve">
+ <value>绐楀彛澶嶄綅</value>
+ </data>
+ <data name="frmFitCircleAndLinefrmFitCircleAndLine" xml:space="preserve">
+ <value>鎷熷悎鍦嗗強鐩寸嚎绐楀彛</value>
+ </data>
+ <data name="frmFitCircleAndLineRbMove" xml:space="preserve">
+ <value>绉诲姩</value>
+ </data>
+ <data name="frmFitCircleAndLineRbNone" xml:space="preserve">
+ <value>鏃�</value>
+ </data>
+ <data name="frmFitCircleAndLineRbZoom" xml:space="preserve">
+ <value>鍙樼劍</value>
+ </data>
+ <data name="frmFitCircleAndLinetabPageCircle" xml:space="preserve">
+ <value>鎷熷悎鍦�</value>
+ </data>
+ <data name="frmFitCircleAndLinetabPageLine" xml:space="preserve">
+ <value>鎷熷悎鐩寸嚎</value>
+ </data>
+ <data name="frmFitCircleAndLine" xml:space="preserve">
+ <value>鎷熷悎鍦嗗強鐩寸嚎绐楀彛</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnCircleRoi" xml:space="preserve">
+ <value>娣诲姞鍦�</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnFitCircle" xml:space="preserve">
+ <value>鎷熷悎鍦�</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnFitLine" xml:space="preserve">
+ <value>鎷熷悎鐩寸嚎</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnFitZoom" xml:space="preserve">
+ <value>閫傚悎绐椾綋</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnLineRoi" xml:space="preserve">
+ <value>娣诲姞鐩寸嚎</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnLoadConfige_Circle" xml:space="preserve">
+ <value>杞藉叆鍙傛暟</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnLoadConfige_Line" xml:space="preserve">
+ <value>杞藉叆鍙傛暟</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnRoiHeightReset_Circle" xml:space="preserve">
+ <value>杩樺師</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnRoiHeightReset_Line" xml:space="preserve">
+ <value>杩樺師</value>
+ </data>
+ <data name="frmFitCircleAndLinegbxAddType" xml:space="preserve">
+ <value>娣诲姞绫诲瀷</value>
+ </data>
+ <data name="frmFitCircleAndLinegbxFitCirclePara" xml:space="preserve">
+ <value>鍙傛暟</value>
+ </data>
+ <data name="frmFitCircleAndLinegbxFitLinePara" xml:space="preserve">
+ <value>鍙傛暟</value>
+ </data>
+ <data name="frmFitCircleAndLinegbxImage" xml:space="preserve">
+ <value>鍥惧儚</value>
+ </data>
+ <data name="frmFitCircleAndLinegbxOption" xml:space="preserve">
+ <value>鎿嶄綔</value>
+ </data>
+ <data name="frmFitCircleAndLinelabColumnBegin" xml:space="preserve">
+ <value>璧风偣鍒�</value>
+ </data>
+ <data name="frmFitCircleAndLinelabColumnEnd" xml:space="preserve">
+ <value>缁堢偣鍒�</value>
+ </data>
+ <data name="frmFitCircleAndLinelabInterpolation" xml:space="preserve">
+ <value>鎻掑�兼柟娉�</value>
+ </data>
+ <data name="frmFitCircleAndLinelabInterpolation_Circle" xml:space="preserve">
+ <value>鎻掑�兼柟娉�</value>
+ </data>
+ <data name="frmFitCircleAndLinelabMinEdgeAmpl" xml:space="preserve">
+ <value>鏈�灏忚竟缂樺箙搴�</value>
+ </data>
+ <data name="frmFitCircleAndLinelabMinEdgeAmpl_Circle" xml:space="preserve">
+ <value>鏈�灏忚竟缂樺箙搴�</value>
+ </data>
+ <data name="frmFitCircleAndLinelabNumber" xml:space="preserve">
+ <value>鏁伴噺</value>
+ </data>
+ <data name="frmFitCircleAndLinelabNumber_Circle" xml:space="preserve">
+ <value>鏁伴噺</value>
+ </data>
+ <data name="frmFitCircleAndLinelabPosition" xml:space="preserve">
+ <value>浣嶇疆</value>
+ </data>
+ <data name="frmFitCircleAndLinelabPosition_Circle" xml:space="preserve">
+ <value>浣嶇疆</value>
+ </data>
+ <data name="frmFitCircleAndLinelabRecognition" xml:space="preserve">
+ <value>璇嗗埆</value>
+ </data>
+ <data name="frmFitCircleAndLinelabRecognitionSet" xml:space="preserve">
+ <value>鍊�</value>
+ </data>
+ <data name="frmFitCircleAndLinelabRecognitionSet_Circle" xml:space="preserve">
+ <value>鍊�</value>
+ </data>
+ <data name="frmFitCircleAndLinelabRecognition_Circle" xml:space="preserve">
+ <value>璇嗗埆</value>
+ </data>
+ <data name="frmFitCircleAndLinelabROIHeight" xml:space="preserve">
+ <value>ROI楂樺害</value>
+ </data>
+ <data name="frmFitCircleAndLinelabROIHeight_Circle" xml:space="preserve">
+ <value>ROI楂樺害</value>
+ </data>
+ <data name="frmFitCircleAndLinelabROIWidth" xml:space="preserve">
+ <value>ROI瀹藉害</value>
+ </data>
+ <data name="frmFitCircleAndLinelabROIWidth_Circle" xml:space="preserve">
+ <value>ROI瀹藉害</value>
+ </data>
+ <data name="frmFitCircleAndLinelabRowBegin" xml:space="preserve">
+ <value>璧风偣琛�</value>
+ </data>
+ <data name="frmFitCircleAndLinelabRowEnd" xml:space="preserve">
+ <value>缁堢偣琛�</value>
+ </data>
+ <data name="frmFitCircleAndLinelabSmoothing" xml:space="preserve">
+ <value>妯$硦</value>
+ </data>
+ <data name="frmFitCircleAndLinelabSmoothing_Circle" xml:space="preserve">
+ <value>妯$硦</value>
+ </data>
+ <data name="frmFitCircleAndLinelabTransition" xml:space="preserve">
+ <value>鍙樻崲</value>
+ </data>
+ <data name="frmFitCircleAndLinelabTransition_Circle" xml:space="preserve">
+ <value>鍙樻崲</value>
+ </data>
+ <data name="frmMeasureAssistantCircArcButton" xml:space="preserve">
+ <value>娣诲姞鍦�</value>
+ </data>
+ <data name="frmMeasureAssistantDeleteActRoiButton" xml:space="preserve">
+ <value>鍒犻櫎褰撳墠</value>
+ </data>
+ <data name="frmMeasureAssistantgbxImage" xml:space="preserve">
+ <value>鍥惧儚</value>
+ </data>
+ <data name="frmMeasureAssistantgbxRois" xml:space="preserve">
+ <value>鎰熷叴瓒e尯鍩�</value>
+ </data>
+ <data name="frmMeasureAssistantgbxViewInteraction" xml:space="preserve">
+ <value>鍥惧儚浜や簰</value>
+ </data>
+ <data name="frmMeasureAssistantLineButton" xml:space="preserve">
+ <value>娣诲姞鐩寸嚎</value>
+ </data>
+ <data name="frmMeasureAssistantLoadImgButton" xml:space="preserve">
+ <value>杞藉叆...</value>
+ </data>
+ <data name="frmMeasureAssistantMagnifyButton" xml:space="preserve">
+ <value>鏀惧ぇ</value>
+ </data>
+ <data name="frmMeasureAssistantMoveButton" xml:space="preserve">
+ <value>绉诲姩</value>
+ </data>
+ <data name="frmMeasureAssistantNoneButton" xml:space="preserve">
+ <value>鏃�</value>
+ </data>
+ <data name="frmMeasureAssistantResetROIButton" xml:space="preserve">
+ <value>鍒犻櫎鎵�鏈�</value>
+ </data>
+ <data name="frmMeasureAssistantResetViewButton" xml:space="preserve">
+ <value>杩樺師</value>
+ </data>
+ <data name="frmMeasureAssistanttabPageEdges" xml:space="preserve">
+ <value>杈�</value>
+ </data>
+ <data name="frmMeasureAssistanttabPageLineProfile" xml:space="preserve">
+ <value>鐩寸嚎杞粨</value>
+ </data>
+ <data name="frmMeasureAssistanttabPageResults" xml:space="preserve">
+ <value>缁撴灉</value>
+ </data>
+ <data name="frmMeasureAssistanttabPageSaveConfige" xml:space="preserve">
+ <value>淇濆瓨鍙傛暟</value>
+ </data>
+ <data name="frmMeasureAssistantZoomButton" xml:space="preserve">
+ <value>鍙樼劍</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnParaAdd" xml:space="preserve">
+ <value>娣诲姞鍙傛暟</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnParaAdd_Circle" xml:space="preserve">
+ <value>娣诲姞鍙傛暟</value>
+ </data>
+ <data name="frmFitCircleAndLinelabColumn_Circle" xml:space="preserve">
+ <value>鍒�</value>
+ </data>
+ <data name="frmFitCircleAndLinelabRadius_Circle" xml:space="preserve">
+ <value>鍗婂緞</value>
+ </data>
+ <data name="frmFitCircleAndLinelabRow_Circle" xml:space="preserve">
+ <value>琛�</value>
+ </data>
+ <data name="frmFitCircleAndLinebtnFrmMeasure" xml:space="preserve">
+ <value>娴嬮噺绐楀彛</value>
+ </data>
+</root>
\ No newline at end of file
diff --git a/HalconTools/ScrewModule/ScrewAssistant.cs b/HalconTools/ScrewModule/ScrewAssistant.cs
new file mode 100644
index 0000000..ee61161
--- /dev/null
+++ b/HalconTools/ScrewModule/ScrewAssistant.cs
@@ -0,0 +1,195 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public delegate void ScrewDelegate(ScrewResult result);
+
+ public class ScrewAssistant
+ {
+ public event ScrewDelegate ScrewDone;
+
+ /// <summary>HALCON image used for .</summary>
+ public HImage mImage;
+ public int mWidth;
+ public int mHeight;
+
+ public HWndCtrl viewController;
+ public ROIController roiController;
+
+ public ScrewParam mScrewPara = new ScrewParam();
+ public ScrewResult mScrewResult = new ScrewResult();
+
+ //涓棿鍙傛暟
+ public HXLDCont XLDThresholdSubPix = new HXLDCont();
+ public HXLDCont XLDSelected = new HXLDCont();
+ public HXLDCont XLDRoundness = new HXLDCont();
+
+ public double row, col, radius;
+
+ private HXLDCont tmpXLD = new HXLDCont();
+ private HXLDCont tmpXLD2 = new HXLDCont();
+ private HXLDCont tmpXLD3 = new HXLDCont();
+
+ public ScrewAssistant()
+ {
+ }
+
+ public ScrewAssistant(HWindowControl viewPort)
+ {
+ viewController = new HWndCtrl(viewPort);
+ roiController = new ROIController();
+ }
+
+ public bool SetImage(string filename)
+ {
+ string tmp;
+
+ try
+ {
+ mImage = new HImage(filename);
+ mImage.GetImagePointer1(out tmp, out mWidth, out mHeight);
+ }
+ catch (HOperatorException e)
+ {
+ mImage = null;
+ return false;
+ }
+ return true;
+ }
+
+ public bool SetImage(HImage image)
+ {
+ string tmp;
+
+ try
+ {
+ mImage = image;
+ mImage.GetImagePointer1(out tmp, out mWidth, out mHeight);
+ }
+ catch (HOperatorException e)
+ {
+ mImage = null;
+ return false;
+ }
+ return true;
+ }
+
+ /// <summary>
+ /// Writes the new image to graphic window
+ /// </summary>
+ public void UpdateImage()
+ {
+ viewController.resetAll();
+ viewController.useROIController(roiController);
+ viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
+
+ viewController.addIconicVar(mImage);
+ viewController.repaint();
+ }
+
+ public void UpdateObj(HObject obj)
+ {
+ viewController.resetAll();
+ viewController.repaint();
+
+ viewController.useROIController(roiController);
+ viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
+
+ viewController.changeGraphicSettings(GraphicsContext.GC_COLOR, "blue");
+ viewController.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 2);
+
+ viewController.addIconicVar(obj);
+ viewController.repaint();
+ }
+
+ public void UpdateObj(HObject obj, string color)
+ {
+ viewController.resetAll();
+ viewController.repaint();
+
+ viewController.useROIController(roiController);
+ viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
+
+ viewController.changeGraphicSettings(GraphicsContext.GC_COLOR, color);
+ viewController.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 2);
+
+ viewController.addIconicVar(obj);
+ viewController.repaint();
+ }
+
+ public void SetPara(ScrewParam para)
+ {
+ mScrewPara.ThresholdSubPix = para.ThresholdSubPix;
+ mScrewPara.RoundnessMin = para.RoundnessMin;
+ mScrewPara.RoundnessMax = para.RoundnessMax;
+ mScrewPara.RadiusMin = para.RadiusMin;
+ mScrewPara.RadiusMax = para.RadiusMax;
+ }
+
+ public HXLDCont ThresholdSubPix(HImage image)
+ {
+ tmpXLD = image.ThresholdSubPix(mScrewPara.ThresholdSubPix);
+
+ return tmpXLD;
+ }
+
+ public HXLDCont RoundnessXLD(HXLDCont xld)
+ {
+ tmpXLD = xld.SelectShapeXld("circularity", "and", mScrewPara.RoundnessMin, mScrewPara.RoundnessMax);
+
+ return tmpXLD;
+ }
+
+ public HXLDCont SelectXLD(HXLDCont xld)
+ {
+ tmpXLD2 = xld.SelectShapeXld("width", "and", mScrewPara.RadiusMin * 2, mScrewPara.RadiusMax * 2);
+ tmpXLD3 = tmpXLD2.SelectShapeXld("height", "and", mScrewPara.RadiusMin * 2, mScrewPara.RadiusMax * 2);
+
+ return tmpXLD3;
+ }
+
+ public HXLDCont FitCircle(HXLDCont xld)
+ {
+ double phistart,phiend;
+ string tmps;
+
+ xld.FitCircleContourXld("atukey", -1, 0, 0, 3, 2, out row, out col, out radius, out phistart, out phiend, out tmps);
+
+ tmpXLD = new HXLDCont();
+ tmpXLD.GenCircleContourXld(row, col, radius, 0, 6.28518, "positive", 1);
+
+ return tmpXLD;
+ }
+
+ public void Run()
+ {
+ try
+ {
+ mScrewResult = new ScrewResult();
+
+ XLDThresholdSubPix = ThresholdSubPix(mImage);
+ XLDRoundness = RoundnessXLD(XLDThresholdSubPix);
+ XLDSelected = SelectXLD(XLDRoundness);
+ mScrewResult.CircleCont = FitCircle(XLDSelected);
+ mScrewResult.row = row;
+ mScrewResult.col = col;
+ mScrewResult.radius = radius;
+
+ if (ScrewDone != null)
+ {
+ ScrewDone(mScrewResult);
+ }
+ }
+ catch (Exception ex)
+ {
+ mScrewResult = null;
+
+ if (ScrewDone != null) ScrewDone(mScrewResult);
+ }
+ }
+ }
+}
diff --git a/HalconTools/ScrewModule/ScrewParam.cs b/HalconTools/ScrewModule/ScrewParam.cs
new file mode 100644
index 0000000..0b86e6c
--- /dev/null
+++ b/HalconTools/ScrewModule/ScrewParam.cs
@@ -0,0 +1,20 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HalconTools
+{
+ public class ScrewParam
+ {
+ public double ThresholdSubPix;
+ public double RoundnessMin;
+ public double RoundnessMax;
+ public double RadiusMin;
+ public double RadiusMax;
+
+ public ScrewParam()
+ {
+ }
+ }
+}
diff --git a/HalconTools/ScrewModule/ScrewResult.cs b/HalconTools/ScrewModule/ScrewResult.cs
new file mode 100644
index 0000000..6862e7e
--- /dev/null
+++ b/HalconTools/ScrewModule/ScrewResult.cs
@@ -0,0 +1,22 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public class ScrewResult
+ {
+ public HXLDCont CircleCont;
+ public double row;
+ public double col;
+ public double radius;
+
+ public ScrewResult()
+ {
+ CircleCont = new HXLDCont();
+ }
+
+ }
+}
diff --git a/HalconTools/ToolKit/Counter.cs b/HalconTools/ToolKit/Counter.cs
new file mode 100644
index 0000000..8891b56
--- /dev/null
+++ b/HalconTools/ToolKit/Counter.cs
@@ -0,0 +1,90 @@
+锘縩amespace HalconTools
+{
+ public class Counter
+ {
+ private int all;
+ private int ng;
+ private int ok;
+
+ public Counter()
+ {
+ this.Reset();
+ }
+
+ public string GetPercent()
+ {
+ if (this.all == 0)
+ {
+ return "100.0%";
+ }
+ if (this.ok == this.all)
+ {
+ return "100.0%";
+ }
+ if (this.ok == 0)
+ {
+ return "0.0%";
+ }
+ double num = (((double) this.ok) / ((double) this.all)) * 100.0;
+ return (num.ToString("#0.##") + "%");
+ }
+
+ public string GetPercent(int alls, int ngs)
+ {
+ if (alls == 0)
+ {
+ return "100.0%";
+ }
+ if ((alls - ngs) == alls)
+ {
+ return "100.0%";
+ }
+ if ((alls - ngs) == 0)
+ {
+ return "0.0%";
+ }
+ double num = (((double) (alls - ngs)) / ((double) alls)) * 100.0;
+ return (num.ToString("#0.##") + "%");
+ }
+
+ public void Reset()
+ {
+ this.ok = 0;
+ this.ng = 0;
+ this.all = 0;
+ }
+
+ public int All
+ {
+ get
+ {
+ return (this.ok + this.ng);
+ }
+ }
+
+ public int NG
+ {
+ get
+ {
+ return this.ng;
+ }
+ set
+ {
+ this.ng = value;
+ }
+ }
+
+ public int OK
+ {
+ get
+ {
+ return this.ok;
+ }
+ set
+ {
+ this.ok = value;
+ }
+ }
+ }
+}
+
diff --git a/HalconTools/ToolKit/EventData.cs b/HalconTools/ToolKit/EventData.cs
new file mode 100644
index 0000000..2bc24f1
--- /dev/null
+++ b/HalconTools/ToolKit/EventData.cs
@@ -0,0 +1,31 @@
+锘縩amespace HalconTools
+{
+ public class EventData
+ {
+ private object data;
+
+ public EventData()
+ {
+ this.data = "";
+ }
+
+ public EventData(object obj)
+ {
+ this.data = "";
+ this.data = obj;
+ }
+
+ public object Data
+ {
+ get
+ {
+ return this.data;
+ }
+ set
+ {
+ this.data = value;
+ }
+ }
+ }
+}
+
diff --git a/HalconTools/ToolKit/FileOperationResult.cs b/HalconTools/ToolKit/FileOperationResult.cs
new file mode 100644
index 0000000..ed94d29
--- /dev/null
+++ b/HalconTools/ToolKit/FileOperationResult.cs
@@ -0,0 +1,10 @@
+锘縩amespace HalconTools
+{
+ public enum FileOperationResult
+ {
+ OK,
+ NOTEXIST,
+ WRITEERROR
+ }
+}
+
diff --git a/HalconTools/ToolKit/IniTool.cs b/HalconTools/ToolKit/IniTool.cs
new file mode 100644
index 0000000..735379c
--- /dev/null
+++ b/HalconTools/ToolKit/IniTool.cs
@@ -0,0 +1,59 @@
+锘縰sing System;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace HalconTools
+{
+ public class IniTool
+ {
+ private const int BUFF_LEN = 0x100;
+ private static string iniFileName = (AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "Setting.INI");
+
+ public IniTool(string strIniFileName)
+ {
+ iniFileName = strIniFileName;
+ }
+
+ public static string GetIniSection(string lpszSection)
+ {
+ StringBuilder lpReturnedString = new StringBuilder(0x100);
+ uint num = GetPrivateProfileSection(lpszSection, lpReturnedString, lpReturnedString.Capacity, iniFileName);
+ return lpReturnedString.ToString();
+ }
+
+ public static string GetIniString(string lpszSection, string lpszEntry)
+ {
+ string lpDefault = null;
+ StringBuilder lpReturnedString = new StringBuilder(0x100);
+ uint num = GetPrivateProfileString(lpszSection, lpszEntry, lpDefault, lpReturnedString, Convert.ToUInt32(lpReturnedString.Capacity), iniFileName);
+ return lpReturnedString.ToString();
+ }
+
+ public static string GetIniString(string lpszSection, string lpszEntry, string lpszDefault)
+ {
+ StringBuilder lpReturnedString = new StringBuilder(0x100);
+ uint num = GetPrivateProfileString(lpszSection, lpszEntry, lpszDefault, lpReturnedString, Convert.ToUInt32(lpReturnedString.Capacity), iniFileName);
+ return lpReturnedString.ToString();
+ }
+
+ [DllImport("kernel32")]
+ private static extern uint GetPrivateProfileSection(string lpAppName, StringBuilder lpReturnedString, int nSize, string lpFileName);
+ [DllImport("kernel32.dll")]
+ private static extern uint GetPrivateProfileString(string lpApplicationName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName);
+ public static bool SetIniSection(string lpszSection, string lpszString)
+ {
+ return (WritePrivateProfileSection(lpszSection, lpszString, iniFileName) > 0);
+ }
+
+ public static bool SetIniString(string lpszSection, string lpszEntry, string lpszString)
+ {
+ return (WritePrivateProfileString(lpszSection, lpszEntry, lpszString, iniFileName) > 0);
+ }
+
+ [DllImport("kernel32")]
+ private static extern uint WritePrivateProfileSection(string lpAppName, string lpString, string lpFileName);
+ [DllImport("kernel32.dll")]
+ private static extern uint WritePrivateProfileString(string lpAppName, string lpEntryName, string lpEntryString, string lpFileName);
+ }
+}
+
diff --git a/HalconTools/ToolKit/KillApplication.cs b/HalconTools/ToolKit/KillApplication.cs
new file mode 100644
index 0000000..a3f2e23
--- /dev/null
+++ b/HalconTools/ToolKit/KillApplication.cs
@@ -0,0 +1,35 @@
+锘縩amespace HalconTools
+{
+ public class KillApplication
+ {
+ /// <summary>
+ /// 杩愯DOS鍛戒护
+ /// DOS鍏抽棴杩涚▼鍛戒护(ntsd -c q -p PID )PID涓鸿繘绋嬬殑ID
+ /// </summary>
+ /// <param name="command"></param>
+ /// <returns></returns>
+ public static string RunCmd(string command)
+ {
+ //瀵︿緥涓�鍊婸rocess椤烇紝鍟熷嫊涓�鍊嬬崹绔嬮�茬▼
+ System.Diagnostics.Process p = new System.Diagnostics.Process();
+
+ //Process椤炴湁涓�鍊婼tartInfo灞�э紝閫欏�嬫槸ProcessStartInfo椤烇紝鍖呮嫭浜嗕竴浜涘爆鎬у拰鏂规硶锛屼笅闈㈡垜鍊戠敤鍒颁簡浠栫殑骞惧�嬪爆鎬э細
+
+ p.StartInfo.FileName = "cmd.exe"; //瑷畾绋嬪簭鍚�
+ p.StartInfo.Arguments = "/c " + command; //瑷畾绋嬪紡鍩疯鍙冩暩
+ p.StartInfo.UseShellExecute = false; //闂滈枆Shell鐨勪娇鐢�
+ p.StartInfo.RedirectStandardInput = true; //閲嶅畾鍚戞婧栬几鍏�
+ p.StartInfo.RedirectStandardOutput = true; //閲嶅畾鍚戞婧栬几鍑�
+ p.StartInfo.RedirectStandardError = true; //閲嶅畾鍚戦尟瑾よ几鍑�
+ p.StartInfo.CreateNoWindow = true; //瑷疆涓嶉’绀虹獥鍙�
+
+ p.Start(); //鍟熷嫊
+
+ //p.StandardInput.WriteLine(command); //涔熷彲浠ョ敤閫欑ó鏂瑰紡杓稿叆瑕佸煼琛岀殑鍛戒护
+ //p.StandardInput.WriteLine("exit"); //涓嶉亷瑕佽寰楀姞涓奅xit瑕佷笉鐒朵笅涓�琛岀▼寮忓煼琛岀殑鏅傚�欐渻鐣舵
+
+ return p.StandardOutput.ReadToEnd(); //寰炶几鍑烘祦鍙栧緱鍛戒护鍩疯绲愭灉
+
+ }
+ }
+}
diff --git a/HalconTools/ToolKit/ListenEventArgs.cs b/HalconTools/ToolKit/ListenEventArgs.cs
new file mode 100644
index 0000000..26b3854
--- /dev/null
+++ b/HalconTools/ToolKit/ListenEventArgs.cs
@@ -0,0 +1,27 @@
+锘縰sing System;
+
+namespace HalconTools
+{
+ public class ListenEventArgs : EventArgs
+ {
+ private EventData iData;
+
+ public ListenEventArgs(EventData iData)
+ {
+ this.iData = iData;
+ }
+
+ public EventData IData
+ {
+ get
+ {
+ return this.iData;
+ }
+ set
+ {
+ this.iData = value;
+ }
+ }
+ }
+}
+
diff --git a/HalconTools/ToolKit/ListenEventCreater.cs b/HalconTools/ToolKit/ListenEventCreater.cs
new file mode 100644
index 0000000..05751a1
--- /dev/null
+++ b/HalconTools/ToolKit/ListenEventCreater.cs
@@ -0,0 +1,25 @@
+锘縰sing System;
+
+namespace HalconTools
+{
+ public class ListenEventCreater
+ {
+ public event EventHandler<ListenEventArgs> ListenEvent;
+
+ public void ChangeValue(EventData iData)
+ {
+ ListenEventArgs args = new ListenEventArgs(iData);
+ this.SendEvent(args);
+ }
+
+ protected virtual void SendEvent(ListenEventArgs args)
+ {
+ EventHandler<ListenEventArgs> listenEvent = this.ListenEvent;
+ if (listenEvent != null)
+ {
+ listenEvent(this, args);
+ }
+ }
+ }
+}
+
diff --git a/HalconTools/ToolKit/LkSensor.cs b/HalconTools/ToolKit/LkSensor.cs
new file mode 100644
index 0000000..0fecdc1
--- /dev/null
+++ b/HalconTools/ToolKit/LkSensor.cs
@@ -0,0 +1,403 @@
+锘縰sing System;
+using System.Net;
+
+namespace HalconTools
+{
+ public class LkSensorWrapper
+ {
+ public SerialportWrapper comPort;
+ public const string READ_BOTH_HEAD_CMD = "M0";
+ public const string READ_HEAD_A_CMD = "M1";
+ public const string READ_HEAD_B_CMD = "M2";
+ public const string CHANGE_PROGRAM_CMD = "PW,";
+ public const string START_SYNCSTORING_CMD = "AS";
+ public const string STOP_SYNCSTORING_CMD = "AP";
+ public const string CLEAR_STORING_CMD = "AQ";
+ public const string READ_STORING_CMD = "AO";
+ public const int ONE_HEAD_RESULT_LEN = 12;
+ public const int TWO_HEAD_RESULT_LEN = 21;
+ public const int FIVE_RESULT_LEN = 48;
+ public const int EIGHT_RESULT_LEN = 75;
+ public const double TIMEOUT_SPAN = 3E7;
+
+ public LkSensorWrapper()
+ {
+ comPort = new SerialportWrapper();
+ comPort.Open(0, 9600, false);
+ }
+
+ public LkSensorWrapper(int index)
+ {
+ comPort = new SerialportWrapper();
+ comPort.Open(index, 9600, false);
+ }
+
+ public LkSensorWrapper(string comName)
+ {
+ comPort = new SerialportWrapper();
+ switch (comName)
+ {
+ case "COM1":
+ comPort.Open(0, 9600, false);
+ break;
+
+ case "COM2":
+ comPort.Open(1, 9600, false);
+ break;
+
+ case "COM3":
+ comPort.Open(2, 9600, false);
+ break;
+
+ case "COM4":
+ comPort.Open(3, 9600, false);
+ break;
+
+ case "COM5":
+ comPort.Open(4, 9600, false);
+ break;
+ }
+ }
+
+ public void ComReadHead(int index, ref float value)
+ {
+ String measureCommand = "";
+
+ if (1 == index)
+ {
+ measureCommand = READ_HEAD_A_CMD;
+ }
+ else if (2 == index)
+ {
+ measureCommand = READ_HEAD_B_CMD;
+ }
+
+ comPort.Send(measureCommand + "\r");
+ comPort.Clear();
+
+ DateTime startTime = DateTime.Now;
+ while (comPort.builder.Length < ONE_HEAD_RESULT_LEN)
+ {
+ DateTime currentTime = DateTime.Now;
+ if (currentTime.Ticks - startTime.Ticks > Convert.ToInt32(TIMEOUT_SPAN))
+ {
+ break;
+ }
+ }
+
+ string[] LkOutput = comPort.builder.ToString().Split(',');
+ comPort.Clear();
+
+ if (measureCommand.Equals(LkOutput[0]))
+ {
+ if (LkOutput[1].Contains("FFFF"))
+ {
+ value = float.NegativeInfinity;
+ }
+ else
+ {
+ value = Convert.ToSingle(LkOutput[1]);
+ }
+ }
+ else
+ {
+ value = float.PositiveInfinity;
+ }
+ }
+
+ public void ComReadHeads(ref float valueA, ref float valueB)
+ {
+ string measureCommand = READ_BOTH_HEAD_CMD;
+
+ comPort.Send(measureCommand + "\r");
+ comPort.Clear();
+
+ DateTime startTime = DateTime.Now;
+ while (comPort.builder.Length < TWO_HEAD_RESULT_LEN)
+ {
+ DateTime currentTime = DateTime.Now;
+ if (currentTime.Ticks - startTime.Ticks > Convert.ToInt32(TIMEOUT_SPAN))
+ {
+ break;
+ }
+ }
+
+ string[] LkOutput = comPort.builder.ToString().Trim().Split(',');
+
+ if (measureCommand.Equals(LkOutput[0]))
+ {
+ if (LkOutput[1].Contains("FFFF"))
+ {
+ valueA = float.NegativeInfinity;
+ }
+ else
+ {
+ valueA = Convert.ToSingle(LkOutput[1]);
+ }
+ if (LkOutput[2].Contains("FFFF"))
+ {
+ valueB = float.NegativeInfinity;
+ }
+ else
+ {
+ valueB = Convert.ToSingle(LkOutput[2]);
+ }
+
+ }
+ else
+ {
+ valueA = float.PositiveInfinity;
+ valueB = float.PositiveInfinity;
+ }
+ }
+
+ public void ChoosePrgram(int progNo)
+ {
+ comPort.Send(CHANGE_PROGRAM_CMD + progNo.ToString() + "\r");
+ comPort.Clear();
+ }
+
+ public void StartSyncStoring()
+ {
+ comPort.Send(START_SYNCSTORING_CMD + "\r");
+ comPort.Clear();
+ }
+
+ public void StopSyncStoring()
+ {
+ comPort.Send(STOP_SYNCSTORING_CMD + "\r");
+ comPort.Clear();
+
+ DateTime startTime = DateTime.Now;
+ while (comPort.builder.Length < 2)
+ {
+ DateTime currentTime = DateTime.Now;
+ if (currentTime.Ticks - startTime.Ticks > Convert.ToInt32(TIMEOUT_SPAN))
+ {
+ break;
+ }
+ }
+
+ string[] LkOutput = comPort.builder.ToString().Trim().Split(',');
+
+ if (LkOutput[0].Contains(STOP_SYNCSTORING_CMD))
+ {
+ return;
+ }
+ else
+ {
+ return;
+ }
+ }
+
+ public void ClearStoring()
+ {
+ comPort.Send(CLEAR_STORING_CMD + "\r");
+ comPort.Clear();
+ }
+
+ public void ReadStoring(ref float valueA, ref float valueB)
+ {
+ string measureCommand = READ_STORING_CMD;
+
+ comPort.Send(measureCommand + ",01\r");
+ comPort.Clear();
+
+ DateTime startTime = DateTime.Now;
+ while (comPort.builder.Length < EIGHT_RESULT_LEN)
+ {
+ DateTime currentTime = DateTime.Now;
+ if (currentTime.Ticks - startTime.Ticks > Convert.ToInt32(TIMEOUT_SPAN))
+ {
+ break;
+ }
+ }
+
+ string[] LkOutput = comPort.builder.ToString().Trim().Split(',');
+
+ if (measureCommand.Equals(LkOutput[0]))
+ {
+ if (LkOutput.Length < 2)
+ return;
+
+ if (LkOutput[1].Contains("FFFF"))
+ {
+ valueA = float.NegativeInfinity;
+ }
+ else
+ {
+ valueA = Convert.ToSingle(LkOutput[1]);
+ }
+ if (LkOutput[2].Contains("FFFF"))
+ {
+ valueB = float.NegativeInfinity;
+ }
+ else
+ {
+ valueB = Convert.ToSingle(LkOutput[2]);
+ }
+
+ }
+ else
+ {
+ valueA = float.PositiveInfinity;
+ valueB = float.PositiveInfinity;
+ }
+ }
+ }
+
+ public class HlSensorWrapper
+ {
+ public SerialportWrapper comPort;
+ public const string READ_BOTH_HEAD_CMD = "%EE#RMA5**";
+ public const string READ_HEAD_A_CMD = "%EE#RMD3**";
+ public const string READ_HEAD_B_CMD = "%EE#RMD4**";
+ public const string READ_ONE_HEAD_REPLY = "%EE$RMD";
+ public const string READ_TWO_HEADS_REPLY = "%EE$RMA";
+ public const int ONE_HEAD_RESULT_LEN = 21;
+ public const int TWO_HEAD_RESULT_LEN = 32;
+ public const int HEAD_A_RESULT_STARTINDEX = 7;
+ public const int HEAD_B_RESULT_STARTINDEX = 18;
+ public const int HEAD_RESULT_LENGTH = 11;
+ public const double TIMEOUT_SPAN = 3E7;
+
+ public HlSensorWrapper()
+ {
+ comPort = new SerialportWrapper();
+ comPort.Open(0, 115200, false);
+ }
+
+ public void ComReadHead(int index, ref float value)
+ {
+ String measureCommand = "";
+
+ if (1 == index)
+ {
+ measureCommand = READ_HEAD_A_CMD;
+ }
+ else if (2 == index)
+ {
+ measureCommand = READ_HEAD_B_CMD;
+ }
+
+ comPort.Send(measureCommand + "\r");
+ comPort.Clear();
+
+ DateTime startTime = DateTime.Now;
+ while (comPort.builder.Length < ONE_HEAD_RESULT_LEN)
+ {
+ DateTime currentTime = DateTime.Now;
+ if (currentTime.Ticks - startTime.Ticks > Convert.ToInt32(TIMEOUT_SPAN))
+ {
+ break;
+ }
+ }
+
+ string HlOutput = comPort.builder.ToString().Trim();
+ comPort.Clear();
+
+ if (HlOutput.Contains(READ_ONE_HEAD_REPLY))
+ {
+ if (HlOutput.Contains("FFFF"))
+ {
+ value = float.NegativeInfinity;
+ }
+ else
+ {
+ value = Convert.ToSingle(HlOutput.Substring(HEAD_A_RESULT_STARTINDEX, HEAD_RESULT_LENGTH));
+ }
+ }
+ else
+ {
+ value = float.PositiveInfinity;
+ }
+ }
+
+ public void ComReadHeads(ref float valueA, ref float valueB)
+ {
+ string measureCommand = READ_BOTH_HEAD_CMD;
+
+ comPort.Send(measureCommand + "\r");
+ comPort.Clear();
+
+ DateTime startTime = DateTime.Now;
+ while (comPort.builder.Length < TWO_HEAD_RESULT_LEN)
+ {
+ DateTime currentTime = DateTime.Now;
+ if (currentTime.Ticks - startTime.Ticks > Convert.ToInt32(TIMEOUT_SPAN))
+ {
+ break;
+ }
+ }
+
+ string[] HlOutput = comPort.builder.ToString().Trim().Split(',');
+
+ if (HlOutput[0].Contains(READ_TWO_HEADS_REPLY))
+ {
+ valueA = Convert.ToSingle(HlOutput[0].Substring(HEAD_A_RESULT_STARTINDEX, HEAD_RESULT_LENGTH));
+ valueB = Convert.ToSingle(HlOutput[0].Substring(HEAD_B_RESULT_STARTINDEX, HEAD_RESULT_LENGTH));
+ }
+ else
+ {
+ valueA = float.PositiveInfinity;
+ valueB = float.PositiveInfinity;
+ }
+ }
+ }
+
+ public class ZwSensorWrapper
+ {
+ public SocketTools st;
+ public IPAddress remoteIpAddr;
+ public int remotePort;
+ public const string READ_HEAD_A_CMD = "M";
+ public const string READ_ERROR_REPLY = "ER";
+ public const string READ_INVALID_REPLY = "----";
+ public const int ONE_HEAD_RESULT_LEN = 21;
+ public const int TWO_HEAD_RESULT_LEN = 32;
+ public const int HEAD_A_RESULT_STARTINDEX = 7;
+ public const int HEAD_B_RESULT_STARTINDEX = 18;
+ public const int HEAD_RESULT_LENGTH = 11;
+ public const double TIMEOUT_SPAN = 3E7;
+
+ public ZwSensorWrapper(string remoteIpAddr, int remotePort)
+ {
+ this.remoteIpAddr = IPAddress.Parse(remoteIpAddr);
+ this.remotePort = remotePort;
+
+ st = new SocketTools(9600, this.remotePort, this.remoteIpAddr, new System.Net.IPAddress(0));
+ }
+
+ public void ComReadHead(int index, ref float value)
+ {
+ string str = "";
+
+ str = READ_HEAD_A_CMD + "\r";
+
+ st.SendAndReceiveMessage(remoteIpAddr, 9600, ref str);
+
+ if (!str.Contains(READ_ERROR_REPLY))
+ {
+ if (str.Contains(READ_INVALID_REPLY))
+ {
+ value = float.NegativeInfinity;
+ }
+ else
+ {
+ value = Convert.ToSingle(str) / 1000000;
+ }
+ }
+ else
+ {
+ value = float.PositiveInfinity;
+ }
+ }
+
+ public void ComReadHeads(ref float valueA, ref float valueB)
+ {
+ ComReadHead(0, ref valueA);
+ valueB = valueA;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/HalconTools/ToolKit/Log.cs b/HalconTools/ToolKit/Log.cs
new file mode 100644
index 0000000..b5dec9b
--- /dev/null
+++ b/HalconTools/ToolKit/Log.cs
@@ -0,0 +1,5 @@
+锘縩amespace HalconTools
+{
+ public delegate void Log(string content, LogType type);
+}
+
diff --git a/HalconTools/ToolKit/LogManager.cs b/HalconTools/ToolKit/LogManager.cs
new file mode 100644
index 0000000..52783b8
--- /dev/null
+++ b/HalconTools/ToolKit/LogManager.cs
@@ -0,0 +1,179 @@
+锘縰sing System;
+using System.IO;
+using System.Text;
+
+namespace HalconTools
+{
+ public sealed class LogManager : IDisposable
+ {
+ private Type _componentType;
+ private FileStream _fs;
+ private string _logfile;
+ private static object mutext = new object();
+ public Log WriteLog;
+
+ private LogManager()
+ {
+ this.WriteLog = new Log(this.PrepareLogFile);
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.OpenStream));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendLocalTime));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendSeperator));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendComponentType));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendSeperator));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendType));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendSeperator));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendContent));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendNewLine));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.CloseStream));
+ }
+
+ public LogManager(Type type, string file) : this()
+ {
+ this._logfile = file;
+ this._componentType = type;
+ }
+
+ private void AppendComponentType(string content, LogType type)
+ {
+ byte[] bytes = Encoding.Default.GetBytes((this._componentType == null) ? "" : this._componentType.ToString());
+ this._fs.Write(bytes, 0, bytes.Length);
+ }
+
+ private void AppendContent(string content, LogType type)
+ {
+ byte[] bytes = Encoding.Default.GetBytes(content);
+ this._fs.Write(bytes, 0, bytes.Length);
+ }
+
+ private void AppendLocalTime(string content, LogType type)
+ {
+ string s = DateTime.Now.ToLocalTime().ToString();
+ byte[] bytes = Encoding.Default.GetBytes(s);
+ this._fs.Write(bytes, 0, bytes.Length);
+ }
+
+ private void AppendNewLine(string content, LogType type)
+ {
+ byte[] bytes = Encoding.Default.GetBytes("\r\n");
+ this._fs.Write(bytes, 0, bytes.Length);
+ }
+
+ private void AppendSeperator(string content, LogType type)
+ {
+ byte[] bytes = Encoding.Default.GetBytes(" | ");
+ this._fs.Write(bytes, 0, bytes.Length);
+ }
+
+ private void AppendType(string content, LogType type)
+ {
+ string s = string.Empty;
+ switch (type)
+ {
+ case LogType.Debug:
+ s = "Debug";
+ break;
+
+ case LogType.Trace:
+ s = "Trace";
+ break;
+
+ case LogType.Info:
+ s = "Info";
+ break;
+
+ case LogType.Warn:
+ s = "Warn";
+ break;
+
+ case LogType.Error:
+ s = "Error";
+ break;
+
+ default:
+ s = "";
+ break;
+ }
+ byte[] bytes = Encoding.Default.GetBytes(s);
+ this._fs.Write(bytes, 0, bytes.Length);
+ }
+
+ private void AppendUTCTime(string content, LogType type)
+ {
+ string s = DateTime.Now.ToUniversalTime().ToString();
+ byte[] bytes = Encoding.Default.GetBytes(s);
+ this._fs.Write(bytes, 0, bytes.Length);
+ }
+
+ private void CloseStream(string content, LogType type)
+ {
+ this._fs.Close();
+ this._fs.Dispose();
+ }
+
+ public void Dispose()
+ {
+ if (this._fs != null)
+ {
+ this._fs.Dispose();
+ }
+ GC.SuppressFinalize(this);
+ }
+
+ ~LogManager()
+ {
+ if (this._fs != null)
+ {
+ this._fs.Dispose();
+ }
+ }
+
+ private void OpenStream(string content, LogType type)
+ {
+ this._fs = File.Open(this._logfile, FileMode.Append);
+ }
+
+ private void PrepareLogFile(string content, LogType type)
+ {
+ lock (mutext)
+ {
+ if (!File.Exists(this._logfile))
+ {
+ using (File.Create(this._logfile))
+ {
+ }
+ }
+ }
+ }
+
+ public void UseLocalTime()
+ {
+ this.WriteLog = new Log(this.PrepareLogFile);
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.OpenStream));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendLocalTime));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendSeperator));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendComponentType));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendSeperator));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendType));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendSeperator));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendContent));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendNewLine));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.CloseStream));
+ }
+
+ public void UseUTCTime()
+ {
+ this.WriteLog = new Log(this.PrepareLogFile);
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.OpenStream));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendUTCTime));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendSeperator));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendComponentType));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendSeperator));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendType));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendSeperator));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendContent));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.AppendNewLine));
+ this.WriteLog = (Log) Delegate.Combine(this.WriteLog, new Log(this.CloseStream));
+ }
+ }
+}
+
diff --git a/HalconTools/ToolKit/LogType.cs b/HalconTools/ToolKit/LogType.cs
new file mode 100644
index 0000000..d4355a0
--- /dev/null
+++ b/HalconTools/ToolKit/LogType.cs
@@ -0,0 +1,12 @@
+锘縩amespace HalconTools
+{
+ public enum LogType
+ {
+ Debug,
+ Trace,
+ Info,
+ Warn,
+ Error
+ }
+}
+
diff --git a/HalconTools/ToolKit/NetWorkTool.cs b/HalconTools/ToolKit/NetWorkTool.cs
new file mode 100644
index 0000000..2ad9e96
--- /dev/null
+++ b/HalconTools/ToolKit/NetWorkTool.cs
@@ -0,0 +1,20 @@
+锘縰sing System.Net.NetworkInformation;
+using System.Text;
+
+namespace HalconTools
+{
+ public class NetWorkTool
+ {
+ public bool Ping(string ip)
+ {
+ System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
+ PingOptions options = new PingOptions();
+ options.DontFragment = true;
+ string s = "Test Data";
+ byte[] bytes = Encoding.ASCII.GetBytes(s);
+ int timeout = 0x3e8;
+ return (ping.Send(ip, timeout, bytes, options).Status == IPStatus.Success);
+ }
+ }
+}
+
diff --git a/HalconTools/ToolKit/SerialPort.cs b/HalconTools/ToolKit/SerialPort.cs
new file mode 100644
index 0000000..bdcbb49
--- /dev/null
+++ b/HalconTools/ToolKit/SerialPort.cs
@@ -0,0 +1,177 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.IO.Ports;
+using System.Text.RegularExpressions;
+
+namespace HalconTools
+{
+ public class SerialportWrapper
+ {
+ private SerialPort comm = new SerialPort();
+ string[] ports;
+ private long received_count = 0;//鎺ユ敹璁℃暟
+ private long send_count = 0;//鍙戦�佽鏁�
+
+ public StringBuilder builder = new StringBuilder();//閬垮厤鍦ㄤ簨浠跺鐞嗘柟娉曚腑鍙嶅鐨勫垱寤猴紝瀹氫箟鍒板闈€��
+
+ private bool flagHexDisplay = false;
+ private bool flagSendNewLine = false;
+
+ public SerialportWrapper()
+ {
+ //鍒濆鍖栦笅鎷変覆鍙e悕绉板垪琛ㄦ
+ ports = SerialPort.GetPortNames();
+ Array.Sort(ports);
+
+ //鍒濆鍖朣erialPort瀵硅薄
+ comm.NewLine = "/r/n";
+ comm.RtsEnable = true;//鏍规嵁瀹為檯鎯呭喌鍚с��
+ //娣诲姞浜嬩欢娉ㄥ唽
+ comm.DataReceived += comm_DataReceived;
+ }
+
+ void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
+ {
+ int n = comm.BytesToRead;//鍏堣褰曚笅鏉ワ紝閬垮厤鏌愮鍘熷洜锛屼汉涓虹殑鍘熷洜锛屾搷浣滃嚑娆′箣闂存椂闂撮暱锛岀紦瀛樹笉涓�鑷�
+ byte[] buf = new byte[n];//澹版槑涓�涓复鏃舵暟缁勫瓨鍌ㄥ綋鍓嶆潵鐨勪覆鍙f暟鎹�
+ received_count += n;//澧炲姞鎺ユ敹璁℃暟
+ comm.Read(buf, 0, n);//璇诲彇缂撳啿鏁版嵁
+ //builder.Remove(0, builder.Length);//娓呴櫎瀛楃涓叉瀯閫犲櫒鐨勫唴瀹�
+
+ //鍥犱负瑕佽闂畊i璧勬簮锛屾墍浠ラ渶瑕佷娇鐢╥nvoke鏂瑰紡鍚屾ui銆�
+ if (flagHexDisplay)
+ {
+ //渚濇鐨勬嫾鎺ュ嚭16杩涘埗瀛楃涓�
+ foreach (byte b in buf)
+ {
+ builder.Append(b.ToString("X2") + " ");
+ }
+ }
+ else
+ {
+ //鐩存帴鎸堿SCII瑙勫垯杞崲鎴愬瓧绗︿覆
+ builder.Append(Encoding.ASCII.GetString(buf));
+ }
+ }
+
+ public void Open(string portName, int baudRate, bool hexDisplay)
+ {
+ bool flagPortExists = false;
+
+ foreach (string port in ports)
+ {
+ if (port.Equals(portName))
+ {
+ flagPortExists = true;
+ }
+ }
+
+ if (!flagPortExists)
+ {
+ MessageBox.Show("鎸囧畾涓插彛(%s)涓嶅瓨鍦�", portName);
+ }
+
+ comm.PortName = portName;
+ comm.BaudRate = baudRate;
+ this.flagHexDisplay = hexDisplay;
+
+ try
+ {
+ comm.Open();
+ }
+ catch (Exception ex)
+ {
+ //鎹曡幏鍒板紓甯镐俊鎭紝鍒涘缓涓�涓柊鐨刢omm瀵硅薄锛屼箣鍓嶇殑涓嶈兘鐢ㄤ簡銆�
+ comm = new SerialPort();
+ //鐜板疄寮傚父淇℃伅缁欏鎴枫��
+ MessageBox.Show(ex.Message);
+ }
+ }
+
+ public void Open(int index, int baudRate, bool hexDisplay)
+ {
+ if (index > ports.Length)
+ {
+ MessageBox.Show("鎸囧畾涓插彛(%d)涓嶅瓨鍦�", index.ToString());
+ }
+
+ comm.PortName = ports[index];
+ comm.BaudRate = baudRate;
+ this.flagHexDisplay = hexDisplay;
+
+ try
+ {
+ comm.Open();
+ }
+ catch (Exception ex)
+ {
+ //鎹曡幏鍒板紓甯镐俊鎭紝鍒涘缓涓�涓柊鐨刢omm瀵硅薄锛屼箣鍓嶇殑涓嶈兘鐢ㄤ簡銆�
+ comm = new SerialPort();
+ //鐜板疄寮傚父淇℃伅缁欏鎴枫��
+ MessageBox.Show(ex.Message);
+ }
+ }
+
+
+ public void Close()
+ {
+ //鏍规嵁褰撳墠涓插彛瀵硅薄锛屾潵鍒ゆ柇鎿嶄綔
+ if (comm.IsOpen)
+ {
+ //鎵撳紑鏃剁偣鍑伙紝鍒欏叧闂覆鍙�
+ comm.Close();
+ }
+ }
+
+ public void Send(string content)
+ {
+ //瀹氫箟涓�涓彉閲忥紝璁板綍鍙戦�佷簡鍑犱釜瀛楄妭
+ int n = 0;
+ //16杩涘埗鍙戦��
+ if (flagHexDisplay)
+ {
+ //鎴戜滑涓嶇瑙勫垯浜嗐�傚鏋滃啓閿欎簡涓�浜涳紝鎴戜滑鍏佽鐨勶紝鍙敤姝e垯寰楀埌鏈夋晥鐨勫崄鍏繘鍒舵暟
+ MatchCollection mc = Regex.Matches(content, @"(?i)[/da-f]{2}");
+ List<byte> buf = new List<byte>();//濉厖鍒拌繖涓复鏃跺垪琛ㄤ腑
+ //渚濇娣诲姞鍒板垪琛ㄤ腑
+ foreach (Match m in mc)
+ {
+ buf.Add(byte.Parse(m.Value));
+ }
+ //杞崲鍒楄〃涓烘暟缁勫悗鍙戦��
+ comm.Write(buf.ToArray(), 0, buf.Count);
+ //璁板綍鍙戦�佺殑瀛楄妭鏁�
+ n = buf.Count;
+ }
+ else//ascii缂栫爜鐩存帴鍙戦��
+ {
+ //鍖呭惈鎹㈣绗�
+ if (flagSendNewLine)
+ {
+ comm.WriteLine(content);
+ n = content.Length + 2;
+ }
+ else//涓嶅寘鍚崲琛岀
+ {
+ comm.Write(content);
+ n = content.Length;
+ }
+ }
+ send_count += n;//绱姞鍙戦�佸瓧鑺傛暟
+ }
+
+ public void Reset()
+ {
+ //澶嶄綅鎺ュ彈鍜屽彂閫佺殑瀛楄妭鏁拌鏁板櫒骞舵洿鏂扮晫闈€��
+ send_count = received_count = 0;
+ builder.Remove(0, builder.Length);
+ }
+
+ public void Clear()
+ {
+ builder.Remove(0, builder.Length);
+ }
+ }
+}
\ No newline at end of file
diff --git a/HalconTools/ToolKit/SerializeFileTool.cs b/HalconTools/ToolKit/SerializeFileTool.cs
new file mode 100644
index 0000000..e63ed5a
--- /dev/null
+++ b/HalconTools/ToolKit/SerializeFileTool.cs
@@ -0,0 +1,70 @@
+锘縰sing System;
+using System.IO;
+using System.Text;
+
+namespace HalconTools
+{
+ public class SerializeFileTool<T>
+ {
+ public T GetConfig(string fileName)
+ {
+ T local = default(T);
+ byte[] bStr = null;
+ if (this.ReadBytes(fileName, out bStr) == FileOperationResult.OK)
+ {
+ local = SerializeTool<T>.XmlSerializerDeserialize(bStr);
+ }
+ return local;
+ }
+
+ private FileOperationResult ReadBytes(string path, out byte[] bStr)
+ {
+ bStr = null;
+ if (!File.Exists(path))
+ {
+ return FileOperationResult.NOTEXIST;
+ }
+ try
+ {
+ using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite))
+ {
+ bStr = new byte[stream.Length];
+ stream.Read(bStr, 0, bStr.Length);
+ }
+ }
+ catch
+ {
+ return FileOperationResult.WRITEERROR;
+ }
+ return FileOperationResult.OK;
+ }
+
+ public void SetConfig(string fileName, T config)
+ {
+ this.WriteBytes(fileName, FileMode.Create, SerializeTool<T>.XmlSerializerSerialize(config));
+ }
+
+ private FileOperationResult WriteBytes(string path, FileMode filemode, byte[] bStr)
+ {
+ try
+ {
+ using (FileStream stream = new FileStream(path, filemode, FileAccess.ReadWrite))
+ {
+ stream.Write(bStr, 0, bStr.Length);
+ }
+ }
+ catch (Exception)
+ {
+ return FileOperationResult.WRITEERROR;
+ }
+ return FileOperationResult.OK;
+ }
+
+ private FileOperationResult WriteString(string path, FileMode filemode, string str)
+ {
+ byte[] bytes = Encoding.Default.GetBytes(str);
+ return this.WriteBytes(path, filemode, bytes);
+ }
+ }
+}
+
diff --git a/HalconTools/ToolKit/SerializeTool.cs b/HalconTools/ToolKit/SerializeTool.cs
new file mode 100644
index 0000000..33cb6d2
--- /dev/null
+++ b/HalconTools/ToolKit/SerializeTool.cs
@@ -0,0 +1,46 @@
+锘縰sing System.IO;
+using System.Runtime.Serialization.Formatters.Soap;
+using System.Xml.Serialization;
+
+namespace HalconTools
+{
+ public class SerializeTool<T>
+ {
+ public static T SoapFormatterDeserialize(byte[] data)
+ {
+ using (MemoryStream stream = new MemoryStream(data))
+ {
+ SoapFormatter formatter = new SoapFormatter();
+ return (T) formatter.Deserialize(stream);
+ }
+ }
+
+ public static byte[] SoapFormatterSerialize(T obj)
+ {
+ using (MemoryStream stream = new MemoryStream())
+ {
+ new SoapFormatter().Serialize(stream, obj);
+ return stream.ToArray();
+ }
+ }
+
+ public static T XmlSerializerDeserialize(byte[] data)
+ {
+ using (MemoryStream stream = new MemoryStream(data))
+ {
+ XmlSerializer serializer = new XmlSerializer(typeof(T));
+ return (T) serializer.Deserialize(stream);
+ }
+ }
+
+ public static byte[] XmlSerializerSerialize(T obj)
+ {
+ using (MemoryStream stream = new MemoryStream())
+ {
+ new XmlSerializer(typeof(T)).Serialize((Stream) stream, obj);
+ return stream.ToArray();
+ }
+ }
+ }
+}
+
diff --git a/HalconTools/ToolKit/SocketTools.cs b/HalconTools/ToolKit/SocketTools.cs
new file mode 100644
index 0000000..f9835a7
--- /dev/null
+++ b/HalconTools/ToolKit/SocketTools.cs
@@ -0,0 +1,348 @@
+锘縰sing System;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+
+namespace HalconTools
+{
+ public class SocketTools
+ {
+ private int clientPort;
+ private NetworkStream clientStream;
+ private TcpListener listener;
+ private int listenPort;
+ private IPAddress localIp;
+ private LogManager loger = new LogManager(Type.GetType("Vision.Socket"), Environment.CurrentDirectory + @"\Socket.log");
+ private TcpClient remoteClient;
+ private IPAddress remoteIp;
+ private NetworkStream remoteStream;
+
+ public SocketTools(int listenPort, int clientPort, IPAddress remoteIp, IPAddress localIp)
+ {
+ this.remoteIp = remoteIp;
+ this.listenPort = listenPort;
+ this.clientPort = clientPort;
+ this.listener = new TcpListener(localIp, listenPort);
+ this.LocalIp = localIp;
+ }
+
+ public void CloseAll()
+ {
+ this.CloseListener();
+ }
+
+ public void CloseListener()
+ {
+ if (this != null)
+ {
+ if (this.remoteStream != null)
+ {
+ this.remoteStream.Close();
+ this.remoteStream.Dispose();
+ }
+ if (this.remoteClient != null)
+ {
+ this.remoteClient.Close();
+ this.remoteClient = null;
+ }
+ if (this.listener != null)
+ {
+ this.listener.Stop();
+ this.listener = null;
+ }
+ }
+ }
+
+ protected string GetIP()
+ {
+ IPAddress[] hostAddresses = Dns.GetHostAddresses(Dns.GetHostName());
+ for (int i = 0; i < hostAddresses.Length; i++)
+ {
+ if (hostAddresses[i].ToString().Length > 3)
+ {
+ return hostAddresses[i].ToString();
+ }
+ }
+ return "";
+ }
+
+ public void Listening(ListenEventCreater creater)
+ {
+ this.listener.Start();
+ while (true)
+ {
+ try
+ {
+ if (this.listener == null)
+ {
+ this.listener = new TcpListener(this.LocalIp, this.listenPort);
+ this.listener.Start();
+ }
+ this.remoteClient = this.listener.AcceptTcpClient();
+ this.remoteStream = this.remoteClient.GetStream();
+ if (this.remoteStream.CanRead)
+ {
+ byte[] buffer = new byte[this.remoteClient.ReceiveBufferSize];
+ this.remoteStream.Read(buffer, 0, this.remoteClient.ReceiveBufferSize);
+ string str = Encoding.Default.GetString(buffer);
+ if (str.Contains("CLOSELISTENER"))
+ {
+ return;
+ }
+ EventData iData = new EventData(str.Trim(new char[1]));
+ creater.ChangeValue(iData);
+ }
+ }
+ catch (Exception exception)
+ {
+ this.loger.WriteLog(string.Concat(new object[] { "鐩戝惉闂锛�", exception.Source, exception.TargetSite, exception.ToString(), "\r\n" }), LogType.Info);
+ }
+ finally
+ {
+ if (this.remoteStream != null)
+ {
+ this.remoteStream.Close();
+ this.remoteStream.Dispose();
+ }
+ if (this.remoteClient != null)
+ {
+ this.remoteClient.Close();
+ }
+ }
+ }
+ }
+
+ public bool SendMessage(string messsge)
+ {
+ return this.SendMessage(this.remoteIp, this.clientPort, messsge);
+ }
+
+ public bool SendMessage(IPAddress ip, int port, string messsge)
+ {
+ bool flag;
+ TcpClient client = new TcpClient();
+ NetworkStream stream = null;
+ try
+ {
+ client.Connect(ip, port);
+ stream = client.GetStream();
+ if (stream.CanWrite)
+ {
+ byte[] bytes = Encoding.ASCII.GetBytes(messsge + "\r\n");
+ stream.Write(bytes, 0, bytes.Length);
+ return true;
+ }
+ flag = false;
+ }
+ catch (Exception exception)
+ {
+ this.loger.WriteLog(string.Concat(new object[] { "鍙戦�丼ocket鏁版嵁闂锛�", exception.Source, exception.TargetSite, exception.ToString(), "\r\n" }), LogType.Info);
+ flag = false;
+ }
+ finally
+ {
+ if (stream != null)
+ {
+ stream.Close();
+ }
+ if (client != null)
+ {
+ client.Close();
+ }
+ }
+ return flag;
+ }
+
+ System.Threading.Thread receiveThread;
+ NetworkStream stm = null;
+
+ public bool SendAndReceiveMessage(IPAddress ip, int port, ref string messsge)
+ {
+ bool flag = false;
+ TcpClient tcpClient = new TcpClient();
+
+ int i = 0;
+ int sleepInterval = 100;
+
+ try
+ {
+ //tcpClient = TimeOutSocket.TryConnect(new IPEndPoint(ip, port), 3000);// new TcpClient();
+ tcpClient.Connect(ip, port);
+ stm = tcpClient.GetStream();
+ //receiveThread = new System.Threading.Thread(ReceiveMessage);
+ //receiveThread.Start();
+
+ if (stm.CanWrite)
+ {
+ byte[] bytes = Encoding.ASCII.GetBytes(messsge + "\n");
+ byte[] readBytes = new byte[40];
+
+ stm.Write(bytes, 0, bytes.Length);
+ stm.Read(readBytes, 0, readBytes.Length);
+
+ messsge = Encoding.GetEncoding("gb2312").GetString(readBytes);
+ }
+ }
+ catch (Exception exception)
+ {
+ this.loger.WriteLog(string.Concat(new object[] { "鍙戦�佹帴鏀禨ocket鏁版嵁闂锛�", exception.Source, exception.TargetSite, exception.ToString(), "\r\n" }), LogType.Info);
+ flag = false;
+ }
+ finally
+ {
+ if (stm != null)
+ {
+ stm.Close();
+ }
+ if (tcpClient != null)
+ {
+ tcpClient.Close();
+ }
+ }
+ return flag;
+ }
+
+ // 鎺ユ敹娑堟伅鏂规硶
+ private void ReceiveMessage()
+ {
+ IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
+ while (true)
+ {
+ try
+ {
+ // 鍏抽棴receiveUdpClient鏃舵鏃朵細浜х敓寮傚父
+ Encoding gb2312 = Encoding.GetEncoding("gb2312");//Encoding.Default ,936
+ byte[] receiveBytes;
+ byte[] tcpreceiveBytes = new byte[4096];
+ int count = 0;
+
+
+ //if (netSelected == 0)
+ //{
+ // receiveBytes = receiveUpdClient.Receive(ref remoteIpEndPoint);
+ //}
+ //else
+ {
+
+ count = stm.Read(tcpreceiveBytes, 0, 2048);
+ receiveBytes = tcpreceiveBytes;
+
+ }
+
+ string message = gb2312.GetString(receiveBytes);
+
+ // 鏄剧ず娑堟伅鍐呭
+ //ShowMessageforView(texboxMessageView, string.Format("{0}", message));
+
+ }
+ catch (Exception exception)
+ {
+ break;
+ }
+ }
+ }
+
+
+ public void Stop()
+ {
+ this.SendMessage(this.localIp, this.listenPort, "CLOSELISTENER");
+ }
+
+ public int ClientPort
+ {
+ get
+ {
+ return this.clientPort;
+ }
+ set
+ {
+ this.clientPort = value;
+ }
+ }
+
+ public NetworkStream ClientStream
+ {
+ get
+ {
+ return this.clientStream;
+ }
+ set
+ {
+ this.clientStream = value;
+ }
+ }
+
+ public int ListenPort
+ {
+ get
+ {
+ return this.listenPort;
+ }
+ set
+ {
+ this.listenPort = value;
+ }
+ }
+
+ public TcpListener Listerner
+ {
+ get
+ {
+ return this.listener;
+ }
+ set
+ {
+ this.listener = value;
+ }
+ }
+
+ public IPAddress LocalIp
+ {
+ get
+ {
+ return this.localIp;
+ }
+ set
+ {
+ this.localIp = value;
+ }
+ }
+
+ public TcpClient RemoteClient
+ {
+ get
+ {
+ return this.remoteClient;
+ }
+ set
+ {
+ this.remoteClient = value;
+ }
+ }
+
+ public IPAddress RemoteIp
+ {
+ get
+ {
+ return this.remoteIp;
+ }
+ set
+ {
+ this.remoteIp = value;
+ }
+ }
+
+ public NetworkStream RemoteStream
+ {
+ get
+ {
+ return this.remoteStream;
+ }
+ set
+ {
+ this.remoteStream = value;
+ }
+ }
+ }
+}
+
diff --git a/HalconTools/ToolKit/StarterTool.cs b/HalconTools/ToolKit/StarterTool.cs
new file mode 100644
index 0000000..d64627a
--- /dev/null
+++ b/HalconTools/ToolKit/StarterTool.cs
@@ -0,0 +1,76 @@
+锘縰sing System.Diagnostics;
+using System.Threading;
+
+namespace HalconTools
+{
+ public class StarterTool
+ {
+ public static bool IsExistMutex(string mutexName, out Mutex mutex)
+ {
+ bool flag;
+ mutex = new Mutex(true, mutexName, out flag);
+ return !flag;
+ }
+
+ public static bool IsSingle()
+ {
+ return (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length <= 1);
+ }
+
+ public static void PowerWait(string[] args)
+ {
+ if ((((args != null) && (args.Length > 1)) && args[0].ToUpper().Equals("-S")) && (args[1] != null))
+ {
+ int result = 0;
+ if (int.TryParse(args[1], out result) && (result > 0))
+ {
+ Thread.Sleep((int) (result * 0x3e8));
+ }
+ }
+ }
+
+ //private void Form1_Load(object sender, EventArgs e)
+ //{
+
+ // string appPath = @"C:\Program Files\KEPServerEx\servermain.exe E:\MacBookTest_F2\Kep_F2.opf";
+ // int sleepTime = 200;
+ // bool isVisible = false;
+
+ // KillApp(appPath);
+ // ShowWindow(appPath, sleepTime, isVisible);
+ //}
+
+ public static void ShowWindow(string appPathNargs, int sleepTime, bool isVisible)
+ {
+ int exeStart = appPathNargs.IndexOf(".exe", 0);
+ string appPath = appPathNargs.Substring(0, exeStart + 4);
+ string args = appPathNargs.Substring(exeStart + 5);
+
+ System.Diagnostics.Process p = System.Diagnostics.Process.Start(appPath, args);
+
+ System.Threading.Thread.Sleep(sleepTime);
+ string name = p.MainWindowTitle;
+
+ System.IntPtr ptr = HalconTools.Win32API.FindWindow(null, name);
+ HalconTools.Win32API.ShowWindow(ptr, System.Convert.ToInt32(isVisible));
+ }
+
+ public static void KillApp(string appPath)
+ {
+ int exeStart = appPath.IndexOf(".exe", 0);
+
+ string[] appNames = appPath.Substring(0, exeStart).Split('\\');
+ string appName = appNames[appNames.Length - 1];
+
+ System.Diagnostics.Process[] pList = System.Diagnostics.Process.GetProcesses();
+ foreach (System.Diagnostics.Process item in pList)
+ {
+ if (item.ProcessName.ToUpper().Equals(appName.ToUpper()))
+ {
+ item.Kill();
+ }
+ }
+ }
+ }
+}
+
diff --git a/HalconTools/ToolKit/StyleSetTools.cs b/HalconTools/ToolKit/StyleSetTools.cs
new file mode 100644
index 0000000..eeb82cd
--- /dev/null
+++ b/HalconTools/ToolKit/StyleSetTools.cs
@@ -0,0 +1,77 @@
+锘縰sing System.Drawing;
+using System.Windows.Forms;
+
+namespace HalconTools
+{
+ public class StyleSetTools
+ {
+ public void SetCellColor(DataGridView dgv, int rowIndex, int columnIndex, Color col, Color back)
+ {
+ DataGridViewCellStyle style = new DataGridViewCellStyle();
+ style.ForeColor = col;
+ style.SelectionForeColor = col;
+ style.BackColor = back;
+ style.SelectionBackColor = back;
+ style.Font = new Font("Arial", 10f, FontStyle.Bold);
+ dgv.Rows[rowIndex].Cells[columnIndex].Style = style;
+ }
+
+ public void SetColumnColor(DataGridView dgv, int colIndex, Color col, Color back)
+ {
+ DataGridViewCellStyle style = new DataGridViewCellStyle();
+ style.ForeColor = col;
+ style.SelectionForeColor = col;
+ style.BackColor = back;
+ style.SelectionBackColor = back;
+ style.Font = new Font("Arial", 10f, FontStyle.Bold);
+ dgv.Columns[colIndex].DefaultCellStyle = style;
+ }
+
+ public void SetColumnWidth(DataGridView dgv, int colIndex, int width)
+ {
+ dgv.Columns[colIndex].Width = width;
+ }
+
+ public void SetDefaultView(DataGridView dgv, int width, int height, int x, int y)
+ {
+ dgv.GridColor = Color.BlueViolet;
+ dgv.BorderStyle = BorderStyle.Fixed3D;
+ dgv.CellBorderStyle = DataGridViewCellBorderStyle.Sunken;
+ dgv.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Sunken;
+ dgv.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Sunken;
+ dgv.DefaultCellStyle.BackColor = Color.White;
+ dgv.DefaultCellStyle.SelectionBackColor = Color.White;
+ dgv.DefaultCellStyle.SelectionForeColor = Color.Black;
+ dgv.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
+ dgv.AllowUserToAddRows = false;
+ dgv.AllowUserToDeleteRows = false;
+ dgv.AllowUserToOrderColumns = true;
+ dgv.AllowUserToResizeColumns = false;
+ dgv.AllowUserToResizeRows = false;
+ dgv.ReadOnly = true;
+ dgv.RowHeadersVisible = false;
+ dgv.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;
+ dgv.ScrollBars = ScrollBars.Vertical;
+ dgv.ShowEditingIcon = false;
+ dgv.BackgroundColor = SystemColors.Control;
+ dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
+ dgv.ColumnHeadersVisible = false;
+ dgv.MultiSelect = false;
+ dgv.AutoGenerateColumns = true;
+ dgv.Location = new Point(x, y);
+ dgv.Size = new Size(width, height);
+ }
+
+ public void SetRowColor(DataGridView dgv, int rowIndex, Color col, Color back)
+ {
+ DataGridViewCellStyle style = new DataGridViewCellStyle();
+ style.ForeColor = col;
+ style.SelectionForeColor = col;
+ style.BackColor = back;
+ style.SelectionBackColor = back;
+ style.Font = new Font("Arial", 10f, FontStyle.Bold);
+ dgv.Rows[rowIndex].DefaultCellStyle = style;
+ }
+ }
+}
+
diff --git a/HalconTools/ToolKit/Win32API.cs b/HalconTools/ToolKit/Win32API.cs
new file mode 100644
index 0000000..002f1aa
--- /dev/null
+++ b/HalconTools/ToolKit/Win32API.cs
@@ -0,0 +1,132 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+
+/********************************************************************************
+* 璧勬枡鏀堕泦:Jonny Sun ,www.csframework.com
+* ******************************************************************************/
+
+namespace HalconTools
+{
+ /// <summary>
+ /// 鎿嶄綔Windows绐椾綋,绯荤粺鎵樼洏鎵�鐢ㄧ殑API鍑芥暟
+ /// </summary>
+ public class Win32API
+ {
+ public const int WM_USER = 0x400;
+ public const int WM_CLOSE = 0x10;
+ public const int WM_GETTEXT = 0x000D;
+ public const int WM_SETTEXT = 0x000C;
+
+ public const int STANDARD_RIGHTS_REQUIRED = 0xF0000;
+ public const int SYNCHRONIZE = 0x100000;
+ public const int PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF;
+ public const int PROCESS_TERMINATE = 0x1;
+
+ public const int PROCESS_VM_OPERATION = 0x8;
+ public const int PROCESS_VM_READ = 0x10;
+ public const int PROCESS_VM_WRITE = 0x20;
+
+ public const int MEM_RESERVE = 0x2000;
+ public const int MEM_COMMIT = 0x1000;
+ public const int MEM_RELEASE = 0x8000;
+
+ public const int PAGE_READWRITE = 0x4;
+
+ public const int TB_BUTTONCOUNT = (WM_USER + 24);
+ public const int TB_HIDEBUTTON = (WM_USER + 4);
+ public const int TB_GETBUTTON = (WM_USER + 23);
+ public const int TB_GETBUTTONTEXT = WM_USER + 75;
+ public const int TB_GETBITMAP = (WM_USER + 44);
+ public const int TB_DELETEBUTTON = (WM_USER + 22);
+ public const int TB_ADDBUTTONS = (WM_USER + 20);
+ public const int TB_INSERTBUTTON = (WM_USER + 21);
+ public const int TB_ISBUTTONHIDDEN = (WM_USER + 12);
+ public const int ILD_NORMAL = 0x0;
+ public const int TPM_NONOTIFY = 0x80;
+
+ public const int WS_VISIBLE = 268435456;//绐椾綋鍙
+ public const int WS_MINIMIZEBOX = 131072;//鏈夋渶灏忓寲鎸夐挳
+ public const int WS_MAXIMIZEBOX = 65536;//鏈夋渶澶у寲鎸夐挳
+ public const int WS_BORDER = 8388608;//绐椾綋鏈夎竟妗�
+ public const int GWL_STYLE = (-16);//绐椾綋鏍峰紡
+ public const int GW_HWNDFIRST = 0;
+ public const int GW_HWNDNEXT = 2;
+ public const int SW_HIDE = 0;
+ public const int SW_SHOW = 5;
+
+ [DllImport("User32.Dll")]
+ public static extern void GetClassName(IntPtr hwnd, StringBuilder s, int nMaxCount);
+
+ [DllImport("user32.dll", EntryPoint = "SetForegroundWindow", SetLastError = true)]
+ public static extern void SetForegroundWindow(IntPtr hwnd);
+
+ [DllImport("user32.dll", EntryPoint = "GetDlgItem", SetLastError = true)]
+ public static extern IntPtr GetDlgItem(int nID, IntPtr phWnd);
+
+ [DllImport("user32.dll", CharSet = CharSet.Auto)]
+ public static extern int RegisterWindowMessage(string msg);
+
+ [DllImport("kernel32", EntryPoint = "OpenProcess")]
+ public static extern IntPtr OpenProcess(int dwDesiredAccess, IntPtr bInheritHandle, IntPtr dwProcessId);
+
+ [DllImport("kernel32", EntryPoint = "CloseHandle")]
+ public static extern int CloseHandle(IntPtr hObject);
+
+ [DllImport("user32", EntryPoint = "GetWindowThreadProcessId")]
+ public static extern IntPtr GetWindowThreadProcessId(IntPtr hwnd, ref IntPtr lpdwProcessId);
+
+ [DllImport("user32.dll")]
+ public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
+
+ [DllImport("user32", EntryPoint = "SendMessage")]
+ public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
+
+ [DllImport("user32", EntryPoint = "SendMessage")]
+ public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, IntPtr lParam);
+
+ [DllImport("kernel32", EntryPoint = "ReadProcessMemory")]
+ public static extern int ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, ref IntPtr lpBuffer, int nSize, int lpNumberOfBytesWritten);
+
+ [DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")]
+ public static extern bool ReadProcessMemoryEx(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, int nSize, ref uint vNumberOfBytesRead);
+
+ [DllImport("kernel32", EntryPoint = "ReadProcessMemory")]
+ public static extern int ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, int nSize, int lpNumberOfBytesWritten);
+
+ [DllImport("kernel32", EntryPoint = "WriteProcessMemory")]
+ public static extern int WriteProcessMemory(IntPtr hProcess, ref int lpBaseAddress, ref int lpBuffer, int nSize, ref int lpNumberOfBytesWritten);
+
+ [DllImport("kernel32", EntryPoint = "VirtualAllocEx")]
+ public static extern IntPtr VirtualAllocEx(IntPtr hProcess, int lpAddress, int dwSize, int flAllocationType, int flProtect);
+
+ [DllImport("kernel32", EntryPoint = "VirtualFreeEx")]
+ public static extern int VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress, int dwSize, int dwFreeType);
+
+ [DllImport("User32.dll")]
+ public extern static int GetWindow(int hWnd, int wCmd);
+
+ [DllImport("User32.dll")]
+ public extern static int GetWindowLongA(int hWnd, int wIndx);
+
+ [DllImport("user32.dll")]
+ public static extern bool GetWindowText(int hWnd, StringBuilder title, int maxBufSize);
+
+ [DllImport("user32.dll", CharSet = CharSet.Auto)]
+ public extern static int GetWindowTextLength(IntPtr hWnd);
+
+ [DllImport("User32.dll", EntryPoint = "FindWindow")]
+ public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
+
+ [DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true)]
+ public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
+
+ [DllImport("user32.dll", EntryPoint = "ShowWindow", SetLastError = true)]
+ public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
+
+ [DllImport("user32.dll", EntryPoint = "SendMessageA")]
+ public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
+
+ }
+}
diff --git a/HalconTools/ViewROI/FunctionPlot.cs b/HalconTools/ViewROI/FunctionPlot.cs
new file mode 100644
index 0000000..b4a1f12
--- /dev/null
+++ b/HalconTools/ViewROI/FunctionPlot.cs
@@ -0,0 +1,562 @@
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+using HalconDotNet;
+
+
+namespace HalconTools
+{
+ /// <summary>
+ /// This class allows you to print a function into a Windows.Forms.Control.
+ /// The function must be supplied as an array of either double, float or
+ /// int values. When initializing the class you must provide the control that
+ /// actually draws the function plot. During the initialization you
+ /// can also decide whether the mouse event is used to return the (x,y)
+ /// coordinates of the plotted function. The scaling
+ /// of the x-y axis is performed automatically and depent on the length
+ /// of the function as well as the settings for the y-axis scaling:
+ /// * AXIS_RANGE_FIXED
+ /// * AXIS_RANGE_INCREASING
+ /// * AXIS_RANGE_ADAPTING
+ ///
+ /// Constraints of the function plot class:
+ /// So far only functions containing a positive range of y-values can
+ /// be plotted correctly. Also only a positive and ascending x-range
+ /// can be plotted. The origin of the coordinate system is set to
+ /// be in the lower left corner of the control. Another definition
+ /// of the origin and hence the direction of the coordinate axis
+ /// is not implemented yet.
+ /// </summary>
+ public class FunctionPlot
+ {
+ // panels for display
+ private Graphics gPanel, backBuffer;
+
+ // graphical settings
+ private Pen pen, penCurve, penCursor;
+ private SolidBrush brushCS, brushFuncPanel;
+ private Font drawFont;
+ private StringFormat format;
+ private Bitmap functionMap;
+
+ // dimensions of panels
+ private float panelWidth;
+ private float panelHeight;
+ private float margin;
+
+ // origin
+ private float originX;
+ private float originY;
+
+ private PointF[] points;
+ private HFunction1D func;
+
+ // axis
+ private int axisAdaption;
+ private float axisXLength;
+ private float axisYLength;
+ private float scaleX, scaleY;
+
+ public const int AXIS_RANGE_FIXED = 3;
+ public const int AXIS_RANGE_INCREASING = 4;
+ public const int AXIS_RANGE_ADAPTING = 5;
+
+ int PreX, BorderRight, BorderTop;
+
+
+ /// <summary>
+ /// Initializes a FunctionPlot instance by providing a GUI control
+ /// and a flag specifying the mouse interaction mode.
+ /// The control is used to determine the available space to draw
+ /// the axes and to plot the supplied functions. Depending on the
+ /// available space, the values of the function as well as the axis
+ /// steps are adjusted (scaled) to fit into the visible part of the
+ /// control.
+ /// </summary>
+ /// <param name="panel">
+ /// An instance of the Windows.Forms.Control to plot the
+ /// supplied functions in
+ /// </param>
+ /// <param name="useMouseHandle">
+ /// Flag that specifies whether or not mouse interaction should
+ /// be used to create a navigation bar for the plotted function
+ /// </param>
+ public FunctionPlot(Control panel, bool useMouseHandle)
+ {
+ gPanel = panel.CreateGraphics();
+
+ panelWidth = panel.Size.Width - 32;
+ panelHeight = panel.Size.Height - 22;
+
+ originX = 32;
+ originY = panel.Size.Height - 22;
+ margin = 5.0f;
+
+ BorderRight = (int)(panelWidth + originX - margin);
+ BorderTop = (int)panelHeight;
+
+ PreX = 0;
+ scaleX = scaleY = 0.0f;
+
+
+ //default setting for axis scaling
+ axisAdaption = AXIS_RANGE_ADAPTING;
+ axisXLength = 10.0f;
+ axisYLength = 10.0f;
+
+ pen = new Pen(System.Drawing.Color.DarkGray, 1);
+ penCurve = new Pen(System.Drawing.Color.Blue, 1);
+ penCursor = new Pen(System.Drawing.Color.LightSteelBlue, 1);
+ penCursor.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
+
+ brushCS = new SolidBrush(Color.Black);
+ brushFuncPanel = new SolidBrush(Color.White);
+ drawFont = new Font("Arial", 6);
+ format = new StringFormat();
+ format.Alignment = StringAlignment.Far;
+
+ functionMap = new Bitmap(panel.Size.Width, panel.Size.Height);
+ backBuffer = Graphics.FromImage(functionMap);
+ resetPlot();
+
+ panel.Paint += new System.Windows.Forms.PaintEventHandler(this.paint);
+
+ if (useMouseHandle)
+ panel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.mouseMoved);
+ }
+
+ /// <summary>
+ /// Convenience method for constructor call. For this case the
+ /// useMouseHandle flag is set to false by default.
+ /// </summary>
+ /// <param name="panel">
+ /// An instance of the Windows.Forms.Control to plot the
+ /// supplied function in.
+ /// </param>
+ public FunctionPlot(Control panel)
+ : this(panel, false)
+ {
+ }
+
+
+ /// <summary>
+ /// Changes the origin of the coordinate system to be
+ /// at the control positions x and y.
+ /// </summary>
+ /// <param name="x">
+ /// X position within the control coordinate system
+ /// </param>
+ /// <param name="y">
+ /// Y position within the control coordinate system.
+ /// </param>
+ public void setOrigin(int x, int y)
+ {
+ float tmpX;
+
+ if (x < 1 || y < 1)
+ return;
+
+ tmpX = originX;
+ originX = x;
+ originY = y;
+
+ panelWidth = panelWidth + tmpX - originX;
+ panelHeight = originY;
+ BorderRight = (int)(panelWidth + originX - margin);
+ BorderTop = (int)panelHeight;
+ }
+
+
+ /// <summary>
+ /// Sets the type of scaling for the y-axis. If the
+ /// y-axis is defined to be of fixed size, then the upper
+ /// limit has to be provided with val. Otherwise,
+ /// an 8-bit image is assumed, so the fixed size is set
+ /// to be 255.
+ /// </summary>
+ /// <param name="mode">
+ /// Class constant starting with AXIS_RANGE_*
+ /// </param>
+ /// <param name="val">
+ /// For the mode AXIS_RANGE_FIXED the value
+ /// val must be positive, otherwise
+ /// it has no meaning.
+ /// </param>
+ public void setAxisAdaption(int mode, float val)
+ {
+ switch (mode)
+ {
+ case AXIS_RANGE_FIXED:
+ axisAdaption = mode;
+ axisYLength = (val > 0) ? val : 255.0f;
+ break;
+ default:
+ axisAdaption = mode;
+ break;
+ }
+ }
+
+ public void setAxisAdaption(int mode)
+ {
+ setAxisAdaption(mode, -1.0f);
+ }
+
+
+ /// <summary>
+ /// Plots a function of double values.
+ /// </summary>
+ /// <param name="grayValues">
+ /// Y-values defined as an array of doubles
+ /// </param>
+ public void plotFunction(double[] grayValues)
+ {
+ drawFunction(new HTuple(grayValues));
+ }
+
+
+ /// <summary>
+ /// Plots a function of float values.
+ /// </summary>
+ /// <param name="grayValues">
+ /// Y-values defined as an array of floats
+ /// </param>
+ public void plotFunction(float[] grayValues)
+ {
+ drawFunction(new HTuple(grayValues));
+ }
+
+
+ /// <summary>
+ /// Plots a function of integer values.
+ /// </summary>
+ /// <param name="grayValues">
+ /// Y-values defined as an array of integers
+ /// </param>
+ public void plotFunction(int[] grayValues)
+ {
+ drawFunction(new HTuple(grayValues));
+ }
+
+
+ /// <summary>Plots a function provided as an HTuple</summary>
+ private void drawFunction(HTuple tuple)
+ {
+ HTuple val;
+ int maxY,maxX;
+ float stepOffset;
+
+ if (tuple.Length == 0)
+ {
+ resetPlot();
+ return;
+ }
+
+ val = tuple.TupleSortIndex();
+ maxX = tuple.Length - 1;
+ maxY = (int)tuple[val[val.Length - 1].I].D;
+
+ axisXLength = maxX;
+
+ switch (axisAdaption)
+ {
+ case AXIS_RANGE_ADAPTING:
+ axisYLength = maxY;
+ break;
+ case AXIS_RANGE_INCREASING:
+ axisYLength = (maxY > axisYLength) ? maxY : axisYLength;
+ break;
+ }
+
+ backBuffer.Clear(System.Drawing.Color.WhiteSmoke);
+ backBuffer.FillRectangle(brushFuncPanel, originX, 0, panelWidth, panelHeight);
+
+ stepOffset = drawXYLabels();
+ drawLineCurve(tuple, stepOffset);
+ backBuffer.Flush();
+
+ gPanel.DrawImageUnscaled(functionMap, 0, 0);
+ gPanel.Flush();
+ }
+
+
+ /// <summary>
+ /// Clears the panel and displays only the coordinate axes.
+ /// </summary>
+ public void resetPlot()
+ {
+ backBuffer.Clear(System.Drawing.Color.WhiteSmoke);
+ backBuffer.FillRectangle(brushFuncPanel, originX, 0, panelWidth, panelHeight);
+ func = null;
+ drawXYLabels();
+ backBuffer.Flush();
+ repaint();
+ }
+
+
+ /// <summary>
+ /// Puts (=flushes) the current content of the graphics object on screen
+ /// again.
+ /// </summary>
+ private void repaint()
+ {
+ gPanel.DrawImageUnscaled(functionMap, 0, 0);
+ gPanel.Flush();
+ }
+
+
+ /// <summary>Plots the points of the function.</summary>
+ private void drawLineCurve(HTuple tuple, float stepOffset)
+ {
+ int length;
+
+ if (stepOffset > 1)
+ points = scaleDispValue(tuple);
+ else
+ points = scaleDispBlockValue(tuple);
+
+ length = points.Length;
+
+ func = new HFunction1D(tuple);
+
+ for (int i = 0; i < length - 1; i++)
+ backBuffer.DrawLine(penCurve, points[i], points[i + 1]);
+
+ }
+
+
+ /// <summary>
+ /// Scales the function to the dimension of the graphics object
+ /// (provided by the control).
+ /// </summary>
+ /// <param name="tup">
+ /// Function defined as a tuple of y-values
+ /// </param>
+ /// <returns>
+ /// Array of PointF values, containing the scaled function data
+ /// </returns>
+ private PointF[] scaleDispValue(HTuple tup)
+ {
+ PointF [] pVals;
+ float xMax, yMax, yV, x, y;
+ int length;
+
+ xMax = axisXLength;
+ yMax = axisYLength;
+
+ scaleX = (xMax != 0.0f) ? ((panelWidth - margin) / xMax) : 0.0f;
+ scaleY = (yMax != 0.0f) ? ((panelHeight - margin) / yMax) : 0.0f;
+
+ length = tup.Length;
+ pVals = new PointF[length];
+
+ for (int j=0; j < length; j++)
+ {
+ yV = (float)tup[j].D;
+ x = originX + (float)j * scaleX;
+ y = panelHeight - (yV * scaleY);
+ pVals[j] = new PointF(x, y);
+ }
+
+ return pVals;
+ }
+
+
+ /// <summary>
+ /// Scales the function to the dimension of the graphics object
+ /// (provided by the control). If the stepsize for the x-axis is
+ /// 1, the points are scaled in a block shape.
+ /// </summary>
+ /// <param name="tup">
+ /// Function defined as a tuple of y-values
+ /// </param>
+ /// <returns>
+ /// Array of PointF values, containing the scaled function data
+ /// </returns>
+ private PointF[] scaleDispBlockValue(HTuple tup)
+ {
+ PointF [] pVals;
+ float xMax, yMax, yV,x,y;
+ int length, idx;
+
+ xMax = axisXLength;
+ yMax = axisYLength;
+
+ scaleX = (xMax != 0.0f) ? ((panelWidth - margin) / xMax) : 0.0f;
+ scaleY = (yMax != 0.0f) ? ((panelHeight - margin) / yMax) : 0.0f;
+
+ length = tup.Length;
+ pVals = new PointF[length * 2];
+
+ y = 0;
+ idx = 0;
+
+ for (int j=0; j < length; j++)
+ {
+ yV = (float)tup[j].D;
+ x = originX + (float)j * scaleX - (scaleX / 2.0f);
+ y = panelHeight - (yV * scaleY);
+ pVals[idx] = new PointF(x, y);
+ idx++;
+
+ x = originX + (float)j * scaleX + (scaleX / 2.0f);
+ pVals[idx] = new PointF(x, y);
+ idx++;
+ }
+
+ //trim the end points of the curve
+ idx--;
+ x = originX + (float)(length - 1) * scaleX;
+ pVals[idx] = new PointF(x, y);
+
+ idx = 0;
+ yV = (float)tup[idx].D;
+ x = originX;
+ y = panelHeight - (yV * scaleY);
+ pVals[idx] = new PointF(x, y);
+
+ return pVals;
+ }
+
+
+ /// <summary>Draws x- and y-axis and its labels.</summary>
+ /// <returns>Step size used for the x-axis</returns>
+ private float drawXYLabels()
+ {
+ float pX,pY,length, XStart,YStart;
+ float YCoord, XCoord, XEnd, YEnd, offset, offsetString, offsetStep;
+ float scale = 0.0f;
+
+ offsetString = 5;
+ XStart = originX;
+ YStart = originY;
+
+ //prepare scale data for x-axis
+ pX = axisXLength;
+ if (pX != 0.0)
+ scale = (panelWidth - margin) / pX;
+
+ if (scale > 10.0)
+ offset = 1.0f;
+ else if (scale > 2)
+ offset = 10.0f;
+ else if (scale > 0.2)
+ offset = 100.0f;
+ else
+ offset = 1000.0f;
+
+
+ /*************** draw X-Axis ***************/
+ XCoord = 0.0f;
+ YCoord = YStart;
+ XEnd = (scale * pX);
+
+ backBuffer.DrawLine(pen, XStart, YStart, XStart + panelWidth - margin, YStart);
+ backBuffer.DrawLine(pen, XStart + XCoord, YCoord, XStart + XCoord, YCoord + 6);
+ backBuffer.DrawString(0 + "", drawFont, brushCS, XStart + XCoord + 4, YCoord + 8, format);
+ backBuffer.DrawLine(pen, XStart + XEnd, YCoord, XStart + XEnd, YCoord + 6);
+ backBuffer.DrawString(((int)pX + ""), drawFont, brushCS, XStart + XEnd + 4, YCoord + 8, format);
+
+ length = (int)(pX / offset);
+ length = (offset == 10) ? length - 1 : length;
+ for (int i=1; i <= length; i++)
+ {
+ XCoord = (float)(offset * i * scale);
+
+ if ((XEnd - XCoord) < 20)
+ continue;
+
+ backBuffer.DrawLine(pen, XStart + XCoord, YCoord, XStart + XCoord, YCoord + 6);
+ backBuffer.DrawString(((int)(i * offset) + ""), drawFont, brushCS, XStart + XCoord + 5, YCoord + 8, format);
+ }
+
+ offsetStep = offset;
+
+ //prepare scale data for y-axis
+ pY = axisYLength;
+ if (pY != 0.0)
+ scale = ((panelHeight - margin) / pY);
+
+ if (scale > 10.0)
+ offset = 1.0f;
+ else if (scale > 2)
+ offset = 10.0f;
+ else if (scale > 0.8)
+ offset = 50.0f;
+ else if (scale > 0.12)
+ offset = 100.0f;
+ else
+ offset = 1000.0f;
+
+ /*************** draw Y-Axis ***************/
+ XCoord = XStart;
+ YCoord = 5.0f;
+ YEnd = YStart - (scale * pY);
+
+ backBuffer.DrawLine(pen, XStart, YStart, XStart, YStart - (panelHeight - margin));
+ backBuffer.DrawLine(pen, XCoord, YStart, XCoord - 10, YStart);
+ backBuffer.DrawString(0 + "", drawFont, brushCS, XCoord - 12, YStart - offsetString, format);
+ backBuffer.DrawLine(pen, XCoord, YEnd, XCoord - 10, YEnd);
+ backBuffer.DrawString(pY + "", drawFont, brushCS, XCoord - 12, YEnd - offsetString, format);
+
+ length = (int)(pY / offset);
+ length = (offset == 10) ? length - 1 : length;
+ for (int i=1; i <= length; i++)
+ {
+ YCoord = (YStart - ((float)offset * i * scale));
+
+ if ((YCoord - YEnd) < 10)
+ continue;
+
+ backBuffer.DrawLine(pen, XCoord, YCoord, XCoord - 10, YCoord);
+ backBuffer.DrawString(((int)(i * offset) + ""), drawFont, brushCS, XCoord - 12, YCoord - offsetString, format);
+ }
+
+ return offsetStep;
+ }
+
+
+ /// <summary>
+ /// Action call for the Mouse-Move event. For the x-coordinate
+ /// supplied by the MouseEvent, the unscaled x and y coordinates
+ /// of the plotted function are determined and displayed
+ /// on the control.
+ /// </summary>
+ private void mouseMoved(object sender, MouseEventArgs e)
+ {
+ int Xh, Xc;
+ HTuple Ytup;
+ float Yh, Yc;
+
+ Xh = e.X;
+
+ if (PreX == Xh || Xh < originX || Xh > BorderRight || func == null)
+ return;
+
+ PreX = Xh;
+
+ Xc = (int)Math.Round((Xh - originX) / scaleX);
+ Ytup = func.GetYValueFunct1d(new HTuple(Xc), "zero");
+
+ Yc = (float)Ytup[0].D;
+ Yh = panelHeight - (Yc * scaleY);
+
+ gPanel.DrawImageUnscaled(functionMap, 0, 0);
+ gPanel.DrawLine(penCursor, Xh, 0, Xh, BorderTop);
+ gPanel.DrawLine(penCursor, originX, Yh, BorderRight + margin, Yh);
+ gPanel.DrawString(("X = " + Xc), drawFont, brushCS, panelWidth - margin, 10);
+ gPanel.DrawString(("Y = " + (int)Yc), drawFont, brushCS, panelWidth - margin, 20);
+ gPanel.Flush();
+ }
+
+
+ /// <summary>
+ /// Action call for the Paint event of the control to trigger the
+ /// repainting of the function plot.
+ /// </summary>
+ private void paint(object sender, System.Windows.Forms.PaintEventArgs e)
+ {
+ repaint();
+ }
+
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/ViewROI/GraphicsContext.cs b/HalconTools/ViewROI/GraphicsContext.cs
new file mode 100644
index 0000000..988813b
--- /dev/null
+++ b/HalconTools/ViewROI/GraphicsContext.cs
@@ -0,0 +1,417 @@
+using System;
+using System.Collections;
+using HalconDotNet;
+
+
+
+namespace HalconTools
+{
+ public delegate void GCDelegate(string val);
+
+ /// <summary>
+ /// This class contains the graphical context of an HALCON object. The
+ /// set of graphical modes is defined by the hashlist 'graphicalSettings'.
+ /// If the list is empty, then there is no difference to the graphical
+ /// setting defined by the system by default. Otherwise, the provided
+ /// HALCON window is adjusted according to the entries of the supplied
+ /// graphical context (when calling applyContext())
+ /// </summary>
+ public class GraphicsContext
+ {
+
+ /// <summary>
+ /// Graphical mode for the output color (see dev_set_color)
+ /// </summary>
+ public const string GC_COLOR = "Color";
+
+ /// <summary>
+ /// Graphical mode for the multi-color output (see dev_set_colored)
+ /// </summary>
+ public const string GC_COLORED = "Colored";
+
+ /// <summary>
+ /// Graphical mode for the line width (see set_line_width)
+ /// </summary>
+ public const string GC_LINEWIDTH = "LineWidth";
+
+ /// <summary>
+ /// Graphical mode for the drawing (see set_draw)
+ /// </summary>
+ public const string GC_DRAWMODE = "DrawMode";
+
+ /// <summary>
+ /// Graphical mode for the drawing shape (see set_shape)
+ /// </summary>
+ public const string GC_SHAPE = "Shape";
+
+ /// <summary>
+ /// Graphical mode for the LUT (lookup table) (see set_lut)
+ /// </summary>
+ public const string GC_LUT = "Lut";
+
+ /// <summary>
+ /// Graphical mode for the painting (see set_paint)
+ /// </summary>
+ public const string GC_PAINT = "Paint";
+
+ /// <summary>
+ /// Graphical mode for the line style (see set_line_style)
+ /// </summary>
+ public const string GC_LINESTYLE = "LineStyle";
+
+ /// <summary>
+ /// Hashlist containing entries for graphical modes (defined by GC_*),
+ /// which is then linked to some HALCON object to describe its
+ /// graphical context.
+ /// </summary>
+ private Hashtable graphicalSettings;
+
+ /// <summary>
+ /// Backup of the last graphical context applied to the window.
+ /// </summary>
+ public Hashtable stateOfSettings;
+
+ private IEnumerator iterator;
+
+ /// <summary>
+ /// Option to delegate messages from the graphical context
+ /// to some observer class
+ /// </summary>
+ public GCDelegate gcNotification;
+
+
+ /// <summary>
+ /// Creates a graphical context with no initial
+ /// graphical modes
+ /// </summary>
+ public GraphicsContext()
+ {
+ graphicalSettings = new Hashtable(10, 0.2f);
+ gcNotification = new GCDelegate(dummy);
+ stateOfSettings = new Hashtable(10, 0.2f);
+ }
+
+
+ /// <summary>
+ /// Creates an instance of the graphical context with
+ /// the modes defined in the hashtable 'settings'
+ /// </summary>
+ /// <param name="settings">
+ /// List of modes, which describes the graphical context
+ /// </param>
+ public GraphicsContext(Hashtable settings)
+ {
+ graphicalSettings = settings;
+ gcNotification = new GCDelegate(dummy);
+ stateOfSettings = new Hashtable(10, 0.2f);
+ }
+
+ /// <summary>Applies graphical context to the HALCON window</summary>
+ /// <param name="window">Active HALCON window</param>
+ /// <param name="cContext">
+ /// List that contains graphical modes for window
+ /// </param>
+ public void applyContext(HWindow window, Hashtable cContext)
+ {
+ string key = "";
+ string valS = "";
+ int valI = -1;
+ HTuple valH = null;
+
+ iterator = cContext.Keys.GetEnumerator();
+
+ try
+ {
+ while (iterator.MoveNext())
+ {
+
+ key = (string)iterator.Current;
+
+ if (stateOfSettings.Contains(key) &&
+ stateOfSettings[key] == cContext[key])
+ continue;
+
+ switch (key)
+ {
+ case GC_COLOR:
+ valS = (string)cContext[key];
+ window.SetColor(valS);
+ if (stateOfSettings.Contains(GC_COLORED))
+ stateOfSettings.Remove(GC_COLORED);
+
+ break;
+ case GC_COLORED:
+ valI = (int)cContext[key];
+ window.SetColored(valI);
+
+ if (stateOfSettings.Contains(GC_COLOR))
+ stateOfSettings.Remove(GC_COLOR);
+
+ break;
+ case GC_DRAWMODE:
+ valS = (string)cContext[key];
+ window.SetDraw(valS);
+ break;
+ case GC_LINEWIDTH:
+ valI = (int)cContext[key];
+ window.SetLineWidth(valI);
+ break;
+ case GC_LUT:
+ valS = (string)cContext[key];
+ window.SetLut(valS);
+ break;
+ case GC_PAINT:
+ valS = (string)cContext[key];
+ window.SetPaint(valS);
+ break;
+ case GC_SHAPE:
+ valS = (string)cContext[key];
+ window.SetShape(valS);
+ break;
+ case GC_LINESTYLE:
+ valH = (HTuple)cContext[key];
+ window.SetLineStyle(valH);
+ break;
+ default:
+ break;
+ }
+
+
+ if (valI != -1)
+ {
+ if (stateOfSettings.Contains(key))
+ stateOfSettings[key] = valI;
+ else
+ stateOfSettings.Add(key, valI);
+
+ valI = -1;
+ }
+ else if (valS != "")
+ {
+ if (stateOfSettings.Contains(key))
+ stateOfSettings[key] = valI;
+ else
+ stateOfSettings.Add(key, valI);
+
+ valS = "";
+ }
+ else if (valH != null)
+ {
+ if (stateOfSettings.Contains(key))
+ stateOfSettings[key] = valI;
+ else
+ stateOfSettings.Add(key, valI);
+
+ valH = null;
+ }
+ }//while
+ }
+ catch (HOperatorException e)
+ {
+ gcNotification(e.Message);
+ return;
+ }
+ }
+
+
+ /// <summary>Sets a value for the graphical mode GC_COLOR</summary>
+ /// <param name="val">
+ /// A single color, e.g. "blue", "green" ...etc.
+ /// </param>
+ public void setColorAttribute(string val)
+ {
+ if (graphicalSettings.ContainsKey(GC_COLORED))
+ graphicalSettings.Remove(GC_COLORED);
+
+ addValue(GC_COLOR, val);
+ }
+
+ /// <summary>Sets a value for the graphical mode GC_COLORED</summary>
+ /// <param name="val">
+ /// The colored mode, which can be either "colored3" or "colored6"
+ /// or "colored12"
+ /// </param>
+ public void setColoredAttribute(int val)
+ {
+ if (graphicalSettings.ContainsKey(GC_COLOR))
+ graphicalSettings.Remove(GC_COLOR);
+
+ addValue(GC_COLORED, val);
+ }
+
+ /// <summary>Sets a value for the graphical mode GC_DRAWMODE</summary>
+ /// <param name="val">
+ /// One of the possible draw modes: "margin" or "fill"
+ /// </param>
+ public void setDrawModeAttribute(string val)
+ {
+ addValue(GC_DRAWMODE, val);
+ }
+
+ /// <summary>Sets a value for the graphical mode GC_LINEWIDTH</summary>
+ /// <param name="val">
+ /// The line width, which can range from 1 to 50
+ /// </param>
+ public void setLineWidthAttribute(int val)
+ {
+ addValue(GC_LINEWIDTH, val);
+ }
+
+ /// <summary>Sets a value for the graphical mode GC_LUT</summary>
+ /// <param name="val">
+ /// One of the possible modes of look up tables. For
+ /// further information on particular setups, please refer to the
+ /// Reference Manual entry of the operator set_lut.
+ /// </param>
+ public void setLutAttribute(string val)
+ {
+ addValue(GC_LUT, val);
+ }
+
+
+ /// <summary>Sets a value for the graphical mode GC_PAINT</summary>
+ /// <param name="val">
+ /// One of the possible paint modes. For further
+ /// information on particular setups, please refer refer to the
+ /// Reference Manual entry of the operator set_paint.
+ /// </param>
+ public void setPaintAttribute(string val)
+ {
+ addValue(GC_PAINT, val);
+ }
+
+
+ /// <summary>Sets a value for the graphical mode GC_SHAPE</summary>
+ /// <param name="val">
+ /// One of the possible shape modes. For further
+ /// information on particular setups, please refer refer to the
+ /// Reference Manual entry of the operator set_shape.
+ /// </param>
+ public void setShapeAttribute(string val)
+ {
+ addValue(GC_SHAPE, val);
+ }
+
+ /// <summary>Sets a value for the graphical mode GC_LINESTYLE</summary>
+ /// <param name="val">
+ /// A line style mode, which works
+ /// identical to the input for the HDevelop operator
+ /// 'set_line_style'. For particular information on this
+ /// topic, please refer to the Reference Manual entry of the operator
+ /// set_line_style.
+ /// </param>
+ public void setLineStyleAttribute(HTuple val)
+ {
+ addValue(GC_LINESTYLE, val);
+ }
+
+ /// <summary>
+ /// Adds a value to the hashlist 'graphicalSettings' for the
+ /// graphical mode described by the parameter 'key'
+ /// </summary>
+ /// <param name="key">
+ /// A graphical mode defined by the constant GC_*
+ /// </param>
+ /// <param name="val">
+ /// Defines the value as an int for this graphical
+ /// mode 'key'
+ /// </param>
+ private void addValue(string key, int val)
+ {
+ if (graphicalSettings.ContainsKey(key))
+ graphicalSettings[key] = val;
+ else
+ graphicalSettings.Add(key, val);
+ }
+
+ /// <summary>
+ /// Adds a value to the hashlist 'graphicalSettings' for the
+ /// graphical mode, described by the parameter 'key'
+ /// </summary>
+ /// <param name="key">
+ /// A graphical mode defined by the constant GC_*
+ /// </param>
+ /// <param name="val">
+ /// Defines the value as a string for this
+ /// graphical mode 'key'
+ /// </param>
+ private void addValue(string key, string val)
+ {
+ if (graphicalSettings.ContainsKey(key))
+ graphicalSettings[key] = val;
+ else
+ graphicalSettings.Add(key, val);
+ }
+
+
+ /// <summary>
+ /// Adds a value to the hashlist 'graphicalSettings' for the
+ /// graphical mode, described by the parameter 'key'
+ /// </summary>
+ /// <param name="key">
+ /// A graphical mode defined by the constant GC_*
+ /// </param>
+ /// <param name="val">
+ /// Defines the value as a HTuple for this
+ /// graphical mode 'key'
+ /// </param>
+ private void addValue(string key, HTuple val)
+ {
+ if (graphicalSettings.ContainsKey(key))
+ graphicalSettings[key] = val;
+ else
+ graphicalSettings.Add(key, val);
+ }
+
+ /// <summary>
+ /// Clears the list of graphical settings.
+ /// There will be no graphical changes made prior
+ /// before drawing objects, since there are no
+ /// graphical entries to be applied to the window.
+ /// </summary>
+ public void clear()
+ {
+ graphicalSettings.Clear();
+ }
+
+
+ /// <summary>
+ /// Returns an exact clone of this graphicsContext instance
+ /// </summary>
+ public GraphicsContext copy()
+ {
+ return new GraphicsContext((Hashtable)this.graphicalSettings.Clone());
+ }
+
+
+ /// <summary>
+ /// If the hashtable contains the key, the corresponding
+ /// hashtable value is returned
+ /// </summary>
+ /// <param name="key">
+ /// One of the graphical keys starting with GC_*
+ /// </param>
+ public object getGraphicsAttribute(string key)
+ {
+ if (graphicalSettings.ContainsKey(key))
+ return graphicalSettings[key];
+
+ return null;
+ }
+
+ /// <summary>
+ /// Returns a copy of the hashtable that carries the
+ /// entries for the current graphical context
+ /// </summary>
+ /// <returns> current graphical context </returns>
+ public Hashtable copyContextList()
+ {
+ return (Hashtable)graphicalSettings.Clone();
+ }
+
+
+ /********************************************************************/
+ public void dummy(string val) { }
+
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/ViewROI/HObjectEntry.cs b/HalconTools/ViewROI/HObjectEntry.cs
new file mode 100644
index 0000000..4d3da44
--- /dev/null
+++ b/HalconTools/ViewROI/HObjectEntry.cs
@@ -0,0 +1,53 @@
+using System;
+using HalconDotNet;
+using System.Collections;
+
+
+
+namespace HalconTools
+{
+
+ /// <summary>
+ /// This class is an auxiliary class, which is used to
+ /// link a graphical context to an HALCON object. The graphical
+ /// context is described by a hashtable, which contains a list of
+ /// graphical modes (e.g GC_COLOR, GC_LINEWIDTH and GC_PAINT)
+ /// and their corresponding values (e.g "blue", "4", "3D-plot"). These
+ /// graphical states are applied to the window before displaying the
+ /// object.
+ /// </summary>
+ public class HObjectEntry
+ {
+ /// <summary>Hashlist defining the graphical context for HObj</summary>
+ public Hashtable gContext;
+
+ /// <summary>HALCON object</summary>
+ public HObject HObj;
+
+
+
+ /// <summary>Constructor</summary>
+ /// <param name="obj">
+ /// HALCON object that is linked to the graphical context gc.
+ /// </param>
+ /// <param name="gc">
+ /// Hashlist of graphical states that are applied before the object
+ /// is displayed.
+ /// </param>
+ public HObjectEntry(HObject obj, Hashtable gc)
+ {
+ gContext = gc;
+ HObj = obj;
+ }
+
+ /// <summary>
+ /// Clears the entries of the class members Hobj and gContext
+ /// </summary>
+ public void clear()
+ {
+ gContext.Clear();
+ HObj.Dispose();
+ }
+
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/ViewROI/HWndCtrl.cs b/HalconTools/ViewROI/HWndCtrl.cs
new file mode 100644
index 0000000..bef1a8e
--- /dev/null
+++ b/HalconTools/ViewROI/HWndCtrl.cs
@@ -0,0 +1,867 @@
+using System;
+using HalconTools;
+using System.Collections;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public delegate void IconicDelegate(int val);
+ public delegate void FuncDelegate();
+
+ /// <summary>
+ /// This class works as a wrapper class for the HALCON window
+ /// HWindow. HWndCtrl is in charge of the visualization.
+ /// You can move and zoom the visible image part by using GUI component
+ /// inputs or with the mouse. The class HWndCtrl uses a graphics stack
+ /// to manage the iconic objects for the display. Each object is linked
+ /// to a graphical context, which determines how the object is to be drawn.
+ /// The context can be changed by calling changeGraphicSettings().
+ /// The graphical "modes" are defined by the class GraphicsContext and
+ /// map most of the dev_set_* operators provided in HDevelop.
+ /// </summary>
+ public class HWndCtrl
+ {
+ /// <summary>No action is performed on mouse events</summary>
+ public const int MODE_VIEW_NONE = 10;
+
+ /// <summary>Zoom is performed on mouse events</summary>
+ public const int MODE_VIEW_ZOOM = 11;
+
+ /// <summary>Move is performed on mouse events</summary>
+ public const int MODE_VIEW_MOVE = 12;
+
+ /// <summary>Magnification is performed on mouse events</summary>
+ public const int MODE_VIEW_ZOOMWINDOW = 13;
+
+
+ public const int MODE_INCLUDE_ROI = 1;
+
+ public const int MODE_EXCLUDE_ROI = 2;
+
+
+ /// <summary>
+ /// Constant describes delegate message to signal new image
+ /// </summary>
+ public const int EVENT_UPDATE_IMAGE = 31;
+ /// <summary>
+ /// Constant describes delegate message to signal error
+ /// when reading an image from file
+ /// </summary>
+ public const int ERR_READING_IMG = 32;
+ /// <summary>
+ /// Constant describes delegate message to signal error
+ /// when defining a graphical context
+ /// </summary>
+ public const int ERR_DEFINING_GC = 33;
+
+ /// <summary>
+ /// Maximum number of HALCON objects that can be put on the graphics
+ /// stack without loss. For each additional object, the first entry
+ /// is removed from the stack again.
+ /// </summary>
+ private const int MAXNUMOBJLIST = 50;
+
+
+ private int stateView;
+ private bool mousePressed = false;
+ private double startX,startY;
+
+ /// <summary>HALCON window</summary>
+ private HWindowControl viewPort;
+
+ /// <summary>
+ /// Instance of ROIController, which manages ROI interaction
+ /// </summary>
+ private ROIController roiManager;
+
+ /* dispROI is a flag to know when to add the ROI models to the
+ paint routine and whether or not to respond to mouse events for
+ ROI objects */
+ private int dispROI;
+
+
+ /* Basic parameters, like dimension of window and displayed image part */
+ private int windowWidth;
+ private int windowHeight;
+ private int imageWidth;
+ private int imageHeight;
+
+ private int[] CompRangeX;
+ private int[] CompRangeY;
+
+
+ private int prevCompX, prevCompY;
+ private double stepSizeX, stepSizeY;
+
+
+ /* Image coordinates, which describe the image part that is displayed
+ in the HALCON window */
+ private double ImgRow1, ImgCol1, ImgRow2, ImgCol2;
+
+ /// <summary>Error message when an exception is thrown</summary>
+ public string exceptionText = "";
+
+
+ /* Delegates to send notification messages to other classes */
+ /// <summary>
+ /// Delegate to add information to the HALCON window after
+ /// the paint routine has finished
+ /// </summary>
+ public FuncDelegate addInfoDelegate;
+
+ /// <summary>
+ /// Delegate to notify about failed tasks of the HWndCtrl instance
+ /// </summary>
+ public IconicDelegate NotifyIconObserver;
+
+
+ private HWindow ZoomWindow;
+ private double zoomWndFactor;
+ private double zoomAddOn;
+ private int zoomWndSize;
+
+
+ /// <summary>
+ /// List of HALCON objects to be drawn into the HALCON window.
+ /// The list shouldn't contain more than MAXNUMOBJLIST objects,
+ /// otherwise the first entry is removed from the list.
+ /// </summary>
+ private ArrayList HObjList;
+
+ /// <summary>
+ /// Instance that describes the graphical context for the
+ /// HALCON window. According on the graphical settings
+ /// attached to each HALCON object, this graphical context list
+ /// is updated constantly.
+ /// </summary>
+ private GraphicsContext mGC;
+
+
+ /// <summary>
+ /// Initializes the image dimension, mouse delegation, and the
+ /// graphical context setup of the instance.
+ /// </summary>
+ /// <param name="view"> HALCON window </param>
+ public HWndCtrl(HWindowControl view)
+ {
+ viewPort = view;
+ stateView = MODE_VIEW_NONE;
+ windowWidth = viewPort.Size.Width;
+ windowHeight = viewPort.Size.Height;
+
+ zoomWndFactor = (double)imageWidth / viewPort.Width;
+ zoomAddOn = Math.Pow(0.9, 5);
+ zoomWndSize = 150;
+
+ /*default*/
+ CompRangeX = new int[] { 0, 100 };
+ CompRangeY = new int[] { 0, 100 };
+
+ prevCompX = prevCompY = 0;
+
+ dispROI = MODE_INCLUDE_ROI;//1;
+
+ viewPort.HMouseUp += new HalconDotNet.HMouseEventHandler(this.mouseUp);
+ viewPort.HMouseDown += new HalconDotNet.HMouseEventHandler(this.mouseDown);
+ viewPort.HMouseMove += new HalconDotNet.HMouseEventHandler(this.mouseMoved);
+
+ addInfoDelegate = new FuncDelegate(dummyV);
+ NotifyIconObserver = new IconicDelegate(dummy);
+
+ // graphical stack
+ HObjList = new ArrayList(20);
+ mGC = new GraphicsContext();
+ mGC.gcNotification = new GCDelegate(exceptionGC);
+ }
+
+
+ /// <summary>
+ /// Registers an instance of an ROIController with this window
+ /// controller (and vice versa).
+ /// </summary>
+ /// <param name="rC">
+ /// Controller that manages interactive ROIs for the HALCON window
+ /// </param>
+ public void useROIController(ROIController rC)
+ {
+ roiManager = rC;
+ rC.setViewController(this);
+ }
+
+
+ /// <summary>
+ /// Read dimensions of the image to adjust own window settings
+ /// </summary>
+ /// <param name="image">HALCON image</param>
+ private void setImagePart(HImage image)
+ {
+ string s;
+ int w,h;
+
+ image.GetImagePointer1(out s, out w, out h);
+ setImagePart(0, 0, h, w);
+ }
+
+
+ /// <summary>
+ /// Adjust window settings by the values supplied for the left
+ /// upper corner and the right lower corner
+ /// </summary>
+ /// <param name="r1">y coordinate of left upper corner</param>
+ /// <param name="c1">x coordinate of left upper corner</param>
+ /// <param name="r2">y coordinate of right lower corner</param>
+ /// <param name="c2">x coordinate of right lower corner</param>
+ private void setImagePart(int r1, int c1, int r2, int c2)
+ {
+ ImgRow1 = r1;
+ ImgCol1 = c1;
+ ImgRow2 = imageHeight = r2;
+ ImgCol2 = imageWidth = c2;
+
+ System.Drawing.Rectangle rect = viewPort.ImagePart;
+ rect.X = (int)ImgCol1;
+ rect.Y = (int)ImgRow1;
+ rect.Height = (int)imageHeight;
+ rect.Width = (int)imageWidth;
+ viewPort.ImagePart = rect;
+ }
+
+
+ /// <summary>
+ /// Sets the view mode for mouse events in the HALCON window
+ /// (zoom, move, magnify or none).
+ /// </summary>
+ /// <param name="mode">One of the MODE_VIEW_* constants</param>
+ public void setViewState(int mode)
+ {
+ stateView = mode;
+
+ if (roiManager != null)
+ roiManager.resetROI();
+ }
+
+ /********************************************************************/
+ private void dummy(int val)
+ {
+ }
+
+ private void dummyV()
+ {
+ }
+
+ /*******************************************************************/
+ private void exceptionGC(string message)
+ {
+ exceptionText = message;
+ NotifyIconObserver(ERR_DEFINING_GC);
+ }
+
+ /// <summary>
+ /// Paint or don't paint the ROIs into the HALCON window by
+ /// defining the parameter to be equal to 1 or not equal to 1.
+ /// </summary>
+ public void setDispLevel(int mode)
+ {
+ dispROI = mode;
+ }
+
+ /****************************************************************************/
+ /* graphical element */
+ /****************************************************************************/
+ private void zoomImage(double x, double y, double scale)
+ {
+ double lengthC, lengthR;
+ double percentC, percentR;
+ int lenC, lenR;
+
+ percentC = (x - ImgCol1) / (ImgCol2 - ImgCol1);
+ percentR = (y - ImgRow1) / (ImgRow2 - ImgRow1);
+
+ lengthC = (ImgCol2 - ImgCol1) * scale;
+ lengthR = (ImgRow2 - ImgRow1) * scale;
+
+ ImgCol1 = x - lengthC * percentC;
+ ImgCol2 = x + lengthC * (1 - percentC);
+
+ ImgRow1 = y - lengthR * percentR;
+ ImgRow2 = y + lengthR * (1 - percentR);
+
+ lenC = (int)Math.Round(lengthC);
+ lenR = (int)Math.Round(lengthR);
+
+ System.Drawing.Rectangle rect = viewPort.ImagePart;
+ rect.X = (int)Math.Round(ImgCol1);
+ rect.Y = (int)Math.Round(ImgRow1);
+ rect.Width = (lenC > 0) ? lenC : 1;
+ rect.Height = (lenR > 0) ? lenR : 1;
+ viewPort.ImagePart = rect;
+
+ zoomWndFactor *= scale;
+ repaint();
+ }
+
+ /// <summary>
+ /// Scales the image in the HALCON window according to the
+ /// value scaleFactor
+ /// </summary>
+ public void zoomImage(double scaleFactor)
+ {
+ double midPointX, midPointY;
+
+ if (((ImgRow2 - ImgRow1) == scaleFactor * imageHeight) &&
+ ((ImgCol2 - ImgCol1) == scaleFactor * imageWidth))
+ {
+ repaint();
+ return;
+ }
+
+ ImgRow2 = ImgRow1 + imageHeight;
+ ImgCol2 = ImgCol1 + imageWidth;
+
+ midPointX = ImgCol1;
+ midPointY = ImgRow1;
+
+ zoomWndFactor = (double)imageWidth / viewPort.Width;
+ zoomImage(midPointX, midPointY, scaleFactor);
+ }
+
+
+ /// <summary>
+ /// Scales the HALCON window according to the value scale
+ /// </summary>
+ public void scaleWindow(double scale)
+ {
+ ImgRow1 = 0;
+ ImgCol1 = 0;
+
+ ImgRow2 = imageHeight;
+ ImgCol2 = imageWidth;
+
+ viewPort.Width = (int)(ImgCol2 * scale);
+ viewPort.Height = (int)(ImgRow2 * scale);
+
+ zoomWndFactor = ((double)imageWidth / viewPort.Width);
+ }
+
+ /// <summary>
+ /// Recalculates the image-window-factor, which needs to be added to
+ /// the scale factor for zooming an image. This way the zoom gets
+ /// adjusted to the window-image relation, expressed by the equation
+ /// imageWidth/viewPort.Width.
+ /// </summary>
+ public void setZoomWndFactor()
+ {
+ zoomWndFactor = ((double)imageWidth / viewPort.Width);
+ }
+
+ /// <summary>
+ /// Sets the image-window-factor to the value zoomF
+ /// </summary>
+ public void setZoomWndFactor(double zoomF)
+ {
+ zoomWndFactor = zoomF;
+ }
+
+ /*******************************************************************/
+ private void moveImage(double motionX, double motionY)
+ {
+ ImgRow1 += -motionY;
+ ImgRow2 += -motionY;
+
+ ImgCol1 += -motionX;
+ ImgCol2 += -motionX;
+
+ System.Drawing.Rectangle rect = viewPort.ImagePart;
+ rect.X = (int)Math.Round(ImgCol1);
+ rect.Y = (int)Math.Round(ImgRow1);
+ viewPort.ImagePart = rect;
+
+ repaint();
+ }
+
+
+ /// <summary>
+ /// Resets all parameters that concern the HALCON window display
+ /// setup to their initial values and clears the ROI list.
+ /// </summary>
+ public void resetAll()
+ {
+ ImgRow1 = 0;
+ ImgCol1 = 0;
+ ImgRow2 = imageHeight;
+ ImgCol2 = imageWidth;
+
+ zoomWndFactor = (double)imageWidth / viewPort.Width;
+
+ System.Drawing.Rectangle rect = viewPort.ImagePart;
+ rect.X = (int)ImgCol1;
+ rect.Y = (int)ImgRow1;
+ rect.Width = (int)imageWidth;
+ rect.Height = (int)imageHeight;
+ viewPort.ImagePart = rect;
+
+
+ if (roiManager != null)
+ roiManager.reset();
+ }
+
+ public void resetWindow()
+ {
+ ImgRow1 = 0;
+ ImgCol1 = 0;
+ ImgRow2 = imageHeight;
+ ImgCol2 = imageWidth;
+
+ zoomWndFactor = (double)imageWidth / viewPort.Width;
+
+ System.Drawing.Rectangle rect = viewPort.ImagePart;
+ rect.X = (int)ImgCol1;
+ rect.Y = (int)ImgRow1;
+ rect.Width = (int)imageWidth;
+ rect.Height = (int)imageHeight;
+ viewPort.ImagePart = rect;
+ }
+
+
+ /*************************************************************************/
+ /* Event handling for mouse */
+ /*************************************************************************/
+ private void mouseDown(object sender, HalconDotNet.HMouseEventArgs e)
+ {
+ mousePressed = true;
+ int activeROIidx = -1;
+ double scale;
+
+ if (roiManager != null && (dispROI == MODE_INCLUDE_ROI))
+ {
+ activeROIidx = roiManager.mouseDownAction(e.X, e.Y);
+ }
+
+ if (activeROIidx == -1)
+ {
+ switch (stateView)
+ {
+ case MODE_VIEW_MOVE:
+ startX = e.X;
+ startY = e.Y;
+ break;
+ case MODE_VIEW_ZOOM:
+ if (e.Button == System.Windows.Forms.MouseButtons.Left)
+ scale = 0.9;
+ else
+ scale = 1 / 0.9;
+ zoomImage(e.X, e.Y, scale);
+ break;
+ case MODE_VIEW_NONE:
+ break;
+ case MODE_VIEW_ZOOMWINDOW:
+ activateZoomWindow((int)e.X, (int)e.Y);
+ break;
+ default:
+ break;
+ }
+ }
+ //end of if
+ }
+
+ /*******************************************************************/
+ private void activateZoomWindow(int X, int Y)
+ {
+ double posX, posY;
+ int zoomZone;
+
+ if (ZoomWindow != null)
+ ZoomWindow.Dispose();
+
+ HOperatorSet.SetSystem("border_width", 10);
+ ZoomWindow = new HWindow();
+
+ posX = ((X - ImgCol1) / (ImgCol2 - ImgCol1)) * viewPort.Width;
+ posY = ((Y - ImgRow1) / (ImgRow2 - ImgRow1)) * viewPort.Height;
+
+ zoomZone = (int)((zoomWndSize / 2) * zoomWndFactor * zoomAddOn);
+ ZoomWindow.OpenWindow((int)posY - (zoomWndSize / 2), (int)posX - (zoomWndSize / 2),
+ zoomWndSize, zoomWndSize,
+ viewPort.HalconID, "visible", "");
+ ZoomWindow.SetPart(Y - zoomZone, X - zoomZone, Y + zoomZone, X + zoomZone);
+ repaint(ZoomWindow);
+ ZoomWindow.SetColor("black");
+ }
+
+ /*******************************************************************/
+ private void mouseUp(object sender, HalconDotNet.HMouseEventArgs e)
+ {
+ mousePressed = false;
+
+ if (roiManager != null
+ && (roiManager.activeROIidx != -1)
+ && (dispROI == MODE_INCLUDE_ROI))
+ {
+ roiManager.NotifyRCObserver(ROIController.EVENT_UPDATE_ROI);
+ }
+ else if (stateView == MODE_VIEW_ZOOMWINDOW)
+ {
+ ZoomWindow.Dispose();
+ }
+ }
+
+ /*******************************************************************/
+ private void mouseMoved(object sender, HalconDotNet.HMouseEventArgs e)
+ {
+ double motionX, motionY;
+ double posX, posY;
+ double zoomZone;
+
+
+ if (!mousePressed)
+ return;
+
+ if (roiManager != null && (roiManager.activeROIidx != -1) && (dispROI == MODE_INCLUDE_ROI))
+ {
+ roiManager.mouseMoveAction(e.X, e.Y);
+ }
+ else if (stateView == MODE_VIEW_MOVE)
+ {
+ motionX = ((e.X - startX));
+ motionY = ((e.Y - startY));
+
+ if (((int)motionX != 0) || ((int)motionY != 0))
+ {
+ moveImage(motionX, motionY);
+ startX = e.X - motionX;
+ startY = e.Y - motionY;
+ }
+ }
+ else if (stateView == MODE_VIEW_ZOOMWINDOW)
+ {
+ HSystem.SetSystem("flush_graphic", "false");
+ ZoomWindow.ClearWindow();
+
+
+ posX = ((e.X - ImgCol1) / (ImgCol2 - ImgCol1)) * viewPort.Width;
+ posY = ((e.Y - ImgRow1) / (ImgRow2 - ImgRow1)) * viewPort.Height;
+ zoomZone = (zoomWndSize / 2) * zoomWndFactor * zoomAddOn;
+
+ ZoomWindow.SetWindowExtents((int)posY - (zoomWndSize / 2),
+ (int)posX - (zoomWndSize / 2),
+ zoomWndSize, zoomWndSize);
+ ZoomWindow.SetPart((int)(e.Y - zoomZone), (int)(e.X - zoomZone),
+ (int)(e.Y + zoomZone), (int)(e.X + zoomZone));
+ repaint(ZoomWindow);
+
+ HSystem.SetSystem("flush_graphic", "true");
+ ZoomWindow.DispLine(-100.0, -100.0, -100.0, -100.0);
+ }
+ }
+
+ /// <summary>
+ /// To initialize the move function using a GUI component, the HWndCtrl
+ /// first needs to know the range supplied by the GUI component.
+ /// For the x direction it is specified by xRange, which is
+ /// calculated as follows: GuiComponentX.Max()-GuiComponentX.Min().
+ /// The starting value of the GUI component has to be supplied
+ /// by the parameter Init
+ /// </summary>
+ public void setGUICompRangeX(int[] xRange, int Init)
+ {
+ int cRangeX;
+
+ CompRangeX = xRange;
+ cRangeX = xRange[1] - xRange[0];
+ prevCompX = Init;
+ stepSizeX = ((double)imageWidth / cRangeX) * (imageWidth / windowWidth);
+
+ }
+
+ /// <summary>
+ /// To initialize the move function using a GUI component, the HWndCtrl
+ /// first needs to know the range supplied by the GUI component.
+ /// For the y direction it is specified by yRange, which is
+ /// calculated as follows: GuiComponentY.Max()-GuiComponentY.Min().
+ /// The starting value of the GUI component has to be supplied
+ /// by the parameter Init
+ /// </summary>
+ public void setGUICompRangeY(int[] yRange, int Init)
+ {
+ int cRangeY;
+
+ CompRangeY = yRange;
+ cRangeY = yRange[1] - yRange[0];
+ prevCompY = Init;
+ stepSizeY = ((double)imageHeight / cRangeY) * (imageHeight / windowHeight);
+ }
+
+
+ /// <summary>
+ /// Resets to the starting value of the GUI component.
+ /// </summary>
+ public void resetGUIInitValues(int xVal, int yVal)
+ {
+ prevCompX = xVal;
+ prevCompY = yVal;
+ }
+
+ /// <summary>
+ /// Moves the image by the value valX supplied by the GUI component
+ /// </summary>
+ public void moveXByGUIHandle(int valX)
+ {
+ double motionX;
+
+ motionX = (valX - prevCompX) * stepSizeX;
+
+ if (motionX == 0)
+ return;
+
+ moveImage(motionX, 0.0);
+ prevCompX = valX;
+ }
+
+
+ /// <summary>
+ /// Moves the image by the value valY supplied by the GUI component
+ /// </summary>
+ public void moveYByGUIHandle(int valY)
+ {
+ double motionY;
+
+ motionY = (valY - prevCompY) * stepSizeY;
+
+ if (motionY == 0)
+ return;
+
+ moveImage(0.0, motionY);
+ prevCompY = valY;
+ }
+
+ /// <summary>
+ /// Zooms the image by the value valF supplied by the GUI component
+ /// </summary>
+ public void zoomByGUIHandle(double valF)
+ {
+ double x, y, scale;
+ double prevScaleC;
+
+
+
+ x = (ImgCol1 + (ImgCol2 - ImgCol1) / 2);
+ y = (ImgRow1 + (ImgRow2 - ImgRow1) / 2);
+
+ prevScaleC = (double)((ImgCol2 - ImgCol1) / imageWidth);
+ scale = ((double)1.0 / prevScaleC * (100.0 / valF));
+
+ zoomImage(x, y, scale);
+ }
+
+ /// <summary>
+ /// Triggers a repaint of the HALCON window
+ /// </summary>
+ public void repaint()
+ {
+ repaint(viewPort.HalconWindow);
+ }
+
+ /// <summary>
+ /// Repaints the HALCON window 'window'
+ /// </summary>
+ public void repaint(HalconDotNet.HWindow window)
+ {
+ int count = HObjList.Count;
+ HObjectEntry entry;
+
+ HSystem.SetSystem("flush_graphic", "false");
+ window.ClearWindow();
+ mGC.stateOfSettings.Clear();
+
+ for (int i=0; i < count; i++)
+ {
+ entry = ((HObjectEntry)HObjList[i]);
+ mGC.applyContext(window, entry.gContext);
+ window.DispObj(entry.HObj);
+ }
+
+ addInfoDelegate();
+
+ if (roiManager != null && (dispROI == MODE_INCLUDE_ROI))
+ roiManager.paintData(window);
+
+ HSystem.SetSystem("flush_graphic", "true");
+
+ window.SetColor("black");
+ window.DispLine(-100.0, -100.0, -101.0, -101.0);
+ }
+
+
+
+ /********************************************************************/
+ /* GRAPHICSSTACK */
+ /********************************************************************/
+
+ /// <summary>
+ /// Adds an iconic object to the graphics stack similar to the way
+ /// it is defined for the HDevelop graphics stack.
+ /// </summary>
+ /// <param name="obj">Iconic object</param>
+ public void addIconicVar(HObject obj)
+ {
+ HObjectEntry entry;
+
+ if (obj == null)
+ return;
+
+ if (obj is HImage)
+ {
+ double r, c;
+ int h, w, area;
+ string s;
+
+ area = ((HImage)obj).GetDomain().AreaCenter(out r, out c);
+ ((HImage)obj).GetImagePointer1(out s, out w, out h);
+
+ if (area == (w * h))
+ {
+ clearList();
+
+ if ((h != imageHeight) || (w != imageWidth))
+ {
+ imageHeight = h;
+ imageWidth = w;
+ zoomWndFactor = (double)imageWidth / viewPort.Width;
+ setImagePart(0, 0, h, w);
+ }
+ }//if
+ }//if
+
+ entry = new HObjectEntry(obj, mGC.copyContextList());
+
+ HObjList.Add(entry);
+
+ if (HObjList.Count > MAXNUMOBJLIST)
+ HObjList.RemoveAt(1);
+ }
+
+
+ /// <summary>
+ /// Clears all entries from the graphics stack
+ /// </summary>
+ public void clearList()
+ {
+ HObjList.Clear();
+ }
+
+ /// <summary>
+ /// Returns the number of items on the graphics stack
+ /// </summary>
+ public int getListCount()
+ {
+ return HObjList.Count;
+ }
+
+ /// <summary>
+ /// Changes the current graphical context by setting the specified mode
+ /// (constant starting by GC_*) to the specified value.
+ /// </summary>
+ /// <param name="mode">
+ /// Constant that is provided by the class GraphicsContext
+ /// and describes the mode that has to be changed,
+ /// e.g., GraphicsContext.GC_COLOR
+ /// </param>
+ /// <param name="val">
+ /// Value, provided as a string,
+ /// the mode is to be changed to, e.g., "blue"
+ /// </param>
+ public void changeGraphicSettings(string mode, string val)
+ {
+ switch (mode)
+ {
+ case GraphicsContext.GC_COLOR:
+ mGC.setColorAttribute(val);
+ break;
+ case GraphicsContext.GC_DRAWMODE:
+ mGC.setDrawModeAttribute(val);
+ break;
+ case GraphicsContext.GC_LUT:
+ mGC.setLutAttribute(val);
+ break;
+ case GraphicsContext.GC_PAINT:
+ mGC.setPaintAttribute(val);
+ break;
+ case GraphicsContext.GC_SHAPE:
+ mGC.setShapeAttribute(val);
+ break;
+ default:
+ break;
+ }
+ }
+
+ /// <summary>
+ /// Changes the current graphical context by setting the specified mode
+ /// (constant starting by GC_*) to the specified value.
+ /// </summary>
+ /// <param name="mode">
+ /// Constant that is provided by the class GraphicsContext
+ /// and describes the mode that has to be changed,
+ /// e.g., GraphicsContext.GC_LINEWIDTH
+ /// </param>
+ /// <param name="val">
+ /// Value, provided as an integer, the mode is to be changed to,
+ /// e.g., 5
+ /// </param>
+ public void changeGraphicSettings(string mode, int val)
+ {
+ switch (mode)
+ {
+ case GraphicsContext.GC_COLORED:
+ mGC.setColoredAttribute(val);
+ break;
+ case GraphicsContext.GC_LINEWIDTH:
+ mGC.setLineWidthAttribute(val);
+ break;
+ default:
+ break;
+ }
+ }
+
+ /// <summary>
+ /// Changes the current graphical context by setting the specified mode
+ /// (constant starting by GC_*) to the specified value.
+ /// </summary>
+ /// <param name="mode">
+ /// Constant that is provided by the class GraphicsContext
+ /// and describes the mode that has to be changed,
+ /// e.g., GraphicsContext.GC_LINESTYLE
+ /// </param>
+ /// <param name="val">
+ /// Value, provided as an HTuple instance, the mode is
+ /// to be changed to, e.g., new HTuple(new int[]{2,2})
+ /// </param>
+ public void changeGraphicSettings(string mode, HTuple val)
+ {
+ switch (mode)
+ {
+ case GraphicsContext.GC_LINESTYLE:
+ mGC.setLineStyleAttribute(val);
+ break;
+ default:
+ break;
+ }
+ }
+
+ /// <summary>
+ /// Clears all entries from the graphical context list
+ /// </summary>
+ public void clearGraphicContext()
+ {
+ mGC.clear();
+ }
+
+ /// <summary>
+ /// Returns a clone of the graphical context list (hashtable)
+ /// </summary>
+ public Hashtable getGraphicContext()
+ {
+ return mGC.copyContextList();
+ }
+
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/ViewROI/ROI.cs b/HalconTools/ViewROI/ROI.cs
new file mode 100644
index 0000000..37b233d
--- /dev/null
+++ b/HalconTools/ViewROI/ROI.cs
@@ -0,0 +1,161 @@
+using System;
+using HalconDotNet;
+
+
+namespace HalconTools
+{
+
+ /// <summary>
+ /// This class is a base class containing virtual methods for handling
+ /// ROIs. Therefore, an inheriting class needs to define/override these
+ /// methods to provide the ROIController with the necessary information on
+ /// its (= the ROIs) shape and position. The example project provides
+ /// derived ROI shapes for rectangles, lines, circles, and circular arcs.
+ /// To use other shapes you must derive a new class from the base class
+ /// ROI and implement its methods.
+ /// </summary>
+ public class ROI
+ {
+
+ // class members of inheriting ROI classes
+ protected int NumHandles;
+ protected int activeHandleIdx;
+
+ /// <summary>
+ /// Flag to define the ROI to be 'positive' or 'negative'.
+ /// </summary>
+ protected int OperatorFlag;
+
+ /// <summary>Parameter to define the line style of the ROI.</summary>
+ public HTuple flagLineStyle;
+
+ /// <summary>Constant for a positive ROI flag.</summary>
+ public const int POSITIVE_FLAG = ROIController.MODE_ROI_POS;
+
+ /// <summary>Constant for a negative ROI flag.</summary>
+ public const int NEGATIVE_FLAG = ROIController.MODE_ROI_NEG;
+
+ public const int ROI_TYPE_LINE = 10;
+ public const int ROI_TYPE_CIRCLE = 11;
+ public const int ROI_TYPE_CIRCLEARC = 12;
+ public const int ROI_TYPE_RECTANCLE1 = 13;
+ public const int ROI_TYPE_RECTANGLE2 = 14;
+
+
+ protected HTuple posOperation = new HTuple();
+ protected HTuple negOperation = new HTuple(new int[] { 2, 2 });
+
+ /// <summary>Constructor of abstract ROI class.</summary>
+ public ROI() { }
+
+ /// <summary>Creates a new ROI instance at the mouse position.</summary>
+ /// <param name="midX">
+ /// x (=column) coordinate for ROI
+ /// </param>
+ /// <param name="midY">
+ /// y (=row) coordinate for ROI
+ /// </param>
+ public virtual void createROI(double midX, double midY) { }
+
+ /// <summary>Paints the ROI into the supplied window.</summary>
+ /// <param name="window">HALCON window</param>
+ public virtual void draw(HalconDotNet.HWindow window) { }
+
+ /// <summary>
+ /// Returns the distance of the ROI handle being
+ /// closest to the image point(x,y)
+ /// </summary>
+ /// <param name="x">x (=column) coordinate</param>
+ /// <param name="y">y (=row) coordinate</param>
+ /// <returns>
+ /// Distance of the closest ROI handle.
+ /// </returns>
+ public virtual double distToClosestHandle(double x, double y)
+ {
+ return 0.0;
+ }
+
+ /// <summary>
+ /// Paints the active handle of the ROI object into the supplied window.
+ /// </summary>
+ /// <param name="window">HALCON window</param>
+ public virtual void displayActive(HalconDotNet.HWindow window) { }
+
+ /// <summary>
+ /// Recalculates the shape of the ROI. Translation is
+ /// performed at the active handle of the ROI object
+ /// for the image coordinate (x,y).
+ /// </summary>
+ /// <param name="x">x (=column) coordinate</param>
+ /// <param name="y">y (=row) coordinate</param>
+ public virtual void moveByHandle(double x, double y) { }
+
+ /// <summary>Gets the HALCON region described by the ROI.</summary>
+ public virtual HRegion getRegion()
+ {
+ return null;
+ }
+
+ public virtual double getDistanceFromStartPoint(double row, double col)
+ {
+ return 0.0;
+ }
+ /// <summary>
+ /// Gets the model information described by
+ /// the ROI.
+ /// </summary>
+ public virtual HTuple getModelData()
+ {
+ return null;
+ }
+
+ /// <summary>Number of handles defined for the ROI.</summary>
+ /// <returns>Number of handles</returns>
+ public int getNumHandles()
+ {
+ return NumHandles;
+ }
+
+ /// <summary>Gets the active handle of the ROI.</summary>
+ /// <returns>Index of the active handle (from the handle list)</returns>
+ public int getActHandleIdx()
+ {
+ return activeHandleIdx;
+ }
+
+ /// <summary>
+ /// Gets the sign of the ROI object, being either
+ /// 'positive' or 'negative'. This sign is used when creating a model
+ /// region for matching applications from a list of ROIs.
+ /// </summary>
+ public int getOperatorFlag()
+ {
+ return OperatorFlag;
+ }
+
+ /// <summary>
+ /// Sets the sign of a ROI object to be positive or negative.
+ /// The sign is used when creating a model region for matching
+ /// applications by summing up all positive and negative ROI models
+ /// created so far.
+ /// </summary>
+ /// <param name="flag">Sign of ROI object</param>
+ public void setOperatorFlag(int flag)
+ {
+ OperatorFlag = flag;
+
+ switch (OperatorFlag)
+ {
+ case ROI.POSITIVE_FLAG:
+ flagLineStyle = posOperation;
+ break;
+ case ROI.NEGATIVE_FLAG:
+ flagLineStyle = negOperation;
+ break;
+ default:
+ flagLineStyle = posOperation;
+ break;
+ }
+ }
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/ViewROI/ROICircle.cs b/HalconTools/ViewROI/ROICircle.cs
new file mode 100644
index 0000000..a20d061
--- /dev/null
+++ b/HalconTools/ViewROI/ROICircle.cs
@@ -0,0 +1,155 @@
+using System;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ /// <summary>
+ /// This class demonstrates one of the possible implementations for a
+ /// circular ROI. ROICircle inherits from the base class ROI and
+ /// implements (besides other auxiliary methods) all virtual methods
+ /// defined in ROI.cs.
+ /// </summary>
+ public class ROICircle : ROI
+ {
+
+ public double radius;
+ public double row1, col1; // first handle
+ public double midR, midC; // second handle
+
+
+ public ROICircle()
+ {
+ NumHandles = 2; // one at corner of circle + midpoint
+ activeHandleIdx = 1;
+ }
+
+ public double hradius = 100;
+
+ /// <summary>Creates a new ROI instance at the mouse position</summary>
+ public override void createROI(double midX, double midY)
+ {
+ midR = midY;
+ midC = midX;
+
+ radius = hradius;
+
+ row1 = midR;
+ col1 = midC + radius;
+ }
+
+ /// <summary>Paints the ROI into the supplied window</summary>
+ /// <param name="window">HALCON window</param>
+ public override void draw(HalconDotNet.HWindow window)
+ {
+ window.DispCircle(midR, midC, radius);
+ window.DispRectangle2(row1, col1, 0, 5, 5);
+ window.DispRectangle2(midR, midC, 0, 5, 5);
+ }
+
+ /// <summary>
+ /// Returns the distance of the ROI handle being
+ /// closest to the image point(x,y)
+ /// </summary>
+ public override double distToClosestHandle(double x, double y)
+ {
+ double max = 10000;
+ double [] val = new double[NumHandles];
+
+ val[0] = HMisc.DistancePp(y, x, row1, col1); // border handle
+ val[1] = HMisc.DistancePp(y, x, midR, midC); // midpoint
+
+ for (int i=0; i < NumHandles; i++)
+ {
+ if (val[i] < max)
+ {
+ max = val[i];
+ activeHandleIdx = i;
+ }
+ }// end of for
+ return val[activeHandleIdx];
+ }
+
+ /// <summary>
+ /// Paints the active handle of the ROI object into the supplied window
+ /// </summary>
+ public override void displayActive(HalconDotNet.HWindow window)
+ {
+
+ switch (activeHandleIdx)
+ {
+ case 0:
+ window.DispRectangle2(row1, col1, 0, 5, 5);
+ break;
+ case 1:
+ window.DispRectangle2(midR, midC, 0, 5, 5);
+ break;
+ }
+ }
+
+ /// <summary>Gets the HALCON region described by the ROI</summary>
+ public override HRegion getRegion()
+ {
+ HRegion region = new HRegion();
+ region.GenCircle(midR, midC, radius);
+ return region;
+ }
+
+ public override double getDistanceFromStartPoint(double row, double col)
+ {
+ double sRow = midR; // assumption: we have an angle starting at 0.0
+ double sCol = midC + 1 * radius;
+
+ double angle = HMisc.AngleLl(midR, midC, sRow, sCol, midR, midC, row, col);
+
+ if (angle < 0)
+ angle += 2 * Math.PI;
+
+ return (radius * angle);
+ }
+
+ /// <summary>
+ /// Gets the model information described by
+ /// the ROI
+ /// </summary>
+ public override HTuple getModelData()
+ {
+ return new HTuple(new double[] { midR, midC, radius });
+ }
+
+ /// <summary>
+ /// Recalculates the shape of the ROI. Translation is
+ /// performed at the active handle of the ROI object
+ /// for the image coordinate (x,y)
+ /// </summary>
+ public override void moveByHandle(double newX, double newY)
+ {
+ HTuple distance;
+ double shiftX,shiftY;
+
+ switch (activeHandleIdx)
+ {
+ case 0: // handle at circle border
+
+ row1 = newY;
+ col1 = newX;
+ HOperatorSet.DistancePp(new HTuple(row1), new HTuple(col1),
+ new HTuple(midR), new HTuple(midC),
+ out distance);
+
+ radius = distance[0].D;
+ break;
+ case 1: // midpoint
+
+ shiftY = midR - newY;
+ shiftX = midC - newX;
+
+ midR = newY;
+ midC = newX;
+
+ row1 -= shiftY;
+ col1 -= shiftX;
+ break;
+ }
+ }
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/ViewROI/ROICircularArc.cs b/HalconTools/ViewROI/ROICircularArc.cs
new file mode 100644
index 0000000..47615b5
--- /dev/null
+++ b/HalconTools/ViewROI/ROICircularArc.cs
@@ -0,0 +1,305 @@
+using System;
+using HalconDotNet;
+
+namespace HalconTools
+{
+
+ /// <summary>
+ /// This class implements an ROI shaped as a circular
+ /// arc. ROICircularArc inherits from the base class ROI and
+ /// implements (besides other auxiliary methods) all virtual methods
+ /// defined in ROI.cs.
+ /// </summary>
+ public class ROICircularArc : ROI
+ {
+ //handles
+ private double midR, midC; // 0. handle: midpoint
+ private double sizeR, sizeC; // 1. handle
+ private double startR, startC; // 2. handle
+ private double extentR, extentC; // 3. handle
+
+ //model data to specify the arc
+ private double radius;
+ private double startPhi, extentPhi; // -2*PI <= x <= 2*PI
+
+ //display attributes
+ private HXLDCont contour;
+ private HXLDCont arrowHandleXLD;
+ private string circDir;
+ private double TwoPI;
+ private double PI;
+
+
+ public ROICircularArc()
+ {
+ NumHandles = 4; // midpoint handle + three handles on the arc
+ activeHandleIdx = 0;
+ contour = new HXLDCont();
+ circDir = "";
+
+ TwoPI = 2 * Math.PI;
+ PI = Math.PI;
+
+ arrowHandleXLD = new HXLDCont();
+ arrowHandleXLD.GenEmptyObj();
+ }
+
+ /// <summary>Creates a new ROI instance at the mouse position</summary>
+ public override void createROI(double midX, double midY)
+ {
+ midR = midY;
+ midC = midX;
+
+ radius = 100;
+
+ sizeR = midR;
+ sizeC = midC - radius;
+
+ startPhi = PI * 0.25;
+ extentPhi = PI * 1.5;
+ circDir = "positive";
+
+ determineArcHandles();
+ updateArrowHandle();
+ }
+
+ /// <summary>Paints the ROI into the supplied window</summary>
+ /// <param name="window">HALCON window</param>
+ public override void draw(HalconDotNet.HWindow window)
+ {
+ contour.Dispose();
+ contour.GenCircleContourXld(midR, midC, radius, startPhi,
+ (startPhi + extentPhi), circDir, 1.0);
+ window.DispObj(contour);
+ window.DispRectangle2(sizeR, sizeC, 0, 5, 5);
+ window.DispRectangle2(midR, midC, 0, 5, 5);
+ window.DispRectangle2(startR, startC, startPhi, 10, 2);
+ window.DispObj(arrowHandleXLD);
+ }
+
+ /// <summary>
+ /// Returns the distance of the ROI handle being
+ /// closest to the image point(x,y)
+ /// </summary>
+ public override double distToClosestHandle(double x, double y)
+ {
+ double max = 10000;
+ double [] val = new double[NumHandles];
+
+ val[0] = HMisc.DistancePp(y, x, midR, midC); // midpoint
+ val[1] = HMisc.DistancePp(y, x, sizeR, sizeC); // border handle
+ val[2] = HMisc.DistancePp(y, x, startR, startC); // border handle
+ val[3] = HMisc.DistancePp(y, x, extentR, extentC); // border handle
+
+ for (int i=0; i < NumHandles; i++)
+ {
+ if (val[i] < max)
+ {
+ max = val[i];
+ activeHandleIdx = i;
+ }
+ }// end of for
+ return val[activeHandleIdx];
+ }
+
+ /// <summary>
+ /// Paints the active handle of the ROI object into the supplied window
+ /// </summary>
+ public override void displayActive(HalconDotNet.HWindow window)
+ {
+ switch (activeHandleIdx)
+ {
+ case 0:
+ window.DispRectangle2(midR, midC, 0, 5, 5);
+ break;
+ case 1:
+ window.DispRectangle2(sizeR, sizeC, 0, 5, 5);
+ break;
+ case 2:
+ window.DispRectangle2(startR, startC, startPhi, 10, 2);
+ break;
+ case 3:
+ window.DispObj(arrowHandleXLD);
+ break;
+ }
+ }
+
+ /// <summary>
+ /// Recalculates the shape of the ROI. Translation is
+ /// performed at the active handle of the ROI object
+ /// for the image coordinate (x,y)
+ /// </summary>
+ public override void moveByHandle(double newX, double newY)
+ {
+ HTuple distance;
+ double dirX, dirY, prior, next, valMax, valMin;
+
+ switch (activeHandleIdx)
+ {
+ case 0: // midpoint
+ dirY = midR - newY;
+ dirX = midC - newX;
+
+ midR = newY;
+ midC = newX;
+
+ sizeR -= dirY;
+ sizeC -= dirX;
+
+ determineArcHandles();
+ break;
+
+ case 1: // handle at circle border
+ sizeR = newY;
+ sizeC = newX;
+
+ HOperatorSet.DistancePp(new HTuple(sizeR), new HTuple(sizeC),
+ new HTuple(midR), new HTuple(midC), out distance);
+ radius = distance[0].D;
+ determineArcHandles();
+ break;
+
+ case 2: // start handle for arc
+ dirY = newY - midR;
+ dirX = newX - midC;
+
+ startPhi = Math.Atan2(-dirY, dirX);
+
+ if (startPhi < 0)
+ startPhi = PI + (startPhi + PI);
+
+ setStartHandle();
+ prior = extentPhi;
+ extentPhi = HMisc.AngleLl(midR, midC, startR, startC, midR, midC, extentR, extentC);
+
+ if (extentPhi < 0 && prior > PI * 0.8)
+ extentPhi = (PI + extentPhi) + PI;
+ else if (extentPhi > 0 && prior < -PI * 0.7)
+ extentPhi = -PI - (PI - extentPhi);
+
+ break;
+
+ case 3: // end handle for arc
+ dirY = newY - midR;
+ dirX = newX - midC;
+
+ prior = extentPhi;
+ next = Math.Atan2(-dirY, dirX);
+
+ if (next < 0)
+ next = PI + (next + PI);
+
+ if (circDir == "positive" && startPhi >= next)
+ extentPhi = (next + TwoPI) - startPhi;
+ else if (circDir == "positive" && next > startPhi)
+ extentPhi = next - startPhi;
+ else if (circDir == "negative" && startPhi >= next)
+ extentPhi = -1.0 * (startPhi - next);
+ else if (circDir == "negative" && next > startPhi)
+ extentPhi = -1.0 * (startPhi + TwoPI - next);
+
+ valMax = Math.Max(Math.Abs(prior), Math.Abs(extentPhi));
+ valMin = Math.Min(Math.Abs(prior), Math.Abs(extentPhi));
+
+ if ((valMax - valMin) >= PI)
+ extentPhi = (circDir == "positive") ? -1.0 * valMin : valMin;
+
+ setExtentHandle();
+ break;
+ }
+
+ circDir = (extentPhi < 0) ? "negative" : "positive";
+ updateArrowHandle();
+ }
+
+ /// <summary>Gets the HALCON region described by the ROI</summary>
+ public override HRegion getRegion()
+ {
+ HRegion region;
+ contour.Dispose();
+ contour.GenCircleContourXld(midR, midC, radius, startPhi, (startPhi + extentPhi), circDir, 1.0);
+ region = new HRegion(contour);
+ return region;
+ }
+
+ /// <summary>
+ /// Gets the model information described by the ROI
+ /// </summary>
+ public override HTuple getModelData()
+ {
+ return new HTuple(new double[] { midR, midC, radius, startPhi, extentPhi });
+ }
+
+ /// <summary>
+ /// Auxiliary method to determine the positions of the second and
+ /// third handle.
+ /// </summary>
+ private void determineArcHandles()
+ {
+ setStartHandle();
+ setExtentHandle();
+ }
+
+ /// <summary>
+ /// Auxiliary method to recalculate the start handle for the arc
+ /// </summary>
+ private void setStartHandle()
+ {
+ startR = midR - radius * Math.Sin(startPhi);
+ startC = midC + radius * Math.Cos(startPhi);
+ }
+
+ /// <summary>
+ /// Auxiliary method to recalculate the extent handle for the arc
+ /// </summary>
+ private void setExtentHandle()
+ {
+ extentR = midR - radius * Math.Sin(startPhi + extentPhi);
+ extentC = midC + radius * Math.Cos(startPhi + extentPhi);
+ }
+
+ /// <summary>
+ /// Auxiliary method to display an arrow at the extent arc position
+ /// </summary>
+ private void updateArrowHandle()
+ {
+ double row1, col1, row2, col2;
+ double rowP1, colP1, rowP2, colP2;
+ double length,dr,dc, halfHW, sign, angleRad;
+ double headLength = 15;
+ double headWidth = 15;
+
+ arrowHandleXLD.Dispose();
+ arrowHandleXLD.GenEmptyObj();
+
+ row2 = extentR;
+ col2 = extentC;
+ angleRad = (startPhi + extentPhi) + Math.PI * 0.5;
+
+ sign = (circDir == "negative") ? -1.0 : 1.0;
+ row1 = row2 + sign * Math.Sin(angleRad) * 20;
+ col1 = col2 - sign * Math.Cos(angleRad) * 20;
+
+ length = HMisc.DistancePp(row1, col1, row2, col2);
+ if (length == 0)
+ length = -1;
+
+ dr = (row2 - row1) / length;
+ dc = (col2 - col1) / length;
+
+ halfHW = headWidth / 2.0;
+ rowP1 = row1 + (length - headLength) * dr + halfHW * dc;
+ rowP2 = row1 + (length - headLength) * dr - halfHW * dc;
+ colP1 = col1 + (length - headLength) * dc - halfHW * dr;
+ colP2 = col1 + (length - headLength) * dc + halfHW * dr;
+
+ if (length == -1)
+ arrowHandleXLD.GenContourPolygonXld(row1, col1);
+ else
+ arrowHandleXLD.GenContourPolygonXld(new HTuple(new double[] { row1, row2, rowP1, row2, rowP2, row2 }),
+ new HTuple(new double[] { col1, col2, colP1, col2, colP2, col2 }));
+ }
+
+ }//end of class
+}//end of namespace
+
diff --git a/HalconTools/ViewROI/ROIController.cs b/HalconTools/ViewROI/ROIController.cs
new file mode 100644
index 0000000..5c3d429
--- /dev/null
+++ b/HalconTools/ViewROI/ROIController.cs
@@ -0,0 +1,402 @@
+using System;
+using HalconDotNet;
+using HalconTools;
+using System.Collections;
+
+
+
+namespace HalconTools
+{
+
+ public delegate void FuncROIDelegate();
+
+ /// <summary>
+ /// This class creates and manages ROI objects. It responds
+ /// to mouse device inputs using the methods mouseDownAction and
+ /// mouseMoveAction. You don't have to know this class in detail when you
+ /// build your own C# project. But you must consider a few things if
+ /// you want to use interactive ROIs in your application: There is a
+ /// quite close connection between the ROIController and the HWndCtrl
+ /// class, which means that you must 'register' the ROIController
+ /// with the HWndCtrl, so the HWndCtrl knows it has to forward user input
+ /// (like mouse events) to the ROIController class.
+ /// The visualization and manipulation of the ROI objects is done
+ /// by the ROIController.
+ /// This class provides special support for the matching
+ /// applications by calculating a model region from the list of ROIs. For
+ /// this, ROIs are added and subtracted according to their sign.
+ /// </summary>
+ public class ROIController
+ {
+
+ /// <summary>
+ /// Constant for setting the ROI mode: positive ROI sign.
+ /// </summary>
+ public const int MODE_ROI_POS = 21;
+
+ /// <summary>
+ /// Constant for setting the ROI mode: negative ROI sign.
+ /// </summary>
+ public const int MODE_ROI_NEG = 22;
+
+ /// <summary>
+ /// Constant for setting the ROI mode: no model region is computed as
+ /// the sum of all ROI objects.
+ /// </summary>
+ public const int MODE_ROI_NONE = 23;
+
+ /// <summary>Constant describing an update of the model region</summary>
+ public const int EVENT_UPDATE_ROI = 50;
+
+ public const int EVENT_CHANGED_ROI_SIGN = 51;
+
+ /// <summary>Constant describing an update of the model region</summary>
+ public const int EVENT_MOVING_ROI = 52;
+
+ public const int EVENT_DELETED_ACTROI = 53;
+
+ public const int EVENT_DELETED_ALL_ROIS = 54;
+
+ public const int EVENT_ACTIVATED_ROI = 55;
+
+ public const int EVENT_CREATED_ROI = 56;
+
+
+ private ROI roiMode;
+ private int stateROI;
+ private double currX, currY;
+
+
+ /// <summary>Index of the active ROI object</summary>
+ public int activeROIidx;
+ public int deletedIdx;
+
+ /// <summary>List containing all created ROI objects so far</summary>
+ public ArrayList ROIList;
+
+ /// <summary>
+ /// Region obtained by summing up all negative
+ /// and positive ROI objects from the ROIList
+ /// </summary>
+ public HRegion ModelROI;
+
+ private string activeCol = "green";
+ private string activeHdlCol = "red";
+ private string inactiveCol = "yellow";
+
+ /// <summary>
+ /// Reference to the HWndCtrl, the ROI Controller is registered to
+ /// </summary>
+ public HWndCtrl viewController;
+
+ /// <summary>
+ /// Delegate that notifies about changes made in the model region
+ /// </summary>
+ public IconicDelegate NotifyRCObserver;
+
+ /// <summary>Constructor</summary>
+ public ROIController()
+ {
+ stateROI = MODE_ROI_NONE;
+ ROIList = new ArrayList();
+ activeROIidx = -1;
+ ModelROI = new HRegion();
+ NotifyRCObserver = new IconicDelegate(dummyI);
+ deletedIdx = -1;
+ currX = currY = -1;
+ }
+
+ /// <summary>Registers the HWndCtrl to this ROIController instance</summary>
+ public void setViewController(HWndCtrl view)
+ {
+ viewController = view;
+ }
+
+ /// <summary>Gets the ModelROI object</summary>
+ public HRegion getModelRegion()
+ {
+ return ModelROI;
+ }
+
+ /// <summary>Gets the List of ROIs created so far</summary>
+ public ArrayList getROIList()
+ {
+ return ROIList;
+ }
+
+ /// <summary>Get the active ROI</summary>
+ public ROI getActiveROI()
+ {
+ if (activeROIidx != -1)
+ return ((ROI)ROIList[activeROIidx]);
+
+ return null;
+ }
+
+ public int getActiveROIIdx()
+ {
+ return activeROIidx;
+ }
+
+ public void setActiveROIIdx(int active)
+ {
+ activeROIidx = active;
+ }
+
+ public int getDelROIIdx()
+ {
+ return deletedIdx;
+ }
+
+ /// <summary>
+ /// To create a new ROI object the application class initializes a
+ /// 'seed' ROI instance and passes it to the ROIController.
+ /// The ROIController now responds by manipulating this new ROI
+ /// instance.
+ /// </summary>
+ /// <param name="r">
+ /// 'Seed' ROI object forwarded by the application forms class.
+ /// </param>
+ public void setROIShape(ROI r)
+ {
+ roiMode = r;
+ roiMode.setOperatorFlag(stateROI);
+ }
+
+
+ /// <summary>
+ /// Sets the sign of a ROI object to the value 'mode' (MODE_ROI_NONE,
+ /// MODE_ROI_POS,MODE_ROI_NEG)
+ /// </summary>
+ public void setROISign(int mode)
+ {
+ stateROI = mode;
+
+ if (activeROIidx != -1)
+ {
+ ((ROI)ROIList[activeROIidx]).setOperatorFlag(stateROI);
+ viewController.repaint();
+ NotifyRCObserver(ROIController.EVENT_CHANGED_ROI_SIGN);
+ }
+ }
+
+ /// <summary>
+ /// Removes the ROI object that is marked as active.
+ /// If no ROI object is active, then nothing happens.
+ /// </summary>
+ public void removeActive()
+ {
+ if (activeROIidx != -1)
+ {
+ ROIList.RemoveAt(activeROIidx);
+ deletedIdx = activeROIidx;
+ activeROIidx = -1;
+ viewController.repaint();
+ NotifyRCObserver(EVENT_DELETED_ACTROI);
+ }
+ }
+
+
+ /// <summary>
+ /// Calculates the ModelROI region for all objects contained
+ /// in ROIList, by adding and subtracting the positive and
+ /// negative ROI objects.
+ /// </summary>
+ public bool defineModelROI()
+ {
+ HRegion tmpAdd, tmpDiff, tmp;
+ double row, col;
+
+ if (stateROI == MODE_ROI_NONE)
+ return true;
+
+ tmpAdd = new HRegion();
+ tmpDiff = new HRegion();
+ tmpAdd.GenEmptyRegion();
+ tmpDiff.GenEmptyRegion();
+
+ for (int i=0; i < ROIList.Count; i++)
+ {
+ switch (((ROI)ROIList[i]).getOperatorFlag())
+ {
+ case ROI.POSITIVE_FLAG:
+ tmp = ((ROI)ROIList[i]).getRegion();
+ tmpAdd = tmp.Union2(tmpAdd);
+ break;
+ case ROI.NEGATIVE_FLAG:
+ tmp = ((ROI)ROIList[i]).getRegion();
+ tmpDiff = tmp.Union2(tmpDiff);
+ break;
+ default:
+ break;
+ }//end of switch
+ }//end of for
+
+ ModelROI = null;
+
+ if (tmpAdd.AreaCenter(out row, out col) > 0)
+ {
+ tmp = tmpAdd.Difference(tmpDiff);
+ if (tmp.AreaCenter(out row, out col) > 0)
+ ModelROI = tmp;
+ }
+
+ //in case the set of positiv and negative ROIs dissolve
+ if (ModelROI == null || ROIList.Count == 0)
+ return false;
+
+ return true;
+ }
+
+
+ /// <summary>
+ /// Clears all variables managing ROI objects
+ /// </summary>
+ public void reset()
+ {
+ ROIList.Clear();
+ activeROIidx = -1;
+ ModelROI = null;
+ roiMode = null;
+ NotifyRCObserver(EVENT_DELETED_ALL_ROIS);
+ }
+
+
+ /// <summary>
+ /// Deletes this ROI instance if a 'seed' ROI object has been passed
+ /// to the ROIController by the application class.
+ ///
+ /// </summary>
+ public void resetROI()
+ {
+ activeROIidx = -1;
+ roiMode = null;
+ }
+
+ /// <summary>Defines the colors for the ROI objects</summary>
+ /// <param name="aColor">Color for the active ROI object</param>
+ /// <param name="inaColor">Color for the inactive ROI objects</param>
+ /// <param name="aHdlColor">
+ /// Color for the active handle of the active ROI object
+ /// </param>
+ public void setDrawColor(string aColor,
+ string aHdlColor,
+ string inaColor)
+ {
+ if (aColor != "")
+ activeCol = aColor;
+ if (aHdlColor != "")
+ activeHdlCol = aHdlColor;
+ if (inaColor != "")
+ inactiveCol = inaColor;
+ }
+
+
+ /// <summary>
+ /// Paints all objects from the ROIList into the HALCON window
+ /// </summary>
+ /// <param name="window">HALCON window</param>
+ public void paintData(HalconDotNet.HWindow window)
+ {
+ window.SetDraw("margin");
+ window.SetLineWidth(1);
+
+ if (ROIList.Count > 0)
+ {
+ window.SetColor(inactiveCol);
+ window.SetDraw("margin");
+
+ for (int i=0; i < ROIList.Count; i++)
+ {
+ window.SetLineStyle(((ROI)ROIList[i]).flagLineStyle);
+ ((ROI)ROIList[i]).draw(window);
+ }
+
+ if (activeROIidx != -1)
+ {
+ window.SetColor(activeCol);
+ window.SetLineStyle(((ROI)ROIList[activeROIidx]).flagLineStyle);
+ ((ROI)ROIList[activeROIidx]).draw(window);
+
+ window.SetColor(activeHdlCol);
+ ((ROI)ROIList[activeROIidx]).displayActive(window);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Reaction of ROI objects to the 'mouse button down' event: changing
+ /// the shape of the ROI and adding it to the ROIList if it is a 'seed'
+ /// ROI.
+ /// </summary>
+ /// <param name="imgX">x coordinate of mouse event</param>
+ /// <param name="imgY">y coordinate of mouse event</param>
+ /// <returns></returns>
+ public int mouseDownAction(double imgX, double imgY)
+ {
+ int idxROI= -1;
+ double max = 10000, dist = 0;
+ double epsilon = 35.0; //maximal shortest distance to one of
+ //the handles
+
+ if (roiMode != null) //either a new ROI object is created
+ {
+ roiMode.createROI(imgX, imgY);
+ ROIList.Add(roiMode);
+ roiMode = null;
+ activeROIidx = ROIList.Count - 1;
+ viewController.repaint();
+
+ NotifyRCObserver(ROIController.EVENT_CREATED_ROI);
+ }
+ else if (ROIList.Count > 0) // ... or an existing one is manipulated
+ {
+ activeROIidx = -1;
+
+ for (int i =0; i < ROIList.Count; i++)
+ {
+ dist = ((ROI)ROIList[i]).distToClosestHandle(imgX, imgY);
+ if ((dist < max) && (dist < epsilon))
+ {
+ max = dist;
+ idxROI = i;
+ }
+ }//end of for
+
+ if (idxROI >= 0)
+ {
+ activeROIidx = idxROI;
+ NotifyRCObserver(ROIController.EVENT_ACTIVATED_ROI);
+ }
+
+ viewController.repaint();
+ }
+ return activeROIidx;
+ }
+
+ /// <summary>
+ /// Reaction of ROI objects to the 'mouse button move' event: moving
+ /// the active ROI.
+ /// </summary>
+ /// <param name="newX">x coordinate of mouse event</param>
+ /// <param name="newY">y coordinate of mouse event</param>
+ public void mouseMoveAction(double newX, double newY)
+ {
+ if ((newX == currX) && (newY == currY))
+ return;
+
+ ((ROI)ROIList[activeROIidx]).moveByHandle(newX, newY);
+ viewController.repaint();
+ currX = newX;
+ currY = newY;
+ NotifyRCObserver(ROIController.EVENT_MOVING_ROI);
+ }
+
+
+ /***********************************************************/
+ public void dummyI(int v)
+ {
+ }
+
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/ViewROI/ROILine.cs b/HalconTools/ViewROI/ROILine.cs
new file mode 100644
index 0000000..6579da9
--- /dev/null
+++ b/HalconTools/ViewROI/ROILine.cs
@@ -0,0 +1,204 @@
+using System;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ /// <summary>
+ /// This class demonstrates one of the possible implementations for a
+ /// linear ROI. ROILine inherits from the base class ROI and
+ /// implements (besides other auxiliary methods) all virtual methods
+ /// defined in ROI.cs.
+ /// </summary>
+ public class ROILine : ROI
+ {
+
+ public double row1, col1; // first end point of line
+ public double row2, col2; // second end point of line
+ public double midR, midC; // midPoint of line
+
+ private HXLDCont arrowHandleXLD;
+
+ public ROILine()
+ {
+ NumHandles = 3; // two end points of line
+ activeHandleIdx = 2;
+ arrowHandleXLD = new HXLDCont();
+ arrowHandleXLD.GenEmptyObj();
+ }
+
+ public double hrow = 0;
+ public double hcol = 50;
+
+ /// <summary>Creates a new ROI instance at the mouse position.</summary>
+ public override void createROI(double midX, double midY)
+ {
+ midR = midY;
+ midC = midX;
+
+ row1 = midR - hrow;
+ col1 = midC - hcol;
+ row2 = midR + hrow;
+ col2 = midC + hcol;
+
+ updateArrowHandle();
+ }
+
+ /// <summary>Paints the ROI into the supplied window.</summary>
+ public override void draw(HalconDotNet.HWindow window)
+ {
+
+ window.DispLine(row1, col1, row2, col2);
+
+ window.DispRectangle2(row1, col1, 0, 5, 5);
+ window.DispObj(arrowHandleXLD); //window.DispRectangle2( row2, col2, 0, 5, 5);
+ window.DispRectangle2(midR, midC, 0, 5, 5);
+ }
+
+ /// <summary>
+ /// Returns the distance of the ROI handle being
+ /// closest to the image point(x,y).
+ /// </summary>
+ public override double distToClosestHandle(double x, double y)
+ {
+
+ double max = 10000;
+ double [] val = new double[NumHandles];
+
+ val[0] = HMisc.DistancePp(y, x, row1, col1); // upper left
+ val[1] = HMisc.DistancePp(y, x, row2, col2); // upper right
+ val[2] = HMisc.DistancePp(y, x, midR, midC); // midpoint
+
+ for (int i=0; i < NumHandles; i++)
+ {
+ if (val[i] < max)
+ {
+ max = val[i];
+ activeHandleIdx = i;
+ }
+ }// end of for
+
+ return val[activeHandleIdx];
+ }
+
+ /// <summary>
+ /// Paints the active handle of the ROI object into the supplied window.
+ /// </summary>
+ public override void displayActive(HalconDotNet.HWindow window)
+ {
+
+ switch (activeHandleIdx)
+ {
+ case 0:
+ window.DispRectangle2(row1, col1, 0, 5, 5);
+ break;
+ case 1:
+ window.DispObj(arrowHandleXLD); //window.DispRectangle2(row2, col2, 0, 5, 5);
+ break;
+ case 2:
+ window.DispRectangle2(midR, midC, 0, 5, 5);
+ break;
+ }
+ }
+
+ /// <summary>Gets the HALCON region described by the ROI.</summary>
+ public override HRegion getRegion()
+ {
+ HRegion region = new HRegion();
+ region.GenRegionLine(row1, col1, row2, col2);
+ return region;
+ }
+
+ public override double getDistanceFromStartPoint(double row, double col)
+ {
+ double distance = HMisc.DistancePp(row, col, row1, col1);
+ return distance;
+ }
+ /// <summary>
+ /// Gets the model information described by
+ /// the ROI.
+ /// </summary>
+ public override HTuple getModelData()
+ {
+ return new HTuple(new double[] { row1, col1, row2, col2 });
+ }
+
+ /// <summary>
+ /// Recalculates the shape of the ROI. Translation is
+ /// performed at the active handle of the ROI object
+ /// for the image coordinate (x,y).
+ /// </summary>
+ public override void moveByHandle(double newX, double newY)
+ {
+ double lenR, lenC;
+
+ switch (activeHandleIdx)
+ {
+ case 0: // first end point
+ row1 = newY;
+ col1 = newX;
+
+ midR = (row1 + row2) / 2;
+ midC = (col1 + col2) / 2;
+ break;
+ case 1: // last end point
+ row2 = newY;
+ col2 = newX;
+
+ midR = (row1 + row2) / 2;
+ midC = (col1 + col2) / 2;
+ break;
+ case 2: // midpoint
+ lenR = row1 - midR;
+ lenC = col1 - midC;
+
+ midR = newY;
+ midC = newX;
+
+ row1 = midR + lenR;
+ col1 = midC + lenC;
+ row2 = midR - lenR;
+ col2 = midC - lenC;
+ break;
+ }
+ updateArrowHandle();
+ }
+
+
+ /// <summary> Auxiliary method </summary>
+ private void updateArrowHandle()
+ {
+ double length,dr,dc, halfHW;
+ double rrow1, ccol1,rowP1, colP1, rowP2, colP2;
+
+ double headLength = 15;
+ double headWidth = 15;
+
+
+ arrowHandleXLD.Dispose();
+ arrowHandleXLD.GenEmptyObj();
+
+ rrow1 = row1 + (row2 - row1) * 0.8;
+ ccol1 = col1 + (col2 - col1) * 0.8;
+
+ length = HMisc.DistancePp(rrow1, ccol1, row2, col2);
+ if (length == 0)
+ length = -1;
+
+ dr = (row2 - rrow1) / length;
+ dc = (col2 - ccol1) / length;
+
+ halfHW = headWidth / 2.0;
+ rowP1 = rrow1 + (length - headLength) * dr + halfHW * dc;
+ rowP2 = rrow1 + (length - headLength) * dr - halfHW * dc;
+ colP1 = ccol1 + (length - headLength) * dc - halfHW * dr;
+ colP2 = ccol1 + (length - headLength) * dc + halfHW * dr;
+
+ if (length == -1)
+ arrowHandleXLD.GenContourPolygonXld(rrow1, ccol1);
+ else
+ arrowHandleXLD.GenContourPolygonXld(new HTuple(new double[] { rrow1, row2, rowP1, row2, rowP2, row2 }),
+ new HTuple(new double[] { ccol1, col2, colP1, col2, colP2, col2 }));
+ }
+
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/ViewROI/ROIRectangle1.cs b/HalconTools/ViewROI/ROIRectangle1.cs
new file mode 100644
index 0000000..d835340
--- /dev/null
+++ b/HalconTools/ViewROI/ROIRectangle1.cs
@@ -0,0 +1,211 @@
+using System;
+using HalconDotNet;
+
+
+namespace HalconTools
+{
+ /// <summary>
+ /// This class demonstrates one of the possible implementations for a
+ /// (simple) rectangularly shaped ROI. ROIRectangle1 inherits
+ /// from the base class ROI and implements (besides other auxiliary
+ /// methods) all virtual methods defined in ROI.cs.
+ /// Since a simple rectangle is defined by two data points, by the upper
+ /// left corner and the lower right corner, we use four values (row1/col1)
+ /// and (row2/col2) as class members to hold these positions at
+ /// any time of the program. The four corners of the rectangle can be taken
+ /// as handles, which the user can use to manipulate the size of the ROI.
+ /// Furthermore, we define a midpoint as an additional handle, with which
+ /// the user can grab and drag the ROI. Therefore, we declare NumHandles
+ /// to be 5 and set the activeHandle to be 0, which will be the upper left
+ /// corner of our ROI.
+ /// </summary>
+ public class ROIRectangle1 : ROI
+ {
+
+ private double row1, col1; // upper left
+ private double row2, col2; // lower right
+ private double midR, midC; // midpoint
+
+
+ /// <summary>Constructor</summary>
+ public ROIRectangle1()
+ {
+
+ NumHandles = 5; // 4 corner points + midpoint
+ activeHandleIdx = 4;
+ }
+
+ /// <summary>Creates a new ROI instance at the mouse position</summary>
+ /// <param name="midX">
+ /// x (=column) coordinate for interactive ROI
+ /// </param>
+ /// <param name="midY">
+ /// y (=row) coordinate for interactive ROI
+ /// </param>
+ public override void createROI(double midX, double midY)
+ {
+ midR = midY;
+ midC = midX;
+
+ row1 = midR - 50;
+ col1 = midC - 50;
+ row2 = midR + 50;
+ col2 = midC + 50;
+ }
+
+ /// <summary>Paints the ROI into the supplied window</summary>
+ /// <param name="window">HALCON window</param>
+ public override void draw(HalconDotNet.HWindow window)
+ {
+ window.DispRectangle1(row1, col1, row2, col2);
+
+ window.DispRectangle2(row1, col1, 0, 5, 5);
+ window.DispRectangle2(row1, col2, 0, 5, 5);
+ window.DispRectangle2(row2, col2, 0, 5, 5);
+ window.DispRectangle2(row2, col1, 0, 5, 5);
+ window.DispRectangle2(midR, midC, 0, 5, 5);
+ }
+
+ /// <summary>
+ /// Returns the distance of the ROI handle being
+ /// closest to the image point(x,y)
+ /// </summary>
+ /// <param name="x">x (=column) coordinate</param>
+ /// <param name="y">y (=row) coordinate</param>
+ /// <returns>
+ /// Distance of the closest ROI handle.
+ /// </returns>
+ public override double distToClosestHandle(double x, double y)
+ {
+
+ double max = 10000;
+ double [] val = new double[NumHandles];
+
+ midR = ((row2 - row1) / 2) + row1;
+ midC = ((col2 - col1) / 2) + col1;
+
+ val[0] = HMisc.DistancePp(y, x, row1, col1); // upper left
+ val[1] = HMisc.DistancePp(y, x, row1, col2); // upper right
+ val[2] = HMisc.DistancePp(y, x, row2, col2); // lower right
+ val[3] = HMisc.DistancePp(y, x, row2, col1); // lower left
+ val[4] = HMisc.DistancePp(y, x, midR, midC); // midpoint
+
+ for (int i=0; i < NumHandles; i++)
+ {
+ if (val[i] < max)
+ {
+ max = val[i];
+ activeHandleIdx = i;
+ }
+ }// end of for
+
+ return val[activeHandleIdx];
+ }
+
+ /// <summary>
+ /// Paints the active handle of the ROI object into the supplied window
+ /// </summary>
+ /// <param name="window">HALCON window</param>
+ public override void displayActive(HalconDotNet.HWindow window)
+ {
+ switch (activeHandleIdx)
+ {
+ case 0:
+ window.DispRectangle2(row1, col1, 0, 5, 5);
+ break;
+ case 1:
+ window.DispRectangle2(row1, col2, 0, 5, 5);
+ break;
+ case 2:
+ window.DispRectangle2(row2, col2, 0, 5, 5);
+ break;
+ case 3:
+ window.DispRectangle2(row2, col1, 0, 5, 5);
+ break;
+ case 4:
+ window.DispRectangle2(midR, midC, 0, 5, 5);
+ break;
+ }
+ }
+
+ /// <summary>Gets the HALCON region described by the ROI</summary>
+ public override HRegion getRegion()
+ {
+ HRegion region = new HRegion();
+ region.GenRectangle1(row1, col1, row2, col2);
+ return region;
+ }
+
+ /// <summary>
+ /// Gets the model information described by
+ /// the interactive ROI
+ /// </summary>
+ public override HTuple getModelData()
+ {
+ return new HTuple(new double[] { row1, col1, row2, col2 });
+ }
+
+
+ /// <summary>
+ /// Recalculates the shape of the ROI instance. Translation is
+ /// performed at the active handle of the ROI object
+ /// for the image coordinate (x,y)
+ /// </summary>
+ /// <param name="newX">x mouse coordinate</param>
+ /// <param name="newY">y mouse coordinate</param>
+ public override void moveByHandle(double newX, double newY)
+ {
+ double len1, len2;
+ double tmp;
+
+ switch (activeHandleIdx)
+ {
+ case 0: // upper left
+ row1 = newY;
+ col1 = newX;
+ break;
+ case 1: // upper right
+ row1 = newY;
+ col2 = newX;
+ break;
+ case 2: // lower right
+ row2 = newY;
+ col2 = newX;
+ break;
+ case 3: // lower left
+ row2 = newY;
+ col1 = newX;
+ break;
+ case 4: // midpoint
+ len1 = ((row2 - row1) / 2);
+ len2 = ((col2 - col1) / 2);
+
+ row1 = newY - len1;
+ row2 = newY + len1;
+
+ col1 = newX - len2;
+ col2 = newX + len2;
+
+ break;
+ }
+
+ if (row2 <= row1)
+ {
+ tmp = row1;
+ row1 = row2;
+ row2 = tmp;
+ }
+
+ if (col2 <= col1)
+ {
+ tmp = col1;
+ col1 = col2;
+ col2 = tmp;
+ }
+
+ midR = ((row2 - row1) / 2) + row1;
+ midC = ((col2 - col1) / 2) + col1;
+
+ }//end of method
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/ViewROI/ROIRectangle2.cs b/HalconTools/ViewROI/ROIRectangle2.cs
new file mode 100644
index 0000000..d6140ba
--- /dev/null
+++ b/HalconTools/ViewROI/ROIRectangle2.cs
@@ -0,0 +1,251 @@
+using System;
+using HalconDotNet;
+
+
+
+namespace HalconTools
+{
+
+ /// <summary>
+ /// This class demonstrates one of the possible implementations for a
+ /// (simple) rectangularly shaped ROI. To create this rectangle we use
+ /// a center point (midR, midC), an orientation 'phi' and the half
+ /// edge lengths 'length1' and 'length2', similar to the HALCON
+ /// operator gen_rectangle2().
+ /// The class ROIRectangle2 inherits from the base class ROI and
+ /// implements (besides other auxiliary methods) all virtual methods
+ /// defined in ROI.cs.
+ /// </summary>
+ public class ROIRectangle2 : ROI
+ {
+
+ /// <summary>Half length of the rectangle side, perpendicular to phi</summary>
+ private double length1;
+
+ /// <summary>Half length of the rectangle side, in direction of phi</summary>
+ private double length2;
+
+ /// <summary>Row coordinate of midpoint of the rectangle</summary>
+ private double midR;
+
+ /// <summary>Column coordinate of midpoint of the rectangle</summary>
+ private double midC;
+
+ /// <summary>Orientation of rectangle defined in radians.</summary>
+ private double phi;
+
+ //auxiliary variables
+ HTuple rowsInit;
+ HTuple colsInit;
+ HTuple rows;
+ HTuple cols;
+
+ HHomMat2D hom2D, tmp;
+
+ /// <summary>Constructor</summary>
+ public ROIRectangle2()
+ {
+ NumHandles = 6; // 4 corners + 1 midpoint + 1 rotationpoint
+ activeHandleIdx = 4;
+ }
+
+ /// <summary>Creates a new ROI instance at the mouse position</summary>
+ /// <param name="midX">
+ /// x (=column) coordinate for interactive ROI
+ /// </param>
+ /// <param name="midY">
+ /// y (=row) coordinate for interactive ROI
+ /// </param>
+ public override void createROI(double midX, double midY)
+ {
+ midR = midY;
+ midC = midX;
+
+ length1 = 100;
+ length2 = 50;
+
+ phi = 0.0;
+
+ rowsInit = new HTuple(new double[] {-1.0, -1.0, 1.0,
+ 1.0, 0.0, 0.0 });
+ colsInit = new HTuple(new double[] {-1.0, 1.0, 1.0,
+ -1.0, 0.0, 0.6 });
+ //order ul , ur, lr, ll, mp, arrowMidpoint
+ hom2D = new HHomMat2D();
+ tmp = new HHomMat2D();
+
+ updateHandlePos();
+ }
+
+ /// <summary>Paints the ROI into the supplied window</summary>
+ /// <param name="window">HALCON window</param>
+ public override void draw(HalconDotNet.HWindow window)
+ {
+ window.DispRectangle2(midR, midC, -phi, length1, length2);
+ for (int i =0; i < NumHandles; i++)
+ window.DispRectangle2(rows[i].D, cols[i].D, -phi, 5, 5);
+
+ window.DispArrow(midR, midC, midR + (Math.Sin(phi) * length1 * 1.2),
+ midC + (Math.Cos(phi) * length1 * 1.2), 2.0);
+
+ }
+
+ /// <summary>
+ /// Returns the distance of the ROI handle being
+ /// closest to the image point(x,y)
+ /// </summary>
+ /// <param name="x">x (=column) coordinate</param>
+ /// <param name="y">y (=row) coordinate</param>
+ /// <returns>
+ /// Distance of the closest ROI handle.
+ /// </returns>
+ public override double distToClosestHandle(double x, double y)
+ {
+ double max = 10000;
+ double [] val = new double[NumHandles];
+
+
+ for (int i=0; i < NumHandles; i++)
+ val[i] = HMisc.DistancePp(y, x, rows[i].D, cols[i].D);
+
+ for (int i=0; i < NumHandles; i++)
+ {
+ if (val[i] < max)
+ {
+ max = val[i];
+ activeHandleIdx = i;
+ }
+ }
+ return val[activeHandleIdx];
+ }
+
+ /// <summary>
+ /// Paints the active handle of the ROI object into the supplied window
+ /// </summary>
+ /// <param name="window">HALCON window</param>
+ public override void displayActive(HalconDotNet.HWindow window)
+ {
+ window.DispRectangle2(rows[activeHandleIdx].D,
+ cols[activeHandleIdx].D,
+ -phi, 5, 5);
+
+ if (activeHandleIdx == 5)
+ window.DispArrow(midR, midC,
+ midR + (Math.Sin(phi) * length1 * 1.2),
+ midC + (Math.Cos(phi) * length1 * 1.2),
+ 2.0);
+ }
+
+
+ /// <summary>Gets the HALCON region described by the ROI</summary>
+ public override HRegion getRegion()
+ {
+ HRegion region = new HRegion();
+ region.GenRectangle2(midR, midC, -phi, length1, length2);
+ return region;
+ }
+
+ /// <summary>
+ /// Gets the model information described by
+ /// the interactive ROI
+ /// </summary>
+ public override HTuple getModelData()
+ {
+ return new HTuple(new double[] { midR, midC, phi, length1, length2 });
+ }
+
+ /// <summary>
+ /// Recalculates the shape of the ROI instance. Translation is
+ /// performed at the active handle of the ROI object
+ /// for the image coordinate (x,y)
+ /// </summary>
+ /// <param name="newX">x mouse coordinate</param>
+ /// <param name="newY">y mouse coordinate</param>
+ public override void moveByHandle(double newX, double newY)
+ {
+ double vX, vY, x=0, y=0;
+
+ switch (activeHandleIdx)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ tmp = hom2D.HomMat2dInvert();
+ x = tmp.AffineTransPoint2d(newX, newY, out y);
+
+ length2 = Math.Abs(y);
+ length1 = Math.Abs(x);
+
+ checkForRange(x, y);
+ break;
+ case 4:
+ midC = newX;
+ midR = newY;
+ break;
+ case 5:
+ vY = newY - rows[4].D;
+ vX = newX - cols[4].D;
+ phi = Math.Atan2(vY, vX);
+ break;
+ }
+ updateHandlePos();
+ }//end of method
+
+
+ /// <summary>
+ /// Auxiliary method to recalculate the contour points of
+ /// the rectangle by transforming the initial row and
+ /// column coordinates (rowsInit, colsInit) by the updated
+ /// homography hom2D
+ /// </summary>
+ private void updateHandlePos()
+ {
+ hom2D.HomMat2dIdentity();
+ hom2D = hom2D.HomMat2dTranslate(midC, midR);
+ hom2D = hom2D.HomMat2dRotateLocal(phi);
+ tmp = hom2D.HomMat2dScaleLocal(length1, length2);
+ cols = tmp.AffineTransPoint2d(colsInit, rowsInit, out rows);
+ }
+
+
+ /* This auxiliary method checks the half lengths
+ * (length1, length2) using the coordinates (x,y) of the four
+ * rectangle corners (handles 0 to 3) to avoid 'bending' of
+ * the rectangular ROI at its midpoint, when it comes to a
+ * 'collapse' of the rectangle for length1=length2=0.
+ * */
+ private void checkForRange(double x, double y)
+ {
+ switch (activeHandleIdx)
+ {
+ case 0:
+ if ((x < 0) && (y < 0))
+ return;
+ if (x >= 0) length1 = 0.01;
+ if (y >= 0) length2 = 0.01;
+ break;
+ case 1:
+ if ((x > 0) && (y < 0))
+ return;
+ if (x <= 0) length1 = 0.01;
+ if (y >= 0) length2 = 0.01;
+ break;
+ case 2:
+ if ((x > 0) && (y > 0))
+ return;
+ if (x <= 0) length1 = 0.01;
+ if (y <= 0) length2 = 0.01;
+ break;
+ case 3:
+ if ((x < 0) && (y > 0))
+ return;
+ if (x >= 0) length1 = 0.01;
+ if (y <= 0) length2 = 0.01;
+ break;
+ default:
+ break;
+ }
+ }
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/frmCalibration.Designer.cs b/HalconTools/frmCalibration.Designer.cs
new file mode 100644
index 0000000..b4297bb
--- /dev/null
+++ b/HalconTools/frmCalibration.Designer.cs
@@ -0,0 +1,2958 @@
+锘縩amespace HalconTools
+{
+ partial class frmCalibration
+ {
+ /// <summary>
+ /// 蹇呴渶鐨勮璁″櫒鍙橀噺銆�
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// 娓呯悊鎵�鏈夋鍦ㄤ娇鐢ㄧ殑璧勬簮銆�
+ /// </summary>
+ /// <param name="disposing">濡傛灉搴旈噴鏀炬墭绠¤祫婧愶紝涓� true锛涘惁鍒欎负 false銆�</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows 绐椾綋璁捐鍣ㄧ敓鎴愮殑浠g爜
+
+ /// <summary>
+ /// 璁捐鍣ㄦ敮鎸佹墍闇�鐨勬柟娉� - 涓嶈
+ /// 浣跨敤浠g爜缂栬緫鍣ㄤ慨鏀规鏂规硶鐨勫唴瀹广��
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.viewPort = new HalconDotNet.HWindowControl();
+ this.tabControl = new System.Windows.Forms.TabControl();
+ this.tabPageCalib = new System.Windows.Forms.TabPage();
+ this.ListCalibImg = new System.Windows.Forms.ListView();
+ this.ColRef = new System.Windows.Forms.ColumnHeader();
+ this.ColImg = new System.Windows.Forms.ColumnHeader();
+ this.ColStatus = new System.Windows.Forms.ColumnHeader();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.buttonDefaultParams = new System.Windows.Forms.Button();
+ this.LineScanAddPanel = new System.Windows.Forms.Panel();
+ this.label72 = new System.Windows.Forms.Label();
+ this.label73 = new System.Windows.Forms.Label();
+ this.label74 = new System.Windows.Forms.Label();
+ this.label75 = new System.Windows.Forms.Label();
+ this.label76 = new System.Windows.Forms.Label();
+ this.label77 = new System.Windows.Forms.Label();
+ this.MotionZUpDown = new System.Windows.Forms.NumericUpDown();
+ this.MotionYUpDown = new System.Windows.Forms.NumericUpDown();
+ this.MotionXUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label71 = new System.Windows.Forms.Label();
+ this.label70 = new System.Windows.Forms.Label();
+ this.label69 = new System.Windows.Forms.Label();
+ this.label7 = new System.Windows.Forms.Label();
+ this.label6 = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.TelecentricCheckBox = new System.Windows.Forms.CheckBox();
+ this.FocalLengthUpDown = new System.Windows.Forms.NumericUpDown();
+ this.SyUpDown = new System.Windows.Forms.NumericUpDown();
+ this.SxUpDown = new System.Windows.Forms.NumericUpDown();
+ this.buttonImportParams = new System.Windows.Forms.Button();
+ this.textBoxDescr = new System.Windows.Forms.TextBox();
+ this.CamTypComboBox = new System.Windows.Forms.ComboBox();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.ThicknessUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label2 = new System.Windows.Forms.Label();
+ this.buttonLoadDescrFile = new System.Windows.Forms.Button();
+ this.buttonCalibrate = new System.Windows.Forms.Button();
+ this.buttonSetReference = new System.Windows.Forms.Button();
+ this.buttonDeleteAll = new System.Windows.Forms.Button();
+ this.buttonDelete = new System.Windows.Forms.Button();
+ this.buttonLoad = new System.Windows.Forms.Button();
+ this.tabPageQualityCheck = new System.Windows.Forms.TabPage();
+ this.WarnlevelUpDown = new System.Windows.Forms.NumericUpDown();
+ this.ListQualityCheck = new System.Windows.Forms.ListView();
+ this.ColScope = new System.Windows.Forms.ColumnHeader();
+ this.ColDescr = new System.Windows.Forms.ColumnHeader();
+ this.Col2Status = new System.Windows.Forms.ColumnHeader();
+ this.groupBox4 = new System.Windows.Forms.GroupBox();
+ this.MaxDiamTrackBar = new System.Windows.Forms.TrackBar();
+ this.MaxDiamResetButton = new System.Windows.Forms.Button();
+ this.MaxDiamUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label19 = new System.Windows.Forms.Label();
+ this.MinContLResetButton = new System.Windows.Forms.Button();
+ this.MinContLTrackBar = new System.Windows.Forms.TrackBar();
+ this.MinContLUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label18 = new System.Windows.Forms.Label();
+ this.SmootingResetButton = new System.Windows.Forms.Button();
+ this.SmoothTrackBar = new System.Windows.Forms.TrackBar();
+ this.SmoothUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label17 = new System.Windows.Forms.Label();
+ this.MinThreshResetButton = new System.Windows.Forms.Button();
+ this.MinThreshTrackBar = new System.Windows.Forms.TrackBar();
+ this.MinThreshUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label16 = new System.Windows.Forms.Label();
+ this.ThreshDecrResetButton = new System.Windows.Forms.Button();
+ this.ThreshDecrTrackBar = new System.Windows.Forms.TrackBar();
+ this.ThreshDecrUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label15 = new System.Windows.Forms.Label();
+ this.InitThreshResetButton = new System.Windows.Forms.Button();
+ this.InitThreshTrackBar = new System.Windows.Forms.TrackBar();
+ this.InitThreshUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label14 = new System.Windows.Forms.Label();
+ this.MinDiamResetButton = new System.Windows.Forms.Button();
+ this.MinDiamTrackBar = new System.Windows.Forms.TrackBar();
+ this.MinDiamUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label13 = new System.Windows.Forms.Label();
+ this.MarkThreshResetButton = new System.Windows.Forms.Button();
+ this.MarkThreshTrackBar = new System.Windows.Forms.TrackBar();
+ this.MarkThreshUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label12 = new System.Windows.Forms.Label();
+ this.FilterSizeResetButton = new System.Windows.Forms.Button();
+ this.FilterSizeTrackBar = new System.Windows.Forms.TrackBar();
+ this.FilterSizeUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label11 = new System.Windows.Forms.Label();
+ this.label10 = new System.Windows.Forms.Label();
+ this.label9 = new System.Windows.Forms.Label();
+ this.SeqTestsComboBox = new System.Windows.Forms.ComboBox();
+ this.label8 = new System.Windows.Forms.Label();
+ this.ImgTestsComboBox = new System.Windows.Forms.ComboBox();
+ this.tabPageResults = new System.Windows.Forms.TabPage();
+ this.label20 = new System.Windows.Forms.Label();
+ this.buttonSimImg = new System.Windows.Forms.RadioButton();
+ this.buttonRefImg = new System.Windows.Forms.RadioButton();
+ this.groupBox6 = new System.Windows.Forms.GroupBox();
+ this.checkBoxOrigImgCoord = new System.Windows.Forms.CheckBox();
+ this.buttonSaveCamPose = new System.Windows.Forms.Button();
+ this.label59 = new System.Windows.Forms.Label();
+ this.label60 = new System.Windows.Forms.Label();
+ this.label61 = new System.Windows.Forms.Label();
+ this.label62 = new System.Windows.Forms.Label();
+ this.CamGammaLabel = new System.Windows.Forms.Label();
+ this.label64 = new System.Windows.Forms.Label();
+ this.CamBetaLabel = new System.Windows.Forms.Label();
+ this.label66 = new System.Windows.Forms.Label();
+ this.CamAlphaLabel = new System.Windows.Forms.Label();
+ this.label50 = new System.Windows.Forms.Label();
+ this.label51 = new System.Windows.Forms.Label();
+ this.label52 = new System.Windows.Forms.Label();
+ this.label53 = new System.Windows.Forms.Label();
+ this.CamPoseZLabel = new System.Windows.Forms.Label();
+ this.label55 = new System.Windows.Forms.Label();
+ this.CamPoseYLabel = new System.Windows.Forms.Label();
+ this.label57 = new System.Windows.Forms.Label();
+ this.CamPoseXLabel = new System.Windows.Forms.Label();
+ this.groupBox5 = new System.Windows.Forms.GroupBox();
+ this.AreaScanPolynomPanel = new System.Windows.Forms.Panel();
+ this.P2Label = new System.Windows.Forms.Label();
+ this.label83 = new System.Windows.Forms.Label();
+ this.label84 = new System.Windows.Forms.Label();
+ this.P1Label = new System.Windows.Forms.Label();
+ this.label80 = new System.Windows.Forms.Label();
+ this.label81 = new System.Windows.Forms.Label();
+ this.K3Label = new System.Windows.Forms.Label();
+ this.K2Label = new System.Windows.Forms.Label();
+ this.K1Label = new System.Windows.Forms.Label();
+ this.label54 = new System.Windows.Forms.Label();
+ this.label56 = new System.Windows.Forms.Label();
+ this.label58 = new System.Windows.Forms.Label();
+ this.label63 = new System.Windows.Forms.Label();
+ this.label65 = new System.Windows.Forms.Label();
+ this.label67 = new System.Windows.Forms.Label();
+ this.label44 = new System.Windows.Forms.Label();
+ this.label30 = new System.Windows.Forms.Label();
+ this.FocalLResultLabel = new System.Windows.Forms.Label();
+ this.KappaPanel = new System.Windows.Forms.Panel();
+ this.LineScanPanel = new System.Windows.Forms.Panel();
+ this.VzResultLabel = new System.Windows.Forms.Label();
+ this.VyResultLabel = new System.Windows.Forms.Label();
+ this.VxResultLabel = new System.Windows.Forms.Label();
+ this.label82 = new System.Windows.Forms.Label();
+ this.label85 = new System.Windows.Forms.Label();
+ this.label86 = new System.Windows.Forms.Label();
+ this.label87 = new System.Windows.Forms.Label();
+ this.label88 = new System.Windows.Forms.Label();
+ this.label89 = new System.Windows.Forms.Label();
+ this.label45 = new System.Windows.Forms.Label();
+ this.label32 = new System.Windows.Forms.Label();
+ this.KappaResultLabel = new System.Windows.Forms.Label();
+ this.buttonSaveCamParams = new System.Windows.Forms.Button();
+ this.label49 = new System.Windows.Forms.Label();
+ this.label48 = new System.Windows.Forms.Label();
+ this.label47 = new System.Windows.Forms.Label();
+ this.label46 = new System.Windows.Forms.Label();
+ this.label43 = new System.Windows.Forms.Label();
+ this.label42 = new System.Windows.Forms.Label();
+ this.label40 = new System.Windows.Forms.Label();
+ this.ImgHResultLabel = new System.Windows.Forms.Label();
+ this.label38 = new System.Windows.Forms.Label();
+ this.ImgWResultLabel = new System.Windows.Forms.Label();
+ this.label36 = new System.Windows.Forms.Label();
+ this.CyResultLabel = new System.Windows.Forms.Label();
+ this.label34 = new System.Windows.Forms.Label();
+ this.CxResultLabel = new System.Windows.Forms.Label();
+ this.label28 = new System.Windows.Forms.Label();
+ this.SyResultLabel = new System.Windows.Forms.Label();
+ this.label26 = new System.Windows.Forms.Label();
+ this.SxResultLabel = new System.Windows.Forms.Label();
+ this.label22 = new System.Windows.Forms.Label();
+ this.ErrorLabel = new System.Windows.Forms.Label();
+ this.label21 = new System.Windows.Forms.Label();
+ this.StatusCalibLabel = new System.Windows.Forms.Label();
+ this.tabPageDistance = new System.Windows.Forms.TabPage();
+ this.label33 = new System.Windows.Forms.Label();
+ this.label35 = new System.Windows.Forms.Label();
+ this.numericUpDownP4 = new System.Windows.Forms.NumericUpDown();
+ this.numericUpDownP3 = new System.Windows.Forms.NumericUpDown();
+ this.label29 = new System.Windows.Forms.Label();
+ this.label31 = new System.Windows.Forms.Label();
+ this.txtDistanceP3P4 = new System.Windows.Forms.TextBox();
+ this.label27 = new System.Windows.Forms.Label();
+ this.label25 = new System.Windows.Forms.Label();
+ this.txtDistanceP1P2 = new System.Windows.Forms.TextBox();
+ this.label24 = new System.Windows.Forms.Label();
+ this.label23 = new System.Windows.Forms.Label();
+ this.numericUpDownP2 = new System.Windows.Forms.NumericUpDown();
+ this.numericUpDownP1 = new System.Windows.Forms.NumericUpDown();
+ this.label1 = new System.Windows.Forms.Label();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.buttonMove = new System.Windows.Forms.RadioButton();
+ this.buttonReset = new System.Windows.Forms.Button();
+ this.buttonNone = new System.Windows.Forms.RadioButton();
+ this.buttonMagnify = new System.Windows.Forms.RadioButton();
+ this.buttonZoom = new System.Windows.Forms.RadioButton();
+ this.groupBox3 = new System.Windows.Forms.GroupBox();
+ this.upDownLineWidth = new System.Windows.Forms.NumericUpDown();
+ this.label78 = new System.Windows.Forms.Label();
+ this.label68 = new System.Windows.Forms.Label();
+ this.checkBoxCoordSys = new System.Windows.Forms.CheckBox();
+ this.checkBoxMarkCenter = new System.Windows.Forms.CheckBox();
+ this.checkBoxPlateRegion = new System.Windows.Forms.CheckBox();
+ this.comboBoxDraw = new System.Windows.Forms.ComboBox();
+ this.comboBoxCoordSys = new System.Windows.Forms.ComboBox();
+ this.comboBoxMarkCenters = new System.Windows.Forms.ComboBox();
+ this.comboBoxPlateRegion = new System.Windows.Forms.ComboBox();
+ this.openFileDialogImg = new System.Windows.Forms.OpenFileDialog();
+ this.openFileDialogDescr = new System.Windows.Forms.OpenFileDialog();
+ this.openFileDialogImportParams = new System.Windows.Forms.OpenFileDialog();
+ this.StatusLabel = new System.Windows.Forms.Label();
+ this.saveParamFileDialog = new System.Windows.Forms.SaveFileDialog();
+ this.tabControl.SuspendLayout();
+ this.tabPageCalib.SuspendLayout();
+ this.groupBox2.SuspendLayout();
+ this.LineScanAddPanel.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.MotionZUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MotionYUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MotionXUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.FocalLengthUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.SyUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.SxUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ThicknessUpDown)).BeginInit();
+ this.tabPageQualityCheck.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.WarnlevelUpDown)).BeginInit();
+ this.groupBox4.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.MaxDiamTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MaxDiamUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinContLTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinContLUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.SmoothTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.SmoothUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinThreshTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinThreshUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ThreshDecrTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ThreshDecrUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.InitThreshTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.InitThreshUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinDiamTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinDiamUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MarkThreshTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MarkThreshUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.FilterSizeTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.FilterSizeUpDown)).BeginInit();
+ this.tabPageResults.SuspendLayout();
+ this.groupBox6.SuspendLayout();
+ this.groupBox5.SuspendLayout();
+ this.AreaScanPolynomPanel.SuspendLayout();
+ this.KappaPanel.SuspendLayout();
+ this.LineScanPanel.SuspendLayout();
+ this.tabPageDistance.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.numericUpDownP4)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.numericUpDownP3)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.numericUpDownP2)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.numericUpDownP1)).BeginInit();
+ this.groupBox1.SuspendLayout();
+ this.groupBox3.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.upDownLineWidth)).BeginInit();
+ this.SuspendLayout();
+ //
+ // viewPort
+ //
+ this.viewPort.BackColor = System.Drawing.Color.Black;
+ this.viewPort.BorderColor = System.Drawing.Color.Black;
+ this.viewPort.ImagePart = new System.Drawing.Rectangle(0, 0, 640, 480);
+ this.viewPort.Location = new System.Drawing.Point(19, 43);
+ this.viewPort.Name = "viewPort";
+ this.viewPort.Size = new System.Drawing.Size(547, 396);
+ this.viewPort.TabIndex = 0;
+ this.viewPort.WindowSize = new System.Drawing.Size(547, 396);
+ //
+ // tabControl
+ //
+ this.tabControl.Controls.Add(this.tabPageCalib);
+ this.tabControl.Controls.Add(this.tabPageQualityCheck);
+ this.tabControl.Controls.Add(this.tabPageResults);
+ this.tabControl.Controls.Add(this.tabPageDistance);
+ this.tabControl.Location = new System.Drawing.Point(595, 26);
+ this.tabControl.Name = "tabControl";
+ this.tabControl.SelectedIndex = 0;
+ this.tabControl.Size = new System.Drawing.Size(519, 672);
+ this.tabControl.TabIndex = 1;
+ this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged);
+ //
+ // tabPageCalib
+ //
+ this.tabPageCalib.Controls.Add(this.ListCalibImg);
+ this.tabPageCalib.Controls.Add(this.groupBox2);
+ this.tabPageCalib.Controls.Add(this.buttonCalibrate);
+ this.tabPageCalib.Controls.Add(this.buttonSetReference);
+ this.tabPageCalib.Controls.Add(this.buttonDeleteAll);
+ this.tabPageCalib.Controls.Add(this.buttonDelete);
+ this.tabPageCalib.Controls.Add(this.buttonLoad);
+ this.tabPageCalib.Location = new System.Drawing.Point(4, 22);
+ this.tabPageCalib.Name = "tabPageCalib";
+ this.tabPageCalib.Size = new System.Drawing.Size(511, 646);
+ this.tabPageCalib.TabIndex = 0;
+ this.tabPageCalib.Text = "Calibration";
+ this.tabPageCalib.UseVisualStyleBackColor = true;
+ //
+ // ListCalibImg
+ //
+ this.ListCalibImg.AutoArrange = false;
+ this.ListCalibImg.BackColor = System.Drawing.SystemColors.Window;
+ this.ListCalibImg.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.ColRef,
+ this.ColImg,
+ this.ColStatus});
+ this.ListCalibImg.FullRowSelect = true;
+ this.ListCalibImg.Location = new System.Drawing.Point(10, 34);
+ this.ListCalibImg.MultiSelect = false;
+ this.ListCalibImg.Name = "ListCalibImg";
+ this.ListCalibImg.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.ListCalibImg.Size = new System.Drawing.Size(374, 233);
+ this.ListCalibImg.TabIndex = 21;
+ this.ListCalibImg.UseCompatibleStateImageBehavior = false;
+ this.ListCalibImg.View = System.Windows.Forms.View.Details;
+ //
+ // ColRef
+ //
+ this.ColRef.Text = "Ref";
+ this.ColRef.Width = 30;
+ //
+ // ColImg
+ //
+ this.ColImg.Text = "Image";
+ this.ColImg.Width = 152;
+ //
+ // ColStatus
+ //
+ this.ColStatus.Text = "Status";
+ this.ColStatus.Width = 125;
+ //
+ // groupBox2
+ //
+ this.groupBox2.BackColor = System.Drawing.SystemColors.Control;
+ this.groupBox2.Controls.Add(this.buttonDefaultParams);
+ this.groupBox2.Controls.Add(this.LineScanAddPanel);
+ this.groupBox2.Controls.Add(this.label71);
+ this.groupBox2.Controls.Add(this.label70);
+ this.groupBox2.Controls.Add(this.label69);
+ this.groupBox2.Controls.Add(this.label7);
+ this.groupBox2.Controls.Add(this.label6);
+ this.groupBox2.Controls.Add(this.label5);
+ this.groupBox2.Controls.Add(this.TelecentricCheckBox);
+ this.groupBox2.Controls.Add(this.FocalLengthUpDown);
+ this.groupBox2.Controls.Add(this.SyUpDown);
+ this.groupBox2.Controls.Add(this.SxUpDown);
+ this.groupBox2.Controls.Add(this.buttonImportParams);
+ this.groupBox2.Controls.Add(this.textBoxDescr);
+ this.groupBox2.Controls.Add(this.CamTypComboBox);
+ this.groupBox2.Controls.Add(this.label4);
+ this.groupBox2.Controls.Add(this.label3);
+ this.groupBox2.Controls.Add(this.ThicknessUpDown);
+ this.groupBox2.Controls.Add(this.label2);
+ this.groupBox2.Controls.Add(this.buttonLoadDescrFile);
+ this.groupBox2.Location = new System.Drawing.Point(10, 293);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(489, 345);
+ this.groupBox2.TabIndex = 20;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "Camera Setup";
+ //
+ // buttonDefaultParams
+ //
+ this.buttonDefaultParams.Location = new System.Drawing.Point(326, 310);
+ this.buttonDefaultParams.Name = "buttonDefaultParams";
+ this.buttonDefaultParams.Size = new System.Drawing.Size(144, 26);
+ this.buttonDefaultParams.TabIndex = 33;
+ this.buttonDefaultParams.Text = "Reset Parameters";
+ this.buttonDefaultParams.Click += new System.EventHandler(this.buttonDefaultParams_Click);
+ //
+ // LineScanAddPanel
+ //
+ this.LineScanAddPanel.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.LineScanAddPanel.Controls.Add(this.label72);
+ this.LineScanAddPanel.Controls.Add(this.label73);
+ this.LineScanAddPanel.Controls.Add(this.label74);
+ this.LineScanAddPanel.Controls.Add(this.label75);
+ this.LineScanAddPanel.Controls.Add(this.label76);
+ this.LineScanAddPanel.Controls.Add(this.label77);
+ this.LineScanAddPanel.Controls.Add(this.MotionZUpDown);
+ this.LineScanAddPanel.Controls.Add(this.MotionYUpDown);
+ this.LineScanAddPanel.Controls.Add(this.MotionXUpDown);
+ this.LineScanAddPanel.Location = new System.Drawing.Point(10, 226);
+ this.LineScanAddPanel.Name = "LineScanAddPanel";
+ this.LineScanAddPanel.Size = new System.Drawing.Size(412, 78);
+ this.LineScanAddPanel.TabIndex = 32;
+ this.LineScanAddPanel.Visible = false;
+ //
+ // label72
+ //
+ this.label72.Location = new System.Drawing.Point(10, 52);
+ this.label72.Name = "label72";
+ this.label72.Size = new System.Drawing.Size(105, 26);
+ this.label72.TabIndex = 40;
+ this.label72.Text = "Motion Z (Vz)";
+ this.label72.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label73
+ //
+ this.label73.Location = new System.Drawing.Point(10, 26);
+ this.label73.Name = "label73";
+ this.label73.Size = new System.Drawing.Size(105, 26);
+ this.label73.TabIndex = 39;
+ this.label73.Text = "Motion Y (Vy)";
+ this.label73.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label74
+ //
+ this.label74.Location = new System.Drawing.Point(10, 0);
+ this.label74.Name = "label74";
+ this.label74.Size = new System.Drawing.Size(105, 26);
+ this.label74.TabIndex = 38;
+ this.label74.Text = "Motion X (Vx)";
+ this.label74.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label75
+ //
+ this.label75.BackColor = System.Drawing.SystemColors.Control;
+ this.label75.Location = new System.Drawing.Point(307, 52);
+ this.label75.Name = "label75";
+ this.label75.Size = new System.Drawing.Size(70, 26);
+ this.label75.TabIndex = 37;
+ this.label75.Text = "渭m/Pixel";
+ this.label75.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label76
+ //
+ this.label76.BackColor = System.Drawing.SystemColors.Control;
+ this.label76.Location = new System.Drawing.Point(307, 26);
+ this.label76.Name = "label76";
+ this.label76.Size = new System.Drawing.Size(70, 26);
+ this.label76.TabIndex = 36;
+ this.label76.Text = "渭m/Pixel";
+ this.label76.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label77
+ //
+ this.label77.BackColor = System.Drawing.SystemColors.Control;
+ this.label77.Location = new System.Drawing.Point(307, 0);
+ this.label77.Name = "label77";
+ this.label77.Size = new System.Drawing.Size(70, 26);
+ this.label77.TabIndex = 35;
+ this.label77.Text = "渭m/Pixel";
+ this.label77.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // MotionZUpDown
+ //
+ this.MotionZUpDown.DecimalPlaces = 3;
+ this.MotionZUpDown.Increment = new decimal(new int[] {
+ 100,
+ 0,
+ 0,
+ 0});
+ this.MotionZUpDown.Location = new System.Drawing.Point(125, 52);
+ this.MotionZUpDown.Maximum = new decimal(new int[] {
+ 10000,
+ 0,
+ 0,
+ 0});
+ this.MotionZUpDown.Name = "MotionZUpDown";
+ this.MotionZUpDown.Size = new System.Drawing.Size(163, 21);
+ this.MotionZUpDown.TabIndex = 34;
+ this.MotionZUpDown.ValueChanged += new System.EventHandler(this.MotionZUpDown_ValueChanged);
+ this.MotionZUpDown.Leave += new System.EventHandler(this.MotionZUpDown_Leave);
+ //
+ // MotionYUpDown
+ //
+ this.MotionYUpDown.DecimalPlaces = 3;
+ this.MotionYUpDown.Increment = new decimal(new int[] {
+ 100,
+ 0,
+ 0,
+ 0});
+ this.MotionYUpDown.Location = new System.Drawing.Point(125, 26);
+ this.MotionYUpDown.Maximum = new decimal(new int[] {
+ 10000,
+ 0,
+ 0,
+ 0});
+ this.MotionYUpDown.Name = "MotionYUpDown";
+ this.MotionYUpDown.Size = new System.Drawing.Size(163, 21);
+ this.MotionYUpDown.TabIndex = 33;
+ this.MotionYUpDown.ValueChanged += new System.EventHandler(this.MotionYUpDown_ValueChanged);
+ this.MotionYUpDown.Leave += new System.EventHandler(this.MotionYUpDown_Leave);
+ //
+ // MotionXUpDown
+ //
+ this.MotionXUpDown.DecimalPlaces = 3;
+ this.MotionXUpDown.Increment = new decimal(new int[] {
+ 100,
+ 0,
+ 0,
+ 0});
+ this.MotionXUpDown.Location = new System.Drawing.Point(125, 0);
+ this.MotionXUpDown.Maximum = new decimal(new int[] {
+ 10000,
+ 0,
+ 0,
+ 0});
+ this.MotionXUpDown.Name = "MotionXUpDown";
+ this.MotionXUpDown.Size = new System.Drawing.Size(163, 21);
+ this.MotionXUpDown.TabIndex = 32;
+ this.MotionXUpDown.ValueChanged += new System.EventHandler(this.MotionXUpDown_ValueChanged);
+ this.MotionXUpDown.Leave += new System.EventHandler(this.MotionXUpDown_Leave);
+ //
+ // label71
+ //
+ this.label71.Location = new System.Drawing.Point(19, 198);
+ this.label71.Name = "label71";
+ this.label71.Size = new System.Drawing.Size(106, 26);
+ this.label71.TabIndex = 22;
+ this.label71.Text = "Focal Length ";
+ this.label71.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label70
+ //
+ this.label70.Location = new System.Drawing.Point(19, 172);
+ this.label70.Name = "label70";
+ this.label70.Size = new System.Drawing.Size(106, 26);
+ this.label70.TabIndex = 21;
+ this.label70.Text = "Cell Height (Sy)";
+ this.label70.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label69
+ //
+ this.label69.Location = new System.Drawing.Point(19, 146);
+ this.label69.Name = "label69";
+ this.label69.Size = new System.Drawing.Size(106, 26);
+ this.label69.TabIndex = 20;
+ this.label69.Text = "Cell Width (Sx)";
+ this.label69.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label7
+ //
+ this.label7.Location = new System.Drawing.Point(317, 198);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(50, 26);
+ this.label7.TabIndex = 19;
+ this.label7.Text = "mm";
+ this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label6
+ //
+ this.label6.Location = new System.Drawing.Point(317, 172);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(71, 26);
+ this.label6.TabIndex = 18;
+ this.label6.Text = "渭m";
+ this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label5
+ //
+ this.label5.Location = new System.Drawing.Point(317, 146);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(71, 26);
+ this.label5.TabIndex = 17;
+ this.label5.Text = "渭m";
+ this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // TelecentricCheckBox
+ //
+ this.TelecentricCheckBox.Location = new System.Drawing.Point(374, 198);
+ this.TelecentricCheckBox.Name = "TelecentricCheckBox";
+ this.TelecentricCheckBox.Size = new System.Drawing.Size(106, 26);
+ this.TelecentricCheckBox.TabIndex = 16;
+ this.TelecentricCheckBox.Text = "Telecentric";
+ this.TelecentricCheckBox.CheckedChanged += new System.EventHandler(this.checkBoxTelecentric_CheckedChanged);
+ //
+ // FocalLengthUpDown
+ //
+ this.FocalLengthUpDown.DecimalPlaces = 3;
+ this.FocalLengthUpDown.Increment = new decimal(new int[] {
+ 100,
+ 0,
+ 0,
+ 0});
+ this.FocalLengthUpDown.Location = new System.Drawing.Point(134, 198);
+ this.FocalLengthUpDown.Maximum = new decimal(new int[] {
+ 100000000,
+ 0,
+ 0,
+ 0});
+ this.FocalLengthUpDown.Name = "FocalLengthUpDown";
+ this.FocalLengthUpDown.Size = new System.Drawing.Size(164, 21);
+ this.FocalLengthUpDown.TabIndex = 15;
+ this.FocalLengthUpDown.ValueChanged += new System.EventHandler(this.numUpDownFocalLength_ValueChanged);
+ this.FocalLengthUpDown.Leave += new System.EventHandler(this.FocalLengthUpDown_Leave);
+ //
+ // SyUpDown
+ //
+ this.SyUpDown.DecimalPlaces = 3;
+ this.SyUpDown.Increment = new decimal(new int[] {
+ 100,
+ 0,
+ 0,
+ 0});
+ this.SyUpDown.Location = new System.Drawing.Point(134, 172);
+ this.SyUpDown.Maximum = new decimal(new int[] {
+ 1000000000,
+ 0,
+ 0,
+ 0});
+ this.SyUpDown.Name = "SyUpDown";
+ this.SyUpDown.Size = new System.Drawing.Size(164, 21);
+ this.SyUpDown.TabIndex = 14;
+ this.SyUpDown.ValueChanged += new System.EventHandler(this.numUpDownSy_ValueChanged);
+ this.SyUpDown.Leave += new System.EventHandler(this.SyUpDown_Leave);
+ //
+ // SxUpDown
+ //
+ this.SxUpDown.DecimalPlaces = 3;
+ this.SxUpDown.Increment = new decimal(new int[] {
+ 100,
+ 0,
+ 0,
+ 0});
+ this.SxUpDown.Location = new System.Drawing.Point(134, 146);
+ this.SxUpDown.Maximum = new decimal(new int[] {
+ 1000000000,
+ 0,
+ 0,
+ 0});
+ this.SxUpDown.Name = "SxUpDown";
+ this.SxUpDown.Size = new System.Drawing.Size(164, 21);
+ this.SxUpDown.TabIndex = 13;
+ this.SxUpDown.ValueChanged += new System.EventHandler(this.numUpDownSx_ValueChanged);
+ this.SxUpDown.Leave += new System.EventHandler(this.SxUpDown_Leave);
+ //
+ // buttonImportParams
+ //
+ this.buttonImportParams.Location = new System.Drawing.Point(326, 103);
+ this.buttonImportParams.Name = "buttonImportParams";
+ this.buttonImportParams.Size = new System.Drawing.Size(144, 26);
+ this.buttonImportParams.TabIndex = 9;
+ this.buttonImportParams.Text = "Import Parameters ...";
+ this.buttonImportParams.Click += new System.EventHandler(this.buttonImportParams_Click);
+ //
+ // textBoxDescr
+ //
+ this.textBoxDescr.BackColor = System.Drawing.SystemColors.InactiveBorder;
+ this.textBoxDescr.Location = new System.Drawing.Point(134, 34);
+ this.textBoxDescr.Name = "textBoxDescr";
+ this.textBoxDescr.ReadOnly = true;
+ this.textBoxDescr.Size = new System.Drawing.Size(173, 21);
+ this.textBoxDescr.TabIndex = 8;
+ this.textBoxDescr.Text = ".descr";
+ //
+ // CamTypComboBox
+ //
+ this.CamTypComboBox.Items.AddRange(new object[] {
+ "Area Scan (Division)",
+ "Area Scan (Polynomial)",
+ "Line Scan"});
+ this.CamTypComboBox.Location = new System.Drawing.Point(134, 103);
+ this.CamTypComboBox.Name = "CamTypComboBox";
+ this.CamTypComboBox.Size = new System.Drawing.Size(173, 20);
+ this.CamTypComboBox.TabIndex = 7;
+ this.CamTypComboBox.Text = "Area Scan (Division)";
+ this.CamTypComboBox.SelectedIndexChanged += new System.EventHandler(this.comboBoxCamTyp_SelectedIndexChanged);
+ //
+ // label4
+ //
+ this.label4.Location = new System.Drawing.Point(19, 103);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(106, 26);
+ this.label4.TabIndex = 6;
+ this.label4.Text = "Camera Type";
+ this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label3
+ //
+ this.label3.Location = new System.Drawing.Point(326, 60);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(96, 26);
+ this.label3.TabIndex = 5;
+ this.label3.Text = "mm";
+ this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // ThicknessUpDown
+ //
+ this.ThicknessUpDown.DecimalPlaces = 3;
+ this.ThicknessUpDown.Location = new System.Drawing.Point(134, 60);
+ this.ThicknessUpDown.Maximum = new decimal(new int[] {
+ 10000,
+ 0,
+ 0,
+ 0});
+ this.ThicknessUpDown.Name = "ThicknessUpDown";
+ this.ThicknessUpDown.Size = new System.Drawing.Size(173, 21);
+ this.ThicknessUpDown.TabIndex = 4;
+ this.ThicknessUpDown.ValueChanged += new System.EventHandler(this.numUpDownThickness_ValueChanged);
+ this.ThicknessUpDown.Leave += new System.EventHandler(this.ThicknessUpDown_Leave);
+ //
+ // label2
+ //
+ this.label2.Location = new System.Drawing.Point(19, 60);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(106, 26);
+ this.label2.TabIndex = 3;
+ this.label2.Text = "Thickness";
+ this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // buttonLoadDescrFile
+ //
+ this.buttonLoadDescrFile.Location = new System.Drawing.Point(326, 34);
+ this.buttonLoadDescrFile.Name = "buttonLoadDescrFile";
+ this.buttonLoadDescrFile.Size = new System.Drawing.Size(144, 26);
+ this.buttonLoadDescrFile.TabIndex = 2;
+ this.buttonLoadDescrFile.Text = "Load File";
+ this.buttonLoadDescrFile.Click += new System.EventHandler(this.buttonLoadDescrFile_Click);
+ //
+ // buttonCalibrate
+ //
+ this.buttonCalibrate.Enabled = false;
+ this.buttonCalibrate.Location = new System.Drawing.Point(394, 241);
+ this.buttonCalibrate.Name = "buttonCalibrate";
+ this.buttonCalibrate.Size = new System.Drawing.Size(100, 26);
+ this.buttonCalibrate.TabIndex = 19;
+ this.buttonCalibrate.Text = "Calibrate";
+ this.buttonCalibrate.Click += new System.EventHandler(this.buttonCalibrate_Click);
+ //
+ // buttonSetReference
+ //
+ this.buttonSetReference.Enabled = false;
+ this.buttonSetReference.Location = new System.Drawing.Point(394, 207);
+ this.buttonSetReference.Name = "buttonSetReference";
+ this.buttonSetReference.Size = new System.Drawing.Size(100, 26);
+ this.buttonSetReference.TabIndex = 18;
+ this.buttonSetReference.Text = "Set Reference";
+ this.buttonSetReference.Click += new System.EventHandler(this.buttonSetReference_Click);
+ //
+ // buttonDeleteAll
+ //
+ this.buttonDeleteAll.Location = new System.Drawing.Point(394, 103);
+ this.buttonDeleteAll.Name = "buttonDeleteAll";
+ this.buttonDeleteAll.Size = new System.Drawing.Size(100, 26);
+ this.buttonDeleteAll.TabIndex = 15;
+ this.buttonDeleteAll.Text = "Delete All";
+ this.buttonDeleteAll.Click += new System.EventHandler(this.buttonDeleteAll_Click);
+ //
+ // buttonDelete
+ //
+ this.buttonDelete.Location = new System.Drawing.Point(394, 69);
+ this.buttonDelete.Name = "buttonDelete";
+ this.buttonDelete.Size = new System.Drawing.Size(100, 26);
+ this.buttonDelete.TabIndex = 14;
+ this.buttonDelete.Text = "Delete";
+ this.buttonDelete.Click += new System.EventHandler(this.buttonDelete_Click);
+ //
+ // buttonLoad
+ //
+ this.buttonLoad.Location = new System.Drawing.Point(394, 34);
+ this.buttonLoad.Name = "buttonLoad";
+ this.buttonLoad.Size = new System.Drawing.Size(100, 26);
+ this.buttonLoad.TabIndex = 8;
+ this.buttonLoad.Text = "Load ...";
+ this.buttonLoad.Click += new System.EventHandler(this.buttonLoad_Click);
+ //
+ // tabPageQualityCheck
+ //
+ this.tabPageQualityCheck.Controls.Add(this.WarnlevelUpDown);
+ this.tabPageQualityCheck.Controls.Add(this.ListQualityCheck);
+ this.tabPageQualityCheck.Controls.Add(this.groupBox4);
+ this.tabPageQualityCheck.Controls.Add(this.label10);
+ this.tabPageQualityCheck.Controls.Add(this.label9);
+ this.tabPageQualityCheck.Controls.Add(this.SeqTestsComboBox);
+ this.tabPageQualityCheck.Controls.Add(this.label8);
+ this.tabPageQualityCheck.Controls.Add(this.ImgTestsComboBox);
+ this.tabPageQualityCheck.Location = new System.Drawing.Point(4, 22);
+ this.tabPageQualityCheck.Name = "tabPageQualityCheck";
+ this.tabPageQualityCheck.Size = new System.Drawing.Size(511, 646);
+ this.tabPageQualityCheck.TabIndex = 1;
+ this.tabPageQualityCheck.Text = "Image Quality Check";
+ this.tabPageQualityCheck.UseVisualStyleBackColor = true;
+ //
+ // WarnlevelUpDown
+ //
+ this.WarnlevelUpDown.Increment = new decimal(new int[] {
+ 5,
+ 0,
+ 0,
+ 0});
+ this.WarnlevelUpDown.Location = new System.Drawing.Point(394, 220);
+ this.WarnlevelUpDown.Maximum = new decimal(new int[] {
+ 99,
+ 0,
+ 0,
+ 0});
+ this.WarnlevelUpDown.Name = "WarnlevelUpDown";
+ this.WarnlevelUpDown.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.WarnlevelUpDown.Size = new System.Drawing.Size(96, 21);
+ this.WarnlevelUpDown.TabIndex = 23;
+ this.WarnlevelUpDown.ValueChanged += new System.EventHandler(this.numUpDownWarnlevel_ValueChanged);
+ //
+ // ListQualityCheck
+ //
+ this.ListQualityCheck.AutoArrange = false;
+ this.ListQualityCheck.BackColor = System.Drawing.SystemColors.Window;
+ this.ListQualityCheck.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.ColScope,
+ this.ColDescr,
+ this.Col2Status});
+ this.ListQualityCheck.FullRowSelect = true;
+ this.ListQualityCheck.GridLines = true;
+ this.ListQualityCheck.LabelWrap = false;
+ this.ListQualityCheck.Location = new System.Drawing.Point(10, 34);
+ this.ListQualityCheck.MultiSelect = false;
+ this.ListQualityCheck.Name = "ListQualityCheck";
+ this.ListQualityCheck.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.ListQualityCheck.Size = new System.Drawing.Size(374, 207);
+ this.ListQualityCheck.TabIndex = 22;
+ this.ListQualityCheck.UseCompatibleStateImageBehavior = false;
+ this.ListQualityCheck.View = System.Windows.Forms.View.Details;
+ //
+ // ColScope
+ //
+ this.ColScope.Text = "Scope";
+ this.ColScope.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
+ this.ColScope.Width = 65;
+ //
+ // ColDescr
+ //
+ this.ColDescr.Text = "Description";
+ this.ColDescr.Width = 192;
+ //
+ // Col2Status
+ //
+ this.Col2Status.Text = "Status";
+ this.Col2Status.Width = 50;
+ //
+ // groupBox4
+ //
+ this.groupBox4.Controls.Add(this.MaxDiamTrackBar);
+ this.groupBox4.Controls.Add(this.MaxDiamResetButton);
+ this.groupBox4.Controls.Add(this.MaxDiamUpDown);
+ this.groupBox4.Controls.Add(this.label19);
+ this.groupBox4.Controls.Add(this.MinContLResetButton);
+ this.groupBox4.Controls.Add(this.MinContLTrackBar);
+ this.groupBox4.Controls.Add(this.MinContLUpDown);
+ this.groupBox4.Controls.Add(this.label18);
+ this.groupBox4.Controls.Add(this.SmootingResetButton);
+ this.groupBox4.Controls.Add(this.SmoothTrackBar);
+ this.groupBox4.Controls.Add(this.SmoothUpDown);
+ this.groupBox4.Controls.Add(this.label17);
+ this.groupBox4.Controls.Add(this.MinThreshResetButton);
+ this.groupBox4.Controls.Add(this.MinThreshTrackBar);
+ this.groupBox4.Controls.Add(this.MinThreshUpDown);
+ this.groupBox4.Controls.Add(this.label16);
+ this.groupBox4.Controls.Add(this.ThreshDecrResetButton);
+ this.groupBox4.Controls.Add(this.ThreshDecrTrackBar);
+ this.groupBox4.Controls.Add(this.ThreshDecrUpDown);
+ this.groupBox4.Controls.Add(this.label15);
+ this.groupBox4.Controls.Add(this.InitThreshResetButton);
+ this.groupBox4.Controls.Add(this.InitThreshTrackBar);
+ this.groupBox4.Controls.Add(this.InitThreshUpDown);
+ this.groupBox4.Controls.Add(this.label14);
+ this.groupBox4.Controls.Add(this.MinDiamResetButton);
+ this.groupBox4.Controls.Add(this.MinDiamTrackBar);
+ this.groupBox4.Controls.Add(this.MinDiamUpDown);
+ this.groupBox4.Controls.Add(this.label13);
+ this.groupBox4.Controls.Add(this.MarkThreshResetButton);
+ this.groupBox4.Controls.Add(this.MarkThreshTrackBar);
+ this.groupBox4.Controls.Add(this.MarkThreshUpDown);
+ this.groupBox4.Controls.Add(this.label12);
+ this.groupBox4.Controls.Add(this.FilterSizeResetButton);
+ this.groupBox4.Controls.Add(this.FilterSizeTrackBar);
+ this.groupBox4.Controls.Add(this.FilterSizeUpDown);
+ this.groupBox4.Controls.Add(this.label11);
+ this.groupBox4.Location = new System.Drawing.Point(10, 276);
+ this.groupBox4.Name = "groupBox4";
+ this.groupBox4.Size = new System.Drawing.Size(492, 362);
+ this.groupBox4.TabIndex = 7;
+ this.groupBox4.TabStop = false;
+ this.groupBox4.Text = "Calibration Plate Extraction Parameters";
+ //
+ // MaxDiamTrackBar
+ //
+ this.MaxDiamTrackBar.LargeChange = 20;
+ this.MaxDiamTrackBar.Location = new System.Drawing.Point(192, 310);
+ this.MaxDiamTrackBar.Maximum = 500;
+ this.MaxDiamTrackBar.Name = "MaxDiamTrackBar";
+ this.MaxDiamTrackBar.Size = new System.Drawing.Size(230, 45);
+ this.MaxDiamTrackBar.SmallChange = 10;
+ this.MaxDiamTrackBar.TabIndex = 34;
+ this.MaxDiamTrackBar.TickFrequency = 20;
+ this.MaxDiamTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.MaxDiamTrackBar.Scroll += new System.EventHandler(this.trackBarMaxDiam_Scroll);
+ //
+ // MaxDiamResetButton
+ //
+ this.MaxDiamResetButton.ForeColor = System.Drawing.Color.Gray;
+ this.MaxDiamResetButton.Location = new System.Drawing.Point(422, 310);
+ this.MaxDiamResetButton.Name = "MaxDiamResetButton";
+ this.MaxDiamResetButton.Size = new System.Drawing.Size(58, 26);
+ this.MaxDiamResetButton.TabIndex = 35;
+ this.MaxDiamResetButton.Text = "Reset";
+ this.MaxDiamResetButton.Click += new System.EventHandler(this.buttonRMaxDiam_Click);
+ //
+ // MaxDiamUpDown
+ //
+ this.MaxDiamUpDown.Location = new System.Drawing.Point(115, 310);
+ this.MaxDiamUpDown.Maximum = new decimal(new int[] {
+ 500,
+ 0,
+ 0,
+ 0});
+ this.MaxDiamUpDown.Name = "MaxDiamUpDown";
+ this.MaxDiamUpDown.Size = new System.Drawing.Size(77, 21);
+ this.MaxDiamUpDown.TabIndex = 33;
+ this.MaxDiamUpDown.ValueChanged += new System.EventHandler(this.numUpDownMaxDiam_ValueChanged);
+ //
+ // label19
+ //
+ this.label19.Location = new System.Drawing.Point(10, 310);
+ this.label19.Name = "label19";
+ this.label19.Size = new System.Drawing.Size(105, 26);
+ this.label19.TabIndex = 32;
+ this.label19.Text = "Max Mark Diam";
+ this.label19.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // MinContLResetButton
+ //
+ this.MinContLResetButton.ForeColor = System.Drawing.Color.Gray;
+ this.MinContLResetButton.Location = new System.Drawing.Point(422, 276);
+ this.MinContLResetButton.Name = "MinContLResetButton";
+ this.MinContLResetButton.Size = new System.Drawing.Size(58, 26);
+ this.MinContLResetButton.TabIndex = 31;
+ this.MinContLResetButton.Text = "Reset";
+ this.MinContLResetButton.Click += new System.EventHandler(this.buttonRMinContL_Click);
+ //
+ // MinContLTrackBar
+ //
+ this.MinContLTrackBar.LargeChange = 20;
+ this.MinContLTrackBar.Location = new System.Drawing.Point(192, 276);
+ this.MinContLTrackBar.Maximum = 500;
+ this.MinContLTrackBar.Name = "MinContLTrackBar";
+ this.MinContLTrackBar.Size = new System.Drawing.Size(230, 45);
+ this.MinContLTrackBar.SmallChange = 10;
+ this.MinContLTrackBar.TabIndex = 30;
+ this.MinContLTrackBar.TickFrequency = 20;
+ this.MinContLTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.MinContLTrackBar.Scroll += new System.EventHandler(this.trackBarMinContL_Scroll);
+ //
+ // MinContLUpDown
+ //
+ this.MinContLUpDown.Location = new System.Drawing.Point(115, 276);
+ this.MinContLUpDown.Maximum = new decimal(new int[] {
+ 500,
+ 0,
+ 0,
+ 0});
+ this.MinContLUpDown.Name = "MinContLUpDown";
+ this.MinContLUpDown.Size = new System.Drawing.Size(77, 21);
+ this.MinContLUpDown.TabIndex = 29;
+ this.MinContLUpDown.ValueChanged += new System.EventHandler(this.numUpDownMinContL_ValueChanged);
+ //
+ // label18
+ //
+ this.label18.Location = new System.Drawing.Point(10, 276);
+ this.label18.Name = "label18";
+ this.label18.Size = new System.Drawing.Size(105, 26);
+ this.label18.TabIndex = 28;
+ this.label18.Text = "Min Cont Length";
+ this.label18.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // SmootingResetButton
+ //
+ this.SmootingResetButton.ForeColor = System.Drawing.Color.Gray;
+ this.SmootingResetButton.Location = new System.Drawing.Point(422, 241);
+ this.SmootingResetButton.Name = "SmootingResetButton";
+ this.SmootingResetButton.Size = new System.Drawing.Size(58, 26);
+ this.SmootingResetButton.TabIndex = 27;
+ this.SmootingResetButton.Text = "Reset";
+ this.SmootingResetButton.Click += new System.EventHandler(this.buttonRSmooting_Click);
+ //
+ // SmoothTrackBar
+ //
+ this.SmoothTrackBar.LargeChange = 10;
+ this.SmoothTrackBar.Location = new System.Drawing.Point(192, 241);
+ this.SmoothTrackBar.Maximum = 200;
+ this.SmoothTrackBar.Minimum = 1;
+ this.SmoothTrackBar.Name = "SmoothTrackBar";
+ this.SmoothTrackBar.Size = new System.Drawing.Size(230, 45);
+ this.SmoothTrackBar.SmallChange = 5;
+ this.SmoothTrackBar.TabIndex = 26;
+ this.SmoothTrackBar.TickFrequency = 10;
+ this.SmoothTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.SmoothTrackBar.Value = 1;
+ this.SmoothTrackBar.Scroll += new System.EventHandler(this.trackBarSmooth_Scroll);
+ //
+ // SmoothUpDown
+ //
+ this.SmoothUpDown.Location = new System.Drawing.Point(115, 241);
+ this.SmoothUpDown.Maximum = new decimal(new int[] {
+ 200,
+ 0,
+ 0,
+ 0});
+ this.SmoothUpDown.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.SmoothUpDown.Name = "SmoothUpDown";
+ this.SmoothUpDown.Size = new System.Drawing.Size(77, 21);
+ this.SmoothUpDown.TabIndex = 25;
+ this.SmoothUpDown.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.SmoothUpDown.ValueChanged += new System.EventHandler(this.numUpDownSmooth_ValueChanged);
+ //
+ // label17
+ //
+ this.label17.Location = new System.Drawing.Point(10, 241);
+ this.label17.Name = "label17";
+ this.label17.Size = new System.Drawing.Size(105, 26);
+ this.label17.TabIndex = 24;
+ this.label17.Text = "Smoothing*100";
+ this.label17.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // MinThreshResetButton
+ //
+ this.MinThreshResetButton.ForeColor = System.Drawing.Color.Gray;
+ this.MinThreshResetButton.Location = new System.Drawing.Point(422, 207);
+ this.MinThreshResetButton.Name = "MinThreshResetButton";
+ this.MinThreshResetButton.Size = new System.Drawing.Size(58, 26);
+ this.MinThreshResetButton.TabIndex = 23;
+ this.MinThreshResetButton.Text = "Reset";
+ this.MinThreshResetButton.Click += new System.EventHandler(this.buttonRMinThresh_Click);
+ //
+ // MinThreshTrackBar
+ //
+ this.MinThreshTrackBar.LargeChange = 10;
+ this.MinThreshTrackBar.Location = new System.Drawing.Point(192, 207);
+ this.MinThreshTrackBar.Maximum = 100;
+ this.MinThreshTrackBar.Name = "MinThreshTrackBar";
+ this.MinThreshTrackBar.Size = new System.Drawing.Size(230, 45);
+ this.MinThreshTrackBar.SmallChange = 5;
+ this.MinThreshTrackBar.TabIndex = 22;
+ this.MinThreshTrackBar.TickFrequency = 10;
+ this.MinThreshTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.MinThreshTrackBar.Scroll += new System.EventHandler(this.trackBarMinThresh_Scroll);
+ //
+ // MinThreshUpDown
+ //
+ this.MinThreshUpDown.Location = new System.Drawing.Point(115, 207);
+ this.MinThreshUpDown.Name = "MinThreshUpDown";
+ this.MinThreshUpDown.Size = new System.Drawing.Size(77, 21);
+ this.MinThreshUpDown.TabIndex = 21;
+ this.MinThreshUpDown.ValueChanged += new System.EventHandler(this.numUpDownMinThresh_ValueChanged);
+ //
+ // label16
+ //
+ this.label16.Location = new System.Drawing.Point(10, 207);
+ this.label16.Name = "label16";
+ this.label16.Size = new System.Drawing.Size(76, 26);
+ this.label16.TabIndex = 20;
+ this.label16.Text = "Min Thresh";
+ this.label16.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // ThreshDecrResetButton
+ //
+ this.ThreshDecrResetButton.ForeColor = System.Drawing.Color.Gray;
+ this.ThreshDecrResetButton.Location = new System.Drawing.Point(422, 172);
+ this.ThreshDecrResetButton.Name = "ThreshDecrResetButton";
+ this.ThreshDecrResetButton.Size = new System.Drawing.Size(58, 26);
+ this.ThreshDecrResetButton.TabIndex = 19;
+ this.ThreshDecrResetButton.Text = "Reset";
+ this.ThreshDecrResetButton.Click += new System.EventHandler(this.buttonRThreshDecr_Click);
+ //
+ // ThreshDecrTrackBar
+ //
+ this.ThreshDecrTrackBar.LargeChange = 10;
+ this.ThreshDecrTrackBar.Location = new System.Drawing.Point(192, 172);
+ this.ThreshDecrTrackBar.Maximum = 100;
+ this.ThreshDecrTrackBar.Name = "ThreshDecrTrackBar";
+ this.ThreshDecrTrackBar.Size = new System.Drawing.Size(230, 45);
+ this.ThreshDecrTrackBar.SmallChange = 5;
+ this.ThreshDecrTrackBar.TabIndex = 18;
+ this.ThreshDecrTrackBar.TickFrequency = 10;
+ this.ThreshDecrTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.ThreshDecrTrackBar.Scroll += new System.EventHandler(this.trackBarThreshDecr_Scroll);
+ //
+ // ThreshDecrUpDown
+ //
+ this.ThreshDecrUpDown.Location = new System.Drawing.Point(115, 172);
+ this.ThreshDecrUpDown.Name = "ThreshDecrUpDown";
+ this.ThreshDecrUpDown.Size = new System.Drawing.Size(77, 21);
+ this.ThreshDecrUpDown.TabIndex = 17;
+ this.ThreshDecrUpDown.ValueChanged += new System.EventHandler(this.numUpDownThreshDecr_ValueChanged);
+ //
+ // label15
+ //
+ this.label15.Location = new System.Drawing.Point(10, 172);
+ this.label15.Name = "label15";
+ this.label15.Size = new System.Drawing.Size(86, 26);
+ this.label15.TabIndex = 16;
+ this.label15.Text = "Thresh Decr";
+ this.label15.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // InitThreshResetButton
+ //
+ this.InitThreshResetButton.ForeColor = System.Drawing.Color.Gray;
+ this.InitThreshResetButton.Location = new System.Drawing.Point(422, 138);
+ this.InitThreshResetButton.Name = "InitThreshResetButton";
+ this.InitThreshResetButton.Size = new System.Drawing.Size(58, 26);
+ this.InitThreshResetButton.TabIndex = 15;
+ this.InitThreshResetButton.Text = "Reset";
+ this.InitThreshResetButton.Click += new System.EventHandler(this.buttonRInitThresh_Click);
+ //
+ // InitThreshTrackBar
+ //
+ this.InitThreshTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.InitThreshTrackBar.LargeChange = 10;
+ this.InitThreshTrackBar.Location = new System.Drawing.Point(192, 138);
+ this.InitThreshTrackBar.Maximum = 255;
+ this.InitThreshTrackBar.Name = "InitThreshTrackBar";
+ this.InitThreshTrackBar.Size = new System.Drawing.Size(230, 45);
+ this.InitThreshTrackBar.SmallChange = 5;
+ this.InitThreshTrackBar.TabIndex = 14;
+ this.InitThreshTrackBar.TickFrequency = 10;
+ this.InitThreshTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.InitThreshTrackBar.Scroll += new System.EventHandler(this.trackBarInitThresh_Scroll);
+ //
+ // InitThreshUpDown
+ //
+ this.InitThreshUpDown.Location = new System.Drawing.Point(115, 138);
+ this.InitThreshUpDown.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.InitThreshUpDown.Name = "InitThreshUpDown";
+ this.InitThreshUpDown.Size = new System.Drawing.Size(77, 21);
+ this.InitThreshUpDown.TabIndex = 13;
+ this.InitThreshUpDown.ValueChanged += new System.EventHandler(this.numUpDownInitThresh_ValueChanged);
+ //
+ // label14
+ //
+ this.label14.Location = new System.Drawing.Point(10, 138);
+ this.label14.Name = "label14";
+ this.label14.Size = new System.Drawing.Size(76, 26);
+ this.label14.TabIndex = 12;
+ this.label14.Text = "Init Thresh";
+ this.label14.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // MinDiamResetButton
+ //
+ this.MinDiamResetButton.ForeColor = System.Drawing.Color.Gray;
+ this.MinDiamResetButton.Location = new System.Drawing.Point(422, 103);
+ this.MinDiamResetButton.Name = "MinDiamResetButton";
+ this.MinDiamResetButton.Size = new System.Drawing.Size(58, 26);
+ this.MinDiamResetButton.TabIndex = 11;
+ this.MinDiamResetButton.Text = "Reset";
+ this.MinDiamResetButton.Click += new System.EventHandler(this.buttonRMinDiam_Click);
+ //
+ // MinDiamTrackBar
+ //
+ this.MinDiamTrackBar.LargeChange = 10;
+ this.MinDiamTrackBar.Location = new System.Drawing.Point(192, 103);
+ this.MinDiamTrackBar.Maximum = 100;
+ this.MinDiamTrackBar.Name = "MinDiamTrackBar";
+ this.MinDiamTrackBar.Size = new System.Drawing.Size(230, 45);
+ this.MinDiamTrackBar.SmallChange = 5;
+ this.MinDiamTrackBar.TabIndex = 10;
+ this.MinDiamTrackBar.TickFrequency = 10;
+ this.MinDiamTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.MinDiamTrackBar.Scroll += new System.EventHandler(this.trackBarMinDiam_Scroll);
+ //
+ // MinDiamUpDown
+ //
+ this.MinDiamUpDown.Location = new System.Drawing.Point(115, 103);
+ this.MinDiamUpDown.Name = "MinDiamUpDown";
+ this.MinDiamUpDown.Size = new System.Drawing.Size(77, 21);
+ this.MinDiamUpDown.TabIndex = 9;
+ this.MinDiamUpDown.ValueChanged += new System.EventHandler(this.numUpDownMinDiam_ValueChanged);
+ //
+ // label13
+ //
+ this.label13.Location = new System.Drawing.Point(10, 103);
+ this.label13.Name = "label13";
+ this.label13.Size = new System.Drawing.Size(96, 26);
+ this.label13.TabIndex = 8;
+ this.label13.Text = "Min Mark Diam";
+ this.label13.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // MarkThreshResetButton
+ //
+ this.MarkThreshResetButton.ForeColor = System.Drawing.Color.Gray;
+ this.MarkThreshResetButton.Location = new System.Drawing.Point(422, 69);
+ this.MarkThreshResetButton.Name = "MarkThreshResetButton";
+ this.MarkThreshResetButton.Size = new System.Drawing.Size(58, 26);
+ this.MarkThreshResetButton.TabIndex = 7;
+ this.MarkThreshResetButton.Text = "Reset";
+ this.MarkThreshResetButton.Click += new System.EventHandler(this.buttonRMarkThresh_Click);
+ //
+ // MarkThreshTrackBar
+ //
+ this.MarkThreshTrackBar.LargeChange = 10;
+ this.MarkThreshTrackBar.Location = new System.Drawing.Point(192, 69);
+ this.MarkThreshTrackBar.Maximum = 255;
+ this.MarkThreshTrackBar.Name = "MarkThreshTrackBar";
+ this.MarkThreshTrackBar.Size = new System.Drawing.Size(230, 45);
+ this.MarkThreshTrackBar.SmallChange = 5;
+ this.MarkThreshTrackBar.TabIndex = 6;
+ this.MarkThreshTrackBar.TickFrequency = 10;
+ this.MarkThreshTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.MarkThreshTrackBar.Scroll += new System.EventHandler(this.trackBarMarkThresh_Scroll);
+ //
+ // MarkThreshUpDown
+ //
+ this.MarkThreshUpDown.Location = new System.Drawing.Point(115, 69);
+ this.MarkThreshUpDown.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.MarkThreshUpDown.Name = "MarkThreshUpDown";
+ this.MarkThreshUpDown.Size = new System.Drawing.Size(77, 21);
+ this.MarkThreshUpDown.TabIndex = 5;
+ this.MarkThreshUpDown.ValueChanged += new System.EventHandler(this.numUpDownMarkThresh_ValueChanged);
+ //
+ // label12
+ //
+ this.label12.Location = new System.Drawing.Point(10, 69);
+ this.label12.Name = "label12";
+ this.label12.Size = new System.Drawing.Size(96, 26);
+ this.label12.TabIndex = 4;
+ this.label12.Text = "Mark Thresh";
+ this.label12.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // FilterSizeResetButton
+ //
+ this.FilterSizeResetButton.ForeColor = System.Drawing.Color.Gray;
+ this.FilterSizeResetButton.Location = new System.Drawing.Point(422, 34);
+ this.FilterSizeResetButton.Name = "FilterSizeResetButton";
+ this.FilterSizeResetButton.Size = new System.Drawing.Size(58, 26);
+ this.FilterSizeResetButton.TabIndex = 3;
+ this.FilterSizeResetButton.Text = "Reset";
+ this.FilterSizeResetButton.Click += new System.EventHandler(this.buttonRFilterSize_Click);
+ //
+ // FilterSizeTrackBar
+ //
+ this.FilterSizeTrackBar.LargeChange = 1;
+ this.FilterSizeTrackBar.Location = new System.Drawing.Point(192, 34);
+ this.FilterSizeTrackBar.Maximum = 15;
+ this.FilterSizeTrackBar.Minimum = 1;
+ this.FilterSizeTrackBar.Name = "FilterSizeTrackBar";
+ this.FilterSizeTrackBar.Size = new System.Drawing.Size(230, 45);
+ this.FilterSizeTrackBar.TabIndex = 2;
+ this.FilterSizeTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.FilterSizeTrackBar.Value = 1;
+ this.FilterSizeTrackBar.Scroll += new System.EventHandler(this.trackBarFilterSize_Scroll);
+ //
+ // FilterSizeUpDown
+ //
+ this.FilterSizeUpDown.Location = new System.Drawing.Point(115, 34);
+ this.FilterSizeUpDown.Maximum = new decimal(new int[] {
+ 15,
+ 0,
+ 0,
+ 0});
+ this.FilterSizeUpDown.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.FilterSizeUpDown.Name = "FilterSizeUpDown";
+ this.FilterSizeUpDown.Size = new System.Drawing.Size(77, 21);
+ this.FilterSizeUpDown.TabIndex = 1;
+ this.FilterSizeUpDown.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.FilterSizeUpDown.ValueChanged += new System.EventHandler(this.numUpDownFilterSize_ValueChanged);
+ //
+ // label11
+ //
+ this.label11.Location = new System.Drawing.Point(10, 34);
+ this.label11.Name = "label11";
+ this.label11.Size = new System.Drawing.Size(86, 26);
+ this.label11.TabIndex = 0;
+ this.label11.Text = "Filter Size";
+ this.label11.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label10
+ //
+ this.label10.Location = new System.Drawing.Point(394, 194);
+ this.label10.Name = "label10";
+ this.label10.Size = new System.Drawing.Size(105, 26);
+ this.label10.TabIndex = 6;
+ this.label10.Text = "Warn Level (%)";
+ this.label10.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label9
+ //
+ this.label9.Location = new System.Drawing.Point(394, 112);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(105, 26);
+ this.label9.TabIndex = 4;
+ this.label9.Text = "Sequence Tests";
+ this.label9.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // SeqTestsComboBox
+ //
+ this.SeqTestsComboBox.Items.AddRange(new object[] {
+ "All",
+ "Quick",
+ "None"});
+ this.SeqTestsComboBox.Location = new System.Drawing.Point(394, 138);
+ this.SeqTestsComboBox.Name = "SeqTestsComboBox";
+ this.SeqTestsComboBox.Size = new System.Drawing.Size(96, 20);
+ this.SeqTestsComboBox.TabIndex = 3;
+ this.SeqTestsComboBox.Text = "All";
+ this.SeqTestsComboBox.SelectedIndexChanged += new System.EventHandler(this.comboBoxSeqTests_SelectedIndexChanged);
+ //
+ // label8
+ //
+ this.label8.Location = new System.Drawing.Point(394, 34);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(105, 26);
+ this.label8.TabIndex = 2;
+ this.label8.Text = "Image Tests";
+ this.label8.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // ImgTestsComboBox
+ //
+ this.ImgTestsComboBox.Items.AddRange(new object[] {
+ "All",
+ "Quick",
+ "None"});
+ this.ImgTestsComboBox.Location = new System.Drawing.Point(394, 60);
+ this.ImgTestsComboBox.Name = "ImgTestsComboBox";
+ this.ImgTestsComboBox.Size = new System.Drawing.Size(96, 20);
+ this.ImgTestsComboBox.TabIndex = 1;
+ this.ImgTestsComboBox.Text = "All";
+ this.ImgTestsComboBox.SelectedIndexChanged += new System.EventHandler(this.comboBoxImgTests_SelectedIndexChanged);
+ //
+ // tabPageResults
+ //
+ this.tabPageResults.Controls.Add(this.label20);
+ this.tabPageResults.Controls.Add(this.buttonSimImg);
+ this.tabPageResults.Controls.Add(this.buttonRefImg);
+ this.tabPageResults.Controls.Add(this.groupBox6);
+ this.tabPageResults.Controls.Add(this.groupBox5);
+ this.tabPageResults.Controls.Add(this.label22);
+ this.tabPageResults.Controls.Add(this.ErrorLabel);
+ this.tabPageResults.Controls.Add(this.label21);
+ this.tabPageResults.Controls.Add(this.StatusCalibLabel);
+ this.tabPageResults.Location = new System.Drawing.Point(4, 22);
+ this.tabPageResults.Name = "tabPageResults";
+ this.tabPageResults.Size = new System.Drawing.Size(511, 646);
+ this.tabPageResults.TabIndex = 2;
+ this.tabPageResults.Text = "Results";
+ this.tabPageResults.UseVisualStyleBackColor = true;
+ //
+ // label20
+ //
+ this.label20.Location = new System.Drawing.Point(442, 56);
+ this.label20.Name = "label20";
+ this.label20.Size = new System.Drawing.Size(48, 26);
+ this.label20.TabIndex = 21;
+ this.label20.Text = " pixels";
+ this.label20.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // buttonSimImg
+ //
+ this.buttonSimImg.Location = new System.Drawing.Point(29, 612);
+ this.buttonSimImg.Name = "buttonSimImg";
+ this.buttonSimImg.Size = new System.Drawing.Size(201, 26);
+ this.buttonSimImg.TabIndex = 9;
+ this.buttonSimImg.Text = " Simulated Reference Image";
+ this.buttonSimImg.CheckedChanged += new System.EventHandler(this.radioSimulatedImg_CheckedChanged);
+ //
+ // buttonRefImg
+ //
+ this.buttonRefImg.Checked = true;
+ this.buttonRefImg.Location = new System.Drawing.Point(29, 586);
+ this.buttonRefImg.Name = "buttonRefImg";
+ this.buttonRefImg.Size = new System.Drawing.Size(201, 26);
+ this.buttonRefImg.TabIndex = 8;
+ this.buttonRefImg.TabStop = true;
+ this.buttonRefImg.Text = " Original Reference Image";
+ this.buttonRefImg.CheckedChanged += new System.EventHandler(this.buttonRefImg_CheckedChanged);
+ //
+ // groupBox6
+ //
+ this.groupBox6.Controls.Add(this.checkBoxOrigImgCoord);
+ this.groupBox6.Controls.Add(this.buttonSaveCamPose);
+ this.groupBox6.Controls.Add(this.label59);
+ this.groupBox6.Controls.Add(this.label60);
+ this.groupBox6.Controls.Add(this.label61);
+ this.groupBox6.Controls.Add(this.label62);
+ this.groupBox6.Controls.Add(this.CamGammaLabel);
+ this.groupBox6.Controls.Add(this.label64);
+ this.groupBox6.Controls.Add(this.CamBetaLabel);
+ this.groupBox6.Controls.Add(this.label66);
+ this.groupBox6.Controls.Add(this.CamAlphaLabel);
+ this.groupBox6.Controls.Add(this.label50);
+ this.groupBox6.Controls.Add(this.label51);
+ this.groupBox6.Controls.Add(this.label52);
+ this.groupBox6.Controls.Add(this.label53);
+ this.groupBox6.Controls.Add(this.CamPoseZLabel);
+ this.groupBox6.Controls.Add(this.label55);
+ this.groupBox6.Controls.Add(this.CamPoseYLabel);
+ this.groupBox6.Controls.Add(this.label57);
+ this.groupBox6.Controls.Add(this.CamPoseXLabel);
+ this.groupBox6.Location = new System.Drawing.Point(10, 439);
+ this.groupBox6.Name = "groupBox6";
+ this.groupBox6.Size = new System.Drawing.Size(489, 138);
+ this.groupBox6.TabIndex = 7;
+ this.groupBox6.TabStop = false;
+ this.groupBox6.Text = "Camera Pose";
+ //
+ // checkBoxOrigImgCoord
+ //
+ this.checkBoxOrigImgCoord.Location = new System.Drawing.Point(19, 112);
+ this.checkBoxOrigImgCoord.Name = "checkBoxOrigImgCoord";
+ this.checkBoxOrigImgCoord.Size = new System.Drawing.Size(173, 17);
+ this.checkBoxOrigImgCoord.TabIndex = 42;
+ this.checkBoxOrigImgCoord.Text = "Origin at Image Corner";
+ this.checkBoxOrigImgCoord.CheckedChanged += new System.EventHandler(this.checkBoxOrigImgCoord_CheckedChanged);
+ //
+ // buttonSaveCamPose
+ //
+ this.buttonSaveCamPose.Location = new System.Drawing.Point(403, 26);
+ this.buttonSaveCamPose.Name = "buttonSaveCamPose";
+ this.buttonSaveCamPose.Size = new System.Drawing.Size(77, 26);
+ this.buttonSaveCamPose.TabIndex = 41;
+ this.buttonSaveCamPose.Text = "Save ...";
+ this.buttonSaveCamPose.Click += new System.EventHandler(this.buttonSaveCamPose_Click);
+ //
+ // label59
+ //
+ this.label59.Location = new System.Drawing.Point(355, 78);
+ this.label59.Name = "label59";
+ this.label59.Size = new System.Drawing.Size(29, 25);
+ this.label59.TabIndex = 40;
+ this.label59.Text = "deg";
+ this.label59.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label60
+ //
+ this.label60.Location = new System.Drawing.Point(355, 52);
+ this.label60.Name = "label60";
+ this.label60.Size = new System.Drawing.Size(29, 26);
+ this.label60.TabIndex = 39;
+ this.label60.Text = "deg";
+ this.label60.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label61
+ //
+ this.label61.Location = new System.Drawing.Point(355, 26);
+ this.label61.Name = "label61";
+ this.label61.Size = new System.Drawing.Size(29, 26);
+ this.label61.TabIndex = 38;
+ this.label61.Text = "deg";
+ this.label61.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label62
+ //
+ this.label62.Location = new System.Drawing.Point(192, 78);
+ this.label62.Name = "label62";
+ this.label62.Size = new System.Drawing.Size(58, 25);
+ this.label62.TabIndex = 37;
+ this.label62.Text = "Gamma";
+ this.label62.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // CamGammaLabel
+ //
+ this.CamGammaLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.CamGammaLabel.Location = new System.Drawing.Point(250, 78);
+ this.CamGammaLabel.Name = "CamGammaLabel";
+ this.CamGammaLabel.Size = new System.Drawing.Size(105, 25);
+ this.CamGammaLabel.TabIndex = 36;
+ this.CamGammaLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label64
+ //
+ this.label64.Location = new System.Drawing.Point(192, 52);
+ this.label64.Name = "label64";
+ this.label64.Size = new System.Drawing.Size(38, 26);
+ this.label64.TabIndex = 35;
+ this.label64.Text = "Beta";
+ this.label64.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // CamBetaLabel
+ //
+ this.CamBetaLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.CamBetaLabel.Location = new System.Drawing.Point(250, 52);
+ this.CamBetaLabel.Name = "CamBetaLabel";
+ this.CamBetaLabel.Size = new System.Drawing.Size(105, 26);
+ this.CamBetaLabel.TabIndex = 34;
+ this.CamBetaLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label66
+ //
+ this.label66.Location = new System.Drawing.Point(192, 26);
+ this.label66.Name = "label66";
+ this.label66.Size = new System.Drawing.Size(48, 26);
+ this.label66.TabIndex = 33;
+ this.label66.Text = "Alpha";
+ this.label66.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // CamAlphaLabel
+ //
+ this.CamAlphaLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.CamAlphaLabel.Location = new System.Drawing.Point(250, 26);
+ this.CamAlphaLabel.Name = "CamAlphaLabel";
+ this.CamAlphaLabel.Size = new System.Drawing.Size(105, 26);
+ this.CamAlphaLabel.TabIndex = 32;
+ this.CamAlphaLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label50
+ //
+ this.label50.Location = new System.Drawing.Point(144, 78);
+ this.label50.Name = "label50";
+ this.label50.Size = new System.Drawing.Size(29, 25);
+ this.label50.TabIndex = 31;
+ this.label50.Text = "mm";
+ this.label50.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label51
+ //
+ this.label51.Location = new System.Drawing.Point(144, 52);
+ this.label51.Name = "label51";
+ this.label51.Size = new System.Drawing.Size(29, 26);
+ this.label51.TabIndex = 30;
+ this.label51.Text = "mm";
+ this.label51.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label52
+ //
+ this.label52.Location = new System.Drawing.Point(144, 26);
+ this.label52.Name = "label52";
+ this.label52.Size = new System.Drawing.Size(29, 26);
+ this.label52.TabIndex = 29;
+ this.label52.Text = "mm";
+ this.label52.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label53
+ //
+ this.label53.Location = new System.Drawing.Point(19, 78);
+ this.label53.Name = "label53";
+ this.label53.Size = new System.Drawing.Size(19, 25);
+ this.label53.TabIndex = 28;
+ this.label53.Text = "Z";
+ this.label53.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // CamPoseZLabel
+ //
+ this.CamPoseZLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.CamPoseZLabel.Location = new System.Drawing.Point(38, 78);
+ this.CamPoseZLabel.Name = "CamPoseZLabel";
+ this.CamPoseZLabel.Size = new System.Drawing.Size(106, 25);
+ this.CamPoseZLabel.TabIndex = 27;
+ this.CamPoseZLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label55
+ //
+ this.label55.Location = new System.Drawing.Point(19, 52);
+ this.label55.Name = "label55";
+ this.label55.Size = new System.Drawing.Size(19, 26);
+ this.label55.TabIndex = 26;
+ this.label55.Text = "Y";
+ this.label55.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // CamPoseYLabel
+ //
+ this.CamPoseYLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.CamPoseYLabel.Location = new System.Drawing.Point(38, 52);
+ this.CamPoseYLabel.Name = "CamPoseYLabel";
+ this.CamPoseYLabel.Size = new System.Drawing.Size(106, 26);
+ this.CamPoseYLabel.TabIndex = 25;
+ this.CamPoseYLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label57
+ //
+ this.label57.Location = new System.Drawing.Point(19, 26);
+ this.label57.Name = "label57";
+ this.label57.Size = new System.Drawing.Size(19, 26);
+ this.label57.TabIndex = 24;
+ this.label57.Text = "X";
+ this.label57.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // CamPoseXLabel
+ //
+ this.CamPoseXLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.CamPoseXLabel.Location = new System.Drawing.Point(38, 26);
+ this.CamPoseXLabel.Name = "CamPoseXLabel";
+ this.CamPoseXLabel.Size = new System.Drawing.Size(106, 26);
+ this.CamPoseXLabel.TabIndex = 23;
+ this.CamPoseXLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // groupBox5
+ //
+ this.groupBox5.Controls.Add(this.AreaScanPolynomPanel);
+ this.groupBox5.Controls.Add(this.label44);
+ this.groupBox5.Controls.Add(this.label30);
+ this.groupBox5.Controls.Add(this.FocalLResultLabel);
+ this.groupBox5.Controls.Add(this.KappaPanel);
+ this.groupBox5.Controls.Add(this.buttonSaveCamParams);
+ this.groupBox5.Controls.Add(this.label49);
+ this.groupBox5.Controls.Add(this.label48);
+ this.groupBox5.Controls.Add(this.label47);
+ this.groupBox5.Controls.Add(this.label46);
+ this.groupBox5.Controls.Add(this.label43);
+ this.groupBox5.Controls.Add(this.label42);
+ this.groupBox5.Controls.Add(this.label40);
+ this.groupBox5.Controls.Add(this.ImgHResultLabel);
+ this.groupBox5.Controls.Add(this.label38);
+ this.groupBox5.Controls.Add(this.ImgWResultLabel);
+ this.groupBox5.Controls.Add(this.label36);
+ this.groupBox5.Controls.Add(this.CyResultLabel);
+ this.groupBox5.Controls.Add(this.label34);
+ this.groupBox5.Controls.Add(this.CxResultLabel);
+ this.groupBox5.Controls.Add(this.label28);
+ this.groupBox5.Controls.Add(this.SyResultLabel);
+ this.groupBox5.Controls.Add(this.label26);
+ this.groupBox5.Controls.Add(this.SxResultLabel);
+ this.groupBox5.Location = new System.Drawing.Point(10, 93);
+ this.groupBox5.Name = "groupBox5";
+ this.groupBox5.Size = new System.Drawing.Size(489, 346);
+ this.groupBox5.TabIndex = 6;
+ this.groupBox5.TabStop = false;
+ this.groupBox5.Text = "Camera Paramters";
+ //
+ // AreaScanPolynomPanel
+ //
+ this.AreaScanPolynomPanel.Controls.Add(this.P2Label);
+ this.AreaScanPolynomPanel.Controls.Add(this.label83);
+ this.AreaScanPolynomPanel.Controls.Add(this.label84);
+ this.AreaScanPolynomPanel.Controls.Add(this.P1Label);
+ this.AreaScanPolynomPanel.Controls.Add(this.label80);
+ this.AreaScanPolynomPanel.Controls.Add(this.label81);
+ this.AreaScanPolynomPanel.Controls.Add(this.K3Label);
+ this.AreaScanPolynomPanel.Controls.Add(this.K2Label);
+ this.AreaScanPolynomPanel.Controls.Add(this.K1Label);
+ this.AreaScanPolynomPanel.Controls.Add(this.label54);
+ this.AreaScanPolynomPanel.Controls.Add(this.label56);
+ this.AreaScanPolynomPanel.Controls.Add(this.label58);
+ this.AreaScanPolynomPanel.Controls.Add(this.label63);
+ this.AreaScanPolynomPanel.Controls.Add(this.label65);
+ this.AreaScanPolynomPanel.Controls.Add(this.label67);
+ this.AreaScanPolynomPanel.Location = new System.Drawing.Point(19, 207);
+ this.AreaScanPolynomPanel.Name = "AreaScanPolynomPanel";
+ this.AreaScanPolynomPanel.Size = new System.Drawing.Size(461, 129);
+ this.AreaScanPolynomPanel.TabIndex = 47;
+ this.AreaScanPolynomPanel.Visible = false;
+ //
+ // P2Label
+ //
+ this.P2Label.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.P2Label.Location = new System.Drawing.Point(106, 103);
+ this.P2Label.Name = "P2Label";
+ this.P2Label.Size = new System.Drawing.Size(182, 26);
+ this.P2Label.TabIndex = 49;
+ this.P2Label.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label83
+ //
+ this.label83.Location = new System.Drawing.Point(0, 103);
+ this.label83.Name = "label83";
+ this.label83.Size = new System.Drawing.Size(106, 26);
+ this.label83.TabIndex = 48;
+ this.label83.Text = "Tang 2nd (P2)";
+ this.label83.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label84
+ //
+ this.label84.BackColor = System.Drawing.SystemColors.ControlLight;
+ this.label84.Location = new System.Drawing.Point(298, 103);
+ this.label84.Name = "label84";
+ this.label84.Size = new System.Drawing.Size(144, 26);
+ this.label84.TabIndex = 47;
+ this.label84.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // P1Label
+ //
+ this.P1Label.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.P1Label.Location = new System.Drawing.Point(106, 78);
+ this.P1Label.Name = "P1Label";
+ this.P1Label.Size = new System.Drawing.Size(182, 25);
+ this.P1Label.TabIndex = 46;
+ this.P1Label.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label80
+ //
+ this.label80.Location = new System.Drawing.Point(0, 78);
+ this.label80.Name = "label80";
+ this.label80.Size = new System.Drawing.Size(106, 25);
+ this.label80.TabIndex = 45;
+ this.label80.Text = "Tang 2nd (P1)";
+ this.label80.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label81
+ //
+ this.label81.BackColor = System.Drawing.SystemColors.ControlLight;
+ this.label81.Location = new System.Drawing.Point(298, 78);
+ this.label81.Name = "label81";
+ this.label81.Size = new System.Drawing.Size(144, 25);
+ this.label81.TabIndex = 44;
+ this.label81.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // K3Label
+ //
+ this.K3Label.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.K3Label.Location = new System.Drawing.Point(106, 52);
+ this.K3Label.Name = "K3Label";
+ this.K3Label.Size = new System.Drawing.Size(182, 26);
+ this.K3Label.TabIndex = 43;
+ this.K3Label.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // K2Label
+ //
+ this.K2Label.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.K2Label.Location = new System.Drawing.Point(106, 26);
+ this.K2Label.Name = "K2Label";
+ this.K2Label.Size = new System.Drawing.Size(182, 26);
+ this.K2Label.TabIndex = 42;
+ this.K2Label.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // K1Label
+ //
+ this.K1Label.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.K1Label.Location = new System.Drawing.Point(106, 0);
+ this.K1Label.Name = "K1Label";
+ this.K1Label.Size = new System.Drawing.Size(182, 26);
+ this.K1Label.TabIndex = 41;
+ this.K1Label.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label54
+ //
+ this.label54.Location = new System.Drawing.Point(0, 52);
+ this.label54.Name = "label54";
+ this.label54.Size = new System.Drawing.Size(106, 26);
+ this.label54.TabIndex = 40;
+ this.label54.Text = "Radial 6th (K3)";
+ this.label54.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label56
+ //
+ this.label56.Location = new System.Drawing.Point(0, 26);
+ this.label56.Name = "label56";
+ this.label56.Size = new System.Drawing.Size(106, 26);
+ this.label56.TabIndex = 39;
+ this.label56.Text = "Radial 4th (K2)";
+ this.label56.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label58
+ //
+ this.label58.Location = new System.Drawing.Point(0, 0);
+ this.label58.Name = "label58";
+ this.label58.Size = new System.Drawing.Size(106, 26);
+ this.label58.TabIndex = 38;
+ this.label58.Text = "Radial 2nd (K1)";
+ this.label58.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label63
+ //
+ this.label63.BackColor = System.Drawing.SystemColors.ControlLight;
+ this.label63.Location = new System.Drawing.Point(298, 52);
+ this.label63.Name = "label63";
+ this.label63.Size = new System.Drawing.Size(144, 26);
+ this.label63.TabIndex = 37;
+ this.label63.Text = "m^ -6";
+ this.label63.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label65
+ //
+ this.label65.BackColor = System.Drawing.SystemColors.ControlLight;
+ this.label65.Location = new System.Drawing.Point(298, 26);
+ this.label65.Name = "label65";
+ this.label65.Size = new System.Drawing.Size(144, 26);
+ this.label65.TabIndex = 36;
+ this.label65.Text = "m^ -4";
+ this.label65.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label67
+ //
+ this.label67.BackColor = System.Drawing.SystemColors.ControlLight;
+ this.label67.Location = new System.Drawing.Point(298, 0);
+ this.label67.Name = "label67";
+ this.label67.Size = new System.Drawing.Size(144, 26);
+ this.label67.TabIndex = 35;
+ this.label67.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label44
+ //
+ this.label44.Location = new System.Drawing.Point(317, 181);
+ this.label44.Name = "label44";
+ this.label44.Size = new System.Drawing.Size(38, 26);
+ this.label44.TabIndex = 46;
+ this.label44.Text = "mm";
+ this.label44.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label30
+ //
+ this.label30.Location = new System.Drawing.Point(19, 181);
+ this.label30.Name = "label30";
+ this.label30.Size = new System.Drawing.Size(96, 26);
+ this.label30.TabIndex = 43;
+ this.label30.Text = "Focal Length";
+ this.label30.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // FocalLResultLabel
+ //
+ this.FocalLResultLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.FocalLResultLabel.Location = new System.Drawing.Point(125, 181);
+ this.FocalLResultLabel.Name = "FocalLResultLabel";
+ this.FocalLResultLabel.Size = new System.Drawing.Size(182, 26);
+ this.FocalLResultLabel.TabIndex = 42;
+ this.FocalLResultLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // KappaPanel
+ //
+ this.KappaPanel.Controls.Add(this.LineScanPanel);
+ this.KappaPanel.Controls.Add(this.label45);
+ this.KappaPanel.Controls.Add(this.label32);
+ this.KappaPanel.Controls.Add(this.KappaResultLabel);
+ this.KappaPanel.Location = new System.Drawing.Point(19, 207);
+ this.KappaPanel.Name = "KappaPanel";
+ this.KappaPanel.Size = new System.Drawing.Size(413, 129);
+ this.KappaPanel.TabIndex = 33;
+ //
+ // LineScanPanel
+ //
+ this.LineScanPanel.Controls.Add(this.VzResultLabel);
+ this.LineScanPanel.Controls.Add(this.VyResultLabel);
+ this.LineScanPanel.Controls.Add(this.VxResultLabel);
+ this.LineScanPanel.Controls.Add(this.label82);
+ this.LineScanPanel.Controls.Add(this.label85);
+ this.LineScanPanel.Controls.Add(this.label86);
+ this.LineScanPanel.Controls.Add(this.label87);
+ this.LineScanPanel.Controls.Add(this.label88);
+ this.LineScanPanel.Controls.Add(this.label89);
+ this.LineScanPanel.Location = new System.Drawing.Point(0, 43);
+ this.LineScanPanel.Name = "LineScanPanel";
+ this.LineScanPanel.Size = new System.Drawing.Size(413, 78);
+ this.LineScanPanel.TabIndex = 51;
+ this.LineScanPanel.Visible = false;
+ //
+ // VzResultLabel
+ //
+ this.VzResultLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.VzResultLabel.Location = new System.Drawing.Point(106, 52);
+ this.VzResultLabel.Name = "VzResultLabel";
+ this.VzResultLabel.Size = new System.Drawing.Size(182, 26);
+ this.VzResultLabel.TabIndex = 43;
+ this.VzResultLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // VyResultLabel
+ //
+ this.VyResultLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.VyResultLabel.Location = new System.Drawing.Point(106, 26);
+ this.VyResultLabel.Name = "VyResultLabel";
+ this.VyResultLabel.Size = new System.Drawing.Size(182, 26);
+ this.VyResultLabel.TabIndex = 42;
+ this.VyResultLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // VxResultLabel
+ //
+ this.VxResultLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.VxResultLabel.Location = new System.Drawing.Point(106, 0);
+ this.VxResultLabel.Name = "VxResultLabel";
+ this.VxResultLabel.Size = new System.Drawing.Size(182, 26);
+ this.VxResultLabel.TabIndex = 41;
+ this.VxResultLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label82
+ //
+ this.label82.Location = new System.Drawing.Point(0, 52);
+ this.label82.Name = "label82";
+ this.label82.Size = new System.Drawing.Size(106, 26);
+ this.label82.TabIndex = 40;
+ this.label82.Text = "Motion Z (Vz)";
+ this.label82.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label85
+ //
+ this.label85.Location = new System.Drawing.Point(0, 26);
+ this.label85.Name = "label85";
+ this.label85.Size = new System.Drawing.Size(106, 26);
+ this.label85.TabIndex = 39;
+ this.label85.Text = "Motion Y (Vy)";
+ this.label85.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label86
+ //
+ this.label86.Location = new System.Drawing.Point(0, 0);
+ this.label86.Name = "label86";
+ this.label86.Size = new System.Drawing.Size(106, 26);
+ this.label86.TabIndex = 38;
+ this.label86.Text = "Motion X (Vx)";
+ this.label86.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label87
+ //
+ this.label87.BackColor = System.Drawing.SystemColors.ControlLight;
+ this.label87.Location = new System.Drawing.Point(298, 52);
+ this.label87.Name = "label87";
+ this.label87.Size = new System.Drawing.Size(57, 26);
+ this.label87.TabIndex = 37;
+ this.label87.Text = "绁�/Pixel";
+ this.label87.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label88
+ //
+ this.label88.BackColor = System.Drawing.SystemColors.ControlLight;
+ this.label88.Location = new System.Drawing.Point(298, 26);
+ this.label88.Name = "label88";
+ this.label88.Size = new System.Drawing.Size(57, 26);
+ this.label88.TabIndex = 36;
+ this.label88.Text = "绁�/Pixel";
+ this.label88.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label89
+ //
+ this.label89.BackColor = System.Drawing.SystemColors.ControlLight;
+ this.label89.Location = new System.Drawing.Point(298, 0);
+ this.label89.Name = "label89";
+ this.label89.Size = new System.Drawing.Size(57, 26);
+ this.label89.TabIndex = 35;
+ this.label89.Text = "绁�/Pixel";
+ this.label89.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label45
+ //
+ this.label45.Location = new System.Drawing.Point(298, 0);
+ this.label45.Name = "label45";
+ this.label45.Size = new System.Drawing.Size(38, 26);
+ this.label45.TabIndex = 50;
+ this.label45.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label32
+ //
+ this.label32.Location = new System.Drawing.Point(0, 0);
+ this.label32.Name = "label32";
+ this.label32.Size = new System.Drawing.Size(77, 26);
+ this.label32.TabIndex = 49;
+ this.label32.Text = "Kappa";
+ this.label32.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // KappaResultLabel
+ //
+ this.KappaResultLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.KappaResultLabel.Location = new System.Drawing.Point(106, 0);
+ this.KappaResultLabel.Name = "KappaResultLabel";
+ this.KappaResultLabel.Size = new System.Drawing.Size(182, 26);
+ this.KappaResultLabel.TabIndex = 48;
+ this.KappaResultLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // buttonSaveCamParams
+ //
+ this.buttonSaveCamParams.Location = new System.Drawing.Point(403, 26);
+ this.buttonSaveCamParams.Name = "buttonSaveCamParams";
+ this.buttonSaveCamParams.Size = new System.Drawing.Size(77, 26);
+ this.buttonSaveCamParams.TabIndex = 28;
+ this.buttonSaveCamParams.Text = "Save ...";
+ this.buttonSaveCamParams.Click += new System.EventHandler(this.buttonSaveCamParams_Click);
+ //
+ // label49
+ //
+ this.label49.Location = new System.Drawing.Point(317, 155);
+ this.label49.Name = "label49";
+ this.label49.Size = new System.Drawing.Size(48, 26);
+ this.label49.TabIndex = 27;
+ this.label49.Text = "pixels";
+ this.label49.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label48
+ //
+ this.label48.Location = new System.Drawing.Point(317, 129);
+ this.label48.Name = "label48";
+ this.label48.Size = new System.Drawing.Size(48, 26);
+ this.label48.TabIndex = 26;
+ this.label48.Text = "pixels";
+ this.label48.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label47
+ //
+ this.label47.Location = new System.Drawing.Point(317, 103);
+ this.label47.Name = "label47";
+ this.label47.Size = new System.Drawing.Size(48, 26);
+ this.label47.TabIndex = 25;
+ this.label47.Text = "pixels";
+ this.label47.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label46
+ //
+ this.label46.Location = new System.Drawing.Point(317, 78);
+ this.label46.Name = "label46";
+ this.label46.Size = new System.Drawing.Size(48, 25);
+ this.label46.TabIndex = 24;
+ this.label46.Text = "pixels";
+ this.label46.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label43
+ //
+ this.label43.Location = new System.Drawing.Point(317, 52);
+ this.label43.Name = "label43";
+ this.label43.Size = new System.Drawing.Size(38, 26);
+ this.label43.TabIndex = 21;
+ this.label43.Text = "渭m";
+ this.label43.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label42
+ //
+ this.label42.Location = new System.Drawing.Point(317, 26);
+ this.label42.Name = "label42";
+ this.label42.Size = new System.Drawing.Size(38, 26);
+ this.label42.TabIndex = 20;
+ this.label42.Text = "渭m";
+ this.label42.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label40
+ //
+ this.label40.Location = new System.Drawing.Point(19, 155);
+ this.label40.Name = "label40";
+ this.label40.Size = new System.Drawing.Size(87, 26);
+ this.label40.TabIndex = 19;
+ this.label40.Text = "Image Height";
+ this.label40.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // ImgHResultLabel
+ //
+ this.ImgHResultLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.ImgHResultLabel.Location = new System.Drawing.Point(125, 155);
+ this.ImgHResultLabel.Name = "ImgHResultLabel";
+ this.ImgHResultLabel.Size = new System.Drawing.Size(182, 26);
+ this.ImgHResultLabel.TabIndex = 18;
+ this.ImgHResultLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label38
+ //
+ this.label38.Location = new System.Drawing.Point(19, 129);
+ this.label38.Name = "label38";
+ this.label38.Size = new System.Drawing.Size(87, 26);
+ this.label38.TabIndex = 17;
+ this.label38.Text = "Image Width";
+ this.label38.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // ImgWResultLabel
+ //
+ this.ImgWResultLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.ImgWResultLabel.Location = new System.Drawing.Point(125, 129);
+ this.ImgWResultLabel.Name = "ImgWResultLabel";
+ this.ImgWResultLabel.Size = new System.Drawing.Size(182, 26);
+ this.ImgWResultLabel.TabIndex = 16;
+ this.ImgWResultLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label36
+ //
+ this.label36.Location = new System.Drawing.Point(19, 103);
+ this.label36.Name = "label36";
+ this.label36.Size = new System.Drawing.Size(106, 26);
+ this.label36.TabIndex = 15;
+ this.label36.Text = "Center Row (Cy)";
+ this.label36.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // CyResultLabel
+ //
+ this.CyResultLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.CyResultLabel.Location = new System.Drawing.Point(125, 103);
+ this.CyResultLabel.Name = "CyResultLabel";
+ this.CyResultLabel.Size = new System.Drawing.Size(182, 26);
+ this.CyResultLabel.TabIndex = 14;
+ this.CyResultLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label34
+ //
+ this.label34.Location = new System.Drawing.Point(19, 78);
+ this.label34.Name = "label34";
+ this.label34.Size = new System.Drawing.Size(106, 25);
+ this.label34.TabIndex = 13;
+ this.label34.Text = "Center Col (Cx)";
+ this.label34.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // CxResultLabel
+ //
+ this.CxResultLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.CxResultLabel.Location = new System.Drawing.Point(125, 78);
+ this.CxResultLabel.Name = "CxResultLabel";
+ this.CxResultLabel.Size = new System.Drawing.Size(182, 25);
+ this.CxResultLabel.TabIndex = 12;
+ this.CxResultLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label28
+ //
+ this.label28.Location = new System.Drawing.Point(19, 52);
+ this.label28.Name = "label28";
+ this.label28.Size = new System.Drawing.Size(100, 26);
+ this.label28.TabIndex = 7;
+ this.label28.Text = "Cell Height (Sy)";
+ this.label28.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // SyResultLabel
+ //
+ this.SyResultLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.SyResultLabel.Location = new System.Drawing.Point(125, 52);
+ this.SyResultLabel.Name = "SyResultLabel";
+ this.SyResultLabel.Size = new System.Drawing.Size(182, 26);
+ this.SyResultLabel.TabIndex = 6;
+ this.SyResultLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label26
+ //
+ this.label26.Location = new System.Drawing.Point(19, 26);
+ this.label26.Name = "label26";
+ this.label26.Size = new System.Drawing.Size(96, 26);
+ this.label26.TabIndex = 5;
+ this.label26.Text = "Cell Width (Sx)";
+ this.label26.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // SxResultLabel
+ //
+ this.SxResultLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.SxResultLabel.Location = new System.Drawing.Point(125, 26);
+ this.SxResultLabel.Name = "SxResultLabel";
+ this.SxResultLabel.Size = new System.Drawing.Size(182, 26);
+ this.SxResultLabel.TabIndex = 4;
+ this.SxResultLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label22
+ //
+ this.label22.Location = new System.Drawing.Point(19, 56);
+ this.label22.Name = "label22";
+ this.label22.Size = new System.Drawing.Size(77, 26);
+ this.label22.TabIndex = 3;
+ this.label22.Text = "Mean Error";
+ this.label22.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // ErrorLabel
+ //
+ this.ErrorLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.ErrorLabel.Location = new System.Drawing.Point(96, 56);
+ this.ErrorLabel.Name = "ErrorLabel";
+ this.ErrorLabel.Size = new System.Drawing.Size(336, 26);
+ this.ErrorLabel.TabIndex = 2;
+ this.ErrorLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label21
+ //
+ this.label21.Location = new System.Drawing.Point(19, 26);
+ this.label21.Name = "label21";
+ this.label21.Size = new System.Drawing.Size(77, 26);
+ this.label21.TabIndex = 1;
+ this.label21.Text = "Status";
+ this.label21.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // StatusCalibLabel
+ //
+ this.StatusCalibLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.StatusCalibLabel.Location = new System.Drawing.Point(96, 26);
+ this.StatusCalibLabel.Name = "StatusCalibLabel";
+ this.StatusCalibLabel.Size = new System.Drawing.Size(394, 26);
+ this.StatusCalibLabel.TabIndex = 0;
+ this.StatusCalibLabel.Text = "No calibration data available";
+ this.StatusCalibLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // tabPageDistance
+ //
+ this.tabPageDistance.Controls.Add(this.label33);
+ this.tabPageDistance.Controls.Add(this.label35);
+ this.tabPageDistance.Controls.Add(this.numericUpDownP4);
+ this.tabPageDistance.Controls.Add(this.numericUpDownP3);
+ this.tabPageDistance.Controls.Add(this.label29);
+ this.tabPageDistance.Controls.Add(this.label31);
+ this.tabPageDistance.Controls.Add(this.txtDistanceP3P4);
+ this.tabPageDistance.Controls.Add(this.label27);
+ this.tabPageDistance.Controls.Add(this.label25);
+ this.tabPageDistance.Controls.Add(this.txtDistanceP1P2);
+ this.tabPageDistance.Controls.Add(this.label24);
+ this.tabPageDistance.Controls.Add(this.label23);
+ this.tabPageDistance.Controls.Add(this.numericUpDownP2);
+ this.tabPageDistance.Controls.Add(this.numericUpDownP1);
+ this.tabPageDistance.Location = new System.Drawing.Point(4, 22);
+ this.tabPageDistance.Name = "tabPageDistance";
+ this.tabPageDistance.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPageDistance.Size = new System.Drawing.Size(511, 646);
+ this.tabPageDistance.TabIndex = 3;
+ this.tabPageDistance.Text = "Distance";
+ this.tabPageDistance.UseVisualStyleBackColor = true;
+ //
+ // label33
+ //
+ this.label33.AutoSize = true;
+ this.label33.Location = new System.Drawing.Point(252, 98);
+ this.label33.Name = "label33";
+ this.label33.Size = new System.Drawing.Size(53, 12);
+ this.label33.TabIndex = 14;
+ this.label33.Text = "Point 4:";
+ //
+ // label35
+ //
+ this.label35.AutoSize = true;
+ this.label35.Location = new System.Drawing.Point(20, 98);
+ this.label35.Name = "label35";
+ this.label35.Size = new System.Drawing.Size(53, 12);
+ this.label35.TabIndex = 13;
+ this.label35.Text = "Point 3:";
+ //
+ // numericUpDownP4
+ //
+ this.numericUpDownP4.Location = new System.Drawing.Point(322, 96);
+ this.numericUpDownP4.Maximum = new decimal(new int[] {
+ 49,
+ 0,
+ 0,
+ 0});
+ this.numericUpDownP4.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.numericUpDownP4.Name = "numericUpDownP4";
+ this.numericUpDownP4.Size = new System.Drawing.Size(92, 21);
+ this.numericUpDownP4.TabIndex = 12;
+ this.numericUpDownP4.Value = new decimal(new int[] {
+ 25,
+ 0,
+ 0,
+ 0});
+ this.numericUpDownP4.ValueChanged += new System.EventHandler(this.numericUpDownP4_ValueChanged);
+ //
+ // numericUpDownP3
+ //
+ this.numericUpDownP3.Location = new System.Drawing.Point(79, 96);
+ this.numericUpDownP3.Maximum = new decimal(new int[] {
+ 49,
+ 0,
+ 0,
+ 0});
+ this.numericUpDownP3.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.numericUpDownP3.Name = "numericUpDownP3";
+ this.numericUpDownP3.Size = new System.Drawing.Size(92, 21);
+ this.numericUpDownP3.TabIndex = 11;
+ this.numericUpDownP3.Value = new decimal(new int[] {
+ 18,
+ 0,
+ 0,
+ 0});
+ this.numericUpDownP3.ValueChanged += new System.EventHandler(this.numericUpDownP3_ValueChanged);
+ //
+ // label29
+ //
+ this.label29.AutoSize = true;
+ this.label29.Font = new System.Drawing.Font("瀹嬩綋", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label29.Location = new System.Drawing.Point(397, 210);
+ this.label29.Name = "label29";
+ this.label29.Size = new System.Drawing.Size(32, 21);
+ this.label29.TabIndex = 10;
+ this.label29.Text = "mm";
+ //
+ // label31
+ //
+ this.label31.AutoSize = true;
+ this.label31.Font = new System.Drawing.Font("瀹嬩綋", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label31.Location = new System.Drawing.Point(17, 210);
+ this.label31.Name = "label31";
+ this.label31.Size = new System.Drawing.Size(185, 21);
+ this.label31.TabIndex = 9;
+ this.label31.Text = "Distance P3-P4锛�";
+ //
+ // txtDistanceP3P4
+ //
+ this.txtDistanceP3P4.Font = new System.Drawing.Font("瀹嬩綋", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.txtDistanceP3P4.ForeColor = System.Drawing.SystemColors.WindowText;
+ this.txtDistanceP3P4.Location = new System.Drawing.Point(208, 207);
+ this.txtDistanceP3P4.Name = "txtDistanceP3P4";
+ this.txtDistanceP3P4.ReadOnly = true;
+ this.txtDistanceP3P4.Size = new System.Drawing.Size(172, 31);
+ this.txtDistanceP3P4.TabIndex = 8;
+ this.txtDistanceP3P4.Text = "0";
+ //
+ // label27
+ //
+ this.label27.AutoSize = true;
+ this.label27.Font = new System.Drawing.Font("瀹嬩綋", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label27.Location = new System.Drawing.Point(397, 160);
+ this.label27.Name = "label27";
+ this.label27.Size = new System.Drawing.Size(32, 21);
+ this.label27.TabIndex = 7;
+ this.label27.Text = "mm";
+ //
+ // label25
+ //
+ this.label25.AutoSize = true;
+ this.label25.Font = new System.Drawing.Font("瀹嬩綋", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label25.Location = new System.Drawing.Point(17, 160);
+ this.label25.Name = "label25";
+ this.label25.Size = new System.Drawing.Size(185, 21);
+ this.label25.TabIndex = 6;
+ this.label25.Text = "Distance P1-P2锛�";
+ //
+ // txtDistanceP1P2
+ //
+ this.txtDistanceP1P2.Font = new System.Drawing.Font("瀹嬩綋", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.txtDistanceP1P2.ForeColor = System.Drawing.SystemColors.WindowText;
+ this.txtDistanceP1P2.Location = new System.Drawing.Point(208, 157);
+ this.txtDistanceP1P2.Name = "txtDistanceP1P2";
+ this.txtDistanceP1P2.ReadOnly = true;
+ this.txtDistanceP1P2.Size = new System.Drawing.Size(172, 31);
+ this.txtDistanceP1P2.TabIndex = 5;
+ this.txtDistanceP1P2.Text = "0";
+ //
+ // label24
+ //
+ this.label24.AutoSize = true;
+ this.label24.Location = new System.Drawing.Point(252, 57);
+ this.label24.Name = "label24";
+ this.label24.Size = new System.Drawing.Size(53, 12);
+ this.label24.TabIndex = 4;
+ this.label24.Text = "Point 2:";
+ //
+ // label23
+ //
+ this.label23.AutoSize = true;
+ this.label23.Location = new System.Drawing.Point(20, 57);
+ this.label23.Name = "label23";
+ this.label23.Size = new System.Drawing.Size(53, 12);
+ this.label23.TabIndex = 3;
+ this.label23.Text = "Point 1:";
+ //
+ // numericUpDownP2
+ //
+ this.numericUpDownP2.Location = new System.Drawing.Point(322, 55);
+ this.numericUpDownP2.Maximum = new decimal(new int[] {
+ 49,
+ 0,
+ 0,
+ 0});
+ this.numericUpDownP2.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.numericUpDownP2.Name = "numericUpDownP2";
+ this.numericUpDownP2.Size = new System.Drawing.Size(92, 21);
+ this.numericUpDownP2.TabIndex = 2;
+ this.numericUpDownP2.Value = new decimal(new int[] {
+ 25,
+ 0,
+ 0,
+ 0});
+ this.numericUpDownP2.ValueChanged += new System.EventHandler(this.numericUpDownP2_ValueChanged);
+ //
+ // numericUpDownP1
+ //
+ this.numericUpDownP1.Location = new System.Drawing.Point(79, 55);
+ this.numericUpDownP1.Maximum = new decimal(new int[] {
+ 49,
+ 0,
+ 0,
+ 0});
+ this.numericUpDownP1.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.numericUpDownP1.Name = "numericUpDownP1";
+ this.numericUpDownP1.Size = new System.Drawing.Size(92, 21);
+ this.numericUpDownP1.TabIndex = 1;
+ this.numericUpDownP1.Value = new decimal(new int[] {
+ 24,
+ 0,
+ 0,
+ 0});
+ this.numericUpDownP1.ValueChanged += new System.EventHandler(this.numericUpDown1_ValueChanged);
+ //
+ // label1
+ //
+ this.label1.Location = new System.Drawing.Point(19, 34);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(106, 26);
+ this.label1.TabIndex = 1;
+ this.label1.Text = "Description File";
+ this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.buttonMove);
+ this.groupBox1.Controls.Add(this.buttonReset);
+ this.groupBox1.Controls.Add(this.buttonNone);
+ this.groupBox1.Controls.Add(this.buttonMagnify);
+ this.groupBox1.Controls.Add(this.buttonZoom);
+ this.groupBox1.Location = new System.Drawing.Point(432, 474);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(134, 172);
+ this.groupBox1.TabIndex = 11;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "View Interaction";
+ //
+ // buttonMove
+ //
+ this.buttonMove.Location = new System.Drawing.Point(19, 26);
+ this.buttonMove.Name = "buttonMove";
+ this.buttonMove.Size = new System.Drawing.Size(106, 26);
+ this.buttonMove.TabIndex = 4;
+ this.buttonMove.Text = " move";
+ this.buttonMove.CheckedChanged += new System.EventHandler(this.buttonMove_CheckedChanged);
+ //
+ // buttonReset
+ //
+ this.buttonReset.Location = new System.Drawing.Point(19, 138);
+ this.buttonReset.Name = "buttonReset";
+ this.buttonReset.Size = new System.Drawing.Size(96, 24);
+ this.buttonReset.TabIndex = 3;
+ this.buttonReset.Text = "Reset";
+ this.buttonReset.Click += new System.EventHandler(this.buttonReset_Click);
+ //
+ // buttonNone
+ //
+ this.buttonNone.Checked = true;
+ this.buttonNone.Location = new System.Drawing.Point(19, 103);
+ this.buttonNone.Name = "buttonNone";
+ this.buttonNone.Size = new System.Drawing.Size(106, 26);
+ this.buttonNone.TabIndex = 2;
+ this.buttonNone.TabStop = true;
+ this.buttonNone.Text = " none";
+ this.buttonNone.CheckedChanged += new System.EventHandler(this.buttonNone_CheckedChanged);
+ //
+ // buttonMagnify
+ //
+ this.buttonMagnify.Location = new System.Drawing.Point(19, 78);
+ this.buttonMagnify.Name = "buttonMagnify";
+ this.buttonMagnify.Size = new System.Drawing.Size(106, 25);
+ this.buttonMagnify.TabIndex = 1;
+ this.buttonMagnify.Text = " magnify";
+ this.buttonMagnify.CheckedChanged += new System.EventHandler(this.buttonMagnify_CheckedChanged);
+ //
+ // buttonZoom
+ //
+ this.buttonZoom.Location = new System.Drawing.Point(19, 52);
+ this.buttonZoom.Name = "buttonZoom";
+ this.buttonZoom.Size = new System.Drawing.Size(106, 26);
+ this.buttonZoom.TabIndex = 0;
+ this.buttonZoom.Text = " zoom";
+ this.buttonZoom.CheckedChanged += new System.EventHandler(this.buttonZoom_CheckedChanged);
+ //
+ // groupBox3
+ //
+ this.groupBox3.Controls.Add(this.upDownLineWidth);
+ this.groupBox3.Controls.Add(this.label78);
+ this.groupBox3.Controls.Add(this.label68);
+ this.groupBox3.Controls.Add(this.checkBoxCoordSys);
+ this.groupBox3.Controls.Add(this.checkBoxMarkCenter);
+ this.groupBox3.Controls.Add(this.checkBoxPlateRegion);
+ this.groupBox3.Controls.Add(this.comboBoxDraw);
+ this.groupBox3.Controls.Add(this.comboBoxCoordSys);
+ this.groupBox3.Controls.Add(this.comboBoxMarkCenters);
+ this.groupBox3.Controls.Add(this.comboBoxPlateRegion);
+ this.groupBox3.Location = new System.Drawing.Point(19, 474);
+ this.groupBox3.Name = "groupBox3";
+ this.groupBox3.Size = new System.Drawing.Size(375, 172);
+ this.groupBox3.TabIndex = 26;
+ this.groupBox3.TabStop = false;
+ this.groupBox3.Text = "Display Parameters";
+ //
+ // upDownLineWidth
+ //
+ this.upDownLineWidth.Location = new System.Drawing.Point(197, 138);
+ this.upDownLineWidth.Maximum = new decimal(new int[] {
+ 15,
+ 0,
+ 0,
+ 0});
+ this.upDownLineWidth.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.upDownLineWidth.Name = "upDownLineWidth";
+ this.upDownLineWidth.Size = new System.Drawing.Size(153, 21);
+ this.upDownLineWidth.TabIndex = 36;
+ this.upDownLineWidth.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.upDownLineWidth.ValueChanged += new System.EventHandler(this.upDownLineWidth_ValueChanged);
+ //
+ // label78
+ //
+ this.label78.Location = new System.Drawing.Point(48, 138);
+ this.label78.Name = "label78";
+ this.label78.Size = new System.Drawing.Size(77, 26);
+ this.label78.TabIndex = 35;
+ this.label78.Text = " LineWidth";
+ this.label78.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label68
+ //
+ this.label68.Location = new System.Drawing.Point(48, 112);
+ this.label68.Name = "label68";
+ this.label68.Size = new System.Drawing.Size(77, 26);
+ this.label68.TabIndex = 33;
+ this.label68.Text = " Draw";
+ this.label68.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // checkBoxCoordSys
+ //
+ this.checkBoxCoordSys.Checked = true;
+ this.checkBoxCoordSys.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.checkBoxCoordSys.Location = new System.Drawing.Point(24, 78);
+ this.checkBoxCoordSys.Name = "checkBoxCoordSys";
+ this.checkBoxCoordSys.Size = new System.Drawing.Size(154, 25);
+ this.checkBoxCoordSys.TabIndex = 32;
+ this.checkBoxCoordSys.Text = " Coordinate System";
+ this.checkBoxCoordSys.CheckedChanged += new System.EventHandler(this.checkBoxCoordSys_CheckedChanged);
+ //
+ // checkBoxMarkCenter
+ //
+ this.checkBoxMarkCenter.Checked = true;
+ this.checkBoxMarkCenter.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.checkBoxMarkCenter.Location = new System.Drawing.Point(24, 52);
+ this.checkBoxMarkCenter.Name = "checkBoxMarkCenter";
+ this.checkBoxMarkCenter.Size = new System.Drawing.Size(154, 26);
+ this.checkBoxMarkCenter.TabIndex = 31;
+ this.checkBoxMarkCenter.Text = " Mark Centers";
+ this.checkBoxMarkCenter.CheckedChanged += new System.EventHandler(this.checkBoxMarkCenter_CheckedChanged);
+ //
+ // checkBoxPlateRegion
+ //
+ this.checkBoxPlateRegion.Checked = true;
+ this.checkBoxPlateRegion.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.checkBoxPlateRegion.Location = new System.Drawing.Point(24, 26);
+ this.checkBoxPlateRegion.Name = "checkBoxPlateRegion";
+ this.checkBoxPlateRegion.Size = new System.Drawing.Size(154, 26);
+ this.checkBoxPlateRegion.TabIndex = 30;
+ this.checkBoxPlateRegion.Text = " Plate Region";
+ this.checkBoxPlateRegion.CheckedChanged += new System.EventHandler(this.checkBoxPlateRegion_CheckedChanged);
+ //
+ // comboBoxDraw
+ //
+ this.comboBoxDraw.Items.AddRange(new object[] {
+ "margin",
+ "fill"});
+ this.comboBoxDraw.Location = new System.Drawing.Point(197, 112);
+ this.comboBoxDraw.Name = "comboBoxDraw";
+ this.comboBoxDraw.Size = new System.Drawing.Size(153, 20);
+ this.comboBoxDraw.TabIndex = 29;
+ this.comboBoxDraw.Text = "margin";
+ this.comboBoxDraw.SelectedIndexChanged += new System.EventHandler(this.comboBoxDraw_SelectedIndexChanged);
+ //
+ // comboBoxCoordSys
+ //
+ this.comboBoxCoordSys.Items.AddRange(new object[] {
+ "green",
+ "red",
+ "blue",
+ "black",
+ "white",
+ "yellow",
+ "magenta",
+ "cyan",
+ "gray"});
+ this.comboBoxCoordSys.Location = new System.Drawing.Point(197, 78);
+ this.comboBoxCoordSys.Name = "comboBoxCoordSys";
+ this.comboBoxCoordSys.Size = new System.Drawing.Size(153, 20);
+ this.comboBoxCoordSys.TabIndex = 28;
+ this.comboBoxCoordSys.Text = "yellow";
+ this.comboBoxCoordSys.SelectedIndexChanged += new System.EventHandler(this.comboBoxCoordSys_SelectedIndexChanged);
+ //
+ // comboBoxMarkCenters
+ //
+ this.comboBoxMarkCenters.Items.AddRange(new object[] {
+ "green",
+ "red",
+ "blue",
+ "black",
+ "white",
+ "yellow",
+ "magenta",
+ "cyan",
+ "gray"});
+ this.comboBoxMarkCenters.Location = new System.Drawing.Point(197, 52);
+ this.comboBoxMarkCenters.Name = "comboBoxMarkCenters";
+ this.comboBoxMarkCenters.Size = new System.Drawing.Size(153, 20);
+ this.comboBoxMarkCenters.TabIndex = 27;
+ this.comboBoxMarkCenters.Text = "cyan";
+ this.comboBoxMarkCenters.SelectedIndexChanged += new System.EventHandler(this.comboBoxMarkCenters_SelectedIndexChanged);
+ //
+ // comboBoxPlateRegion
+ //
+ this.comboBoxPlateRegion.Items.AddRange(new object[] {
+ "green",
+ "red",
+ "blue",
+ "black",
+ "white",
+ "yellow",
+ "magenta",
+ "cyan",
+ "gray"});
+ this.comboBoxPlateRegion.Location = new System.Drawing.Point(197, 26);
+ this.comboBoxPlateRegion.Name = "comboBoxPlateRegion";
+ this.comboBoxPlateRegion.Size = new System.Drawing.Size(153, 20);
+ this.comboBoxPlateRegion.TabIndex = 26;
+ this.comboBoxPlateRegion.Text = "green";
+ this.comboBoxPlateRegion.SelectedIndexChanged += new System.EventHandler(this.comboBoxPlateRegion_SelectedIndexChanged);
+ //
+ // openFileDialogImg
+ //
+ this.openFileDialogImg.Filter = "png (*.png)|*.png|tiff (*.tif)|*.tif|jpeg (*.jpg)| *.jpg|all files (*.*)|*.*";
+ this.openFileDialogImg.FilterIndex = 4;
+ this.openFileDialogImg.Multiselect = true;
+ //
+ // openFileDialogDescr
+ //
+ this.openFileDialogDescr.Filter = " Plate Description (*.descr)|*.descr| all files (*.*)|*.*";
+ //
+ // openFileDialogImportParams
+ //
+ this.openFileDialogImportParams.Filter = "camera parameters (*.cal)|*.cal|camera parameters (*.dat)|*dat| all files (*.*)|*" +
+ ".*";
+ this.openFileDialogImportParams.FilterIndex = 3;
+ //
+ // StatusLabel
+ //
+ this.StatusLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.StatusLabel.Location = new System.Drawing.Point(19, 663);
+ this.StatusLabel.Name = "StatusLabel";
+ this.StatusLabel.Size = new System.Drawing.Size(547, 26);
+ this.StatusLabel.TabIndex = 27;
+ this.StatusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // saveParamFileDialog
+ //
+ this.saveParamFileDialog.Filter = "camera parameters (*.cal)|*.cal|camera parameters (*.dat)|*dat| all files (*.*)|*" +
+ ".*";
+ //
+ // frmCalibration
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(1132, 698);
+ this.Controls.Add(this.StatusLabel);
+ this.Controls.Add(this.groupBox3);
+ this.Controls.Add(this.groupBox1);
+ this.Controls.Add(this.tabControl);
+ this.Controls.Add(this.viewPort);
+ this.Controls.Add(this.label1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.MaximizeBox = false;
+ this.MaximumSize = new System.Drawing.Size(1138, 732);
+ this.MinimumSize = new System.Drawing.Size(1138, 726);
+ this.Name = "frmCalibration";
+ this.Text = "鏍囧畾";
+ this.Load += new System.EventHandler(this.frmMain_Load);
+ this.tabControl.ResumeLayout(false);
+ this.tabPageCalib.ResumeLayout(false);
+ this.groupBox2.ResumeLayout(false);
+ this.groupBox2.PerformLayout();
+ this.LineScanAddPanel.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.MotionZUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MotionYUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MotionXUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.FocalLengthUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.SyUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.SxUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ThicknessUpDown)).EndInit();
+ this.tabPageQualityCheck.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.WarnlevelUpDown)).EndInit();
+ this.groupBox4.ResumeLayout(false);
+ this.groupBox4.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.MaxDiamTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MaxDiamUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinContLTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinContLUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.SmoothTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.SmoothUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinThreshTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinThreshUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ThreshDecrTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ThreshDecrUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.InitThreshTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.InitThreshUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinDiamTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinDiamUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MarkThreshTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MarkThreshUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.FilterSizeTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.FilterSizeUpDown)).EndInit();
+ this.tabPageResults.ResumeLayout(false);
+ this.groupBox6.ResumeLayout(false);
+ this.groupBox5.ResumeLayout(false);
+ this.AreaScanPolynomPanel.ResumeLayout(false);
+ this.KappaPanel.ResumeLayout(false);
+ this.LineScanPanel.ResumeLayout(false);
+ this.tabPageDistance.ResumeLayout(false);
+ this.tabPageDistance.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.numericUpDownP4)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.numericUpDownP3)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.numericUpDownP2)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.numericUpDownP1)).EndInit();
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox3.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.upDownLineWidth)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ #region 瀹氫箟
+ private System.Windows.Forms.TabControl tabControl;
+ private System.Windows.Forms.TabPage tabPageResults;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.Button buttonLoad;
+ private System.Windows.Forms.Button buttonDelete;
+ private System.Windows.Forms.Button buttonDeleteAll;
+ private System.Windows.Forms.Button buttonSetReference;
+ private System.Windows.Forms.Button buttonCalibrate;
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.GroupBox groupBox3;
+ private System.Windows.Forms.CheckBox checkBoxCoordSys;
+ private System.Windows.Forms.CheckBox checkBoxMarkCenter;
+ private System.Windows.Forms.CheckBox checkBoxPlateRegion;
+ private System.Windows.Forms.ComboBox comboBoxDraw;
+ private System.Windows.Forms.ComboBox comboBoxCoordSys;
+ private System.Windows.Forms.ComboBox comboBoxMarkCenters;
+ private System.Windows.Forms.ComboBox comboBoxPlateRegion;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.TabPage tabPageQualityCheck;
+ private System.Windows.Forms.TabPage tabPageCalib;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.Label label10;
+ private System.Windows.Forms.GroupBox groupBox4;
+ private System.Windows.Forms.Label label11;
+ private System.Windows.Forms.Label label12;
+ private System.Windows.Forms.Label label13;
+ private System.Windows.Forms.Label label14;
+ private System.Windows.Forms.Label label15;
+ private System.Windows.Forms.Label label16;
+ private System.Windows.Forms.Label label17;
+ private System.Windows.Forms.Label label18;
+ private System.Windows.Forms.Label label19;
+ private System.Windows.Forms.Label label21;
+ private System.Windows.Forms.Label label22;
+ private System.Windows.Forms.GroupBox groupBox5;
+ private System.Windows.Forms.Label label26;
+ private System.Windows.Forms.Label label28;
+ private System.Windows.Forms.Label label34;
+ private System.Windows.Forms.Label label36;
+ private System.Windows.Forms.Label label38;
+ private System.Windows.Forms.Label label40;
+ private System.Windows.Forms.Label label42;
+ private System.Windows.Forms.Label label43;
+ private System.Windows.Forms.Label label46;
+ private System.Windows.Forms.Label label47;
+ private System.Windows.Forms.Label label48;
+ private System.Windows.Forms.Label label49;
+ private System.Windows.Forms.GroupBox groupBox6;
+ private System.Windows.Forms.Label label50;
+ private System.Windows.Forms.Label label51;
+ private System.Windows.Forms.Label label52;
+ private System.Windows.Forms.Label label53;
+ private System.Windows.Forms.Label label55;
+ private System.Windows.Forms.Label label57;
+ private System.Windows.Forms.Label label59;
+ private System.Windows.Forms.Label label60;
+ private System.Windows.Forms.Label label61;
+ private System.Windows.Forms.Label label62;
+ private System.Windows.Forms.Label label64;
+ private System.Windows.Forms.Label label66;
+ private System.Windows.Forms.RadioButton buttonMove;
+ private System.Windows.Forms.Button buttonReset;
+ private System.Windows.Forms.RadioButton buttonNone;
+ private System.Windows.Forms.RadioButton buttonMagnify;
+ private System.Windows.Forms.RadioButton buttonZoom;
+ private System.Windows.Forms.OpenFileDialog openFileDialogImg;
+ private System.Windows.Forms.Label label68;
+ private System.Windows.Forms.Button buttonImportParams;
+ private System.Windows.Forms.Button buttonLoadDescrFile;
+ private System.Windows.Forms.Label label69;
+ private System.Windows.Forms.Label label70;
+ private System.Windows.Forms.Label label71;
+ private System.Windows.Forms.ListView ListCalibImg;
+ private System.Windows.Forms.ColumnHeader ColRef;
+ private System.Windows.Forms.ColumnHeader ColImg;
+ private System.Windows.Forms.ColumnHeader ColStatus;
+ private System.Windows.Forms.ListView ListQualityCheck;
+ private System.Windows.Forms.ColumnHeader ColScope;
+ private System.Windows.Forms.ColumnHeader ColDescr;
+ private System.Windows.Forms.ColumnHeader Col2Status;
+ private System.Windows.Forms.OpenFileDialog openFileDialogDescr;
+ private System.Windows.Forms.TextBox textBoxDescr;
+ private System.Windows.Forms.OpenFileDialog openFileDialogImportParams;
+ private System.Windows.Forms.CheckBox TelecentricCheckBox;
+ private System.Windows.Forms.NumericUpDown FocalLengthUpDown;
+ private System.Windows.Forms.NumericUpDown SyUpDown;
+ private System.Windows.Forms.NumericUpDown SxUpDown;
+ private System.Windows.Forms.ComboBox CamTypComboBox;
+ private System.Windows.Forms.NumericUpDown ThicknessUpDown;
+ private System.Windows.Forms.TrackBar MaxDiamTrackBar;
+ private System.Windows.Forms.NumericUpDown MaxDiamUpDown;
+ private System.Windows.Forms.TrackBar MinContLTrackBar;
+ private System.Windows.Forms.NumericUpDown MinContLUpDown;
+ private System.Windows.Forms.TrackBar SmoothTrackBar;
+ private System.Windows.Forms.NumericUpDown SmoothUpDown;
+ private System.Windows.Forms.TrackBar MinThreshTrackBar;
+ private System.Windows.Forms.NumericUpDown MinThreshUpDown;
+ private System.Windows.Forms.TrackBar ThreshDecrTrackBar;
+ private System.Windows.Forms.NumericUpDown ThreshDecrUpDown;
+ private System.Windows.Forms.TrackBar InitThreshTrackBar;
+ private System.Windows.Forms.NumericUpDown InitThreshUpDown;
+ private System.Windows.Forms.TrackBar MinDiamTrackBar;
+ private System.Windows.Forms.NumericUpDown MinDiamUpDown;
+ private System.Windows.Forms.TrackBar MarkThreshTrackBar;
+ private System.Windows.Forms.NumericUpDown MarkThreshUpDown;
+ private System.Windows.Forms.ComboBox SeqTestsComboBox;
+ private System.Windows.Forms.ComboBox ImgTestsComboBox;
+ private System.Windows.Forms.NumericUpDown WarnlevelUpDown;
+ private System.Windows.Forms.Button MaxDiamResetButton;
+ private System.Windows.Forms.Button MinContLResetButton;
+ private System.Windows.Forms.Button SmootingResetButton;
+ private System.Windows.Forms.Button MinThreshResetButton;
+ private System.Windows.Forms.Button ThreshDecrResetButton;
+ private System.Windows.Forms.Button InitThreshResetButton;
+ private System.Windows.Forms.Button MinDiamResetButton;
+ private System.Windows.Forms.Button MarkThreshResetButton;
+ private System.Windows.Forms.TrackBar FilterSizeTrackBar;
+ private System.Windows.Forms.NumericUpDown FilterSizeUpDown;
+ private System.Windows.Forms.Button FilterSizeResetButton;
+ private System.Windows.Forms.Label label72;
+ private System.Windows.Forms.Label label73;
+ private System.Windows.Forms.Label label74;
+ private System.Windows.Forms.Label label75;
+ private System.Windows.Forms.Label label76;
+ private System.Windows.Forms.Label label77;
+ private System.Windows.Forms.NumericUpDown MotionZUpDown;
+ private System.Windows.Forms.NumericUpDown MotionYUpDown;
+ private System.Windows.Forms.NumericUpDown MotionXUpDown;
+ private System.Windows.Forms.Panel LineScanAddPanel;
+ private System.Windows.Forms.Label label78;
+ private System.Windows.Forms.NumericUpDown upDownLineWidth;
+ private System.Windows.Forms.Button buttonSaveCamPose;
+ private System.Windows.Forms.Label CamGammaLabel;
+ private System.Windows.Forms.Label CamBetaLabel;
+ private System.Windows.Forms.Label CamAlphaLabel;
+ private System.Windows.Forms.Label CamPoseZLabel;
+ private System.Windows.Forms.Label CamPoseYLabel;
+ private System.Windows.Forms.Label CamPoseXLabel;
+ private System.Windows.Forms.Button buttonSaveCamParams;
+ private System.Windows.Forms.Label CyResultLabel;
+ private System.Windows.Forms.Label CxResultLabel;
+ private System.Windows.Forms.Label SyResultLabel;
+ private System.Windows.Forms.Label SxResultLabel;
+ private System.Windows.Forms.Label StatusCalibLabel;
+ private System.Windows.Forms.Label ImgHResultLabel;
+ private System.Windows.Forms.Label ImgWResultLabel;
+ private System.Windows.Forms.Label label20;
+ private System.Windows.Forms.CheckBox checkBoxOrigImgCoord;
+ private System.Windows.Forms.Label StatusLabel;
+ private System.Windows.Forms.RadioButton buttonRefImg;
+ private System.Windows.Forms.Label label44;
+ private System.Windows.Forms.Label label30;
+ private System.Windows.Forms.Label FocalLResultLabel;
+ private System.Windows.Forms.Label label45;
+ private System.Windows.Forms.Label label32;
+ private System.Windows.Forms.Label KappaResultLabel;
+ private System.Windows.Forms.Label label83;
+ private System.Windows.Forms.Label label84;
+ private System.Windows.Forms.Label label80;
+ private System.Windows.Forms.Label label81;
+ private System.Windows.Forms.Label label54;
+ private System.Windows.Forms.Label label56;
+ private System.Windows.Forms.Label label58;
+ private System.Windows.Forms.Label label63;
+ private System.Windows.Forms.Label label65;
+ private System.Windows.Forms.Label label67;
+ private System.Windows.Forms.Label P2Label;
+ private System.Windows.Forms.Label P1Label;
+ private System.Windows.Forms.Label K3Label;
+ private System.Windows.Forms.Label K2Label;
+ private System.Windows.Forms.Label K1Label;
+ private System.Windows.Forms.Label ErrorLabel;
+ private System.Windows.Forms.Label label82;
+ private System.Windows.Forms.Label label85;
+ private System.Windows.Forms.Label label86;
+ private System.Windows.Forms.Label label87;
+ private System.Windows.Forms.Label label88;
+ private System.Windows.Forms.Label label89;
+ private System.Windows.Forms.Label VzResultLabel;
+ private System.Windows.Forms.Label VyResultLabel;
+ private System.Windows.Forms.Label VxResultLabel;
+ private System.Windows.Forms.Panel AreaScanPolynomPanel;
+ private System.Windows.Forms.Panel KappaPanel;
+ private System.Windows.Forms.Panel LineScanPanel;
+ private System.Windows.Forms.SaveFileDialog saveParamFileDialog;
+ private System.Windows.Forms.RadioButton buttonSimImg;
+ private System.Windows.Forms.Button buttonDefaultParams;
+ private HalconDotNet.HWindowControl viewPort;
+ #endregion
+ private System.Windows.Forms.TabPage tabPageDistance;
+ private System.Windows.Forms.Label label24;
+ private System.Windows.Forms.Label label23;
+ private System.Windows.Forms.NumericUpDown numericUpDownP2;
+ private System.Windows.Forms.NumericUpDown numericUpDownP1;
+ private System.Windows.Forms.TextBox txtDistanceP1P2;
+ private System.Windows.Forms.Label label27;
+ private System.Windows.Forms.Label label25;
+ private System.Windows.Forms.Label label29;
+ private System.Windows.Forms.Label label31;
+ private System.Windows.Forms.TextBox txtDistanceP3P4;
+ private System.Windows.Forms.Label label33;
+ private System.Windows.Forms.Label label35;
+ private System.Windows.Forms.NumericUpDown numericUpDownP4;
+ private System.Windows.Forms.NumericUpDown numericUpDownP3;
+ }
+}
+
diff --git a/HalconTools/frmCalibration.cs b/HalconTools/frmCalibration.cs
new file mode 100644
index 0000000..69a63c2
--- /dev/null
+++ b/HalconTools/frmCalibration.cs
@@ -0,0 +1,1415 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public partial class frmCalibration : Form
+ {
+ private HWndCtrl mView;
+ private CalibrationAssistant mAssistant;
+ private int currIdx;
+ private int currLineW;
+
+ private double tThickness = 0;
+ private double tCellWidth = 0;
+ private double tCellHeight = 0;
+ private double tFocalLength = 0;
+ private double tMotionX = 0;
+ private double tMotionY = 0;
+ private double tMotionZ = 0;
+
+ private bool locked;
+ private bool plateRegionDisp;
+ private bool markCentersDisp;
+ private bool coordSystemDisp;
+
+ private string plateRegionColor;
+ private string markCenterColor;
+ private string coordSystemColor;
+
+ public frmCalibration()
+ {
+ InitializeComponent();
+ }
+
+ private void frmMain_Load(object sender, EventArgs e)
+ {
+ mView = new HWndCtrl(viewPort);
+ mView.setViewState(HWndCtrl.MODE_VIEW_NONE);
+ mView.changeGraphicSettings(GraphicsContext.GC_DRAWMODE, comboBoxDraw.Text);
+ mView.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 1);
+
+ mAssistant = new CalibrationAssistant();
+ mAssistant.NotifyCalibObserver = new CalibDelegate(UpdateCalibResults);
+ Init();
+ }
+
+ /*******************************************************************
+ * Initialize the GUI front end with the values defined for the
+ * corresponding parameters in the Calibration Assistant
+ * ****************************************************************/
+ private void Init()
+ {
+ currIdx = 0;
+ currLineW = 1;
+ locked = true;
+
+ plateRegionDisp = checkBoxPlateRegion.Checked;
+ markCentersDisp = checkBoxMarkCenter.Checked;
+ coordSystemDisp = checkBoxCoordSys.Checked;
+
+ plateRegionColor = comboBoxPlateRegion.Text;
+ markCenterColor = comboBoxMarkCenters.Text;
+ coordSystemColor = comboBoxCoordSys.Text;
+
+ CamTypComboBox.SelectedIndex = 0;
+ SxUpDown.Value = (decimal)mAssistant.getCellWidth();
+ SxUpDown.Increment = 0.100m;
+ SyUpDown.Value = (decimal)mAssistant.getCellHeight();
+ SyUpDown.Increment = 0.100m;
+ FocalLengthUpDown.Value = (decimal)mAssistant.getFocalLength();
+ FocalLengthUpDown.Increment = 0.100m;
+ ThicknessUpDown.Value = (decimal)(mAssistant.getThickness());
+ ThicknessUpDown.Increment = 0.100m;
+
+
+ textBoxDescr.Text = mAssistant.mDescrFileName;
+
+ FilterSizeUpDown.Value = (int)mAssistant.getFilterSize();
+ MarkThreshUpDown.Value = (int)mAssistant.getMarkThresh();
+ MinDiamUpDown.Value = (int)mAssistant.getMinMarkDiam();
+ InitThreshUpDown.Value = (int)mAssistant.getInitThresh();
+ ThreshDecrUpDown.Value = (int)mAssistant.getThreshDecr();
+ MinThreshUpDown.Value = (int)mAssistant.getMinThresh();
+ SmoothUpDown.Value = (int)(mAssistant.getSmoothing() * 100);
+ MinContLUpDown.Value = (int)mAssistant.getMinContLength();
+ MaxDiamUpDown.Value = (int)mAssistant.getMaxMarkDiam();
+ WarnlevelUpDown.Value = (int)mAssistant.getWarnLevel();
+
+ MotionXUpDown.Value = (decimal)mAssistant.getMotionX();
+ MotionXUpDown.Increment = 0.100m;
+ MotionYUpDown.Value = (decimal)mAssistant.getMotionY();
+ MotionYUpDown.Increment = 0.100m;
+ MotionZUpDown.Value = (decimal)mAssistant.getMotionZ();
+ MotionZUpDown.Increment = 0.100m;
+
+ string imPathValue =
+ (string)HSystem.GetSystem("image_dir").TupleSplit(";");
+ openFileDialogImg.InitialDirectory = imPathValue + "\\calib";
+ string halconPathValue = Environment.GetEnvironmentVariable(
+ "HALCONROOT");
+ openFileDialogDescr.InitialDirectory = halconPathValue + "\\calib";
+ // set initial directory to standard user's working directory
+ openFileDialogImportParams.InitialDirectory =
+ Environment.GetFolderPath(
+ System.Environment.SpecialFolder.Personal);
+ // set initial directory to standard user's working directory
+ saveParamFileDialog.InitialDirectory =
+ Environment.GetFolderPath(
+ System.Environment.SpecialFolder.Personal);
+
+ locked = false;
+ }
+
+ /********************************************************************/
+ /* Display Parameters */
+ /********************************************************************/
+ private void checkBoxPlateRegion_CheckedChanged(object sender, System.EventArgs e)
+ {
+ plateRegionDisp = checkBoxPlateRegion.Checked;
+ UpdateView();
+ }
+
+ /****************************************************/
+ private void checkBoxMarkCenter_CheckedChanged(object sender, System.EventArgs e)
+ {
+ markCentersDisp = checkBoxMarkCenter.Checked;
+ UpdateView();
+ }
+
+ /****************************************************/
+ private void checkBoxCoordSys_CheckedChanged(object sender, System.EventArgs e)
+ {
+ coordSystemDisp = checkBoxCoordSys.Checked;
+ UpdateView();
+ }
+
+ /****************************************************/
+ private void comboBoxPlateRegion_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ plateRegionColor = comboBoxPlateRegion.Text;
+ UpdateView();
+ }
+
+ /****************************************************/
+ private void comboBoxMarkCenters_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ markCenterColor = comboBoxMarkCenters.Text;
+ UpdateView();
+ }
+
+ /****************************************************/
+ private void comboBoxCoordSys_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ coordSystemColor = comboBoxCoordSys.Text;
+ UpdateView();
+ }
+
+ /****************************************************/
+ private void comboBoxDraw_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ mView.changeGraphicSettings(GraphicsContext.GC_DRAWMODE, comboBoxDraw.Text);
+ UpdateView();
+ }
+
+ private void upDownLineWidth_ValueChanged(object sender, System.EventArgs e)
+ {
+ currLineW = (int)upDownLineWidth.Value;
+ mView.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, currLineW);
+ UpdateView();
+ }
+
+
+ /********************************************************************/
+ /* MouseInteraction Parameters */
+ /********************************************************************/
+ private void buttonMove_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mView.setViewState(HWndCtrl.MODE_VIEW_MOVE);
+ }
+
+ /****************************************************/
+ private void buttonZoom_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mView.setViewState(HWndCtrl.MODE_VIEW_ZOOM);
+ }
+
+ /****************************************************/
+ private void buttonMagnify_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mView.setViewState(HWndCtrl.MODE_VIEW_ZOOMWINDOW);
+ }
+
+ /****************************************************/
+ private void buttonNone_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mView.setViewState(HWndCtrl.MODE_VIEW_NONE);
+ }
+
+ /****************************************************/
+ private void buttonReset_Click(object sender, System.EventArgs e)
+ {
+ mView.resetWindow();
+ UpdateView();
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ /* 1. Tab */
+ /********************************************************************/
+ /********************************************************************/
+ private void buttonLoad_Click(object sender, System.EventArgs e)
+ {
+ string[] files;
+ ListViewItem item;
+ int count = 0;
+ CalibImage data = null;
+
+ int idx = StatusLabel.Text.Length;
+
+ if (openFileDialogImg.ShowDialog() == DialogResult.OK)
+ {
+ files = openFileDialogImg.FileNames;
+ count = files.Length;
+
+
+ for (int i = 0; i < count; i++)
+ {
+ if ((data = mAssistant.addImage(files[i])) != null)
+ {
+ item = new ListViewItem("");
+ item.SubItems.Add(files[i]);
+ item.SubItems.Add(data.getPlateStatus());
+ ListCalibImg.Items.AddRange(new ListViewItem[] { item });
+ }
+ }//for
+
+ mAssistant.UpdateSequenceIssues();
+
+ buttonCalibrate.Enabled = (mAssistant.mCanCalib && (mAssistant.mReferenceIndex != -1));
+ buttonSetReference.Enabled = true;
+
+ if (data != null)
+ {
+ ListCalibImg.Items[currIdx].BackColor = System.Drawing.SystemColors.Window;
+ currIdx = ListCalibImg.Items.Count - 1;
+ UpdateCalibResults(CalibrationAssistant.UPDATE_MARKS_POSE);
+ UpdateCalibResults(CalibrationAssistant.UPDATE_QUALITY_TABLE);
+ UpdateCalibResults(CalibrationAssistant.UPDATE_CALIBRATION_RESULTS);
+ }
+ }//if
+ }
+
+ /****************************************************/
+ private void ListCalibImg_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ string path = "";
+ ListView.SelectedListViewItemCollection items = ListCalibImg.SelectedItems;
+
+ foreach (ListViewItem item in items)
+ {
+ path = item.SubItems[1].Text;
+ if (path != "")
+ {
+ ListCalibImg.Items[currIdx].BackColor = System.Drawing.SystemColors.Window;
+ currIdx = ListCalibImg.Items.IndexOf(item);
+ ListCalibImg.Items[currIdx].BackColor = System.Drawing.SystemColors.Control;
+
+ showLabelErrMessage();
+ UpdateView();
+ UpdateQualityIssueTable();
+ break;
+ }//if
+ }//foreach
+ }
+
+ /****************************************************/
+ private void showLabelErrMessage()
+ {
+ string message = mAssistant.getCalibDataAt(currIdx).mErrorMessage;
+ showLabelErrMessage(message);
+ }
+
+ /****************************************************/
+ private void showLabelErrMessage(string message)
+ {
+ int idx = message.IndexOf(":");
+ string tmp;
+
+ if (idx > 0)
+ {
+ message = "Error" + message.Remove(0, idx);
+
+ if (message.Length > 90)
+ {
+ idx = message.LastIndexOf(" ", 80);
+ tmp = message.Substring(0, idx) + "\n " + message.Substring(idx + 1);
+ message = tmp;
+ }
+ StatusLabel.Text = message;
+ }
+ else
+ {
+ StatusLabel.Text = "";
+ }
+ }
+
+ /****************************************************/
+ private void buttonDelete_Click(object sender, System.EventArgs e)
+ {
+ int cIdx = -1;
+ int refIdx = -1;
+ string path = "";
+
+ ListView.SelectedListViewItemCollection items = ListCalibImg.SelectedItems;
+
+ currIdx = 0;
+ foreach (ListViewItem item in items)
+ {
+ path = item.SubItems[1].Text;
+ if (path != "")
+ {
+ refIdx = mAssistant.mReferenceIndex;
+
+ if ((cIdx = ListCalibImg.Items.IndexOf(item)) == refIdx)
+ refIdx = -1;
+ else if (cIdx < refIdx)
+ refIdx--;
+
+ mAssistant.setReferenceIdx(refIdx);
+ mAssistant.removeImage(cIdx);
+ buttonCalibrate.Enabled = (mAssistant.mCanCalib && (refIdx != -1));
+ ListCalibImg.Items.Remove(item);
+ ListQualityCheck.Items.Clear();
+ break;
+ }//if
+ }//foreach
+
+ if (ListCalibImg.Items.Count == 0)
+ buttonSetReference.Enabled = false;
+ else
+ UpdateView();
+
+ }
+
+ /****************************************************/
+ private void buttonDeleteAll_Click(object sender, System.EventArgs e)
+ {
+ mAssistant.removeImage();
+ mView.resetWindow();
+ mView.clearList();
+ currIdx = 0;
+
+ ListCalibImg.Items.Clear();
+ ListQualityCheck.Items.Clear();
+
+ buttonSetReference.Enabled = false;
+ buttonCalibrate.Enabled = false;
+ mAssistant.setReferenceIdx(-1);
+ mAssistant.resetCanCalib();
+
+ UpdateView();
+ }
+
+ /****************************************************/
+ private void buttonSetReference_Click(object sender, System.EventArgs e)
+ {
+ int val = mAssistant.mReferenceIndex;
+
+ if (val > -1)
+ ListCalibImg.Items[val].SubItems[0].Text = "";
+
+ mAssistant.setReferenceIdx(currIdx);
+ ListCalibImg.Items[currIdx].SubItems[0].Text = " *";
+ buttonCalibrate.Enabled = mAssistant.mCanCalib;
+ }
+
+ /*************************************************************/
+ private void buttonCalibrate_Click(object sender, System.EventArgs e)
+ {
+ StatusLabel.Text = " Calibrating ... ";
+ StatusLabel.Refresh();
+
+ mAssistant.applyCalibration();
+ tabControl.SelectedTab = tabControl.TabPages[2];
+
+ }
+
+ /**************************************************************/
+ private void buttonLoadDescrFile_Click(object sender, System.EventArgs e)
+ {
+ string file;
+ string[] val;
+ if (openFileDialogDescr.ShowDialog() == DialogResult.OK)
+ {
+ file = openFileDialogDescr.FileNames[0];
+ if (file.EndsWith(".descr"))
+ {
+ mAssistant.setDesrcFile(file);
+ val = file.Split(new Char[] { '\\' });
+ file = val[val.Length - 1];
+ textBoxDescr.Text = file;
+ }
+ else
+ {
+ MessageBox.Show("Fileformat is wrong, it's not a description file!",
+ "Calibration Assistant",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ }
+ }
+ }
+
+ /**************************************************************/
+ private void buttonImportParams_Click(object sender, System.EventArgs e)
+ {
+ string file;
+ bool success;
+
+
+ if (openFileDialogImportParams.ShowDialog() == DialogResult.OK)
+ {
+ file = openFileDialogImportParams.FileNames[0];
+ if (file.EndsWith(".cal") || file.EndsWith(".dat"))
+ {
+ success = mAssistant.importCamParams(file);
+
+ if (success)
+ {
+ locked = true;
+ resetGUICameraSetup();
+ locked = false;
+ }
+ }
+ else
+ {
+ UpdateCalibResults(CalibrationAssistant.ERR_READING_FILE);
+ }
+ }
+ }
+
+ /**************************************************************/
+ private void resetGUICameraSetup()
+ {
+ int camType, val;
+
+ try
+ {
+ camType = mAssistant.getCameraType();
+ if (camType == CalibrationAssistant.CAMERA_TYP_AREA_SCAN_DIV)
+ val = 0;
+ else if (camType == CalibrationAssistant.CAMERA_TYP_AREA_SCAN_POLY)
+ val = 1;
+ else if (camType == CalibrationAssistant.CAMERA_TYP_LINE_SCAN)
+ val = 2;
+ else
+ throw (new ArgumentException());
+
+
+ CamTypComboBox.SelectedIndex = val;
+ SxUpDown.Value = (decimal)mAssistant.getCellWidth();
+ SyUpDown.Value = (decimal)mAssistant.getCellHeight();
+ FocalLengthUpDown.Value = (decimal)mAssistant.getFocalLength();
+ TelecentricCheckBox.Checked = mAssistant.isTelecentric;
+
+ MotionXUpDown.Value = (decimal)mAssistant.getMotionX();
+ MotionYUpDown.Value = (decimal)mAssistant.getMotionY();
+ MotionZUpDown.Value = (decimal)mAssistant.getMotionZ();
+
+ }
+ catch (ArgumentException)
+ {
+ locked = false;
+ }
+ }
+
+
+ /**************************************************************/
+ private void buttonDefaultParams_Click(object sender, System.EventArgs e)
+ {
+ mAssistant.resetCameraSetup(false);
+ locked = true;
+ resetGUICameraSetup();
+ locked = false;
+ }
+
+ /**************************************************************/
+ private void numUpDownThickness_ValueChanged(object sender, System.EventArgs e)
+ {
+ tThickness = (double)ThicknessUpDown.Value;
+ mAssistant.setThickness((double)ThicknessUpDown.Value);
+ }
+
+ /**************************************************************/
+ private void comboBoxCamTyp_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ int val = 0;
+
+ AreaScanPolynomPanel.Visible = false;
+ KappaPanel.Visible = false;
+ LineScanPanel.Visible = false;
+
+ LineScanAddPanel.Visible = false;
+
+ switch ((int)CamTypComboBox.SelectedIndex)
+ {
+ case 0:
+ val = CalibrationAssistant.CAMERA_TYP_AREA_SCAN_DIV;
+ KappaPanel.Visible = true;
+ TelecentricCheckBox.Enabled = true;
+ break;
+ case 1:
+ val = CalibrationAssistant.CAMERA_TYP_AREA_SCAN_POLY;
+ AreaScanPolynomPanel.Visible = true;
+ TelecentricCheckBox.Enabled = true;
+ break;
+ case 2:
+ val = CalibrationAssistant.CAMERA_TYP_LINE_SCAN;
+ KappaPanel.Visible = true;
+ LineScanPanel.Visible = true;
+ LineScanAddPanel.Visible = true;
+ TelecentricCheckBox.Checked = false;
+ TelecentricCheckBox.Enabled = false;
+ break;
+ }
+
+ if (!locked)
+ mAssistant.setCameraType(val);
+
+ }
+
+ /**************************************************************/
+ private void numUpDownSx_ValueChanged(object sender, System.EventArgs e)
+ {
+ tCellWidth = (double)SxUpDown.Value;
+
+ if (!locked)
+ mAssistant.setCellWidth((double)SxUpDown.Value);
+ }
+
+ /**************************************************************/
+ private void numUpDownSy_ValueChanged(object sender, System.EventArgs e)
+ {
+ tCellHeight = (double)SyUpDown.Value;
+
+ if (!locked)
+ mAssistant.setCellHeight((double)SyUpDown.Value);
+ }
+
+ /**************************************************************/
+ private void numUpDownFocalLength_ValueChanged(object sender, System.EventArgs e)
+ {
+ tFocalLength = (double)FocalLengthUpDown.Value;
+
+ if (!locked)
+ mAssistant.setFocalLength((double)FocalLengthUpDown.Value);
+ }
+
+ /**************************************************************/
+ private void checkBoxTelecentric_CheckedChanged(object sender, System.EventArgs e)
+ {
+ bool check = TelecentricCheckBox.Checked;
+
+ if (check)
+ FocalLengthUpDown.Enabled = false;
+ else
+ FocalLengthUpDown.Enabled = true;
+
+ if (!locked)
+ mAssistant.setIsTelecentric(check);
+ }
+
+ /**************************************************************/
+ private void MotionXUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ tMotionX = (double)MotionXUpDown.Value;
+
+ if (!locked)
+ mAssistant.setMotionX((double)MotionXUpDown.Value);
+ }
+
+ /**************************************************************/
+ private void MotionYUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ tMotionY = (double)MotionYUpDown.Value;
+
+ if (!locked)
+ mAssistant.setMotionY((double)MotionYUpDown.Value);
+ }
+
+ /**************************************************************/
+ private void MotionZUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ tMotionZ = (double)MotionZUpDown.Value;
+
+ if (!locked)
+ mAssistant.setMotionZ((double)MotionZUpDown.Value);
+ }
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* 2. Tab */
+ /*************************************************************************/
+ /*************************************************************************/
+ private void comboBoxImgTests_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ if (!locked)
+ mAssistant.setImageTests(ImgTestsComboBox.SelectedIndex);
+ }
+
+ /**************************************************************/
+ private void comboBoxSeqTests_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ if (!locked)
+ mAssistant.setSequenceTests(SeqTestsComboBox.SelectedIndex);
+ }
+
+ /**************************************************************/
+ private void numUpDownWarnlevel_ValueChanged(object sender, System.EventArgs e)
+ {
+ if (!locked)
+ mAssistant.setWarnLevel((int)WarnlevelUpDown.Value);
+ }
+
+ /**************************************************************/
+ /******************** FillSize ***************************/
+ private void numUpDownFilterSize_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)FilterSizeUpDown.Value;
+ FilterSizeTrackBar.Value = val;
+
+ if (!locked)
+ setFilterSize(val);
+
+ }
+ private void trackBarFilterSize_Scroll(object sender, System.EventArgs e)
+ {
+ FilterSizeUpDown.Value = FilterSizeTrackBar.Value;
+ FilterSizeUpDown.Refresh();
+ }
+ private void buttonRFilterSize_Click(object sender, System.EventArgs e)
+ {
+ FilterSizeUpDown.Value = mAssistant.resetFilterSize;
+ FilterSizeResetButton.ForeColor = System.Drawing.Color.Gray;
+ }
+ private void setFilterSize(int val)
+ {
+ FilterSizeResetButton.ForeColor = System.Drawing.Color.Black;
+ mAssistant.setFilterSize((double)val);
+ }
+
+ /**************************************************************/
+ /********************** Mark Threshold ************************/
+ private void numUpDownMarkThresh_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)MarkThreshUpDown.Value;
+ MarkThreshTrackBar.Value = val;
+
+ if (!locked)
+ setMarkThresh(val);
+
+ }
+ private void trackBarMarkThresh_Scroll(object sender, System.EventArgs e)
+ {
+ MarkThreshUpDown.Value = (int)MarkThreshTrackBar.Value;
+ MarkThreshUpDown.Refresh();
+ }
+ private void buttonRMarkThresh_Click(object sender, System.EventArgs e)
+ {
+ MarkThreshUpDown.Value = mAssistant.resetMarkThresh;
+ MarkThreshResetButton.ForeColor = System.Drawing.Color.Gray;
+
+ }
+ private void setMarkThresh(int val)
+ {
+ MarkThreshResetButton.ForeColor = System.Drawing.Color.Black;
+ mAssistant.setMarkThresh((double)val);
+ }
+
+ /**************************************************************/
+ /*********************** Min Diameter ***********************/
+ private void numUpDownMinDiam_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)MinDiamUpDown.Value;
+ MinDiamTrackBar.Value = val;
+
+ if (!locked)
+ setMinDiam(val);
+
+ }
+ private void trackBarMinDiam_Scroll(object sender, System.EventArgs e)
+ {
+ MinDiamUpDown.Value = MinDiamTrackBar.Value;
+ MinDiamUpDown.Refresh();
+ }
+ private void buttonRMinDiam_Click(object sender, System.EventArgs e)
+ {
+ MinDiamUpDown.Value = mAssistant.resetMinMarkDiam;
+ MinDiamResetButton.ForeColor = System.Drawing.Color.Gray;
+ }
+ private void setMinDiam(int val)
+ {
+ MinDiamResetButton.ForeColor = System.Drawing.Color.Black;
+ mAssistant.setMinMarkDiam((double)val);
+ }
+
+ /**************************************************************/
+ /******************** Init Threshold ************************/
+ private void numUpDownInitThresh_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)InitThreshUpDown.Value;
+ InitThreshTrackBar.Value = val;
+
+ if (!locked)
+ setInitThresh(val);
+
+ }
+ private void trackBarInitThresh_Scroll(object sender, System.EventArgs e)
+ {
+ InitThreshUpDown.Value = InitThreshTrackBar.Value;
+ InitThreshUpDown.Refresh();
+ }
+ private void buttonRInitThresh_Click(object sender, System.EventArgs e)
+ {
+ InitThreshUpDown.Value = mAssistant.resetInitThresh;
+ InitThreshResetButton.ForeColor = System.Drawing.Color.Gray;
+ }
+ private void setInitThresh(int val)
+ {
+ InitThreshResetButton.ForeColor = System.Drawing.Color.Black;
+ mAssistant.setInitThresh((double)val);
+ }
+
+ /**************************************************************/
+ /****************** Threshold Decrement **********************/
+ private void numUpDownThreshDecr_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)ThreshDecrUpDown.Value;
+ ThreshDecrTrackBar.Value = val;
+
+ if (!locked)
+ setThreshDecr(val);
+
+ }
+ private void trackBarThreshDecr_Scroll(object sender, System.EventArgs e)
+ {
+ ThreshDecrUpDown.Value = (int)ThreshDecrTrackBar.Value;
+ ThreshDecrUpDown.Refresh();
+ }
+ private void buttonRThreshDecr_Click(object sender, System.EventArgs e)
+ {
+ ThreshDecrUpDown.Value = mAssistant.resetThreshDecr;
+ ThreshDecrResetButton.ForeColor = System.Drawing.Color.Gray;
+
+ }
+ private void setThreshDecr(int val)
+ {
+ ThreshDecrResetButton.ForeColor = System.Drawing.Color.Black;
+ mAssistant.setThreshDecr((double)val);
+ }
+
+ /**************************************************************/
+ /****************** Minimum Threshold ************************/
+ private void numUpDownMinThresh_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)MinThreshUpDown.Value;
+ MinThreshTrackBar.Value = val;
+
+ if (!locked)
+ setMinThresh(val);
+
+ }
+ private void trackBarMinThresh_Scroll(object sender, System.EventArgs e)
+ {
+ MinThreshUpDown.Value = MinThreshTrackBar.Value;
+ MinThreshUpDown.Refresh();
+ }
+ private void buttonRMinThresh_Click(object sender, System.EventArgs e)
+ {
+ MinThreshUpDown.Value = mAssistant.resetMinThresh;
+ MinThreshResetButton.ForeColor = System.Drawing.Color.Gray;
+
+ }
+ private void setMinThresh(int val)
+ {
+ MinThreshResetButton.ForeColor = System.Drawing.Color.Black;
+ mAssistant.setMinThresh((double)val);
+ }
+
+ /**************************************************************/
+ /******************** Smoothing *****************************/
+ private void numUpDownSmooth_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)SmoothUpDown.Value;
+ SmoothTrackBar.Value = val;
+
+ if (!locked)
+ setSmoothing(val);
+
+ }
+ private void trackBarSmooth_Scroll(object sender, System.EventArgs e)
+ {
+ SmoothUpDown.Value = SmoothTrackBar.Value;
+ SmoothUpDown.Refresh();
+ }
+ private void buttonRSmooting_Click(object sender, System.EventArgs e)
+ {
+ SmoothUpDown.Value = (int)(mAssistant.resetSmoothing * 100);
+ SmootingResetButton.ForeColor = System.Drawing.Color.Gray;
+
+ }
+ private void setSmoothing(int val)
+ {
+ SmootingResetButton.ForeColor = System.Drawing.Color.Black;
+ mAssistant.setSmoothing((double)val / 100.0);
+ }
+
+ /**************************************************************/
+ /***************** Min Contour Length ************************/
+ private void numUpDownMinContL_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)MinContLUpDown.Value;
+ MinContLTrackBar.Value = val;
+
+ if (!locked)
+ setMinContLength(val);
+
+ }
+ private void trackBarMinContL_Scroll(object sender, System.EventArgs e)
+ {
+ MinContLUpDown.Value = (int)MinContLTrackBar.Value;
+ MinContLUpDown.Refresh();
+ }
+ private void buttonRMinContL_Click(object sender, System.EventArgs e)
+ {
+ MinContLUpDown.Value = mAssistant.resetMinContL;
+ MinContLResetButton.ForeColor = System.Drawing.Color.Gray;
+
+ }
+ private void setMinContLength(int val)
+ {
+ MinContLResetButton.ForeColor = System.Drawing.Color.Black;
+ mAssistant.setMinContLength((double)val);
+ }
+
+ /**************************************************************/
+ /******************** Max Diameter ***************************/
+ private void numUpDownMaxDiam_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)MaxDiamUpDown.Value;
+ MaxDiamTrackBar.Value = val;
+
+ if (!locked)
+ setMaxDiam(val);
+ }
+ private void trackBarMaxDiam_Scroll(object sender, System.EventArgs e)
+ {
+ MaxDiamUpDown.Value = MaxDiamTrackBar.Value;
+ MaxDiamUpDown.Refresh();
+ }
+ private void buttonRMaxDiam_Click(object sender, System.EventArgs e)
+ {
+ MaxDiamUpDown.Value = mAssistant.resetMaxMarkDiam;
+ MaxDiamResetButton.ForeColor = System.Drawing.Color.Gray;
+ }
+ private void setMaxDiam(int val)
+ {
+ MaxDiamResetButton.ForeColor = System.Drawing.Color.Black;
+ mAssistant.setMaxMarkDiam((double)val);
+ }
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* 3. Tab */
+ /*************************************************************************/
+ /*************************************************************************/
+ private void checkBoxOrigImgCoord_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mAssistant.setAtImgCoord(checkBoxOrigImgCoord.Checked);
+ UpdateView();
+ }
+
+
+ private void buttonSaveCamParams_Click(object sender, System.EventArgs e)
+ {
+ string files;
+
+ if (saveParamFileDialog.ShowDialog() == DialogResult.OK)
+ {
+ files = saveParamFileDialog.FileName;
+
+ if (!files.EndsWith(".cal") && !files.EndsWith(".CAL"))
+ files += ".cal";
+
+ if (mAssistant.mCalibValid)
+ mAssistant.saveCamParams(files);
+ }
+ }
+
+ /*************************************************************************/
+ /*************************************************************************/
+ private void buttonSaveCamPose_Click(object sender, System.EventArgs e)
+ {
+
+ string files;
+
+ if (saveParamFileDialog.ShowDialog() == DialogResult.OK)
+ {
+ files = saveParamFileDialog.FileName;
+
+ if (!files.EndsWith(".dat") && !files.EndsWith(".DAT"))
+ files += ".dat";
+
+ if (mAssistant.mCalibValid)
+ mAssistant.saveCamPose(files);
+ }
+ }
+
+ /*************************************************************************/
+ private void buttonRefImg_CheckedChanged(object sender, System.EventArgs e)
+ {
+ UpdateView();
+ }
+
+ /*************************************************************************/
+ private void radioSimulatedImg_CheckedChanged(object sender, System.EventArgs e)
+ {
+ UpdateView();
+ }
+
+
+
+ /********************************************************************/
+ /* Update methods invoked by delegates */
+ /********************************************************************/
+
+ /// <summary>
+ /// This update method is invoked for all changes occurring in the
+ /// CalibrationAssistant that need to be forwarded to the GUI. The
+ /// referring delegate invokes an update for changes in the model
+ /// data, which leads to an update in the graphics view. Also, errors
+ /// that occur during IO functions and for single calibration steps
+ /// are mapped here.
+ /// </summary>
+ /// <param name="mode">
+ /// Constant of the class CalibrationAssistant, which starts with
+ /// UPDATE_* or ERR_* and which describes an update of the model
+ /// data or an HALCON error, respectively.
+ /// </param>
+ public void UpdateCalibResults(int mode)
+ {
+ switch (mode)
+ {
+ case CalibrationAssistant.UPDATE_MARKS_POSE:
+ UpdateView();
+ break;
+ case CalibrationAssistant.UPDATE_QUALITY_TABLE:
+ UpdateQualityIssueTable();
+ break;
+ case CalibrationAssistant.UPDATE_CALTAB_STATUS:
+ UpdateImageStatus();
+ break;
+ case CalibrationAssistant.UPDATE_CALIBRATION_RESULTS:
+ UpdateResultTab(mAssistant.mCalibValid);
+ StatusLabel.Text = " ";
+ break;
+ case CalibrationAssistant.ERR_READING_FILE:
+ MessageBox.Show("Problem occured while reading file! \n" + mAssistant.mErrorMessage,
+ "Calibration Assistant",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ break;
+ case CalibrationAssistant.ERR_QUALITY_ISSUES:
+ MessageBox.Show("Error occured while testing for quality issues \n" + mAssistant.mErrorMessage,
+ "Calibration Assistant",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ ListQualityCheck.Items.Clear();
+ break;
+ case CalibrationAssistant.ERR_IN_CALIBRATION:
+ MessageBox.Show("Problem occured while calibrating",
+ "Calibration Assistant",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ UpdateResultTab(mAssistant.mCalibValid);
+ showLabelErrMessage(mAssistant.mErrorMessage);
+ break;
+ case CalibrationAssistant.ERR_REFINDEX_INVALID:
+ MessageBox.Show("Problem occured: \n" +
+ "Please check, whether your reference index is valid",
+ "Calibration Assistant",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ break;
+ case CalibrationAssistant.ERR_WRITE_CALIB_RESULTS:
+ MessageBox.Show("Problem occured while ! \n" + mAssistant.mErrorMessage,
+ "Calibration Assistant",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ break;
+ default:
+ break;
+ }
+ }
+
+
+ HObject mObj;
+ /// <summary>
+ /// Update the graphical window, by adding all objects of either
+ /// the training data set or the test data set, including the
+ /// reference world coordinate system and the calibrated world
+ /// coordinate system.
+ /// </summary>
+ public void UpdateView()
+ {
+ HImage img = null;
+ CalibImage data = mAssistant.getCalibDataAt(currIdx);
+
+
+ if (data == null)
+ {
+ mView.clearList();
+ }
+ else
+ {
+ if (tabControl.SelectedIndex == 2 && mAssistant.mCalibValid)
+ {
+ if (buttonRefImg.Checked)
+ img = mAssistant.getRefImage();
+ else
+ img = (HImage)mAssistant.getSimulatedImage();
+
+
+ mView.addIconicVar(img);
+ if (coordSystemDisp && mAssistant.getReferenceWCS().IsInitialized())
+ {
+ mView.changeGraphicSettings(GraphicsContext.GC_COLOR, coordSystemColor);
+ mView.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, currLineW + 1);
+ mView.addIconicVar(mAssistant.getReferenceWCS());
+ }
+ }
+ else if (tabControl.SelectedIndex == 3 && mAssistant.mCalibValid)
+ {
+ mView.addIconicVar(data.getImage());
+ mView.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, currLineW + 1);
+ mView.changeGraphicSettings(GraphicsContext.GC_COLOR, coordSystemColor);
+
+ HTuple dis = new HTuple();
+ HTuple worldRow = data.getWorldY();
+ HTuple worldCol = data.getWorldX();
+ HTuple Rows = data.getMarkCenterRows();
+ HTuple Cols = data.getMarkCenterColumns();
+
+ HTuple tmprows = new HTuple();
+ HTuple tmpcols = new HTuple();
+
+ int i, j;
+
+ #region P1-P2
+ i = (int)numericUpDownP1.Value;
+ j = (int)numericUpDownP2.Value;
+
+ tmprows.Append(Rows.ToDArr()[i - 1]);
+ tmprows.Append(Rows.ToDArr()[j - 1]);
+ tmpcols.Append(Cols.ToDArr()[i - 1]);
+ tmpcols.Append(Cols.ToDArr()[j - 1]);
+
+ HOperatorSet.DistancePp((HTuple)worldRow.ToDArr()[i - 1], (HTuple)worldCol.ToDArr()[i - 1], (HTuple)worldRow.ToDArr()[j - 1], (HTuple)worldCol.ToDArr()[j - 1], out dis);
+
+ txtDistanceP1P2.Text = dis.D.ToString("0.0000");
+ #endregion
+
+ HOperatorSet.GenEmptyObj(out mObj);
+ HOperatorSet.GenContourPolygonXld(out mObj, tmprows, tmpcols);
+ mView.addIconicVar(mObj);
+
+ tmprows = new HTuple();
+ tmpcols = new HTuple();
+
+ #region P3-P4
+ i = (int)numericUpDownP3.Value;
+ j = (int)numericUpDownP4.Value;
+
+ tmprows.Append(Rows.ToDArr()[i - 1]);
+ tmprows.Append(Rows.ToDArr()[j - 1]);
+ tmpcols.Append(Cols.ToDArr()[i - 1]);
+ tmpcols.Append(Cols.ToDArr()[j - 1]);
+
+ HOperatorSet.DistancePp((HTuple)worldRow.ToDArr()[i - 1], (HTuple)worldCol.ToDArr()[i - 1], (HTuple)worldRow.ToDArr()[j - 1], (HTuple)worldCol.ToDArr()[j - 1], out dis);
+
+ txtDistanceP3P4.Text = dis.D.ToString("0.0000");
+ #endregion
+
+ HOperatorSet.GenEmptyObj(out mObj);
+ HOperatorSet.GenContourPolygonXld(out mObj, tmprows, tmpcols);
+ mView.addIconicVar(mObj);
+ }
+ else
+ {
+ mView.addIconicVar(data.getImage());
+ mView.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, currLineW);
+
+ if (plateRegionDisp && data.getCaltabRegion().IsInitialized())
+ {
+ mView.changeGraphicSettings(GraphicsContext.GC_COLOR, plateRegionColor);
+ mView.addIconicVar(data.getCaltabRegion());
+ }
+
+ if (markCentersDisp && data.getMarkCenters().IsInitialized())
+ {
+ mView.changeGraphicSettings(GraphicsContext.GC_COLOR, markCenterColor);
+ mView.addIconicVar(data.getMarkCenters());
+ }
+ if (coordSystemDisp && data.getEstimatedWCS().IsInitialized())
+ {
+ mView.changeGraphicSettings(GraphicsContext.GC_COLOR, coordSystemColor);
+ mView.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, currLineW + 1);
+ mView.addIconicVar(data.getEstimatedWCS());
+
+ }
+ }
+
+ }
+ mView.repaint();
+ }
+
+ /// <summary>
+ /// If the quality issues are recalculated for all calibration
+ /// images, the information table depicting the quality
+ /// measure for each image must be updated.
+ /// </summary>
+ public void UpdateQualityIssueTable()
+ {
+ ListViewItem item;
+ QualityIssue issue;
+ int count;
+ string text = "";
+ ArrayList qList;
+
+ qList = (mAssistant.getCalibDataAt(currIdx)).getQualityIssueList();
+ count = qList.Count;
+ ListQualityCheck.Items.Clear();
+
+ for (int i = 0; i < count; i++)
+ {
+ issue = (QualityIssue)qList[i];
+ item = new ListViewItem("Image");
+
+ //Images
+ switch (issue.getIssueType())
+ {
+ case CalibrationAssistant.QUALITY_ISSUE_FAILURE:
+ text = "Quality assessment failed";
+ break;
+ case CalibrationAssistant.QUALITY_ISSUE_IMG_CALTAB_SIZE:
+ text = "Plate in image is too small";
+ break;
+ case CalibrationAssistant.QUALITY_ISSUE_IMG_CONTRAST:
+ text = "Contrast is too low";
+ break;
+ case CalibrationAssistant.QUALITY_ISSUE_IMG_EXPOSURE:
+ text = "Plate is too overexposed";
+ break;
+ case CalibrationAssistant.QUALITY_ISSUE_IMG_FOCUS:
+ text = "Marks on plate are out of focus";
+ break;
+ case CalibrationAssistant.QUALITY_ISSUE_IMG_HOMOGENEITY:
+ text = "Illumination is inhomogeneous";
+ break;
+ }
+
+ item.SubItems.Add(text);
+ item.SubItems.Add(((int)(issue.getScore() * 100.0)) + " %");
+ ListQualityCheck.Items.AddRange(new ListViewItem[] { item });
+ }//for
+
+
+ qList = mAssistant.mSeqQualityList;
+ count = qList.Count;
+
+ for (int i = 0; i < count; i++)
+ {
+ issue = (QualityIssue)qList[i];
+ item = new ListViewItem("Sequence");
+
+ //Sequences
+ switch (issue.getIssueType())
+ {
+ case CalibrationAssistant.QUALITY_ISSUE_FAILURE:
+ text = "Quality assessment failed";
+ break;
+ case CalibrationAssistant.QUALITY_ISSUE_SEQ_ALL_OVER:
+ text = "Quality issues detected for some images";
+ break;
+ case CalibrationAssistant.QUALITY_ISSUE_SEQ_CALTAB_TILT:
+ text = "Tilt angles are not covered by sequence";
+ break;
+ case CalibrationAssistant.QUALITY_ISSUE_SEQ_MARKS_DISTR:
+ text = "Field of view is not covered by plate images";
+ break;
+ case CalibrationAssistant.QUALITY_ISSUE_SEQ_NUMBER:
+ text = "Number of images is too low";
+ break;
+ case CalibrationAssistant.QUALITY_ISSUE_SEQ_ERROR:
+ text = "Mark extraction failed for some images";
+ break;
+ default:
+ text = "unknown issue";
+ break;
+ }
+
+ item.SubItems.Add(text);
+ item.SubItems.Add(((int)(issue.getScore() * 100.0)) + " %");
+ ListQualityCheck.Items.AddRange(new ListViewItem[] { item });
+ }//for
+
+ }//end of method
+
+
+ /// <summary>
+ /// For each change in the calibration parameter set the basic parts,
+ /// like finding the calibration plate and the marks, need to be
+ /// recalculated.
+ /// The success or failure for detecting each of these basic parts
+ /// are described for each calibration image by one of the following
+ /// status messages:
+ /// ["Plate not found", "Marks not found",
+ /// "Quality issues detected", "Ok"]
+ /// </summary>
+ public void UpdateImageStatus()
+ {
+ ListViewItem item;
+ int count = ListCalibImg.Items.Count;
+
+ for (int i = 0; i < count; i++)
+ {
+ item = ListCalibImg.Items[i];
+ item.SubItems[2].Text = ((CalibImage)mAssistant.getCalibDataAt(i)).getPlateStatus();
+ }
+
+ showLabelErrMessage();
+ buttonCalibrate.Enabled = (mAssistant.mCanCalib && (mAssistant.mReferenceIndex != -1));
+ }
+
+
+ /// <summary>Displays the calibration results</summary>
+ /// <param name="CalibSuccess">
+ /// Depicts success or failure of the calibration process
+ /// </param>
+ public void UpdateResultTab(bool CalibSuccess)
+ {
+ HTuple campar, reference;
+ HTuple from = new HTuple(7 * mAssistant.mReferenceIndex);
+ HTuple to = new HTuple(7 * mAssistant.mReferenceIndex + 6);
+
+ if (CalibSuccess)
+ {
+ int offset = 0;
+
+ mAssistant.getCalibrationResult(out campar, out reference);
+
+ StatusCalibLabel.Text = "Calibration successful";
+ ErrorLabel.Text = mAssistant.mErrorMean.ToString("f5");
+ FocalLResultLabel.Text = (campar[0].D * 1000.0).ToString("f4");
+
+ if (mAssistant.getCameraType() == CalibrationAssistant.CAMERA_TYP_AREA_SCAN_POLY)
+ {
+ offset = 4;
+ K1Label.Text = campar[1].D.ToString("f2");
+ K2Label.Text = campar[2].D.ToString("e10");
+ K3Label.Text = campar[3].D.ToString("e10");
+ P1Label.Text = campar[4].D.ToString("f6");
+ P2Label.Text = campar[5].D.ToString("f6");
+ }
+ else
+ {
+ KappaResultLabel.Text = campar[1].D.ToString("f2");
+ }
+
+ SxResultLabel.Text = (campar[2 + offset].D * 1000000.0).ToString("f3");
+ SyResultLabel.Text = (campar[3 + offset].D * 1000000.0).ToString("f3");
+ CxResultLabel.Text = campar[4 + offset].D.ToString("f3");
+ CyResultLabel.Text = campar[5 + offset].D.ToString("f3");
+ ImgWResultLabel.Text = campar[6 + offset].I + "";
+ ImgHResultLabel.Text = campar[7 + offset].I + "";
+
+ if (campar.Length == 11)
+ {
+ VxResultLabel.Text = (campar[8].D * 1000000.0).ToString("f3");
+ VyResultLabel.Text = (campar[9].D * 1000000.0).ToString("f3");
+ VzResultLabel.Text = (campar[10].D * 1000000.0).ToString("f3");
+ }
+
+
+ if (reference.Length >= 6)
+ {
+ CamPoseXLabel.Text = (reference[0].D * 1000).ToString("f3");
+ CamPoseYLabel.Text = (reference[1].D * 1000).ToString("f3");
+ CamPoseZLabel.Text = (reference[2].D * 1000).ToString("f3");
+ CamAlphaLabel.Text = (reference[3].D).ToString("f3");
+ CamBetaLabel.Text = (reference[4].D).ToString("f3");
+ CamGammaLabel.Text = (reference[5].D).ToString("f3");
+ }
+ }
+ else //leave all fields empty
+ {
+ StatusCalibLabel.Text = "No calibration data available";
+ ErrorLabel.Text = "";
+ SxResultLabel.Text = "";
+ SyResultLabel.Text = "";
+ FocalLResultLabel.Text = "";
+ KappaResultLabel.Text = "";
+ CxResultLabel.Text = "";
+ CyResultLabel.Text = "";
+ ImgWResultLabel.Text = "";
+ ImgHResultLabel.Text = "";
+ VxResultLabel.Text = "";
+ VyResultLabel.Text = "";
+ VzResultLabel.Text = "";
+ CamPoseXLabel.Text = "";
+ CamPoseYLabel.Text = "";
+ CamPoseZLabel.Text = "";
+ CamAlphaLabel.Text = "";
+ CamBetaLabel.Text = "";
+ CamGammaLabel.Text = "";
+ K1Label.Text = "";
+ K2Label.Text = "";
+ K3Label.Text = "";
+ P1Label.Text = "";
+ P2Label.Text = "";
+ }
+ }
+
+
+ /**************************************************************/
+ private void tabControl_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ UpdateView();
+ }
+
+
+ /**************************************************************/
+ /********* Event on leave - for not to miss on changes *******/
+ /**************************************************************/
+ private void FocalLengthUpDown_Leave(object sender, System.EventArgs e)
+ {
+ if ((double)FocalLengthUpDown.Value != tFocalLength)
+ mAssistant.setFocalLength((double)FocalLengthUpDown.Value);
+ }
+
+ private void ThicknessUpDown_Leave(object sender, System.EventArgs e)
+ {
+ if ((double)ThicknessUpDown.Value != tThickness)
+ mAssistant.setThickness((double)ThicknessUpDown.Value);
+ }
+
+ private void SxUpDown_Leave(object sender, System.EventArgs e)
+ {
+ if ((double)SxUpDown.Value != tCellWidth)
+ mAssistant.setCellWidth((double)SxUpDown.Value);
+ }
+
+ private void SyUpDown_Leave(object sender, System.EventArgs e)
+ {
+ if ((double)SyUpDown.Value != tCellHeight)
+ mAssistant.setCellHeight((double)SyUpDown.Value);
+ }
+
+ private void MotionXUpDown_Leave(object sender, System.EventArgs e)
+ {
+ if ((double)MotionXUpDown.Value != tMotionX)
+ mAssistant.setMotionX((double)MotionXUpDown.Value);
+ }
+
+ private void MotionYUpDown_Leave(object sender, System.EventArgs e)
+ {
+ if ((double)MotionYUpDown.Value != tMotionY)
+ mAssistant.setMotionY((double)MotionYUpDown.Value);
+ }
+
+ private void MotionZUpDown_Leave(object sender, System.EventArgs e)
+ {
+ if ((double)MotionZUpDown.Value != tMotionZ)
+ mAssistant.setMotionZ((double)MotionZUpDown.Value);
+ }
+
+ private void numericUpDown1_ValueChanged(object sender, EventArgs e)
+ {
+ UpdateView();
+ }
+
+ private void numericUpDownP2_ValueChanged(object sender, EventArgs e)
+ {
+ UpdateView();
+ }
+
+ private void numericUpDownP4_ValueChanged(object sender, EventArgs e)
+ {
+ UpdateView();
+ }
+
+ private void numericUpDownP3_ValueChanged(object sender, EventArgs e)
+ {
+ UpdateView();
+ }
+
+ }
+}
diff --git a/HalconTools/frmCalibration.resx b/HalconTools/frmCalibration.resx
new file mode 100644
index 0000000..fb33be2
--- /dev/null
+++ b/HalconTools/frmCalibration.resx
@@ -0,0 +1,132 @@
+<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="openFileDialogImg.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>415, 17</value>
+ </metadata>
+ <metadata name="openFileDialogDescr.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>579, 17</value>
+ </metadata>
+ <metadata name="openFileDialogImportParams.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <metadata name="saveParamFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>241, 17</value>
+ </metadata>
+</root>
\ No newline at end of file
diff --git a/HalconTools/frmContourAssistant.Designer.cs b/HalconTools/frmContourAssistant.Designer.cs
new file mode 100644
index 0000000..b9065c1
--- /dev/null
+++ b/HalconTools/frmContourAssistant.Designer.cs
@@ -0,0 +1,528 @@
+锘縩amespace HalconTools
+{
+ partial class frmContourAssistant
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.viewport1 = new HalconDotNet.HWindowControl();
+ this.viewport2 = new HalconDotNet.HWindowControl();
+ this.viewport4 = new HalconDotNet.HWindowControl();
+ this.label1 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.btnResetAll = new System.Windows.Forms.Button();
+ this.btnLoadImage = new System.Windows.Forms.Button();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.btnFitZoom = new System.Windows.Forms.Button();
+ this.RBZoom = new System.Windows.Forms.RadioButton();
+ this.RBmove = new System.Windows.Forms.RadioButton();
+ this.RBnone = new System.Windows.Forms.RadioButton();
+ this.viewport3 = new HalconDotNet.HWindowControl();
+ this.label4 = new System.Windows.Forms.Label();
+ this.groupBox3 = new System.Windows.Forms.GroupBox();
+ this.labArea = new System.Windows.Forms.Label();
+ this.btnSelect = new System.Windows.Forms.Button();
+ this.btnSelectShape = new System.Windows.Forms.Button();
+ this.btnThreshold = new System.Windows.Forms.Button();
+ this.nUDAreaMax = new System.Windows.Forms.NumericUpDown();
+ this.nUDAreaMin = new System.Windows.Forms.NumericUpDown();
+ this.nUDThresholdMax = new System.Windows.Forms.NumericUpDown();
+ this.nUDThresholdMin = new System.Windows.Forms.NumericUpDown();
+ this.label9 = new System.Windows.Forms.Label();
+ this.cmbSelectObj = new System.Windows.Forms.ComboBox();
+ this.label8 = new System.Windows.Forms.Label();
+ this.label7 = new System.Windows.Forms.Label();
+ this.label6 = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.btnRun = new System.Windows.Forms.Button();
+ this.btnParaSave = new System.Windows.Forms.Button();
+ this.groupBox1.SuspendLayout();
+ this.groupBox2.SuspendLayout();
+ this.groupBox3.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nUDAreaMax)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nUDAreaMin)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nUDThresholdMax)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nUDThresholdMin)).BeginInit();
+ this.SuspendLayout();
+ //
+ // viewport1
+ //
+ this.viewport1.BackColor = System.Drawing.Color.Black;
+ this.viewport1.BorderColor = System.Drawing.Color.Black;
+ this.viewport1.ImagePart = new System.Drawing.Rectangle(0, 0, 640, 480);
+ this.viewport1.Location = new System.Drawing.Point(12, 24);
+ this.viewport1.Name = "viewport1";
+ this.viewport1.Size = new System.Drawing.Size(320, 240);
+ this.viewport1.TabIndex = 0;
+ this.viewport1.WindowSize = new System.Drawing.Size(320, 240);
+ //
+ // viewport2
+ //
+ this.viewport2.BackColor = System.Drawing.Color.Black;
+ this.viewport2.BorderColor = System.Drawing.Color.Black;
+ this.viewport2.ImagePart = new System.Drawing.Rectangle(0, 0, 640, 480);
+ this.viewport2.Location = new System.Drawing.Point(338, 24);
+ this.viewport2.Name = "viewport2";
+ this.viewport2.Size = new System.Drawing.Size(320, 240);
+ this.viewport2.TabIndex = 1;
+ this.viewport2.WindowSize = new System.Drawing.Size(320, 240);
+ //
+ // viewport4
+ //
+ this.viewport4.BackColor = System.Drawing.Color.Black;
+ this.viewport4.BorderColor = System.Drawing.Color.Black;
+ this.viewport4.ImagePart = new System.Drawing.Rectangle(0, 0, 640, 480);
+ this.viewport4.Location = new System.Drawing.Point(338, 282);
+ this.viewport4.Name = "viewport4";
+ this.viewport4.Size = new System.Drawing.Size(320, 240);
+ this.viewport4.TabIndex = 2;
+ this.viewport4.WindowSize = new System.Drawing.Size(320, 240);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(12, 9);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(29, 12);
+ this.label1.TabIndex = 3;
+ this.label1.Text = "鍘熷浘";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(336, 9);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(41, 12);
+ this.label2.TabIndex = 4;
+ this.label2.Text = "浜屽�煎寲";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(336, 267);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(41, 12);
+ this.label3.TabIndex = 5;
+ this.label3.Text = "閫夋嫨鍚�";
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.btnResetAll);
+ this.groupBox1.Controls.Add(this.btnLoadImage);
+ this.groupBox1.Location = new System.Drawing.Point(672, 12);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(307, 88);
+ this.groupBox1.TabIndex = 6;
+ this.groupBox1.TabStop = false;
+ //
+ // btnResetAll
+ //
+ this.btnResetAll.Location = new System.Drawing.Point(183, 20);
+ this.btnResetAll.Name = "btnResetAll";
+ this.btnResetAll.Size = new System.Drawing.Size(92, 49);
+ this.btnResetAll.TabIndex = 1;
+ this.btnResetAll.Text = "鎵�鏈夎繕鍘�";
+ this.btnResetAll.UseVisualStyleBackColor = true;
+ this.btnResetAll.Click += new System.EventHandler(this.btnResetAll_Click);
+ //
+ // btnLoadImage
+ //
+ this.btnLoadImage.Location = new System.Drawing.Point(21, 20);
+ this.btnLoadImage.Name = "btnLoadImage";
+ this.btnLoadImage.Size = new System.Drawing.Size(94, 49);
+ this.btnLoadImage.TabIndex = 0;
+ this.btnLoadImage.Text = "鍥剧墖杞藉叆";
+ this.btnLoadImage.UseVisualStyleBackColor = true;
+ this.btnLoadImage.Click += new System.EventHandler(this.btnLoadImage_Click);
+ //
+ // groupBox2
+ //
+ this.groupBox2.Controls.Add(this.btnFitZoom);
+ this.groupBox2.Controls.Add(this.RBZoom);
+ this.groupBox2.Controls.Add(this.RBmove);
+ this.groupBox2.Controls.Add(this.RBnone);
+ this.groupBox2.Location = new System.Drawing.Point(672, 106);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(307, 78);
+ this.groupBox2.TabIndex = 7;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "鍥剧墖鎿嶄綔";
+ //
+ // btnFitZoom
+ //
+ this.btnFitZoom.Location = new System.Drawing.Point(206, 28);
+ this.btnFitZoom.Name = "btnFitZoom";
+ this.btnFitZoom.Size = new System.Drawing.Size(75, 31);
+ this.btnFitZoom.TabIndex = 3;
+ this.btnFitZoom.Text = "閫傚悎绐椾綋";
+ this.btnFitZoom.UseVisualStyleBackColor = true;
+ this.btnFitZoom.Click += new System.EventHandler(this.btnFitZoom_Click);
+ //
+ // RBZoom
+ //
+ this.RBZoom.AutoSize = true;
+ this.RBZoom.Location = new System.Drawing.Point(140, 35);
+ this.RBZoom.Name = "RBZoom";
+ this.RBZoom.Size = new System.Drawing.Size(47, 16);
+ this.RBZoom.TabIndex = 2;
+ this.RBZoom.Text = "Zoom";
+ this.RBZoom.UseVisualStyleBackColor = true;
+ this.RBZoom.CheckedChanged += new System.EventHandler(this.RBZoom_CheckedChanged);
+ //
+ // RBmove
+ //
+ this.RBmove.AutoSize = true;
+ this.RBmove.Location = new System.Drawing.Point(75, 35);
+ this.RBmove.Name = "RBmove";
+ this.RBmove.Size = new System.Drawing.Size(47, 16);
+ this.RBmove.TabIndex = 1;
+ this.RBmove.Text = "Move";
+ this.RBmove.UseVisualStyleBackColor = true;
+ this.RBmove.CheckedChanged += new System.EventHandler(this.RBmove_CheckedChanged);
+ //
+ // RBnone
+ //
+ this.RBnone.AutoSize = true;
+ this.RBnone.Checked = true;
+ this.RBnone.Location = new System.Drawing.Point(6, 35);
+ this.RBnone.Name = "RBnone";
+ this.RBnone.Size = new System.Drawing.Size(47, 16);
+ this.RBnone.TabIndex = 0;
+ this.RBnone.TabStop = true;
+ this.RBnone.Text = "None";
+ this.RBnone.UseVisualStyleBackColor = true;
+ this.RBnone.CheckedChanged += new System.EventHandler(this.RBnone_CheckedChanged);
+ //
+ // viewport3
+ //
+ this.viewport3.BackColor = System.Drawing.Color.Black;
+ this.viewport3.BorderColor = System.Drawing.Color.Black;
+ this.viewport3.ImagePart = new System.Drawing.Rectangle(0, 0, 640, 480);
+ this.viewport3.Location = new System.Drawing.Point(12, 282);
+ this.viewport3.Name = "viewport3";
+ this.viewport3.Size = new System.Drawing.Size(320, 240);
+ this.viewport3.TabIndex = 8;
+ this.viewport3.WindowSize = new System.Drawing.Size(320, 240);
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(12, 267);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(41, 12);
+ this.label4.TabIndex = 9;
+ this.label4.Text = "鍘绘潅鍚�";
+ //
+ // groupBox3
+ //
+ this.groupBox3.Controls.Add(this.labArea);
+ this.groupBox3.Controls.Add(this.btnSelect);
+ this.groupBox3.Controls.Add(this.btnSelectShape);
+ this.groupBox3.Controls.Add(this.btnThreshold);
+ this.groupBox3.Controls.Add(this.nUDAreaMax);
+ this.groupBox3.Controls.Add(this.nUDAreaMin);
+ this.groupBox3.Controls.Add(this.nUDThresholdMax);
+ this.groupBox3.Controls.Add(this.nUDThresholdMin);
+ this.groupBox3.Controls.Add(this.label9);
+ this.groupBox3.Controls.Add(this.cmbSelectObj);
+ this.groupBox3.Controls.Add(this.label8);
+ this.groupBox3.Controls.Add(this.label7);
+ this.groupBox3.Controls.Add(this.label6);
+ this.groupBox3.Controls.Add(this.label5);
+ this.groupBox3.Location = new System.Drawing.Point(672, 190);
+ this.groupBox3.Name = "groupBox3";
+ this.groupBox3.Size = new System.Drawing.Size(307, 171);
+ this.groupBox3.TabIndex = 10;
+ this.groupBox3.TabStop = false;
+ this.groupBox3.Text = "鍙傛暟";
+ //
+ // labArea
+ //
+ this.labArea.AutoSize = true;
+ this.labArea.Location = new System.Drawing.Point(142, 144);
+ this.labArea.Name = "labArea";
+ this.labArea.Size = new System.Drawing.Size(29, 12);
+ this.labArea.TabIndex = 13;
+ this.labArea.Text = "闈㈢Н";
+ //
+ // btnSelect
+ //
+ this.btnSelect.Location = new System.Drawing.Point(225, 139);
+ this.btnSelect.Name = "btnSelect";
+ this.btnSelect.Size = new System.Drawing.Size(66, 23);
+ this.btnSelect.TabIndex = 12;
+ this.btnSelect.Text = "閫夋嫨";
+ this.btnSelect.UseVisualStyleBackColor = true;
+ this.btnSelect.Click += new System.EventHandler(this.btnSelect_Click);
+ //
+ // btnSelectShape
+ //
+ this.btnSelectShape.Location = new System.Drawing.Point(225, 101);
+ this.btnSelectShape.Name = "btnSelectShape";
+ this.btnSelectShape.Size = new System.Drawing.Size(66, 23);
+ this.btnSelectShape.TabIndex = 11;
+ this.btnSelectShape.Text = "鍘绘潅";
+ this.btnSelectShape.UseVisualStyleBackColor = true;
+ this.btnSelectShape.Click += new System.EventHandler(this.btnSelectShape_Click);
+ //
+ // btnThreshold
+ //
+ this.btnThreshold.Location = new System.Drawing.Point(225, 50);
+ this.btnThreshold.Name = "btnThreshold";
+ this.btnThreshold.Size = new System.Drawing.Size(66, 23);
+ this.btnThreshold.TabIndex = 10;
+ this.btnThreshold.Text = "浜屽�煎寲";
+ this.btnThreshold.UseVisualStyleBackColor = true;
+ this.btnThreshold.Click += new System.EventHandler(this.btnThreshold_Click);
+ //
+ // nUDAreaMax
+ //
+ this.nUDAreaMax.Location = new System.Drawing.Point(124, 104);
+ this.nUDAreaMax.Maximum = new decimal(new int[] {
+ 10000000,
+ 0,
+ 0,
+ 0});
+ this.nUDAreaMax.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nUDAreaMax.Name = "nUDAreaMax";
+ this.nUDAreaMax.Size = new System.Drawing.Size(76, 21);
+ this.nUDAreaMax.TabIndex = 9;
+ this.nUDAreaMax.Value = new decimal(new int[] {
+ 9999999,
+ 0,
+ 0,
+ 0});
+ //
+ // nUDAreaMin
+ //
+ this.nUDAreaMin.Location = new System.Drawing.Point(14, 104);
+ this.nUDAreaMin.Maximum = new decimal(new int[] {
+ 10000000,
+ 0,
+ 0,
+ 0});
+ this.nUDAreaMin.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nUDAreaMin.Name = "nUDAreaMin";
+ this.nUDAreaMin.Size = new System.Drawing.Size(75, 21);
+ this.nUDAreaMin.TabIndex = 8;
+ this.nUDAreaMin.Value = new decimal(new int[] {
+ 1000,
+ 0,
+ 0,
+ 0});
+ //
+ // nUDThresholdMax
+ //
+ this.nUDThresholdMax.Location = new System.Drawing.Point(124, 53);
+ this.nUDThresholdMax.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.nUDThresholdMax.Name = "nUDThresholdMax";
+ this.nUDThresholdMax.Size = new System.Drawing.Size(76, 21);
+ this.nUDThresholdMax.TabIndex = 7;
+ this.nUDThresholdMax.Value = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ //
+ // nUDThresholdMin
+ //
+ this.nUDThresholdMin.Location = new System.Drawing.Point(14, 53);
+ this.nUDThresholdMin.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.nUDThresholdMin.Name = "nUDThresholdMin";
+ this.nUDThresholdMin.Size = new System.Drawing.Size(75, 21);
+ this.nUDThresholdMin.TabIndex = 6;
+ this.nUDThresholdMin.Value = new decimal(new int[] {
+ 128,
+ 0,
+ 0,
+ 0});
+ //
+ // label9
+ //
+ this.label9.AutoSize = true;
+ this.label9.Location = new System.Drawing.Point(12, 144);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(53, 12);
+ this.label9.TabIndex = 5;
+ this.label9.Text = "閫夋嫨鐗╀綋";
+ //
+ // cmbSelectObj
+ //
+ this.cmbSelectObj.FormattingEnabled = true;
+ this.cmbSelectObj.Items.AddRange(new object[] {
+ "1"});
+ this.cmbSelectObj.Location = new System.Drawing.Point(71, 141);
+ this.cmbSelectObj.Name = "cmbSelectObj";
+ this.cmbSelectObj.Size = new System.Drawing.Size(65, 20);
+ this.cmbSelectObj.TabIndex = 4;
+ this.cmbSelectObj.SelectedIndexChanged += new System.EventHandler(this.cmbSelectObj_SelectedIndexChanged);
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.Location = new System.Drawing.Point(123, 84);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(89, 12);
+ this.label8.TabIndex = 3;
+ this.label8.Text = "鍘绘潅闈㈢Н鏈�澶у��";
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.Location = new System.Drawing.Point(12, 84);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(89, 12);
+ this.label7.TabIndex = 2;
+ this.label7.Text = "鍘绘潅闈㈢Н鏈�灏忓��";
+ //
+ // label6
+ //
+ this.label6.AutoSize = true;
+ this.label6.Location = new System.Drawing.Point(123, 31);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(77, 12);
+ this.label6.TabIndex = 1;
+ this.label6.Text = "浜屽�煎寲鏈�澶у��";
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(12, 31);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(77, 12);
+ this.label5.TabIndex = 0;
+ this.label5.Text = "浜屽�煎寲鏈�灏忓��";
+ //
+ // btnRun
+ //
+ this.btnRun.Location = new System.Drawing.Point(672, 386);
+ this.btnRun.Name = "btnRun";
+ this.btnRun.Size = new System.Drawing.Size(115, 56);
+ this.btnRun.TabIndex = 11;
+ this.btnRun.Text = "杩愯";
+ this.btnRun.UseVisualStyleBackColor = true;
+ this.btnRun.Click += new System.EventHandler(this.btnRun_Click);
+ //
+ // btnParaSave
+ //
+ this.btnParaSave.Location = new System.Drawing.Point(812, 386);
+ this.btnParaSave.Name = "btnParaSave";
+ this.btnParaSave.Size = new System.Drawing.Size(118, 56);
+ this.btnParaSave.TabIndex = 12;
+ this.btnParaSave.Text = "鍙傛暟淇濆瓨";
+ this.btnParaSave.UseVisualStyleBackColor = true;
+ this.btnParaSave.Click += new System.EventHandler(this.btnParaSave_Click);
+ //
+ // frmContourAssistant
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(991, 532);
+ this.Controls.Add(this.btnParaSave);
+ this.Controls.Add(this.btnRun);
+ this.Controls.Add(this.groupBox3);
+ this.Controls.Add(this.label4);
+ this.Controls.Add(this.viewport3);
+ this.Controls.Add(this.groupBox2);
+ this.Controls.Add(this.groupBox1);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.viewport4);
+ this.Controls.Add(this.viewport2);
+ this.Controls.Add(this.viewport1);
+ this.Name = "frmContourAssistant";
+ this.Text = "frmContourAssistant";
+ this.Load += new System.EventHandler(this.frmContourAssistant_Load);
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox2.ResumeLayout(false);
+ this.groupBox2.PerformLayout();
+ this.groupBox3.ResumeLayout(false);
+ this.groupBox3.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nUDAreaMax)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nUDAreaMin)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nUDThresholdMax)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nUDThresholdMin)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private HalconDotNet.HWindowControl viewport1;
+ private HalconDotNet.HWindowControl viewport2;
+ private HalconDotNet.HWindowControl viewport4;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.Button btnLoadImage;
+ private System.Windows.Forms.Button btnResetAll;
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.RadioButton RBZoom;
+ private System.Windows.Forms.RadioButton RBmove;
+ private System.Windows.Forms.RadioButton RBnone;
+ private System.Windows.Forms.Button btnFitZoom;
+ private HalconDotNet.HWindowControl viewport3;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.GroupBox groupBox3;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.ComboBox cmbSelectObj;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.NumericUpDown nUDAreaMin;
+ private System.Windows.Forms.NumericUpDown nUDThresholdMax;
+ private System.Windows.Forms.NumericUpDown nUDThresholdMin;
+ private System.Windows.Forms.NumericUpDown nUDAreaMax;
+ private System.Windows.Forms.Button btnSelectShape;
+ private System.Windows.Forms.Button btnThreshold;
+ private System.Windows.Forms.Button btnSelect;
+ private System.Windows.Forms.Button btnRun;
+ private System.Windows.Forms.Button btnParaSave;
+ private System.Windows.Forms.Label labArea;
+ }
+}
\ No newline at end of file
diff --git a/HalconTools/frmContourAssistant.cs b/HalconTools/frmContourAssistant.cs
new file mode 100644
index 0000000..2190aff
--- /dev/null
+++ b/HalconTools/frmContourAssistant.cs
@@ -0,0 +1,240 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.IO;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public partial class frmContourAssistant : Form
+ {
+ public frmContourAssistant()
+ {
+ InitializeComponent();
+ }
+
+ public HImage MainImage1;
+ public HImage MainImage2;
+ public HImage MainImage3;
+ public HImage MainImage4;
+ public ContourAssistant mContourAssistant1;
+ public ContourAssistant mContourAssistant2;
+ public ContourAssistant mContourAssistant3;
+ public ContourAssistant mContourAssistant4;
+ public HObject ThresholdObj;
+ public HObject ConnectRegion;
+ public HObject ObjsSelect;
+ public HObject SelectedObj;
+
+ //鍙傛暟
+ public ContourParam para = new ContourParam();
+
+ public void init()
+ {
+ mContourAssistant1 = new ContourAssistant(viewport1);
+ mContourAssistant2 = new ContourAssistant(viewport2);
+ mContourAssistant3 = new ContourAssistant(viewport3);
+ mContourAssistant4 = new ContourAssistant(viewport4);
+
+ cmbSelectObj.SelectedIndex = 0;
+ }
+
+ private void RBnone_CheckedChanged(object sender, EventArgs e)
+ {
+ mContourAssistant1.viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
+ mContourAssistant2.viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
+ mContourAssistant3.viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
+ mContourAssistant4.viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
+ }
+
+ private void RBmove_CheckedChanged(object sender, EventArgs e)
+ {
+ mContourAssistant1.viewController.setViewState(HWndCtrl.MODE_VIEW_MOVE);
+ mContourAssistant2.viewController.setViewState(HWndCtrl.MODE_VIEW_MOVE);
+ mContourAssistant3.viewController.setViewState(HWndCtrl.MODE_VIEW_MOVE);
+ mContourAssistant4.viewController.setViewState(HWndCtrl.MODE_VIEW_MOVE);
+ }
+
+ private void RBZoom_CheckedChanged(object sender, EventArgs e)
+ {
+ mContourAssistant1.viewController.setViewState(HWndCtrl.MODE_VIEW_ZOOM);
+ mContourAssistant2.viewController.setViewState(HWndCtrl.MODE_VIEW_ZOOM);
+ mContourAssistant3.viewController.setViewState(HWndCtrl.MODE_VIEW_ZOOM);
+ mContourAssistant4.viewController.setViewState(HWndCtrl.MODE_VIEW_ZOOM);
+ }
+
+ private void btnFitZoom_Click(object sender, EventArgs e)
+ {
+ mContourAssistant1.viewController.resetWindow();
+ mContourAssistant1.viewController.repaint();
+ mContourAssistant2.viewController.resetWindow();
+ mContourAssistant2.viewController.repaint();
+ mContourAssistant3.viewController.resetWindow();
+ mContourAssistant3.viewController.repaint();
+ mContourAssistant4.viewController.resetWindow();
+ mContourAssistant4.viewController.repaint();
+ }
+
+ private void btnResetAll_Click(object sender, EventArgs e)
+ {
+ mContourAssistant1.viewController.resetAll();
+ mContourAssistant1.viewController.repaint();
+ mContourAssistant2.viewController.resetAll();
+ mContourAssistant2.viewController.repaint();
+ mContourAssistant3.viewController.resetAll();
+ mContourAssistant3.viewController.repaint();
+ mContourAssistant4.viewController.resetAll();
+ mContourAssistant4.viewController.repaint();
+ }
+
+ private void frmContourAssistant_Load(object sender, EventArgs e)
+ {
+ init();
+ }
+
+ private void btnLoadImage_Click(object sender, EventArgs e)
+ {
+ OpenFileDialog imagePath = new OpenFileDialog();
+ imagePath.Filter = "*.jpg,*.jpeg,*.bmp,*.gif,*.ico,*.png,*.tif,*.wmf|*.jpg;*.jpeg;*.bmp;*.gif;*.ico;*.png;*.tif;*.wmf";
+
+ if (imagePath.ShowDialog() == DialogResult.OK)
+ {
+ if (!mContourAssistant1.SetImage(imagePath.FileName))
+ {
+ return;
+ }
+
+ MainImage1 = mContourAssistant1.GetImage();
+ mContourAssistant1.UpdateImage();
+ }
+ }
+
+ private void btnThreshold_Click(object sender, EventArgs e)
+ {
+ HOperatorSet.GenEmptyObj(out ThresholdObj);
+ ThresholdObj.Dispose();
+ HOperatorSet.Threshold(MainImage1, out ThresholdObj,
+ Convert.ToInt32(nUDThresholdMin.Value), Convert.ToInt32(nUDThresholdMax.Value));
+
+ mContourAssistant2.SetImage(MainImage1);
+ MainImage2 = mContourAssistant2.GetImage();
+ mContourAssistant2.UpdateImage();
+
+ mContourAssistant2.UpdateObj(ThresholdObj);
+ }
+
+ private void btnSelectShape_Click(object sender, EventArgs e)
+ {
+ //鍏堝皢鐗╀綋鍒嗗紑
+ HOperatorSet.GenEmptyObj(out ConnectRegion);
+ ConnectRegion.Dispose();
+ HOperatorSet.Connection(ThresholdObj, out ConnectRegion);
+ //閫夋嫨鐗╀綋
+ HOperatorSet.GenEmptyObj(out ObjsSelect);
+ ObjsSelect.Dispose();
+ HOperatorSet.SelectShape(ConnectRegion, out ObjsSelect, "area", "and",
+ Convert.ToInt32(nUDAreaMin.Value), Convert.ToInt32(nUDAreaMax.Value));
+
+ mContourAssistant3.SetImage(MainImage1);
+ MainImage3 = mContourAssistant3.GetImage();
+ mContourAssistant3.UpdateImage();
+
+ mContourAssistant3.UpdateObj(ObjsSelect, "green");
+
+ //灏嗗緱鍒扮殑缁撴灉杞藉叆鍒癱omboBox涓�
+ if (ObjsSelect.CountObj() == 0) return;
+ cmbSelectObj.Items.Clear();
+ for (int i = 0; i < ObjsSelect.CountObj(); i++)
+ {
+ cmbSelectObj.Items.Add(i + 1);
+ }
+ cmbSelectObj.SelectedIndex = 0;
+ }
+
+ private void btnSelect_Click(object sender, EventArgs e)
+ {
+ HOperatorSet.GenEmptyObj(out SelectedObj);
+ SelectedObj.Dispose();
+ HOperatorSet.SelectObj(ObjsSelect, out SelectedObj, cmbSelectObj.SelectedIndex + 1);
+
+ mContourAssistant4.SetImage(MainImage1);
+ MainImage4 = mContourAssistant4.GetImage();
+ mContourAssistant4.UpdateImage();
+
+ mContourAssistant4.UpdateObj(SelectedObj, "red");
+
+ HTuple area = null, row = null, col = null;
+ HOperatorSet.AreaCenter(SelectedObj, out area, out row, out col);
+ labArea.Text = area.ToString();
+ }
+
+ private void btnRun_Click(object sender, EventArgs e)
+ {
+ para = new ContourParam(Convert.ToInt32(nUDThresholdMin.Value), Convert.ToInt32(nUDThresholdMax.Value),
+ Convert.ToInt32(nUDAreaMin.Value), Convert.ToInt32(nUDAreaMax.Value),
+ cmbSelectObj.SelectedIndex + 1);
+
+ mContourAssistant1.SetPara(para);
+ if (mContourAssistant1.mImage == null) return;
+ mContourAssistant1.Run();
+
+ //绐楀彛2鏄剧ず
+ mContourAssistant2.SetImage(MainImage1);
+ MainImage2 = mContourAssistant2.GetImage();
+ mContourAssistant2.UpdateImage();
+
+ mContourAssistant2.UpdateObj(mContourAssistant1.mThresholdObj);
+ ThresholdObj = mContourAssistant1.mThresholdObj;
+
+ //绐楀彛3鏄剧ず
+ mContourAssistant3.SetImage(MainImage1);
+ MainImage3 = mContourAssistant3.GetImage();
+ mContourAssistant3.UpdateImage();
+
+ mContourAssistant3.UpdateObj(mContourAssistant1.mSelectObj, "green");
+ ObjsSelect = mContourAssistant1.mSelectObj;
+
+ if (mContourAssistant1.mSelectObj.CountObj() == 0) return;
+ cmbSelectObj.Items.Clear();
+ for (int i = 0; i < mContourAssistant1.mSelectObj.CountObj(); i++)
+ {
+ cmbSelectObj.Items.Add(i + 1);
+ }
+
+ //绐楀彛4鏄剧ず
+ mContourAssistant4.SetImage(MainImage1);
+ MainImage4 = mContourAssistant4.GetImage();
+ mContourAssistant4.UpdateImage();
+
+ mContourAssistant4.UpdateObj(mContourAssistant1.mObject, "red");
+ SelectedObj = mContourAssistant1.mObject;
+ }
+
+ private void btnParaSave_Click(object sender, EventArgs e)
+ {
+ para = new ContourParam(Convert.ToInt32(nUDThresholdMin.Value), Convert.ToInt32(nUDThresholdMax.Value),
+ Convert.ToInt32(nUDAreaMin.Value), Convert.ToInt32(nUDAreaMax.Value),
+ cmbSelectObj.SelectedIndex + 1);
+
+ string path = System.Windows.Forms.Application.StartupPath + "\\ContourConfige";
+ if (!Directory.Exists(path))
+ {
+ Directory.CreateDirectory(path);
+ }
+ path += "\\ContourConfige.xml";
+
+ SerializeFileTool<ContourParam> sft = new SerializeFileTool<ContourParam>();
+ sft.SetConfig(path, para);
+ }
+
+ private void cmbSelectObj_SelectedIndexChanged(object sender, EventArgs e)
+ {
+
+ }
+ }
+}
diff --git a/HalconTools/frmContourAssistant.resx b/HalconTools/frmContourAssistant.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/HalconTools/frmContourAssistant.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
\ No newline at end of file
diff --git a/HalconTools/frmFitCircleAndLine.Designer.cs b/HalconTools/frmFitCircleAndLine.Designer.cs
new file mode 100644
index 0000000..2693f04
--- /dev/null
+++ b/HalconTools/frmFitCircleAndLine.Designer.cs
@@ -0,0 +1,1254 @@
+锘縩amespace HalconTools
+{
+ partial class frmFitCircleAndLine
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.plnBottom = new System.Windows.Forms.Panel();
+ this.pnlBtMiddle = new System.Windows.Forms.Panel();
+ this.gbxOption = new System.Windows.Forms.GroupBox();
+ this.btnFitZoom = new System.Windows.Forms.Button();
+ this.RbZoom = new System.Windows.Forms.RadioButton();
+ this.RbMove = new System.Windows.Forms.RadioButton();
+ this.RbNone = new System.Windows.Forms.RadioButton();
+ this.pnlBtRight = new System.Windows.Forms.Panel();
+ this.gbxAddType = new System.Windows.Forms.GroupBox();
+ this.btnCircleRoi = new System.Windows.Forms.Button();
+ this.btnLineRoi = new System.Windows.Forms.Button();
+ this.pnlBtLeft = new System.Windows.Forms.Panel();
+ this.gbxImage = new System.Windows.Forms.GroupBox();
+ this.btnFrmMeasure = new System.Windows.Forms.Button();
+ this.btnResetView = new System.Windows.Forms.Button();
+ this.btnLoadImage = new System.Windows.Forms.Button();
+ this.plnLeft = new System.Windows.Forms.Panel();
+ this.tabControl1 = new System.Windows.Forms.TabControl();
+ this.tabPageLine = new System.Windows.Forms.TabPage();
+ this.btnLoadConfige_Line = new System.Windows.Forms.Button();
+ this.gbxFitLinePara = new System.Windows.Forms.GroupBox();
+ this.btnParaAdd = new System.Windows.Forms.Button();
+ this.labColumnEnd = new System.Windows.Forms.Label();
+ this.labColumnEndSet = new System.Windows.Forms.Label();
+ this.labRowEnd = new System.Windows.Forms.Label();
+ this.labRowEndSet = new System.Windows.Forms.Label();
+ this.labColumnBegin = new System.Windows.Forms.Label();
+ this.labColumnBeginSet = new System.Windows.Forms.Label();
+ this.labRowBegin = new System.Windows.Forms.Label();
+ this.labRowBeginSet = new System.Windows.Forms.Label();
+ this.labNumber = new System.Windows.Forms.Label();
+ this.labNumberSet = new System.Windows.Forms.Label();
+ this.btnRoiHeightReset_Line = new System.Windows.Forms.Button();
+ this.tBroiHeight = new System.Windows.Forms.TrackBar();
+ this.numUDRoiHeight = new System.Windows.Forms.NumericUpDown();
+ this.labPosition = new System.Windows.Forms.Label();
+ this.labPositionSet = new System.Windows.Forms.Label();
+ this.labTransition = new System.Windows.Forms.Label();
+ this.labTransitionSet = new System.Windows.Forms.Label();
+ this.labInterpolation = new System.Windows.Forms.Label();
+ this.labInterpolationSet = new System.Windows.Forms.Label();
+ this.labROIHeight = new System.Windows.Forms.Label();
+ this.labROIWidth = new System.Windows.Forms.Label();
+ this.labROIWidthSet = new System.Windows.Forms.Label();
+ this.labSmoothing = new System.Windows.Forms.Label();
+ this.labSmoothingSet = new System.Windows.Forms.Label();
+ this.labMinEdgeAmpl = new System.Windows.Forms.Label();
+ this.labRecognitionSet = new System.Windows.Forms.Label();
+ this.labMinEdgeAmplSet = new System.Windows.Forms.Label();
+ this.labRecognition = new System.Windows.Forms.Label();
+ this.btnFitLine = new System.Windows.Forms.Button();
+ this.tabPageCircle = new System.Windows.Forms.TabPage();
+ this.btnLoadConfige_Circle = new System.Windows.Forms.Button();
+ this.gbxFitCirclePara = new System.Windows.Forms.GroupBox();
+ this.labRadius_Circle = new System.Windows.Forms.Label();
+ this.labRadiusSet_Circle = new System.Windows.Forms.Label();
+ this.labColumn_Circle = new System.Windows.Forms.Label();
+ this.labColumnSet_Circle = new System.Windows.Forms.Label();
+ this.labRow_Circle = new System.Windows.Forms.Label();
+ this.labRowSet_Circle = new System.Windows.Forms.Label();
+ this.btnParaAdd_Circle = new System.Windows.Forms.Button();
+ this.labNumber_Circle = new System.Windows.Forms.Label();
+ this.labNumberSet_Circle = new System.Windows.Forms.Label();
+ this.btnRoiHeightReset_Circle = new System.Windows.Forms.Button();
+ this.trackBar1 = new System.Windows.Forms.TrackBar();
+ this.numUDRoiHeight_Circle = new System.Windows.Forms.NumericUpDown();
+ this.labPosition_Circle = new System.Windows.Forms.Label();
+ this.labPositionSet_Circle = new System.Windows.Forms.Label();
+ this.labTransition_Circle = new System.Windows.Forms.Label();
+ this.labTransitionSet_Circle = new System.Windows.Forms.Label();
+ this.labInterpolation_Circle = new System.Windows.Forms.Label();
+ this.labInterpolationSet_Circle = new System.Windows.Forms.Label();
+ this.labROIHeight_Circle = new System.Windows.Forms.Label();
+ this.labROIWidth_Circle = new System.Windows.Forms.Label();
+ this.labROIWidthSet_Circle = new System.Windows.Forms.Label();
+ this.labSmoothing_Circle = new System.Windows.Forms.Label();
+ this.labSmoothingSet_Circle = new System.Windows.Forms.Label();
+ this.labMinEdgeAmpl_Circle = new System.Windows.Forms.Label();
+ this.labRecognitionSet_Circle = new System.Windows.Forms.Label();
+ this.labMinEdgeAmplSet_Circle = new System.Windows.Forms.Label();
+ this.labRecognition_Circle = new System.Windows.Forms.Label();
+ this.btnFitCircle = new System.Windows.Forms.Button();
+ this.pnlMiddle = new System.Windows.Forms.Panel();
+ this.viewPort = new HalconDotNet.HWindowControl();
+ this.txtMinEdgeAmplSet = new System.Windows.Forms.TextBox();
+ this.txtSmoothingSet = new System.Windows.Forms.TextBox();
+ this.txtInterpolationSet = new System.Windows.Forms.TextBox();
+ this.txtNumberSet = new System.Windows.Forms.TextBox();
+ this.txtPositionSet = new System.Windows.Forms.TextBox();
+ this.txtTransitionSet = new System.Windows.Forms.TextBox();
+ this.txtROIWidthSet = new System.Windows.Forms.TextBox();
+ this.plnBottom.SuspendLayout();
+ this.pnlBtMiddle.SuspendLayout();
+ this.gbxOption.SuspendLayout();
+ this.pnlBtRight.SuspendLayout();
+ this.gbxAddType.SuspendLayout();
+ this.pnlBtLeft.SuspendLayout();
+ this.gbxImage.SuspendLayout();
+ this.plnLeft.SuspendLayout();
+ this.tabControl1.SuspendLayout();
+ this.tabPageLine.SuspendLayout();
+ this.gbxFitLinePara.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.tBroiHeight)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.numUDRoiHeight)).BeginInit();
+ this.tabPageCircle.SuspendLayout();
+ this.gbxFitCirclePara.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.numUDRoiHeight_Circle)).BeginInit();
+ this.pnlMiddle.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // plnBottom
+ //
+ this.plnBottom.Controls.Add(this.pnlBtMiddle);
+ this.plnBottom.Controls.Add(this.pnlBtRight);
+ this.plnBottom.Controls.Add(this.pnlBtLeft);
+ this.plnBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.plnBottom.Location = new System.Drawing.Point(0, 622);
+ this.plnBottom.Name = "plnBottom";
+ this.plnBottom.Size = new System.Drawing.Size(1183, 92);
+ this.plnBottom.TabIndex = 2;
+ //
+ // pnlBtMiddle
+ //
+ this.pnlBtMiddle.Controls.Add(this.gbxOption);
+ this.pnlBtMiddle.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.pnlBtMiddle.Location = new System.Drawing.Point(361, 0);
+ this.pnlBtMiddle.Name = "pnlBtMiddle";
+ this.pnlBtMiddle.Size = new System.Drawing.Size(462, 92);
+ this.pnlBtMiddle.TabIndex = 2;
+ //
+ // gbxOption
+ //
+ this.gbxOption.Controls.Add(this.btnFitZoom);
+ this.gbxOption.Controls.Add(this.RbZoom);
+ this.gbxOption.Controls.Add(this.RbMove);
+ this.gbxOption.Controls.Add(this.RbNone);
+ this.gbxOption.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.gbxOption.Location = new System.Drawing.Point(0, 0);
+ this.gbxOption.Name = "gbxOption";
+ this.gbxOption.Size = new System.Drawing.Size(462, 92);
+ this.gbxOption.TabIndex = 16;
+ this.gbxOption.TabStop = false;
+ this.gbxOption.Text = "groupBox3";
+ //
+ // btnFitZoom
+ //
+ this.btnFitZoom.Location = new System.Drawing.Point(298, 20);
+ this.btnFitZoom.Name = "btnFitZoom";
+ this.btnFitZoom.Size = new System.Drawing.Size(117, 65);
+ this.btnFitZoom.TabIndex = 15;
+ this.btnFitZoom.Text = "Fit Zoom";
+ this.btnFitZoom.Click += new System.EventHandler(this.btnFitZoom_Click);
+ //
+ // RbZoom
+ //
+ this.RbZoom.Location = new System.Drawing.Point(179, 44);
+ this.RbZoom.Name = "RbZoom";
+ this.RbZoom.Size = new System.Drawing.Size(68, 18);
+ this.RbZoom.TabIndex = 13;
+ this.RbZoom.Text = "zoom";
+ this.RbZoom.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.RbZoom.CheckedChanged += new System.EventHandler(this.RbZoom_CheckedChanged);
+ //
+ // RbMove
+ //
+ this.RbMove.Location = new System.Drawing.Point(106, 44);
+ this.RbMove.Name = "RbMove";
+ this.RbMove.Size = new System.Drawing.Size(67, 18);
+ this.RbMove.TabIndex = 12;
+ this.RbMove.Text = "move";
+ this.RbMove.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.RbMove.CheckedChanged += new System.EventHandler(this.RbMove_CheckedChanged);
+ //
+ // RbNone
+ //
+ this.RbNone.Checked = true;
+ this.RbNone.Location = new System.Drawing.Point(33, 44);
+ this.RbNone.Name = "RbNone";
+ this.RbNone.Size = new System.Drawing.Size(67, 18);
+ this.RbNone.TabIndex = 11;
+ this.RbNone.TabStop = true;
+ this.RbNone.Text = "none";
+ this.RbNone.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.RbNone.CheckedChanged += new System.EventHandler(this.RbNone_CheckedChanged);
+ //
+ // pnlBtRight
+ //
+ this.pnlBtRight.Controls.Add(this.gbxAddType);
+ this.pnlBtRight.Dock = System.Windows.Forms.DockStyle.Right;
+ this.pnlBtRight.Location = new System.Drawing.Point(823, 0);
+ this.pnlBtRight.Name = "pnlBtRight";
+ this.pnlBtRight.Size = new System.Drawing.Size(360, 92);
+ this.pnlBtRight.TabIndex = 1;
+ //
+ // gbxAddType
+ //
+ this.gbxAddType.Controls.Add(this.btnCircleRoi);
+ this.gbxAddType.Controls.Add(this.btnLineRoi);
+ this.gbxAddType.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.gbxAddType.Location = new System.Drawing.Point(0, 0);
+ this.gbxAddType.Name = "gbxAddType";
+ this.gbxAddType.Size = new System.Drawing.Size(360, 92);
+ this.gbxAddType.TabIndex = 11;
+ this.gbxAddType.TabStop = false;
+ this.gbxAddType.Text = "groupBox2";
+ //
+ // btnCircleRoi
+ //
+ this.btnCircleRoi.Location = new System.Drawing.Point(206, 36);
+ this.btnCircleRoi.Name = "btnCircleRoi";
+ this.btnCircleRoi.Size = new System.Drawing.Size(117, 50);
+ this.btnCircleRoi.TabIndex = 11;
+ this.btnCircleRoi.Text = "Circle";
+ this.btnCircleRoi.Click += new System.EventHandler(this.btnCircleRoi_Click);
+ //
+ // btnLineRoi
+ //
+ this.btnLineRoi.Location = new System.Drawing.Point(29, 36);
+ this.btnLineRoi.Name = "btnLineRoi";
+ this.btnLineRoi.Size = new System.Drawing.Size(117, 49);
+ this.btnLineRoi.TabIndex = 10;
+ this.btnLineRoi.Text = "Line";
+ this.btnLineRoi.Click += new System.EventHandler(this.BtnLineRoi_Click);
+ //
+ // pnlBtLeft
+ //
+ this.pnlBtLeft.Controls.Add(this.gbxImage);
+ this.pnlBtLeft.Dock = System.Windows.Forms.DockStyle.Left;
+ this.pnlBtLeft.Location = new System.Drawing.Point(0, 0);
+ this.pnlBtLeft.Name = "pnlBtLeft";
+ this.pnlBtLeft.Size = new System.Drawing.Size(361, 92);
+ this.pnlBtLeft.TabIndex = 0;
+ //
+ // gbxImage
+ //
+ this.gbxImage.Controls.Add(this.btnFrmMeasure);
+ this.gbxImage.Controls.Add(this.btnResetView);
+ this.gbxImage.Controls.Add(this.btnLoadImage);
+ this.gbxImage.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.gbxImage.Location = new System.Drawing.Point(0, 0);
+ this.gbxImage.Name = "gbxImage";
+ this.gbxImage.Size = new System.Drawing.Size(361, 92);
+ this.gbxImage.TabIndex = 15;
+ this.gbxImage.TabStop = false;
+ this.gbxImage.Text = "groupBox1";
+ //
+ // btnFrmMeasure
+ //
+ this.btnFrmMeasure.Location = new System.Drawing.Point(249, 20);
+ this.btnFrmMeasure.Name = "btnFrmMeasure";
+ this.btnFrmMeasure.Size = new System.Drawing.Size(95, 60);
+ this.btnFrmMeasure.TabIndex = 15;
+ this.btnFrmMeasure.Text = "Measure Form";
+ this.btnFrmMeasure.UseVisualStyleBackColor = true;
+ this.btnFrmMeasure.Click += new System.EventHandler(this.btnFrmMeasure_Click);
+ //
+ // btnResetView
+ //
+ this.btnResetView.Location = new System.Drawing.Point(124, 20);
+ this.btnResetView.Name = "btnResetView";
+ this.btnResetView.Size = new System.Drawing.Size(89, 60);
+ this.btnResetView.TabIndex = 14;
+ this.btnResetView.Text = "Reset View";
+ this.btnResetView.Click += new System.EventHandler(this.BtnResetView_Click);
+ //
+ // btnLoadImage
+ //
+ this.btnLoadImage.Location = new System.Drawing.Point(12, 20);
+ this.btnLoadImage.Name = "btnLoadImage";
+ this.btnLoadImage.Size = new System.Drawing.Size(83, 60);
+ this.btnLoadImage.TabIndex = 0;
+ this.btnLoadImage.Text = "Load Image";
+ this.btnLoadImage.UseVisualStyleBackColor = true;
+ this.btnLoadImage.Click += new System.EventHandler(this.btnLoadImage_Click);
+ //
+ // plnLeft
+ //
+ this.plnLeft.Controls.Add(this.tabControl1);
+ this.plnLeft.Dock = System.Windows.Forms.DockStyle.Right;
+ this.plnLeft.Location = new System.Drawing.Point(823, 0);
+ this.plnLeft.Name = "plnLeft";
+ this.plnLeft.Size = new System.Drawing.Size(360, 622);
+ this.plnLeft.TabIndex = 3;
+ //
+ // tabControl1
+ //
+ this.tabControl1.Controls.Add(this.tabPageLine);
+ this.tabControl1.Controls.Add(this.tabPageCircle);
+ this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tabControl1.Location = new System.Drawing.Point(0, 0);
+ this.tabControl1.Name = "tabControl1";
+ this.tabControl1.SelectedIndex = 0;
+ this.tabControl1.Size = new System.Drawing.Size(360, 622);
+ this.tabControl1.TabIndex = 0;
+ //
+ // tabPageLine
+ //
+ this.tabPageLine.Controls.Add(this.btnLoadConfige_Line);
+ this.tabPageLine.Controls.Add(this.gbxFitLinePara);
+ this.tabPageLine.Controls.Add(this.btnFitLine);
+ this.tabPageLine.Location = new System.Drawing.Point(4, 22);
+ this.tabPageLine.Name = "tabPageLine";
+ this.tabPageLine.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPageLine.Size = new System.Drawing.Size(352, 596);
+ this.tabPageLine.TabIndex = 0;
+ this.tabPageLine.Text = "Fit Line";
+ this.tabPageLine.UseVisualStyleBackColor = true;
+ //
+ // btnLoadConfige_Line
+ //
+ this.btnLoadConfige_Line.Location = new System.Drawing.Point(202, 526);
+ this.btnLoadConfige_Line.Name = "btnLoadConfige_Line";
+ this.btnLoadConfige_Line.Size = new System.Drawing.Size(117, 55);
+ this.btnLoadConfige_Line.TabIndex = 52;
+ this.btnLoadConfige_Line.Text = "Load Confige";
+ this.btnLoadConfige_Line.UseVisualStyleBackColor = true;
+ this.btnLoadConfige_Line.Click += new System.EventHandler(this.btnLoadConfige_Line_Click);
+ //
+ // gbxFitLinePara
+ //
+ this.gbxFitLinePara.Controls.Add(this.txtROIWidthSet);
+ this.gbxFitLinePara.Controls.Add(this.txtNumberSet);
+ this.gbxFitLinePara.Controls.Add(this.txtPositionSet);
+ this.gbxFitLinePara.Controls.Add(this.txtTransitionSet);
+ this.gbxFitLinePara.Controls.Add(this.txtInterpolationSet);
+ this.gbxFitLinePara.Controls.Add(this.txtSmoothingSet);
+ this.gbxFitLinePara.Controls.Add(this.txtMinEdgeAmplSet);
+ this.gbxFitLinePara.Controls.Add(this.btnParaAdd);
+ this.gbxFitLinePara.Controls.Add(this.labColumnEnd);
+ this.gbxFitLinePara.Controls.Add(this.labColumnEndSet);
+ this.gbxFitLinePara.Controls.Add(this.labRowEnd);
+ this.gbxFitLinePara.Controls.Add(this.labRowEndSet);
+ this.gbxFitLinePara.Controls.Add(this.labColumnBegin);
+ this.gbxFitLinePara.Controls.Add(this.labColumnBeginSet);
+ this.gbxFitLinePara.Controls.Add(this.labRowBegin);
+ this.gbxFitLinePara.Controls.Add(this.labRowBeginSet);
+ this.gbxFitLinePara.Controls.Add(this.labNumber);
+ this.gbxFitLinePara.Controls.Add(this.labNumberSet);
+ this.gbxFitLinePara.Controls.Add(this.btnRoiHeightReset_Line);
+ this.gbxFitLinePara.Controls.Add(this.tBroiHeight);
+ this.gbxFitLinePara.Controls.Add(this.numUDRoiHeight);
+ this.gbxFitLinePara.Controls.Add(this.labPosition);
+ this.gbxFitLinePara.Controls.Add(this.labPositionSet);
+ this.gbxFitLinePara.Controls.Add(this.labTransition);
+ this.gbxFitLinePara.Controls.Add(this.labTransitionSet);
+ this.gbxFitLinePara.Controls.Add(this.labInterpolation);
+ this.gbxFitLinePara.Controls.Add(this.labInterpolationSet);
+ this.gbxFitLinePara.Controls.Add(this.labROIHeight);
+ this.gbxFitLinePara.Controls.Add(this.labROIWidth);
+ this.gbxFitLinePara.Controls.Add(this.labROIWidthSet);
+ this.gbxFitLinePara.Controls.Add(this.labSmoothing);
+ this.gbxFitLinePara.Controls.Add(this.labSmoothingSet);
+ this.gbxFitLinePara.Controls.Add(this.labMinEdgeAmpl);
+ this.gbxFitLinePara.Controls.Add(this.labRecognitionSet);
+ this.gbxFitLinePara.Controls.Add(this.labMinEdgeAmplSet);
+ this.gbxFitLinePara.Controls.Add(this.labRecognition);
+ this.gbxFitLinePara.Location = new System.Drawing.Point(6, 6);
+ this.gbxFitLinePara.Name = "gbxFitLinePara";
+ this.gbxFitLinePara.Size = new System.Drawing.Size(338, 514);
+ this.gbxFitLinePara.TabIndex = 51;
+ this.gbxFitLinePara.TabStop = false;
+ this.gbxFitLinePara.Text = "groupBox10";
+ //
+ // btnParaAdd
+ //
+ this.btnParaAdd.Location = new System.Drawing.Point(222, 448);
+ this.btnParaAdd.Name = "btnParaAdd";
+ this.btnParaAdd.Size = new System.Drawing.Size(103, 49);
+ this.btnParaAdd.TabIndex = 60;
+ this.btnParaAdd.Text = "Para Add";
+ this.btnParaAdd.UseVisualStyleBackColor = true;
+ this.btnParaAdd.Visible = false;
+ this.btnParaAdd.Click += new System.EventHandler(this.btnParaAdd_Click);
+ //
+ // labColumnEnd
+ //
+ this.labColumnEnd.BackColor = System.Drawing.SystemColors.Control;
+ this.labColumnEnd.Location = new System.Drawing.Point(14, 390);
+ this.labColumnEnd.Name = "labColumnEnd";
+ this.labColumnEnd.Size = new System.Drawing.Size(115, 21);
+ this.labColumnEnd.TabIndex = 59;
+ this.labColumnEnd.Text = "Transition";
+ this.labColumnEnd.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labColumnEndSet
+ //
+ this.labColumnEndSet.BackColor = System.Drawing.Color.White;
+ this.labColumnEndSet.Location = new System.Drawing.Point(135, 389);
+ this.labColumnEndSet.Name = "labColumnEndSet";
+ this.labColumnEndSet.Size = new System.Drawing.Size(115, 21);
+ this.labColumnEndSet.TabIndex = 58;
+ this.labColumnEndSet.Text = "-";
+ this.labColumnEndSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labRowEnd
+ //
+ this.labRowEnd.BackColor = System.Drawing.SystemColors.Control;
+ this.labRowEnd.Location = new System.Drawing.Point(14, 365);
+ this.labRowEnd.Name = "labRowEnd";
+ this.labRowEnd.Size = new System.Drawing.Size(115, 21);
+ this.labRowEnd.TabIndex = 57;
+ this.labRowEnd.Text = "Interpolation";
+ this.labRowEnd.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labRowEndSet
+ //
+ this.labRowEndSet.BackColor = System.Drawing.Color.White;
+ this.labRowEndSet.Location = new System.Drawing.Point(135, 364);
+ this.labRowEndSet.Name = "labRowEndSet";
+ this.labRowEndSet.Size = new System.Drawing.Size(115, 21);
+ this.labRowEndSet.TabIndex = 56;
+ this.labRowEndSet.Text = "-";
+ this.labRowEndSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labColumnBegin
+ //
+ this.labColumnBegin.BackColor = System.Drawing.SystemColors.Control;
+ this.labColumnBegin.Location = new System.Drawing.Point(14, 340);
+ this.labColumnBegin.Name = "labColumnBegin";
+ this.labColumnBegin.Size = new System.Drawing.Size(115, 21);
+ this.labColumnBegin.TabIndex = 55;
+ this.labColumnBegin.Text = "Smoothing";
+ this.labColumnBegin.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labColumnBeginSet
+ //
+ this.labColumnBeginSet.BackColor = System.Drawing.Color.White;
+ this.labColumnBeginSet.Location = new System.Drawing.Point(135, 339);
+ this.labColumnBeginSet.Name = "labColumnBeginSet";
+ this.labColumnBeginSet.Size = new System.Drawing.Size(115, 21);
+ this.labColumnBeginSet.TabIndex = 54;
+ this.labColumnBeginSet.Text = "-";
+ this.labColumnBeginSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labRowBegin
+ //
+ this.labRowBegin.BackColor = System.Drawing.SystemColors.Control;
+ this.labRowBegin.Location = new System.Drawing.Point(14, 315);
+ this.labRowBegin.Name = "labRowBegin";
+ this.labRowBegin.Size = new System.Drawing.Size(115, 21);
+ this.labRowBegin.TabIndex = 53;
+ this.labRowBegin.Text = "StartRow";
+ this.labRowBegin.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labRowBeginSet
+ //
+ this.labRowBeginSet.BackColor = System.Drawing.Color.White;
+ this.labRowBeginSet.Location = new System.Drawing.Point(135, 314);
+ this.labRowBeginSet.Name = "labRowBeginSet";
+ this.labRowBeginSet.Size = new System.Drawing.Size(115, 21);
+ this.labRowBeginSet.TabIndex = 52;
+ this.labRowBeginSet.Text = "-";
+ this.labRowBeginSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labNumber
+ //
+ this.labNumber.BackColor = System.Drawing.SystemColors.Control;
+ this.labNumber.Location = new System.Drawing.Point(14, 180);
+ this.labNumber.Name = "labNumber";
+ this.labNumber.Size = new System.Drawing.Size(115, 21);
+ this.labNumber.TabIndex = 51;
+ this.labNumber.Text = "Number";
+ this.labNumber.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labNumberSet
+ //
+ this.labNumberSet.BackColor = System.Drawing.Color.White;
+ this.labNumberSet.Location = new System.Drawing.Point(135, 179);
+ this.labNumberSet.Name = "labNumberSet";
+ this.labNumberSet.Size = new System.Drawing.Size(115, 21);
+ this.labNumberSet.TabIndex = 50;
+ this.labNumberSet.Text = "-";
+ this.labNumberSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // btnRoiHeightReset_Line
+ //
+ this.btnRoiHeightReset_Line.Location = new System.Drawing.Point(256, 233);
+ this.btnRoiHeightReset_Line.Name = "btnRoiHeightReset_Line";
+ this.btnRoiHeightReset_Line.Size = new System.Drawing.Size(69, 31);
+ this.btnRoiHeightReset_Line.TabIndex = 49;
+ this.btnRoiHeightReset_Line.Text = "Reset";
+ //
+ // tBroiHeight
+ //
+ this.tBroiHeight.Location = new System.Drawing.Point(137, 260);
+ this.tBroiHeight.Maximum = 2000;
+ this.tBroiHeight.Minimum = 5;
+ this.tBroiHeight.Name = "tBroiHeight";
+ this.tBroiHeight.Size = new System.Drawing.Size(113, 45);
+ this.tBroiHeight.TabIndex = 48;
+ this.tBroiHeight.TickFrequency = 10;
+ this.tBroiHeight.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.tBroiHeight.Value = 20;
+ //
+ // numUDRoiHeight
+ //
+ this.numUDRoiHeight.Location = new System.Drawing.Point(137, 233);
+ this.numUDRoiHeight.Maximum = new decimal(new int[] {
+ 2000,
+ 0,
+ 0,
+ 0});
+ this.numUDRoiHeight.Name = "numUDRoiHeight";
+ this.numUDRoiHeight.Size = new System.Drawing.Size(113, 21);
+ this.numUDRoiHeight.TabIndex = 47;
+ this.numUDRoiHeight.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
+ this.numUDRoiHeight.Value = new decimal(new int[] {
+ 20,
+ 0,
+ 0,
+ 0});
+ this.numUDRoiHeight.ValueChanged += new System.EventHandler(this.numUDRoiHeight_ValueChanged);
+ //
+ // labPosition
+ //
+ this.labPosition.BackColor = System.Drawing.SystemColors.Control;
+ this.labPosition.Location = new System.Drawing.Point(14, 155);
+ this.labPosition.Name = "labPosition";
+ this.labPosition.Size = new System.Drawing.Size(115, 21);
+ this.labPosition.TabIndex = 46;
+ this.labPosition.Text = "Position";
+ this.labPosition.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labPositionSet
+ //
+ this.labPositionSet.BackColor = System.Drawing.Color.White;
+ this.labPositionSet.Location = new System.Drawing.Point(135, 154);
+ this.labPositionSet.Name = "labPositionSet";
+ this.labPositionSet.Size = new System.Drawing.Size(115, 21);
+ this.labPositionSet.TabIndex = 45;
+ this.labPositionSet.Text = "-";
+ this.labPositionSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labTransition
+ //
+ this.labTransition.BackColor = System.Drawing.SystemColors.Control;
+ this.labTransition.Location = new System.Drawing.Point(14, 130);
+ this.labTransition.Name = "labTransition";
+ this.labTransition.Size = new System.Drawing.Size(115, 21);
+ this.labTransition.TabIndex = 44;
+ this.labTransition.Text = "Transition";
+ this.labTransition.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labTransitionSet
+ //
+ this.labTransitionSet.BackColor = System.Drawing.Color.White;
+ this.labTransitionSet.Location = new System.Drawing.Point(135, 129);
+ this.labTransitionSet.Name = "labTransitionSet";
+ this.labTransitionSet.Size = new System.Drawing.Size(115, 21);
+ this.labTransitionSet.TabIndex = 43;
+ this.labTransitionSet.Text = "-";
+ this.labTransitionSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labInterpolation
+ //
+ this.labInterpolation.BackColor = System.Drawing.SystemColors.Control;
+ this.labInterpolation.Location = new System.Drawing.Point(14, 105);
+ this.labInterpolation.Name = "labInterpolation";
+ this.labInterpolation.Size = new System.Drawing.Size(115, 21);
+ this.labInterpolation.TabIndex = 42;
+ this.labInterpolation.Text = "Interpolation";
+ this.labInterpolation.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labInterpolationSet
+ //
+ this.labInterpolationSet.BackColor = System.Drawing.Color.White;
+ this.labInterpolationSet.Location = new System.Drawing.Point(135, 104);
+ this.labInterpolationSet.Name = "labInterpolationSet";
+ this.labInterpolationSet.Size = new System.Drawing.Size(115, 21);
+ this.labInterpolationSet.TabIndex = 41;
+ this.labInterpolationSet.Text = "-";
+ this.labInterpolationSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labROIHeight
+ //
+ this.labROIHeight.BackColor = System.Drawing.SystemColors.Control;
+ this.labROIHeight.Location = new System.Drawing.Point(14, 231);
+ this.labROIHeight.Name = "labROIHeight";
+ this.labROIHeight.Size = new System.Drawing.Size(115, 21);
+ this.labROIHeight.TabIndex = 40;
+ this.labROIHeight.Text = "ROI Height";
+ this.labROIHeight.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labROIWidth
+ //
+ this.labROIWidth.BackColor = System.Drawing.SystemColors.Control;
+ this.labROIWidth.Location = new System.Drawing.Point(14, 206);
+ this.labROIWidth.Name = "labROIWidth";
+ this.labROIWidth.Size = new System.Drawing.Size(115, 21);
+ this.labROIWidth.TabIndex = 38;
+ this.labROIWidth.Text = "ROI Width";
+ this.labROIWidth.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labROIWidthSet
+ //
+ this.labROIWidthSet.BackColor = System.Drawing.Color.White;
+ this.labROIWidthSet.Location = new System.Drawing.Point(135, 205);
+ this.labROIWidthSet.Name = "labROIWidthSet";
+ this.labROIWidthSet.Size = new System.Drawing.Size(115, 21);
+ this.labROIWidthSet.TabIndex = 37;
+ this.labROIWidthSet.Text = "-";
+ this.labROIWidthSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labSmoothing
+ //
+ this.labSmoothing.BackColor = System.Drawing.SystemColors.Control;
+ this.labSmoothing.Location = new System.Drawing.Point(14, 80);
+ this.labSmoothing.Name = "labSmoothing";
+ this.labSmoothing.Size = new System.Drawing.Size(115, 21);
+ this.labSmoothing.TabIndex = 36;
+ this.labSmoothing.Text = "Smoothing";
+ this.labSmoothing.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labSmoothingSet
+ //
+ this.labSmoothingSet.BackColor = System.Drawing.Color.White;
+ this.labSmoothingSet.Location = new System.Drawing.Point(135, 79);
+ this.labSmoothingSet.Name = "labSmoothingSet";
+ this.labSmoothingSet.Size = new System.Drawing.Size(115, 21);
+ this.labSmoothingSet.TabIndex = 35;
+ this.labSmoothingSet.Text = "-";
+ this.labSmoothingSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labMinEdgeAmpl
+ //
+ this.labMinEdgeAmpl.BackColor = System.Drawing.SystemColors.Control;
+ this.labMinEdgeAmpl.Location = new System.Drawing.Point(14, 55);
+ this.labMinEdgeAmpl.Name = "labMinEdgeAmpl";
+ this.labMinEdgeAmpl.Size = new System.Drawing.Size(115, 21);
+ this.labMinEdgeAmpl.TabIndex = 34;
+ this.labMinEdgeAmpl.Text = "Min.EdgeAmpl";
+ this.labMinEdgeAmpl.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labRecognitionSet
+ //
+ this.labRecognitionSet.BackColor = System.Drawing.SystemColors.Control;
+ this.labRecognitionSet.Location = new System.Drawing.Point(135, 29);
+ this.labRecognitionSet.Name = "labRecognitionSet";
+ this.labRecognitionSet.Size = new System.Drawing.Size(115, 21);
+ this.labRecognitionSet.TabIndex = 33;
+ this.labRecognitionSet.Text = "Recognition";
+ this.labRecognitionSet.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labMinEdgeAmplSet
+ //
+ this.labMinEdgeAmplSet.BackColor = System.Drawing.Color.White;
+ this.labMinEdgeAmplSet.Location = new System.Drawing.Point(135, 54);
+ this.labMinEdgeAmplSet.Name = "labMinEdgeAmplSet";
+ this.labMinEdgeAmplSet.Size = new System.Drawing.Size(115, 21);
+ this.labMinEdgeAmplSet.TabIndex = 32;
+ this.labMinEdgeAmplSet.Text = "-";
+ this.labMinEdgeAmplSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labRecognition
+ //
+ this.labRecognition.BackColor = System.Drawing.SystemColors.Control;
+ this.labRecognition.Location = new System.Drawing.Point(14, 29);
+ this.labRecognition.Name = "labRecognition";
+ this.labRecognition.Size = new System.Drawing.Size(115, 21);
+ this.labRecognition.TabIndex = 31;
+ this.labRecognition.Text = "Recognition";
+ this.labRecognition.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // btnFitLine
+ //
+ this.btnFitLine.Location = new System.Drawing.Point(35, 526);
+ this.btnFitLine.Name = "btnFitLine";
+ this.btnFitLine.Size = new System.Drawing.Size(117, 55);
+ this.btnFitLine.TabIndex = 3;
+ this.btnFitLine.Text = "Fit Line";
+ this.btnFitLine.UseVisualStyleBackColor = true;
+ this.btnFitLine.Click += new System.EventHandler(this.btnFitLine_Click);
+ //
+ // tabPageCircle
+ //
+ this.tabPageCircle.Controls.Add(this.btnLoadConfige_Circle);
+ this.tabPageCircle.Controls.Add(this.gbxFitCirclePara);
+ this.tabPageCircle.Controls.Add(this.btnFitCircle);
+ this.tabPageCircle.Location = new System.Drawing.Point(4, 22);
+ this.tabPageCircle.Name = "tabPageCircle";
+ this.tabPageCircle.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPageCircle.Size = new System.Drawing.Size(352, 596);
+ this.tabPageCircle.TabIndex = 1;
+ this.tabPageCircle.Text = "Fit Circle";
+ this.tabPageCircle.UseVisualStyleBackColor = true;
+ //
+ // btnLoadConfige_Circle
+ //
+ this.btnLoadConfige_Circle.Location = new System.Drawing.Point(202, 525);
+ this.btnLoadConfige_Circle.Name = "btnLoadConfige_Circle";
+ this.btnLoadConfige_Circle.Size = new System.Drawing.Size(117, 65);
+ this.btnLoadConfige_Circle.TabIndex = 54;
+ this.btnLoadConfige_Circle.Text = "Load Confige";
+ this.btnLoadConfige_Circle.UseVisualStyleBackColor = true;
+ this.btnLoadConfige_Circle.Click += new System.EventHandler(this.btnLoadConfige_Circle_Click);
+ //
+ // gbxFitCirclePara
+ //
+ this.gbxFitCirclePara.Controls.Add(this.labRadius_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labRadiusSet_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labColumn_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labColumnSet_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labRow_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labRowSet_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.btnParaAdd_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labNumber_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labNumberSet_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.btnRoiHeightReset_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.trackBar1);
+ this.gbxFitCirclePara.Controls.Add(this.numUDRoiHeight_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labPosition_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labPositionSet_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labTransition_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labTransitionSet_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labInterpolation_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labInterpolationSet_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labROIHeight_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labROIWidth_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labROIWidthSet_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labSmoothing_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labSmoothingSet_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labMinEdgeAmpl_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labRecognitionSet_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labMinEdgeAmplSet_Circle);
+ this.gbxFitCirclePara.Controls.Add(this.labRecognition_Circle);
+ this.gbxFitCirclePara.Location = new System.Drawing.Point(6, 6);
+ this.gbxFitCirclePara.Name = "gbxFitCirclePara";
+ this.gbxFitCirclePara.Size = new System.Drawing.Size(338, 494);
+ this.gbxFitCirclePara.TabIndex = 53;
+ this.gbxFitCirclePara.TabStop = false;
+ this.gbxFitCirclePara.Text = "groupBox4";
+ //
+ // labRadius_Circle
+ //
+ this.labRadius_Circle.BackColor = System.Drawing.SystemColors.Control;
+ this.labRadius_Circle.Location = new System.Drawing.Point(14, 366);
+ this.labRadius_Circle.Name = "labRadius_Circle";
+ this.labRadius_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labRadius_Circle.TabIndex = 58;
+ this.labRadius_Circle.Text = "Number";
+ this.labRadius_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labRadiusSet_Circle
+ //
+ this.labRadiusSet_Circle.BackColor = System.Drawing.Color.White;
+ this.labRadiusSet_Circle.Location = new System.Drawing.Point(135, 365);
+ this.labRadiusSet_Circle.Name = "labRadiusSet_Circle";
+ this.labRadiusSet_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labRadiusSet_Circle.TabIndex = 57;
+ this.labRadiusSet_Circle.Text = "-";
+ this.labRadiusSet_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labColumn_Circle
+ //
+ this.labColumn_Circle.BackColor = System.Drawing.SystemColors.Control;
+ this.labColumn_Circle.Location = new System.Drawing.Point(14, 341);
+ this.labColumn_Circle.Name = "labColumn_Circle";
+ this.labColumn_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labColumn_Circle.TabIndex = 56;
+ this.labColumn_Circle.Text = "Position";
+ this.labColumn_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labColumnSet_Circle
+ //
+ this.labColumnSet_Circle.BackColor = System.Drawing.Color.White;
+ this.labColumnSet_Circle.Location = new System.Drawing.Point(135, 340);
+ this.labColumnSet_Circle.Name = "labColumnSet_Circle";
+ this.labColumnSet_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labColumnSet_Circle.TabIndex = 55;
+ this.labColumnSet_Circle.Text = "-";
+ this.labColumnSet_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labRow_Circle
+ //
+ this.labRow_Circle.BackColor = System.Drawing.SystemColors.Control;
+ this.labRow_Circle.Location = new System.Drawing.Point(14, 316);
+ this.labRow_Circle.Name = "labRow_Circle";
+ this.labRow_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labRow_Circle.TabIndex = 54;
+ this.labRow_Circle.Text = "Transition";
+ this.labRow_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labRowSet_Circle
+ //
+ this.labRowSet_Circle.BackColor = System.Drawing.Color.White;
+ this.labRowSet_Circle.Location = new System.Drawing.Point(135, 315);
+ this.labRowSet_Circle.Name = "labRowSet_Circle";
+ this.labRowSet_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labRowSet_Circle.TabIndex = 53;
+ this.labRowSet_Circle.Text = "-";
+ this.labRowSet_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // btnParaAdd_Circle
+ //
+ this.btnParaAdd_Circle.Location = new System.Drawing.Point(247, 434);
+ this.btnParaAdd_Circle.Name = "btnParaAdd_Circle";
+ this.btnParaAdd_Circle.Size = new System.Drawing.Size(78, 43);
+ this.btnParaAdd_Circle.TabIndex = 52;
+ this.btnParaAdd_Circle.Text = "Para Add";
+ this.btnParaAdd_Circle.UseVisualStyleBackColor = true;
+ this.btnParaAdd_Circle.Visible = false;
+ this.btnParaAdd_Circle.Click += new System.EventHandler(this.btnParaAdd_Circle_Click);
+ //
+ // labNumber_Circle
+ //
+ this.labNumber_Circle.BackColor = System.Drawing.SystemColors.Control;
+ this.labNumber_Circle.Location = new System.Drawing.Point(14, 180);
+ this.labNumber_Circle.Name = "labNumber_Circle";
+ this.labNumber_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labNumber_Circle.TabIndex = 51;
+ this.labNumber_Circle.Text = "Number";
+ this.labNumber_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labNumberSet_Circle
+ //
+ this.labNumberSet_Circle.BackColor = System.Drawing.Color.White;
+ this.labNumberSet_Circle.Location = new System.Drawing.Point(135, 179);
+ this.labNumberSet_Circle.Name = "labNumberSet_Circle";
+ this.labNumberSet_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labNumberSet_Circle.TabIndex = 50;
+ this.labNumberSet_Circle.Text = "-";
+ this.labNumberSet_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // btnRoiHeightReset_Circle
+ //
+ this.btnRoiHeightReset_Circle.Location = new System.Drawing.Point(256, 233);
+ this.btnRoiHeightReset_Circle.Name = "btnRoiHeightReset_Circle";
+ this.btnRoiHeightReset_Circle.Size = new System.Drawing.Size(69, 31);
+ this.btnRoiHeightReset_Circle.TabIndex = 49;
+ this.btnRoiHeightReset_Circle.Text = "Reset";
+ //
+ // trackBar1
+ //
+ this.trackBar1.Location = new System.Drawing.Point(137, 260);
+ this.trackBar1.Maximum = 2000;
+ this.trackBar1.Minimum = 5;
+ this.trackBar1.Name = "trackBar1";
+ this.trackBar1.Size = new System.Drawing.Size(113, 45);
+ this.trackBar1.TabIndex = 48;
+ this.trackBar1.TickFrequency = 10;
+ this.trackBar1.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.trackBar1.Value = 20;
+ //
+ // numUDRoiHeight_Circle
+ //
+ this.numUDRoiHeight_Circle.Location = new System.Drawing.Point(137, 233);
+ this.numUDRoiHeight_Circle.Maximum = new decimal(new int[] {
+ 2000,
+ 0,
+ 0,
+ 0});
+ this.numUDRoiHeight_Circle.Name = "numUDRoiHeight_Circle";
+ this.numUDRoiHeight_Circle.Size = new System.Drawing.Size(113, 21);
+ this.numUDRoiHeight_Circle.TabIndex = 47;
+ this.numUDRoiHeight_Circle.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
+ this.numUDRoiHeight_Circle.Value = new decimal(new int[] {
+ 20,
+ 0,
+ 0,
+ 0});
+ //
+ // labPosition_Circle
+ //
+ this.labPosition_Circle.BackColor = System.Drawing.SystemColors.Control;
+ this.labPosition_Circle.Location = new System.Drawing.Point(14, 155);
+ this.labPosition_Circle.Name = "labPosition_Circle";
+ this.labPosition_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labPosition_Circle.TabIndex = 46;
+ this.labPosition_Circle.Text = "Position";
+ this.labPosition_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labPositionSet_Circle
+ //
+ this.labPositionSet_Circle.BackColor = System.Drawing.Color.White;
+ this.labPositionSet_Circle.Location = new System.Drawing.Point(135, 154);
+ this.labPositionSet_Circle.Name = "labPositionSet_Circle";
+ this.labPositionSet_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labPositionSet_Circle.TabIndex = 45;
+ this.labPositionSet_Circle.Text = "-";
+ this.labPositionSet_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labTransition_Circle
+ //
+ this.labTransition_Circle.BackColor = System.Drawing.SystemColors.Control;
+ this.labTransition_Circle.Location = new System.Drawing.Point(14, 130);
+ this.labTransition_Circle.Name = "labTransition_Circle";
+ this.labTransition_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labTransition_Circle.TabIndex = 44;
+ this.labTransition_Circle.Text = "Transition";
+ this.labTransition_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labTransitionSet_Circle
+ //
+ this.labTransitionSet_Circle.BackColor = System.Drawing.Color.White;
+ this.labTransitionSet_Circle.Location = new System.Drawing.Point(135, 129);
+ this.labTransitionSet_Circle.Name = "labTransitionSet_Circle";
+ this.labTransitionSet_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labTransitionSet_Circle.TabIndex = 43;
+ this.labTransitionSet_Circle.Text = "-";
+ this.labTransitionSet_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labInterpolation_Circle
+ //
+ this.labInterpolation_Circle.BackColor = System.Drawing.SystemColors.Control;
+ this.labInterpolation_Circle.Location = new System.Drawing.Point(14, 105);
+ this.labInterpolation_Circle.Name = "labInterpolation_Circle";
+ this.labInterpolation_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labInterpolation_Circle.TabIndex = 42;
+ this.labInterpolation_Circle.Text = "Interpolation";
+ this.labInterpolation_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labInterpolationSet_Circle
+ //
+ this.labInterpolationSet_Circle.BackColor = System.Drawing.Color.White;
+ this.labInterpolationSet_Circle.Location = new System.Drawing.Point(135, 104);
+ this.labInterpolationSet_Circle.Name = "labInterpolationSet_Circle";
+ this.labInterpolationSet_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labInterpolationSet_Circle.TabIndex = 41;
+ this.labInterpolationSet_Circle.Text = "-";
+ this.labInterpolationSet_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labROIHeight_Circle
+ //
+ this.labROIHeight_Circle.BackColor = System.Drawing.SystemColors.Control;
+ this.labROIHeight_Circle.Location = new System.Drawing.Point(14, 231);
+ this.labROIHeight_Circle.Name = "labROIHeight_Circle";
+ this.labROIHeight_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labROIHeight_Circle.TabIndex = 40;
+ this.labROIHeight_Circle.Text = "ROI Height";
+ this.labROIHeight_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labROIWidth_Circle
+ //
+ this.labROIWidth_Circle.BackColor = System.Drawing.SystemColors.Control;
+ this.labROIWidth_Circle.Location = new System.Drawing.Point(14, 206);
+ this.labROIWidth_Circle.Name = "labROIWidth_Circle";
+ this.labROIWidth_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labROIWidth_Circle.TabIndex = 38;
+ this.labROIWidth_Circle.Text = "ROI Width";
+ this.labROIWidth_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labROIWidthSet_Circle
+ //
+ this.labROIWidthSet_Circle.BackColor = System.Drawing.Color.White;
+ this.labROIWidthSet_Circle.Location = new System.Drawing.Point(135, 205);
+ this.labROIWidthSet_Circle.Name = "labROIWidthSet_Circle";
+ this.labROIWidthSet_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labROIWidthSet_Circle.TabIndex = 37;
+ this.labROIWidthSet_Circle.Text = "-";
+ this.labROIWidthSet_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labSmoothing_Circle
+ //
+ this.labSmoothing_Circle.BackColor = System.Drawing.SystemColors.Control;
+ this.labSmoothing_Circle.Location = new System.Drawing.Point(14, 80);
+ this.labSmoothing_Circle.Name = "labSmoothing_Circle";
+ this.labSmoothing_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labSmoothing_Circle.TabIndex = 36;
+ this.labSmoothing_Circle.Text = "Smoothing";
+ this.labSmoothing_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labSmoothingSet_Circle
+ //
+ this.labSmoothingSet_Circle.BackColor = System.Drawing.Color.White;
+ this.labSmoothingSet_Circle.Location = new System.Drawing.Point(135, 79);
+ this.labSmoothingSet_Circle.Name = "labSmoothingSet_Circle";
+ this.labSmoothingSet_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labSmoothingSet_Circle.TabIndex = 35;
+ this.labSmoothingSet_Circle.Text = "-";
+ this.labSmoothingSet_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labMinEdgeAmpl_Circle
+ //
+ this.labMinEdgeAmpl_Circle.BackColor = System.Drawing.SystemColors.Control;
+ this.labMinEdgeAmpl_Circle.Location = new System.Drawing.Point(14, 55);
+ this.labMinEdgeAmpl_Circle.Name = "labMinEdgeAmpl_Circle";
+ this.labMinEdgeAmpl_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labMinEdgeAmpl_Circle.TabIndex = 34;
+ this.labMinEdgeAmpl_Circle.Text = "Min.EdgeAmpl";
+ this.labMinEdgeAmpl_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labRecognitionSet_Circle
+ //
+ this.labRecognitionSet_Circle.BackColor = System.Drawing.SystemColors.Control;
+ this.labRecognitionSet_Circle.Location = new System.Drawing.Point(135, 29);
+ this.labRecognitionSet_Circle.Name = "labRecognitionSet_Circle";
+ this.labRecognitionSet_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labRecognitionSet_Circle.TabIndex = 33;
+ this.labRecognitionSet_Circle.Text = "Recognition";
+ this.labRecognitionSet_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labMinEdgeAmplSet_Circle
+ //
+ this.labMinEdgeAmplSet_Circle.BackColor = System.Drawing.Color.White;
+ this.labMinEdgeAmplSet_Circle.Location = new System.Drawing.Point(135, 54);
+ this.labMinEdgeAmplSet_Circle.Name = "labMinEdgeAmplSet_Circle";
+ this.labMinEdgeAmplSet_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labMinEdgeAmplSet_Circle.TabIndex = 32;
+ this.labMinEdgeAmplSet_Circle.Text = "-";
+ this.labMinEdgeAmplSet_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labRecognition_Circle
+ //
+ this.labRecognition_Circle.BackColor = System.Drawing.SystemColors.Control;
+ this.labRecognition_Circle.Location = new System.Drawing.Point(14, 29);
+ this.labRecognition_Circle.Name = "labRecognition_Circle";
+ this.labRecognition_Circle.Size = new System.Drawing.Size(115, 21);
+ this.labRecognition_Circle.TabIndex = 31;
+ this.labRecognition_Circle.Text = "Recognition";
+ this.labRecognition_Circle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // btnFitCircle
+ //
+ this.btnFitCircle.Location = new System.Drawing.Point(39, 525);
+ this.btnFitCircle.Name = "btnFitCircle";
+ this.btnFitCircle.Size = new System.Drawing.Size(117, 65);
+ this.btnFitCircle.TabIndex = 3;
+ this.btnFitCircle.Text = "Fit Circle";
+ this.btnFitCircle.UseVisualStyleBackColor = true;
+ this.btnFitCircle.Click += new System.EventHandler(this.btnFitCircle_Click);
+ //
+ // pnlMiddle
+ //
+ this.pnlMiddle.Controls.Add(this.viewPort);
+ this.pnlMiddle.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.pnlMiddle.Location = new System.Drawing.Point(0, 0);
+ this.pnlMiddle.Name = "pnlMiddle";
+ this.pnlMiddle.Size = new System.Drawing.Size(823, 622);
+ this.pnlMiddle.TabIndex = 4;
+ //
+ // viewPort
+ //
+ this.viewPort.BackColor = System.Drawing.Color.Black;
+ this.viewPort.BorderColor = System.Drawing.Color.Black;
+ this.viewPort.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.viewPort.ImagePart = new System.Drawing.Rectangle(0, 0, 640, 480);
+ this.viewPort.Location = new System.Drawing.Point(0, 0);
+ this.viewPort.Name = "viewPort";
+ this.viewPort.Size = new System.Drawing.Size(823, 622);
+ this.viewPort.TabIndex = 0;
+ this.viewPort.WindowSize = new System.Drawing.Size(823, 622);
+ this.viewPort.HMouseDown += new HalconDotNet.HMouseEventHandler(this.viewPort_HMouseDown);
+ //
+ // txtMinEdgeAmplSet
+ //
+ this.txtMinEdgeAmplSet.Location = new System.Drawing.Point(246, 55);
+ this.txtMinEdgeAmplSet.Name = "txtMinEdgeAmplSet";
+ this.txtMinEdgeAmplSet.Size = new System.Drawing.Size(86, 21);
+ this.txtMinEdgeAmplSet.TabIndex = 61;
+ //
+ // txtSmoothingSet
+ //
+ this.txtSmoothingSet.Location = new System.Drawing.Point(246, 81);
+ this.txtSmoothingSet.Name = "txtSmoothingSet";
+ this.txtSmoothingSet.Size = new System.Drawing.Size(86, 21);
+ this.txtSmoothingSet.TabIndex = 62;
+ //
+ // txtInterpolationSet
+ //
+ this.txtInterpolationSet.Location = new System.Drawing.Point(246, 106);
+ this.txtInterpolationSet.Name = "txtInterpolationSet";
+ this.txtInterpolationSet.Size = new System.Drawing.Size(86, 21);
+ this.txtInterpolationSet.TabIndex = 63;
+ //
+ // txtNumberSet
+ //
+ this.txtNumberSet.Location = new System.Drawing.Point(246, 181);
+ this.txtNumberSet.Name = "txtNumberSet";
+ this.txtNumberSet.Size = new System.Drawing.Size(86, 21);
+ this.txtNumberSet.TabIndex = 66;
+ //
+ // txtPositionSet
+ //
+ this.txtPositionSet.Location = new System.Drawing.Point(246, 155);
+ this.txtPositionSet.Name = "txtPositionSet";
+ this.txtPositionSet.Size = new System.Drawing.Size(86, 21);
+ this.txtPositionSet.TabIndex = 65;
+ //
+ // txtTransitionSet
+ //
+ this.txtTransitionSet.Location = new System.Drawing.Point(246, 130);
+ this.txtTransitionSet.Name = "txtTransitionSet";
+ this.txtTransitionSet.Size = new System.Drawing.Size(86, 21);
+ this.txtTransitionSet.TabIndex = 64;
+ //
+ // txtROIWidthSet
+ //
+ this.txtROIWidthSet.Location = new System.Drawing.Point(246, 207);
+ this.txtROIWidthSet.Name = "txtROIWidthSet";
+ this.txtROIWidthSet.Size = new System.Drawing.Size(86, 21);
+ this.txtROIWidthSet.TabIndex = 67;
+ //
+ // frmFitCircleAndLine
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(1183, 714);
+ this.Controls.Add(this.pnlMiddle);
+ this.Controls.Add(this.plnLeft);
+ this.Controls.Add(this.plnBottom);
+ this.Name = "frmFitCircleAndLine";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "frmFitCircleAndLine";
+ this.Load += new System.EventHandler(this.frmFitCircleAndLine_Load);
+ this.plnBottom.ResumeLayout(false);
+ this.pnlBtMiddle.ResumeLayout(false);
+ this.gbxOption.ResumeLayout(false);
+ this.pnlBtRight.ResumeLayout(false);
+ this.gbxAddType.ResumeLayout(false);
+ this.pnlBtLeft.ResumeLayout(false);
+ this.gbxImage.ResumeLayout(false);
+ this.plnLeft.ResumeLayout(false);
+ this.tabControl1.ResumeLayout(false);
+ this.tabPageLine.ResumeLayout(false);
+ this.gbxFitLinePara.ResumeLayout(false);
+ this.gbxFitLinePara.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.tBroiHeight)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.numUDRoiHeight)).EndInit();
+ this.tabPageCircle.ResumeLayout(false);
+ this.gbxFitCirclePara.ResumeLayout(false);
+ this.gbxFitCirclePara.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.numUDRoiHeight_Circle)).EndInit();
+ this.pnlMiddle.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Panel plnBottom;
+ private System.Windows.Forms.Panel plnLeft;
+ private System.Windows.Forms.Panel pnlMiddle;
+ private System.Windows.Forms.Panel pnlBtMiddle;
+ private System.Windows.Forms.Panel pnlBtRight;
+ private System.Windows.Forms.Panel pnlBtLeft;
+ private System.Windows.Forms.Button btnLoadImage;
+ private System.Windows.Forms.Button btnResetView;
+ private System.Windows.Forms.RadioButton RbZoom;
+ private System.Windows.Forms.RadioButton RbMove;
+ private System.Windows.Forms.RadioButton RbNone;
+ public HalconDotNet.HWindowControl viewPort;
+ private System.Windows.Forms.Button btnLineRoi;
+ private System.Windows.Forms.Button btnFitZoom;
+ private System.Windows.Forms.GroupBox gbxImage;
+ private System.Windows.Forms.GroupBox gbxOption;
+ private System.Windows.Forms.GroupBox gbxAddType;
+ private System.Windows.Forms.Button btnCircleRoi;
+ private System.Windows.Forms.TabControl tabControl1;
+ private System.Windows.Forms.TabPage tabPageLine;
+ private System.Windows.Forms.Button btnLoadConfige_Line;
+ private System.Windows.Forms.GroupBox gbxFitLinePara;
+ private System.Windows.Forms.Label labColumnEnd;
+ private System.Windows.Forms.Label labColumnEndSet;
+ private System.Windows.Forms.Label labRowEnd;
+ private System.Windows.Forms.Label labRowEndSet;
+ private System.Windows.Forms.Label labColumnBegin;
+ private System.Windows.Forms.Label labColumnBeginSet;
+ private System.Windows.Forms.Label labRowBegin;
+ private System.Windows.Forms.Label labRowBeginSet;
+ private System.Windows.Forms.Label labNumber;
+ private System.Windows.Forms.Label labNumberSet;
+ private System.Windows.Forms.Button btnRoiHeightReset_Line;
+ private System.Windows.Forms.TrackBar tBroiHeight;
+ private System.Windows.Forms.NumericUpDown numUDRoiHeight;
+ private System.Windows.Forms.Label labPosition;
+ private System.Windows.Forms.Label labPositionSet;
+ private System.Windows.Forms.Label labTransition;
+ private System.Windows.Forms.Label labTransitionSet;
+ private System.Windows.Forms.Label labInterpolation;
+ private System.Windows.Forms.Label labInterpolationSet;
+ private System.Windows.Forms.Label labROIHeight;
+ private System.Windows.Forms.Label labROIWidth;
+ private System.Windows.Forms.Label labROIWidthSet;
+ private System.Windows.Forms.Label labSmoothing;
+ private System.Windows.Forms.Label labSmoothingSet;
+ private System.Windows.Forms.Label labMinEdgeAmpl;
+ private System.Windows.Forms.Label labRecognitionSet;
+ private System.Windows.Forms.Label labMinEdgeAmplSet;
+ private System.Windows.Forms.Label labRecognition;
+ private System.Windows.Forms.Button btnFitLine;
+ private System.Windows.Forms.TabPage tabPageCircle;
+ private System.Windows.Forms.Button btnLoadConfige_Circle;
+ private System.Windows.Forms.GroupBox gbxFitCirclePara;
+ private System.Windows.Forms.Label labNumber_Circle;
+ private System.Windows.Forms.Label labNumberSet_Circle;
+ private System.Windows.Forms.Button btnRoiHeightReset_Circle;
+ private System.Windows.Forms.TrackBar trackBar1;
+ private System.Windows.Forms.NumericUpDown numUDRoiHeight_Circle;
+ private System.Windows.Forms.Label labPosition_Circle;
+ private System.Windows.Forms.Label labPositionSet_Circle;
+ private System.Windows.Forms.Label labTransition_Circle;
+ private System.Windows.Forms.Label labTransitionSet_Circle;
+ private System.Windows.Forms.Label labInterpolation_Circle;
+ private System.Windows.Forms.Label labInterpolationSet_Circle;
+ private System.Windows.Forms.Label labROIHeight_Circle;
+ private System.Windows.Forms.Label labROIWidth_Circle;
+ private System.Windows.Forms.Label labROIWidthSet_Circle;
+ private System.Windows.Forms.Label labSmoothing_Circle;
+ private System.Windows.Forms.Label labSmoothingSet_Circle;
+ private System.Windows.Forms.Label labMinEdgeAmpl_Circle;
+ private System.Windows.Forms.Label labRecognitionSet_Circle;
+ private System.Windows.Forms.Label labMinEdgeAmplSet_Circle;
+ private System.Windows.Forms.Label labRecognition_Circle;
+ private System.Windows.Forms.Button btnFitCircle;
+ private System.Windows.Forms.Button btnParaAdd;
+ private System.Windows.Forms.Button btnParaAdd_Circle;
+ private System.Windows.Forms.Label labRadius_Circle;
+ private System.Windows.Forms.Label labRadiusSet_Circle;
+ private System.Windows.Forms.Label labColumn_Circle;
+ private System.Windows.Forms.Label labColumnSet_Circle;
+ private System.Windows.Forms.Label labRow_Circle;
+ private System.Windows.Forms.Label labRowSet_Circle;
+ private System.Windows.Forms.Button btnFrmMeasure;
+ private System.Windows.Forms.TextBox txtROIWidthSet;
+ private System.Windows.Forms.TextBox txtNumberSet;
+ private System.Windows.Forms.TextBox txtPositionSet;
+ private System.Windows.Forms.TextBox txtTransitionSet;
+ private System.Windows.Forms.TextBox txtInterpolationSet;
+ private System.Windows.Forms.TextBox txtSmoothingSet;
+ private System.Windows.Forms.TextBox txtMinEdgeAmplSet;
+ }
+}
\ No newline at end of file
diff --git a/HalconTools/frmFitCircleAndLine.cs b/HalconTools/frmFitCircleAndLine.cs
new file mode 100644
index 0000000..1c2e364
--- /dev/null
+++ b/HalconTools/frmFitCircleAndLine.cs
@@ -0,0 +1,512 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.IO;
+using System.Text;
+using System.Windows.Forms;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public partial class frmFitCircleAndLine : Form
+ {
+ public frmFitCircleAndLine()
+ {
+ InitializeComponent();
+ Init();
+ }
+
+ ROICircle roi = new ROICircle();
+ ROILine roi2 = new ROILine();
+
+ private HImage mImage;
+ public frmFitCircleAndLine(JobTool tool,HImage image)
+ {
+ InitializeComponent();
+
+ Init();
+
+ //鍥介檯鍖�
+ ResourceCulture.SetCurrentCulture("zh-CN");
+ ResourceCulture.SetLanguage((Control)this);
+
+ mImage = image;
+ mFitAssistant.SetImage(image);
+ mFitAssistant.UpdateImage();
+
+ switch (tool.type)
+ {
+ case ToolType.FindCircle:
+
+ if (tool.fitCircleParam == null)
+ {
+ fitCircleParamSet = new HalconTools.MeasureParamSave();
+ fitCircleParamSet = fitCircleParamSet.Load(System.Windows.Forms.Application.StartupPath + "\\MeasureConfige\\MeasureConfige.xml");
+
+ showFitCircleParam(fitCircleParamSet);
+ }
+ else
+ {
+ CircleParam = tool.fitCircleParam;
+
+ fitCircleParamSet = new MeasureParamSave();
+
+ fitCircleParamSet.hv_measure_Length1 = tool.fitCircleParam.hv_measure_Length1;
+ fitCircleParamSet.hv_measure_Length2 = tool.fitCircleParam.hv_measure_Length2;
+ fitCircleParamSet.hv_measure_sigma = tool.fitCircleParam.hv_measure_sigma;
+ fitCircleParamSet.hv_measure_position = tool.fitCircleParam.hv_measure_position;
+ fitCircleParamSet.hv_measure_transition = tool.fitCircleParam.hv_measure_transition;
+ fitCircleParamSet.hv_measure_number = (int)tool.fitCircleParam.hv_measure_number;
+ fitCircleParamSet.hv_measure_threshold = tool.fitCircleParam.hv_measure_threshold;
+ fitCircleParamSet.hv_measure_interpolation = tool.fitCircleParam.hv_measure_interpolation;
+
+ showFitCircleParam(fitCircleParamSet);
+
+ mFitAssistant.viewController.resetAll();
+ mFitAssistant.viewController.repaint();
+
+ mFitAssistant.roiController.setROIShape(roi);
+ roi.hradius = tool.fitCircleParam.hv_Radius;
+ roi.midR = tool.fitCircleParam.hv_RowCenter;
+ roi.midC = tool.fitCircleParam.hv_ColumnCenter;
+
+ try
+ {
+ mFitAssistant.roiController.mouseDownAction(roi.midC, roi.midR);
+ }
+ catch (Exception ex)
+ {
+
+ }
+ }
+
+ break;
+
+ case ToolType.FindLine:
+
+ if (tool.fitLineParam == null)
+ {
+ fitLineParamSet = new HalconTools.MeasureParamSave();
+ fitLineParamSet = fitLineParamSet.Load(System.Windows.Forms.Application.StartupPath + "\\MeasureConfige\\MeasureConfige.xml");
+
+ showFitLineParam(fitLineParamSet);
+ }
+ else
+ {
+ LineParam = tool.fitLineParam;
+
+ fitLineParamSet = new MeasureParamSave();
+
+ fitLineParamSet.hv_measure_Length1 = tool.fitLineParam.hv_measure_Length1;
+ fitLineParamSet.hv_measure_Length2 = tool.fitLineParam.hv_measure_Length2;
+ fitLineParamSet.hv_measure_sigma = tool.fitLineParam.hv_measure_sigma;
+ fitLineParamSet.hv_measure_position = tool.fitLineParam.hv_measure_position;
+ fitLineParamSet.hv_measure_transition = tool.fitLineParam.hv_measure_transition;
+ fitLineParamSet.hv_measure_number = (int)tool.fitLineParam.hv_measure_number;
+ fitLineParamSet.hv_measure_threshold = tool.fitLineParam.hv_measure_threshold;
+ fitLineParamSet.hv_measure_interpolation = tool.fitLineParam.hv_measure_interpolation;
+
+ showFitLineParam(fitLineParamSet);
+
+ mFitAssistant.viewController.resetAll();
+ mFitAssistant.viewController.repaint();
+ mFitAssistant.roiController.setROIShape(roi2);
+
+ roi2.hcol = (tool.fitLineParam.hv_ColumnEnd - tool.fitLineParam.hv_ColumnBegin) / 2;
+ roi2.hrow = (tool.fitLineParam.hv_RowEnd - tool.fitLineParam.hv_RowBegin) / 2;
+ roi2.midR = (tool.fitLineParam.hv_RowBegin + tool.fitLineParam.hv_RowEnd) / 2;
+ roi2.midC = (tool.fitLineParam.hv_ColumnBegin + tool.fitLineParam.hv_ColumnEnd) / 2;
+
+ try
+ {
+ mFitAssistant.roiController.mouseDownAction(roi2.midC, roi2.midR);
+ }
+ catch (Exception ex)
+ {
+
+ }
+
+ }
+
+ break;
+ }
+ }
+
+ public frmFitCircleAndLine(string name)
+ {
+ InitializeComponent();
+ ResourceCulture.SetCurrentCulture(name);
+ ResourceCulture.SetLanguage((Control)this);
+
+ Init();
+ }
+
+ /* base variables */
+ //public HWndCtrl viewController;
+ //public ROIController roiController;
+
+ private HalconTools.FitAssistant mFitAssistant;
+
+
+ private void frmFitCircleAndLine_Load(object sender, EventArgs e)
+ {
+
+ }
+
+ private void btnLoadImage_Click(object sender, EventArgs e)
+ {
+ OpenFileDialog imagePath = new OpenFileDialog();
+ imagePath.Filter = "*.jpg,*.jpeg,*.bmp,*.gif,*.ico,*.png,*.tif,*.wmf|*.jpg;*.jpeg;*.bmp;*.gif;*.ico;*.png;*.tif;*.wmf";
+
+ if (imagePath.ShowDialog() == DialogResult.OK)
+ {
+ if (!mFitAssistant.SetImage(imagePath.FileName))
+ {
+ return;
+ }
+
+ mFitAssistant.UpdateImage();
+
+ }
+ }
+
+ private void Init()
+ {
+ mFitAssistant = new FitAssistant(viewPort);
+
+ mFitAssistant.FitLineDone += new FitLineDelegate(mFitAssistant_FitLineDone);
+
+ mFitAssistant.FitCircleDone += new FitCircleDelegate(mFitAssistant_FitCircleDone);
+ }
+
+ void mFitAssistant_FitCircleDone(object sender, HImage image, FitCircleResult result)
+ {
+ mFitAssistant.FitCircleGraphics(mFitAssistant.viewController, image, result);
+ }
+
+ void mFitAssistant_FitLineDone(object sender, HImage image, FitLineResult result)
+ {
+ //throw new NotImplementedException();
+
+ mFitAssistant.FitLineGraphics(mFitAssistant.viewController, image, result);
+ }
+
+ private void RbNone_CheckedChanged(object sender, EventArgs e)
+ {
+ mFitAssistant.viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
+ }
+
+ private void RbMove_CheckedChanged(object sender, EventArgs e)
+ {
+ mFitAssistant.viewController.setViewState(HWndCtrl.MODE_VIEW_MOVE);
+ }
+
+ private void RbZoom_CheckedChanged(object sender, EventArgs e)
+ {
+ mFitAssistant.viewController.setViewState(HWndCtrl.MODE_VIEW_ZOOM);
+ }
+
+ private void btnFitZoom_Click(object sender, EventArgs e)
+ {
+ mFitAssistant.viewController.resetWindow();
+ mFitAssistant.viewController.repaint();
+ }
+
+ private void BtnResetView_Click(object sender, EventArgs e)
+ {
+ mFitAssistant.viewController.resetAll();
+ mFitAssistant.viewController.repaint();
+ }
+
+ private void BtnLineRoi_Click(object sender, EventArgs e)
+ {
+ //鍏堟竻闄ゆ墍鏈塕OI
+ mFitAssistant.viewController.resetAll();
+ mFitAssistant.viewController.repaint();
+
+ mFitAssistant.roiController.setROIShape(roi2);
+ }
+
+ private void btnCircleRoi_Click(object sender, EventArgs e)
+ {
+ //鍏堟竻闄ゆ墍鏈塕OI
+ mFitAssistant.viewController.resetAll();
+ mFitAssistant.viewController.repaint();
+
+ mFitAssistant.roiController.setROIShape(roi);
+ }
+
+ public FitLineParam LineParam = new FitLineParam();
+
+ private void btnFitLine_Click(object sender, EventArgs e)
+ {
+ LinePosition linePosition = mFitAssistant.GetLinePosition();
+
+ if (linePosition == null)
+ {
+ linePosition = new LinePosition();
+ linePosition.hv_ColumnBegin = roi2.col1;
+ linePosition.hv_ColumnEnd = roi2.col2;
+ linePosition.hv_RowBegin = roi2.row1;
+ linePosition.hv_RowEnd = roi2.row2;
+ }
+
+ labRowBeginSet.Text = linePosition.hv_RowBegin.ToString();
+ labColumnBeginSet.Text = linePosition.hv_ColumnBegin.ToString();
+ labRowEndSet.Text = linePosition.hv_RowEnd.ToString();
+ labColumnEndSet.Text = linePosition.hv_ColumnEnd.ToString();
+
+ LineParam.hv_RowBegin = linePosition.hv_RowBegin;
+ LineParam.hv_ColumnBegin = linePosition.hv_ColumnBegin;
+ LineParam.hv_RowEnd = linePosition.hv_RowEnd;
+ LineParam.hv_ColumnEnd = linePosition.hv_ColumnEnd;
+
+ //LineParam.hv_measure_Length1 = fitLineParamSet.hv_measure_Length1;
+ //LineParam.hv_measure_Length2 = fitLineParamSet.hv_measure_Length2;
+ //LineParam.hv_measure_sigma = fitLineParamSet.hv_measure_sigma;
+ //LineParam.hv_measure_position = fitLineParamSet.hv_measure_position;
+ //LineParam.hv_measure_transition = fitLineParamSet.hv_measure_transition;
+ //LineParam.hv_measure_number = fitLineParamSet.hv_measure_number;
+ //LineParam.hv_measure_threshold = fitLineParamSet.hv_measure_threshold;
+ //LineParam.hv_measure_interpolation = fitLineParamSet.hv_measure_interpolation;
+
+ LineParam.hv_measure_Length1 = fitLineParamSet.hv_measure_Length1;
+ LineParam.hv_measure_Length2 = Convert.ToDouble(txtROIWidthSet.Text);
+ LineParam.hv_measure_sigma = Convert.ToDouble(txtSmoothingSet.Text);
+ LineParam.hv_measure_position = txtPositionSet.Text;
+ LineParam.hv_measure_transition = txtTransitionSet.Text;
+ LineParam.hv_measure_number = Convert.ToDouble(txtNumberSet.Text);
+ LineParam.hv_measure_threshold = Convert.ToDouble(txtMinEdgeAmplSet.Text);
+ LineParam.hv_measure_interpolation = txtInterpolationSet.Text;
+
+
+ //FitLineResult result;
+
+ mFitAssistant.FitLine(LineParam);
+ }
+
+ public FitCircleParam CircleParam = new FitCircleParam();
+
+ private void btnFitCircle_Click(object sender, EventArgs e)
+ {
+ CirclePosition circlePosition = mFitAssistant.GetCirClePosition();
+
+ if (circlePosition == null)
+ {
+ circlePosition = new CirclePosition();
+ circlePosition.hv_Column = roi.col1;
+ circlePosition.hv_Row = roi.row1;
+ circlePosition.hv_Radius = roi.radius;
+ }
+
+ labRowSet_Circle.Text = circlePosition.hv_Row.ToString();
+ labColumnSet_Circle.Text = circlePosition.hv_Column.ToString();
+ labRadiusSet_Circle.Text = circlePosition.hv_Radius.ToString();
+
+ CircleParam.hv_ColumnCenter = circlePosition.hv_Column;
+ CircleParam.hv_RowCenter = circlePosition.hv_Row;
+ CircleParam.hv_Radius = circlePosition.hv_Radius;
+
+ CircleParam.hv_measure_Length1 = fitCircleParamSet.hv_measure_Length1;
+ CircleParam.hv_measure_Length2 = fitCircleParamSet.hv_measure_Length2;
+ CircleParam.hv_measure_sigma = fitCircleParamSet.hv_measure_sigma;
+ CircleParam.hv_measure_position = fitCircleParamSet.hv_measure_position;
+ CircleParam.hv_measure_transition = fitCircleParamSet.hv_measure_transition;
+ CircleParam.hv_measure_number = fitCircleParamSet.hv_measure_number;
+ CircleParam.hv_measure_threshold = fitCircleParamSet.hv_measure_threshold;
+ CircleParam.hv_measure_interpolation = fitCircleParamSet.hv_measure_interpolation;
+
+ mFitAssistant.FitCircle(CircleParam);
+ }
+
+ HalconTools.MeasureParamSave fitLineParamSet;
+ private void btnLoadConfige_Line_Click(object sender, EventArgs e)
+ {
+ fitLineParamSet = new HalconTools.MeasureParamSave();
+ OpenFileDialog imagePath = new OpenFileDialog();
+ imagePath.Filter = "*.xml|*.xml";
+
+ if (imagePath.ShowDialog() == DialogResult.OK)
+ {
+
+ fitLineParamSet = fitLineParamSet.Load(imagePath.FileName);
+
+ showFitLineParam(fitLineParamSet);
+ }
+ }
+
+
+ private void showFitLineParam(HalconTools.MeasureParamSave param)
+ {
+ this.labMinEdgeAmplSet.Text = param.hv_measure_threshold.ToString();
+ this.labSmoothingSet.Text = param.hv_measure_sigma.ToString();
+ this.labInterpolationSet.Text = param.hv_measure_interpolation;
+ this.labTransitionSet.Text = param.hv_measure_transition;
+ this.labPositionSet.Text = param.hv_measure_position;
+ this.labNumberSet.Text = param.hv_measure_number.ToString();
+ this.labROIWidthSet.Text = param.hv_measure_Length2.ToString();
+ this.numUDRoiHeight.Value = Convert.ToDecimal( param.hv_measure_Length1);
+
+ this.txtMinEdgeAmplSet.Text = param.hv_measure_threshold.ToString();
+ this.txtSmoothingSet.Text = param.hv_measure_sigma.ToString();
+ this.txtInterpolationSet.Text = param.hv_measure_interpolation;
+ this.txtTransitionSet.Text = param.hv_measure_transition;
+ this.txtPositionSet.Text = param.hv_measure_position;
+ this.txtNumberSet.Text = param.hv_measure_number.ToString();
+ this.txtROIWidthSet.Text = param.hv_measure_Length2.ToString();
+ }
+
+ private void viewPort_HMouseDown(object sender, HMouseEventArgs e)
+ {
+ LinePosition linePosition = mFitAssistant.GetLinePosition();
+ CirclePosition circlePosition = mFitAssistant.GetCirClePosition();
+
+ if (linePosition != null && tabControl1.SelectedIndex == 0)
+ {
+ labRowBeginSet.Text = linePosition.hv_RowBegin.ToString();
+ labColumnBeginSet.Text = linePosition.hv_ColumnBegin.ToString();
+ labRowEndSet.Text = linePosition.hv_RowEnd.ToString();
+ labColumnEndSet.Text = linePosition.hv_ColumnEnd.ToString();
+ }
+ else
+ {
+ labRowBeginSet.Text = "-";
+ labColumnBeginSet.Text = "-";
+ labRowEndSet.Text = "-";
+ labColumnEndSet.Text = "-";
+ }
+
+ if (circlePosition != null && tabControl1.SelectedIndex == 1)
+ {
+ //labRowBeginSet.Text = linePosition.hv_RowBegin.ToString();
+ //labColumnBeginSet.Text = linePosition.hv_ColumnBegin.ToString();
+ //labRowEndSet.Text = linePosition.hv_RowEnd.ToString();
+ //labColumnEndSet.Text = linePosition.hv_ColumnEnd.ToString();
+ }
+ else
+ {
+ labRowBeginSet.Text = "-";
+ labColumnBeginSet.Text = "-";
+ labRowEndSet.Text = "-";
+ labColumnEndSet.Text = "-";
+ }
+
+ }
+
+ HalconTools.MeasureParamSave fitCircleParamSet;
+ private void btnLoadConfige_Circle_Click(object sender, EventArgs e)
+ {
+ fitCircleParamSet = new HalconTools.MeasureParamSave();
+ OpenFileDialog imagePath = new OpenFileDialog();
+ imagePath.Filter = "*.xml|*.xml";
+
+ if (imagePath.ShowDialog() == DialogResult.OK)
+ {
+ fitCircleParamSet = fitCircleParamSet.Load(imagePath.FileName);
+
+ showFitCircleParam(fitCircleParamSet);
+ }
+ }
+
+ private void showFitCircleParam(HalconTools.MeasureParamSave param)
+ {
+ this.labMinEdgeAmplSet_Circle.Text = param.hv_measure_threshold.ToString();
+ this.labSmoothingSet_Circle.Text = param.hv_measure_sigma.ToString();
+ this.labInterpolationSet_Circle.Text = param.hv_measure_interpolation;
+ this.labTransitionSet_Circle.Text = param.hv_measure_transition;
+ this.labPositionSet_Circle.Text = param.hv_measure_position;
+ this.labNumberSet_Circle.Text = param.hv_measure_number.ToString();
+ this.labROIWidthSet_Circle.Text = param.hv_measure_Length2.ToString();
+ this.numUDRoiHeight_Circle.Value = Convert.ToDecimal(param.hv_measure_Length1);
+ }
+
+ private void numUDRoiHeight_ValueChanged(object sender, EventArgs e)
+ {
+
+ }
+
+ private void btnParaAdd_Click(object sender, EventArgs e)
+ {
+ string Path = Application.StartupPath + "\\FitConfig";
+ if (!Directory.Exists(Path))
+ {
+ Directory.CreateDirectory(Path);
+ }
+ Path += "\\fitLineConfig.xml";
+
+ List<FitLineParam> flp = new List<FitLineParam>();
+ SerializeFileTool<List<FitLineParam>> cfg = new SerializeFileTool<List<FitLineParam>>();
+ flp = cfg.GetConfig(Path);
+
+ #region 鑾峰彇鍙傛暟
+ FitLineParam LineParam = new FitLineParam();
+
+ LineParam.hv_RowBegin = Convert.ToDouble(labRowBeginSet.Text);
+ LineParam.hv_ColumnBegin = Convert.ToDouble(labColumnBeginSet.Text);
+ LineParam.hv_RowEnd = Convert.ToDouble(labRowEndSet.Text);
+ LineParam.hv_ColumnEnd = Convert.ToDouble(labColumnEndSet.Text);
+
+ LineParam.hv_measure_Length1 = fitLineParamSet.hv_measure_Length1;
+ LineParam.hv_measure_Length2 = fitLineParamSet.hv_measure_Length2;
+ LineParam.hv_measure_sigma = fitLineParamSet.hv_measure_sigma;
+ LineParam.hv_measure_position = fitLineParamSet.hv_measure_position;
+ LineParam.hv_measure_transition = fitLineParamSet.hv_measure_transition;
+ LineParam.hv_measure_number = fitLineParamSet.hv_measure_number;
+ LineParam.hv_measure_threshold = fitLineParamSet.hv_measure_threshold;
+ LineParam.hv_measure_interpolation = fitLineParamSet.hv_measure_interpolation;
+ #endregion
+
+ if (flp == null) flp = new List<FitLineParam>();
+ flp.Add(LineParam);
+
+ cfg.SetConfig(Path, flp);
+ }
+
+ private void btnParaAdd_Circle_Click(object sender, EventArgs e)
+ {
+ string Path = Application.StartupPath + "\\FitConfig";
+ if (!Directory.Exists(Path))
+ {
+ Directory.CreateDirectory(Path);
+ }
+ Path += "\\fitCircleConfig.xml";
+
+ List<FitCircleParam> fcp = new List<FitCircleParam>();
+ SerializeFileTool<List<FitCircleParam>> cfg = new SerializeFileTool<List<FitCircleParam>>();
+ fcp = cfg.GetConfig(Path);
+
+ #region 鑾峰彇鍙傛暟
+ CirclePosition circlePosition = mFitAssistant.GetCirClePosition();
+ FitCircleParam CircleParam = new FitCircleParam();
+
+ CircleParam.hv_ColumnCenter = Convert.ToDouble(labColumnSet_Circle.Text);
+ CircleParam.hv_RowCenter = Convert.ToDouble(labRowSet_Circle.Text);
+ CircleParam.hv_Radius = Convert.ToDouble(labRadiusSet_Circle.Text);
+
+ CircleParam.hv_measure_Length1 = fitCircleParamSet.hv_measure_Length1;
+ CircleParam.hv_measure_Length2 = fitCircleParamSet.hv_measure_Length2;
+ CircleParam.hv_measure_sigma = fitCircleParamSet.hv_measure_sigma;
+ CircleParam.hv_measure_position = fitCircleParamSet.hv_measure_position;
+ CircleParam.hv_measure_transition = fitCircleParamSet.hv_measure_transition;
+ CircleParam.hv_measure_number = fitCircleParamSet.hv_measure_number;
+ CircleParam.hv_measure_threshold = fitCircleParamSet.hv_measure_threshold;
+ CircleParam.hv_measure_interpolation = fitCircleParamSet.hv_measure_interpolation;
+ #endregion
+
+ if (fcp == null) fcp = new List<FitCircleParam>();
+ fcp.Add(CircleParam);
+
+ cfg.SetConfig(Path, fcp);
+ }
+
+ private void btnFrmMeasure_Click(object sender, EventArgs e)
+ {
+ frmMeasureAssistant frmMeasure = new frmMeasureAssistant(mImage);
+ frmMeasure.ShowDialog();
+ }
+
+ }
+}
diff --git a/HalconTools/frmFitCircleAndLine.resx b/HalconTools/frmFitCircleAndLine.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/HalconTools/frmFitCircleAndLine.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
\ No newline at end of file
diff --git a/HalconTools/frmJobManager.Designer.cs b/HalconTools/frmJobManager.Designer.cs
new file mode 100644
index 0000000..e087db7
--- /dev/null
+++ b/HalconTools/frmJobManager.Designer.cs
@@ -0,0 +1,270 @@
+锘縩amespace HalconTools
+{
+ partial class frmJobManager
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.labTools = new System.Windows.Forms.Label();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.btnParaModify = new System.Windows.Forms.Button();
+ this.cmbToolType = new System.Windows.Forms.ComboBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.cmbTools = new System.Windows.Forms.ComboBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.btnSaveJobs = new System.Windows.Forms.Button();
+ this.btnDelTool = new System.Windows.Forms.Button();
+ this.btnAddTool = new System.Windows.Forms.Button();
+ this.cmbJobName = new System.Windows.Forms.ComboBox();
+ this.hWindowControl1 = new HalconDotNet.HWindowControl();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.btnAddJob = new System.Windows.Forms.Button();
+ this.txtJobName = new System.Windows.Forms.TextBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.btnLoadImage = new System.Windows.Forms.Button();
+ this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
+ this.groupBox1.SuspendLayout();
+ this.groupBox2.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // labTools
+ //
+ this.labTools.AutoSize = true;
+ this.labTools.Location = new System.Drawing.Point(18, 64);
+ this.labTools.Name = "labTools";
+ this.labTools.Size = new System.Drawing.Size(35, 12);
+ this.labTools.TabIndex = 1;
+ this.labTools.Text = "Tools";
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.btnParaModify);
+ this.groupBox1.Controls.Add(this.cmbToolType);
+ this.groupBox1.Controls.Add(this.label3);
+ this.groupBox1.Controls.Add(this.cmbTools);
+ this.groupBox1.Controls.Add(this.label2);
+ this.groupBox1.Controls.Add(this.btnSaveJobs);
+ this.groupBox1.Controls.Add(this.btnDelTool);
+ this.groupBox1.Controls.Add(this.btnAddTool);
+ this.groupBox1.Controls.Add(this.cmbJobName);
+ this.groupBox1.Controls.Add(this.labTools);
+ this.groupBox1.Location = new System.Drawing.Point(375, 17);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(320, 203);
+ this.groupBox1.TabIndex = 2;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Jobs";
+ //
+ // btnParaModify
+ //
+ this.btnParaModify.Location = new System.Drawing.Point(20, 136);
+ this.btnParaModify.Name = "btnParaModify";
+ this.btnParaModify.Size = new System.Drawing.Size(75, 34);
+ this.btnParaModify.TabIndex = 10;
+ this.btnParaModify.Text = "鍙傛暟淇敼";
+ this.btnParaModify.UseVisualStyleBackColor = true;
+ this.btnParaModify.Click += new System.EventHandler(this.btnParaModify_Click);
+ //
+ // cmbToolType
+ //
+ this.cmbToolType.FormattingEnabled = true;
+ this.cmbToolType.Location = new System.Drawing.Point(84, 100);
+ this.cmbToolType.Name = "cmbToolType";
+ this.cmbToolType.Size = new System.Drawing.Size(121, 20);
+ this.cmbToolType.TabIndex = 9;
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(18, 103);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(53, 12);
+ this.label3.TabIndex = 8;
+ this.label3.Text = "ToolType";
+ //
+ // cmbTools
+ //
+ this.cmbTools.FormattingEnabled = true;
+ this.cmbTools.Location = new System.Drawing.Point(84, 61);
+ this.cmbTools.Name = "cmbTools";
+ this.cmbTools.Size = new System.Drawing.Size(121, 20);
+ this.cmbTools.TabIndex = 7;
+ this.cmbTools.SelectedIndexChanged += new System.EventHandler(this.cmbTools_SelectedIndexChanged);
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(18, 23);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(23, 12);
+ this.label2.TabIndex = 6;
+ this.label2.Text = "Job";
+ //
+ // btnSaveJobs
+ //
+ this.btnSaveJobs.Location = new System.Drawing.Point(119, 136);
+ this.btnSaveJobs.Name = "btnSaveJobs";
+ this.btnSaveJobs.Size = new System.Drawing.Size(75, 34);
+ this.btnSaveJobs.TabIndex = 5;
+ this.btnSaveJobs.Text = "淇濆瓨淇敼";
+ this.btnSaveJobs.UseVisualStyleBackColor = true;
+ this.btnSaveJobs.Click += new System.EventHandler(this.btnSaveJobs_Click);
+ //
+ // btnDelTool
+ //
+ this.btnDelTool.Location = new System.Drawing.Point(223, 65);
+ this.btnDelTool.Name = "btnDelTool";
+ this.btnDelTool.Size = new System.Drawing.Size(75, 35);
+ this.btnDelTool.TabIndex = 4;
+ this.btnDelTool.Text = "Del Tool";
+ this.btnDelTool.UseVisualStyleBackColor = true;
+ this.btnDelTool.Click += new System.EventHandler(this.btnDelTool_Click);
+ //
+ // btnAddTool
+ //
+ this.btnAddTool.Location = new System.Drawing.Point(223, 23);
+ this.btnAddTool.Name = "btnAddTool";
+ this.btnAddTool.Size = new System.Drawing.Size(75, 36);
+ this.btnAddTool.TabIndex = 3;
+ this.btnAddTool.Text = "Add Tool";
+ this.btnAddTool.UseVisualStyleBackColor = true;
+ this.btnAddTool.Click += new System.EventHandler(this.btnAddTool_Click);
+ //
+ // cmbJobName
+ //
+ this.cmbJobName.FormattingEnabled = true;
+ this.cmbJobName.Location = new System.Drawing.Point(84, 23);
+ this.cmbJobName.Name = "cmbJobName";
+ this.cmbJobName.Size = new System.Drawing.Size(121, 20);
+ this.cmbJobName.TabIndex = 2;
+ this.cmbJobName.SelectedIndexChanged += new System.EventHandler(this.cmbJobName_SelectedIndexChanged);
+ //
+ // hWindowControl1
+ //
+ this.hWindowControl1.BackColor = System.Drawing.Color.Black;
+ this.hWindowControl1.BorderColor = System.Drawing.Color.Black;
+ this.hWindowControl1.ImagePart = new System.Drawing.Rectangle(0, 0, 640, 480);
+ this.hWindowControl1.Location = new System.Drawing.Point(12, 17);
+ this.hWindowControl1.Name = "hWindowControl1";
+ this.hWindowControl1.Size = new System.Drawing.Size(357, 315);
+ this.hWindowControl1.TabIndex = 3;
+ this.hWindowControl1.WindowSize = new System.Drawing.Size(357, 315);
+ //
+ // groupBox2
+ //
+ this.groupBox2.Controls.Add(this.btnAddJob);
+ this.groupBox2.Controls.Add(this.txtJobName);
+ this.groupBox2.Controls.Add(this.label1);
+ this.groupBox2.Location = new System.Drawing.Point(375, 232);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(320, 100);
+ this.groupBox2.TabIndex = 4;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "new Job";
+ //
+ // btnAddJob
+ //
+ this.btnAddJob.Location = new System.Drawing.Point(223, 38);
+ this.btnAddJob.Name = "btnAddJob";
+ this.btnAddJob.Size = new System.Drawing.Size(75, 23);
+ this.btnAddJob.TabIndex = 2;
+ this.btnAddJob.Text = "Add Job";
+ this.btnAddJob.UseVisualStyleBackColor = true;
+ this.btnAddJob.Click += new System.EventHandler(this.btnAddJob_Click);
+ //
+ // txtJobName
+ //
+ this.txtJobName.Location = new System.Drawing.Point(94, 40);
+ this.txtJobName.Name = "txtJobName";
+ this.txtJobName.Size = new System.Drawing.Size(100, 21);
+ this.txtJobName.TabIndex = 1;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(21, 43);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(53, 12);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "Job Name";
+ //
+ // btnLoadImage
+ //
+ this.btnLoadImage.Location = new System.Drawing.Point(12, 349);
+ this.btnLoadImage.Name = "btnLoadImage";
+ this.btnLoadImage.Size = new System.Drawing.Size(75, 23);
+ this.btnLoadImage.TabIndex = 5;
+ this.btnLoadImage.Text = "鍔犺浇鍥剧墖";
+ this.btnLoadImage.UseVisualStyleBackColor = true;
+ this.btnLoadImage.Click += new System.EventHandler(this.btnLoadImage_Click);
+ //
+ // openFileDialog1
+ //
+ this.openFileDialog1.FileName = "openFileDialog1";
+ //
+ // frmJobManager
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(745, 399);
+ this.Controls.Add(this.btnLoadImage);
+ this.Controls.Add(this.groupBox2);
+ this.Controls.Add(this.hWindowControl1);
+ this.Controls.Add(this.groupBox1);
+ this.Name = "frmJobManager";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "frmJobManager";
+ this.Load += new System.EventHandler(this.frmJobManager_Load);
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ this.groupBox2.ResumeLayout(false);
+ this.groupBox2.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label labTools;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.ComboBox cmbJobName;
+ private System.Windows.Forms.Button btnDelTool;
+ private System.Windows.Forms.Button btnAddTool;
+ private HalconDotNet.HWindowControl hWindowControl1;
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Button btnAddJob;
+ private System.Windows.Forms.TextBox txtJobName;
+ private System.Windows.Forms.Button btnSaveJobs;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.ComboBox cmbTools;
+ private System.Windows.Forms.ComboBox cmbToolType;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Button btnParaModify;
+ private System.Windows.Forms.Button btnLoadImage;
+ private System.Windows.Forms.OpenFileDialog openFileDialog1;
+ }
+}
\ No newline at end of file
diff --git a/HalconTools/frmJobManager.cs b/HalconTools/frmJobManager.cs
new file mode 100644
index 0000000..adbfa89
--- /dev/null
+++ b/HalconTools/frmJobManager.cs
@@ -0,0 +1,237 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.IO;
+using HalconDotNet;
+
+
+namespace HalconTools
+{
+ public partial class frmJobManager : Form
+ {
+ public SerializeFileTool<List<Job>> sft = new SerializeFileTool<List<Job>>();
+ public List<Job> jobs = new List<Job>();
+ public HImage MainImage = null;
+
+ public frmJobManager()
+ {
+ InitializeComponent();
+ }
+
+ private void btnAddJob_Click(object sender, EventArgs e)
+ {
+ Job job = new Job();
+ job.name = txtJobName.Text;
+ job.tools = new List<JobTool>();
+ JobTool jobTool = new JobTool();
+ jobTool.type = ToolType.FindLine;
+ job.tools.Add(jobTool);
+ jobs.Add(job);
+
+ string path = Application.StartupPath + "\\JobConfige";
+ if (!Directory.Exists(path)) Directory.CreateDirectory(path);
+ path += "\\JobConfige.xml";
+
+ sft.SetConfig(path, jobs);
+
+ InitData();
+ }
+
+ private void InitData()
+ {
+ cmbTools.Items.Clear();
+ cmbToolType.Items.Clear();
+ cmbJobName.Items.Clear();
+
+ for (int i = 0; i < 4; i++)
+ {
+ cmbToolType.Items.Add((ToolType)i);
+ }
+
+ jobs = sft.GetConfig(Application.StartupPath + "\\JobConfige\\JobConfige.xml");
+ for (int i = 0; i < jobs.Count; i++)
+ {
+ cmbJobName.Items.Add(jobs[i].name);
+ }
+ for (int i = 0; i < jobs[0].tools.Count; i++)
+ {
+ cmbTools.Items.Add(i);
+ }
+
+ cmbJobName.SelectedIndex = 0;
+ cmbTools.SelectedIndex = 0;
+
+ cmbToolType.SelectedIndex = (int)jobs[0].tools[0].type;
+ }
+
+ private void InitData(int jobNo,int toolNo)
+ {
+ cmbTools.Items.Clear();
+ cmbToolType.Items.Clear();
+ cmbJobName.Items.Clear();
+
+ for (int i = 0; i < 4; i++)
+ {
+ cmbToolType.Items.Add((ToolType)i);
+ }
+ jobs = sft.GetConfig(Application.StartupPath + "\\JobConfige\\JobConfige.xml");
+
+ for (int i = 0; i < jobs.Count; i++)
+ {
+ cmbJobName.Items.Add(jobs[i].name);
+ }
+ for (int i = 0; i < jobs[0].tools.Count; i++)
+ {
+ cmbTools.Items.Add(i);
+ }
+
+ cmbJobName.SelectedIndex = jobNo;
+ cmbTools.SelectedIndex = toolNo;
+
+ cmbToolType.SelectedIndex = (int)jobs[jobNo].tools[toolNo].type;
+ }
+
+ private void frmJobManager_Load(object sender, EventArgs e)
+ {
+ InitData();
+ }
+
+ private void cmbTools_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ int JobNo = cmbJobName.SelectedIndex;
+ int ToolNo = cmbTools.SelectedIndex;
+ cmbToolType .SelectedIndex =(int)jobs[JobNo].tools[ToolNo].type ;
+ }
+
+ private void cmbJobName_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ int JobNo = cmbJobName.SelectedIndex;
+
+ cmbTools.Items.Clear();
+ for (int i = 0; i < jobs[JobNo].tools.Count; i++)
+ {
+ cmbTools.Items.Add(i);
+ }
+ cmbTools.SelectedIndex = 0;
+ cmbToolType.SelectedIndex = (int)jobs[JobNo].tools[0].type;
+ }
+
+ private void btnParaModify_Click(object sender, EventArgs e)
+ {
+ int JobNo = cmbJobName.SelectedIndex;
+ int ToolNo = cmbTools.SelectedIndex;
+ JobTool tmpTool = new JobTool();
+ tmpTool.type = (ToolType)cmbToolType.SelectedIndex;
+ tmpTool.fitCircleParam = jobs[JobNo].tools[ToolNo].fitCircleParam;
+ tmpTool.fitLineParam = jobs[JobNo].tools[ToolNo].fitLineParam;
+ tmpTool.matchingParam = jobs[JobNo].tools[ToolNo].matchingParam;
+ tmpTool.modelPath = jobs[JobNo].tools[ToolNo].modelPath;
+ tmpTool.screwParam = jobs[JobNo].tools[ToolNo].screwParam;
+
+ switch (tmpTool.type)
+ {
+ case ToolType.FindLine:
+
+ if (MainImage == null) return;
+ frmFitCircleAndLine frmfit = new frmFitCircleAndLine(tmpTool, MainImage);
+ frmfit.ShowDialog();
+
+ tmpTool.fitCircleParam = null;
+ tmpTool.fitLineParam = null;
+ tmpTool.matchingParam = null;
+ tmpTool.modelPath = null;
+ tmpTool.fitLineParam = frmfit.LineParam;
+ tmpTool.screwParam = null;
+
+ break;
+
+ case ToolType.FindCircle:
+
+ if (MainImage == null) return;
+ frmFitCircleAndLine frmfit1 = new frmFitCircleAndLine(tmpTool, MainImage);
+ frmfit1.ShowDialog();
+
+ tmpTool.fitCircleParam = null;
+ tmpTool.fitLineParam = null;
+ tmpTool.matchingParam = null;
+ tmpTool.modelPath = null;
+ tmpTool.fitCircleParam = frmfit1.CircleParam;
+ tmpTool.screwParam = null;
+
+ break;
+
+ case ToolType.Matching:
+ break;
+
+ case ToolType.Screw :
+
+ if (MainImage == null) return;
+ frmScrewAssistant frmScrew = new frmScrewAssistant(tmpTool, MainImage);
+ frmScrew.ShowDialog();
+
+ tmpTool.fitCircleParam = null;
+ tmpTool.fitLineParam = null;
+ tmpTool.matchingParam = null;
+ tmpTool.modelPath = null;
+ tmpTool.fitCircleParam = null;
+ tmpTool.screwParam = frmScrew.mScrewPara;
+
+ break;
+ }
+
+ jobs[JobNo].tools[ToolNo] = tmpTool;
+ }
+
+ private void btnSaveJobs_Click(object sender, EventArgs e)
+ {
+ sft.SetConfig(Application.StartupPath + "\\JobConfige\\JobConfige.xml", jobs);
+ }
+
+ private void btnAddTool_Click(object sender, EventArgs e)
+ {
+ JobTool tool = new JobTool();
+ tool.type = ToolType.FindLine;
+
+ int JobNo = cmbJobName.SelectedIndex;
+ jobs[JobNo].tools.Add(tool);
+
+ sft.SetConfig(Application.StartupPath + "\\JobConfige\\JobConfige.xml", jobs);
+
+ InitData(JobNo, jobs[JobNo].tools.Count - 1);
+ }
+
+ private void btnDelTool_Click(object sender, EventArgs e)
+ {
+ int JobNo = cmbJobName.SelectedIndex;
+ int ToolNo = cmbTools.SelectedIndex;
+
+ jobs[JobNo].tools.RemoveAt(ToolNo);
+
+ sft.SetConfig(Application.StartupPath + "\\JobConfige\\JobConfige.xml", jobs);
+
+ InitData();
+ }
+
+ private void btnLoadImage_Click(object sender, EventArgs e)
+ {
+ OpenFileDialog imagePath = new OpenFileDialog();
+ imagePath.Filter = "*.jpg,*.jpeg,*.bmp,*.gif,*.ico,*.png,*.tif,*.wmf|*.jpg;*.jpeg;*.bmp;*.gif;*.ico;*.png;*.tif;*.wmf";
+
+ if (imagePath.ShowDialog() == DialogResult.OK)
+ {
+ MainImage = new HImage(imagePath.FileName);
+
+ HTuple imageWidth = null, imageHeight = null;
+ HOperatorSet.GetImageSize(MainImage, out imageWidth, out imageHeight);
+ HOperatorSet.SetPart(hWindowControl1.HalconWindow, 0, 0, imageHeight - 1, imageWidth - 1);
+ HOperatorSet.DispObj(MainImage, hWindowControl1.HalconWindow);
+ }
+
+ }
+ }
+}
diff --git a/HalconTools/frmJobManager.resx b/HalconTools/frmJobManager.resx
new file mode 100644
index 0000000..6e58fa8
--- /dev/null
+++ b/HalconTools/frmJobManager.resx
@@ -0,0 +1,123 @@
+<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="openFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+</root>
\ No newline at end of file
diff --git a/HalconTools/frmMain.Designer.cs b/HalconTools/frmMain.Designer.cs
new file mode 100644
index 0000000..08fe566
--- /dev/null
+++ b/HalconTools/frmMain.Designer.cs
@@ -0,0 +1,194 @@
+锘縩amespace HalconTools
+{
+ partial class frmMain
+ {
+ /// <summary>
+ /// 蹇呴渶鐨勮璁″櫒鍙橀噺銆�
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// 娓呯悊鎵�鏈夋鍦ㄤ娇鐢ㄧ殑璧勬簮銆�
+ /// </summary>
+ /// <param name="disposing">濡傛灉搴旈噴鏀炬墭绠¤祫婧愶紝涓� true锛涘惁鍒欎负 false銆�</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows 绐椾綋璁捐鍣ㄧ敓鎴愮殑浠g爜
+
+ /// <summary>
+ /// 璁捐鍣ㄦ敮鎸佹墍闇�鐨勬柟娉� - 涓嶈
+ /// 浣跨敤浠g爜缂栬緫鍣ㄤ慨鏀规鏂规硶鐨勫唴瀹广��
+ /// </summary>
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain));
+ this.button1 = new System.Windows.Forms.Button();
+ this.button2 = new System.Windows.Forms.Button();
+ this.button3 = new System.Windows.Forms.Button();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.rbChinese = new System.Windows.Forms.RadioButton();
+ this.rbEnglish = new System.Windows.Forms.RadioButton();
+ this.hWindowControl1 = new HalconDotNet.HWindowControl();
+ this.button4 = new System.Windows.Forms.Button();
+ this.button5 = new System.Windows.Forms.Button();
+ this.button6 = new System.Windows.Forms.Button();
+ this.button7 = new System.Windows.Forms.Button();
+ this.button8 = new System.Windows.Forms.Button();
+ this.button9 = new System.Windows.Forms.Button();
+ this.btnCalibrationForm = new System.Windows.Forms.Button();
+ this.groupBox1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // button1
+ //
+ resources.ApplyResources(this.button1, "button1");
+ this.button1.Name = "button1";
+ this.button1.UseVisualStyleBackColor = true;
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
+ // button2
+ //
+ resources.ApplyResources(this.button2, "button2");
+ this.button2.Name = "button2";
+ this.button2.UseVisualStyleBackColor = true;
+ this.button2.Click += new System.EventHandler(this.button2_Click);
+ //
+ // button3
+ //
+ resources.ApplyResources(this.button3, "button3");
+ this.button3.Name = "button3";
+ this.button3.UseVisualStyleBackColor = true;
+ this.button3.Click += new System.EventHandler(this.button3_Click);
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.rbChinese);
+ this.groupBox1.Controls.Add(this.rbEnglish);
+ resources.ApplyResources(this.groupBox1, "groupBox1");
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.TabStop = false;
+ //
+ // rbChinese
+ //
+ resources.ApplyResources(this.rbChinese, "rbChinese");
+ this.rbChinese.Checked = true;
+ this.rbChinese.Name = "rbChinese";
+ this.rbChinese.TabStop = true;
+ this.rbChinese.UseVisualStyleBackColor = true;
+ this.rbChinese.CheckedChanged += new System.EventHandler(this.rbChinese_CheckedChanged);
+ //
+ // rbEnglish
+ //
+ resources.ApplyResources(this.rbEnglish, "rbEnglish");
+ this.rbEnglish.Name = "rbEnglish";
+ this.rbEnglish.UseVisualStyleBackColor = true;
+ this.rbEnglish.CheckedChanged += new System.EventHandler(this.rbEnglish_CheckedChanged);
+ //
+ // hWindowControl1
+ //
+ this.hWindowControl1.BackColor = System.Drawing.Color.Black;
+ this.hWindowControl1.BorderColor = System.Drawing.Color.Black;
+ this.hWindowControl1.ImagePart = new System.Drawing.Rectangle(0, 0, 640, 480);
+ resources.ApplyResources(this.hWindowControl1, "hWindowControl1");
+ this.hWindowControl1.Name = "hWindowControl1";
+ this.hWindowControl1.WindowSize = new System.Drawing.Size(592, 448);
+ //
+ // button4
+ //
+ resources.ApplyResources(this.button4, "button4");
+ this.button4.Name = "button4";
+ this.button4.UseVisualStyleBackColor = true;
+ this.button4.Click += new System.EventHandler(this.button4_Click);
+ //
+ // button5
+ //
+ resources.ApplyResources(this.button5, "button5");
+ this.button5.Name = "button5";
+ this.button5.UseVisualStyleBackColor = true;
+ this.button5.Click += new System.EventHandler(this.button5_Click);
+ //
+ // button6
+ //
+ resources.ApplyResources(this.button6, "button6");
+ this.button6.Name = "button6";
+ this.button6.UseVisualStyleBackColor = true;
+ this.button6.Click += new System.EventHandler(this.button6_Click);
+ //
+ // button7
+ //
+ resources.ApplyResources(this.button7, "button7");
+ this.button7.Name = "button7";
+ this.button7.UseVisualStyleBackColor = true;
+ this.button7.Click += new System.EventHandler(this.button7_Click);
+ //
+ // button8
+ //
+ resources.ApplyResources(this.button8, "button8");
+ this.button8.Name = "button8";
+ this.button8.UseVisualStyleBackColor = true;
+ this.button8.Click += new System.EventHandler(this.button8_Click);
+ //
+ // button9
+ //
+ resources.ApplyResources(this.button9, "button9");
+ this.button9.Name = "button9";
+ this.button9.UseVisualStyleBackColor = true;
+ this.button9.Click += new System.EventHandler(this.button9_Click);
+ //
+ // btnCalibrationForm
+ //
+ resources.ApplyResources(this.btnCalibrationForm, "btnCalibrationForm");
+ this.btnCalibrationForm.Name = "btnCalibrationForm";
+ this.btnCalibrationForm.UseVisualStyleBackColor = true;
+ this.btnCalibrationForm.Click += new System.EventHandler(this.btnCalibrationForm_Click);
+ //
+ // frmMain
+ //
+ resources.ApplyResources(this, "$this");
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.btnCalibrationForm);
+ this.Controls.Add(this.button9);
+ this.Controls.Add(this.button8);
+ this.Controls.Add(this.button7);
+ this.Controls.Add(this.button6);
+ this.Controls.Add(this.button5);
+ this.Controls.Add(this.button4);
+ this.Controls.Add(this.hWindowControl1);
+ this.Controls.Add(this.groupBox1);
+ this.Controls.Add(this.button3);
+ this.Controls.Add(this.button2);
+ this.Controls.Add(this.button1);
+ this.Name = "frmMain";
+ this.Load += new System.EventHandler(this.frmMain_Load);
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.Button button2;
+ private System.Windows.Forms.Button button3;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.RadioButton rbChinese;
+ private System.Windows.Forms.RadioButton rbEnglish;
+ private HalconDotNet.HWindowControl hWindowControl1;
+ private System.Windows.Forms.Button button4;
+ private System.Windows.Forms.Button button5;
+ private System.Windows.Forms.Button button6;
+ private System.Windows.Forms.Button button7;
+ private System.Windows.Forms.Button button8;
+ private System.Windows.Forms.Button button9;
+ private System.Windows.Forms.Button btnCalibrationForm;
+ }
+}
+
diff --git a/HalconTools/frmMain.cs b/HalconTools/frmMain.cs
new file mode 100644
index 0000000..fb0848c
--- /dev/null
+++ b/HalconTools/frmMain.cs
@@ -0,0 +1,159 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public partial class frmMain : Form
+ {
+ public HImage mainImage;
+ public HWndCtrl viewController;
+
+ public HalconTool ht = new HalconTool();
+
+ public frmMain()
+ {
+ InitializeComponent();
+ }
+
+ private void frmMain_Load(object sender, EventArgs e)
+ {
+ //mainImage = new HImage();
+ //viewController = new HWndCtrl(hWindowControl1);
+ //viewController.resetAll();
+ //viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
+ //viewController.addIconicVar(mainImage);
+ //viewController.repaint();
+
+ ht.resultCreater.ListenEvent += new EventHandler<ListenEventArgs>(resultCreater_ListenEvent);
+ }
+
+ void resultCreater_ListenEvent(object sender, ListenEventArgs e)
+ {
+ string str = e.IData.Data.ToString();
+
+ switch (str)
+ {
+ case "MatchDone":
+ MessageBox.Show("Match Successfully");
+ break;
+
+ case "FindLineDone":
+ MessageBox.Show("Fit Line Successfully");
+ break;
+
+ case "FindCircleDone":
+ MessageBox.Show("Fit Circle Successfully");
+ break;
+ }
+ }
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ frmFitCircleAndLine fitForm = new frmFitCircleAndLine(Language);
+ fitForm.ShowDialog();
+ }
+
+ private void button2_Click(object sender, EventArgs e)
+ {
+ frmMeasureAssistant measureForm = new frmMeasureAssistant();
+ measureForm.ShowDialog();
+ }
+
+ private void button3_Click(object sender, EventArgs e)
+ {
+ frmMatchingAssistant matchForm = new frmMatchingAssistant();
+ matchForm.ShowDialog();
+ }
+
+ string Language = "zh-CN";
+ private void rbChinese_CheckedChanged(object sender, EventArgs e)
+ {
+ Language = "zh-CN";
+ }
+
+ private void rbEnglish_CheckedChanged(object sender, EventArgs e)
+ {
+ Language = "en-US";
+ }
+
+ private void button4_Click(object sender, EventArgs e)
+ {
+ ht.LoadMatchingParameter(Application.StartupPath + "\\MatchingConfige\\MatchingConfige.xml");
+ ht.PatterMatchWithModule("test1", mainImage, ht.matchingPara, @"C:\Users\Swbuild\Desktop\1111.shm");
+ }
+
+ private void button5_Click(object sender, EventArgs e)
+ {
+ ht.LoadFitLineParameter(Application.StartupPath + "\\MeasureConfige\\MeasureConfige.xml");
+
+ //----------------------------------------------------------------------------------
+ MessageBox.Show("璇风敾鐩寸嚎");
+
+ hWindowControl1.Focus();
+ HTuple hv_Row1 = null, hv_Column1 = null, hv_Row2 = null, hv_Column2 = null;
+ HOperatorSet.DrawLine(hWindowControl1.HalconWindow, out hv_Row1, out hv_Column1, out hv_Row2, out hv_Column2);
+
+ MessageBox.Show(hv_Row1.ToString() + "," + hv_Column1.ToString() + "," + hv_Row2.ToString() + "," + hv_Column2.ToString());
+ //-----------------------------------------------------------------------------------
+
+ ht.fitLinePara.hv_RowBegin = hv_Row1.D;
+ ht.fitLinePara.hv_RowEnd = hv_Row2.D;
+ ht.fitLinePara.hv_ColumnBegin = hv_Column1.D;
+ ht.fitLinePara.hv_ColumnEnd = hv_Column2.D;
+
+ ht.ThreadFindLine("test", mainImage, ht.fitLinePara);
+
+ }
+
+ private void button6_Click(object sender, EventArgs e)
+ {
+ ht.LoadFitCircleParameter(Application.StartupPath + "\\MeasureConfige\\MeasureConfige.xml");
+
+ //----------------------------------------------------------------------------------
+ MessageBox.Show("璇风敾鍦�");
+
+ hWindowControl1.Focus();
+ HTuple hv_Row = null, hv_Column = null, hv_Radius = null;
+ HOperatorSet.DrawCircle(hWindowControl1.HalconWindow, out hv_Row, out hv_Column,out hv_Radius);
+
+ MessageBox.Show(hv_Row.ToString() + "," + hv_Column.ToString() + "," + hv_Radius.ToString());
+ //-----------------------------------------------------------------------------------
+
+ ht.fitCirclePara.hv_ColumnCenter = hv_Column;
+ ht.fitCirclePara.hv_RowCenter = hv_Row;
+ ht.fitCirclePara.hv_Radius = hv_Radius;
+
+ ht.FindCircle("test", mainImage, ht.fitCirclePara);
+ }
+
+ private void button7_Click(object sender, EventArgs e)
+ {
+ frmJobManager frmJob = new frmJobManager();
+ frmJob.ShowDialog();
+ }
+
+ private void button8_Click(object sender, EventArgs e)
+ {
+ frmContourAssistant frmContour = new frmContourAssistant();
+ frmContour.ShowDialog();
+ }
+
+ private void button9_Click(object sender, EventArgs e)
+ {
+ frmScrewAssistant frmScrew = new frmScrewAssistant();
+ frmScrew.ShowDialog();
+ }
+
+ private void btnCalibrationForm_Click(object sender, EventArgs e)
+ {
+ frmCalibration frmCalib = new frmCalibration();
+ frmCalib.ShowDialog();
+ }
+ }
+}
diff --git a/HalconTools/frmMain.resx b/HalconTools/frmMain.resx
new file mode 100644
index 0000000..3aeb6ff
--- /dev/null
+++ b/HalconTools/frmMain.resx
@@ -0,0 +1,479 @@
+<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="button1.Location" type="System.Drawing.Point, System.Drawing">
+ <value>620, 72</value>
+ </data>
+ <data name="button1.Size" type="System.Drawing.Size, System.Drawing">
+ <value>80, 40</value>
+ </data>
+ <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <data name="button1.TabIndex" type="System.Int32, mscorlib">
+ <value>0</value>
+ </data>
+ <data name="button1.Text" xml:space="preserve">
+ <value>Fit Form</value>
+ </data>
+ <data name=">>button1.Name" xml:space="preserve">
+ <value>button1</value>
+ </data>
+ <data name=">>button1.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>button1.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>button1.ZOrder" xml:space="preserve">
+ <value>11</value>
+ </data>
+ <data name="button2.Location" type="System.Drawing.Point, System.Drawing">
+ <value>706, 72</value>
+ </data>
+ <data name="button2.Size" type="System.Drawing.Size, System.Drawing">
+ <value>80, 40</value>
+ </data>
+ <data name="button2.TabIndex" type="System.Int32, mscorlib">
+ <value>1</value>
+ </data>
+ <data name="button2.Text" xml:space="preserve">
+ <value>Measure Form</value>
+ </data>
+ <data name=">>button2.Name" xml:space="preserve">
+ <value>button2</value>
+ </data>
+ <data name=">>button2.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>button2.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>button2.ZOrder" xml:space="preserve">
+ <value>10</value>
+ </data>
+ <data name="button3.Location" type="System.Drawing.Point, System.Drawing">
+ <value>792, 72</value>
+ </data>
+ <data name="button3.Size" type="System.Drawing.Size, System.Drawing">
+ <value>80, 40</value>
+ </data>
+ <data name="button3.TabIndex" type="System.Int32, mscorlib">
+ <value>2</value>
+ </data>
+ <data name="button3.Text" xml:space="preserve">
+ <value>Match Form</value>
+ </data>
+ <data name=">>button3.Name" xml:space="preserve">
+ <value>button3</value>
+ </data>
+ <data name=">>button3.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>button3.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>button3.ZOrder" xml:space="preserve">
+ <value>9</value>
+ </data>
+ <data name="rbChinese.AutoSize" type="System.Boolean, mscorlib">
+ <value>True</value>
+ </data>
+ <data name="rbChinese.Location" type="System.Drawing.Point, System.Drawing">
+ <value>152, 27</value>
+ </data>
+ <data name="rbChinese.Size" type="System.Drawing.Size, System.Drawing">
+ <value>47, 16</value>
+ </data>
+ <data name="rbChinese.TabIndex" type="System.Int32, mscorlib">
+ <value>1</value>
+ </data>
+ <data name="rbChinese.Text" xml:space="preserve">
+ <value>涓枃</value>
+ </data>
+ <data name=">>rbChinese.Name" xml:space="preserve">
+ <value>rbChinese</value>
+ </data>
+ <data name=">>rbChinese.Type" xml:space="preserve">
+ <value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>rbChinese.Parent" xml:space="preserve">
+ <value>groupBox1</value>
+ </data>
+ <data name=">>rbChinese.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <data name="rbEnglish.AutoSize" type="System.Boolean, mscorlib">
+ <value>True</value>
+ </data>
+ <data name="rbEnglish.Location" type="System.Drawing.Point, System.Drawing">
+ <value>33, 27</value>
+ </data>
+ <data name="rbEnglish.Size" type="System.Drawing.Size, System.Drawing">
+ <value>65, 16</value>
+ </data>
+ <data name="rbEnglish.TabIndex" type="System.Int32, mscorlib">
+ <value>0</value>
+ </data>
+ <data name="rbEnglish.Text" xml:space="preserve">
+ <value>English</value>
+ </data>
+ <data name=">>rbEnglish.Name" xml:space="preserve">
+ <value>rbEnglish</value>
+ </data>
+ <data name=">>rbEnglish.Type" xml:space="preserve">
+ <value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>rbEnglish.Parent" xml:space="preserve">
+ <value>groupBox1</value>
+ </data>
+ <data name=">>rbEnglish.ZOrder" xml:space="preserve">
+ <value>1</value>
+ </data>
+ <data name="groupBox1.Location" type="System.Drawing.Point, System.Drawing">
+ <value>620, 12</value>
+ </data>
+ <data name="groupBox1.Size" type="System.Drawing.Size, System.Drawing">
+ <value>252, 54</value>
+ </data>
+ <data name="groupBox1.TabIndex" type="System.Int32, mscorlib">
+ <value>3</value>
+ </data>
+ <data name="groupBox1.Text" xml:space="preserve">
+ <value>Language</value>
+ </data>
+ <data name=">>groupBox1.Name" xml:space="preserve">
+ <value>groupBox1</value>
+ </data>
+ <data name=">>groupBox1.Type" xml:space="preserve">
+ <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>groupBox1.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>groupBox1.ZOrder" xml:space="preserve">
+ <value>8</value>
+ </data>
+ <data name="hWindowControl1.Location" type="System.Drawing.Point, System.Drawing">
+ <value>12, 12</value>
+ </data>
+ <data name="hWindowControl1.Size" type="System.Drawing.Size, System.Drawing">
+ <value>592, 448</value>
+ </data>
+ <data name="hWindowControl1.TabIndex" type="System.Int32, mscorlib">
+ <value>4</value>
+ </data>
+ <data name=">>hWindowControl1.Name" xml:space="preserve">
+ <value>hWindowControl1</value>
+ </data>
+ <data name=">>hWindowControl1.Type" xml:space="preserve">
+ <value>HalconDotNet.HWindowControl, halcondotnetxl, Version=11.0.1.0, Culture=neutral, PublicKeyToken=4973bed59ddbf2b8</value>
+ </data>
+ <data name=">>hWindowControl1.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>hWindowControl1.ZOrder" xml:space="preserve">
+ <value>7</value>
+ </data>
+ <data name="button4.Location" type="System.Drawing.Point, System.Drawing">
+ <value>776, 423</value>
+ </data>
+ <data name="button4.Size" type="System.Drawing.Size, System.Drawing">
+ <value>94, 40</value>
+ </data>
+ <data name="button4.TabIndex" type="System.Int32, mscorlib">
+ <value>5</value>
+ </data>
+ <data name="button4.Text" xml:space="preserve">
+ <value>鍖归厤</value>
+ </data>
+ <data name=">>button4.Name" xml:space="preserve">
+ <value>button4</value>
+ </data>
+ <data name=">>button4.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>button4.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>button4.ZOrder" xml:space="preserve">
+ <value>6</value>
+ </data>
+ <data name="button5.Location" type="System.Drawing.Point, System.Drawing">
+ <value>776, 377</value>
+ </data>
+ <data name="button5.Size" type="System.Drawing.Size, System.Drawing">
+ <value>94, 40</value>
+ </data>
+ <data name="button5.TabIndex" type="System.Int32, mscorlib">
+ <value>6</value>
+ </data>
+ <data name="button5.Text" xml:space="preserve">
+ <value>鎵剧洿绾�</value>
+ </data>
+ <data name=">>button5.Name" xml:space="preserve">
+ <value>button5</value>
+ </data>
+ <data name=">>button5.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>button5.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>button5.ZOrder" xml:space="preserve">
+ <value>5</value>
+ </data>
+ <data name="button6.Location" type="System.Drawing.Point, System.Drawing">
+ <value>776, 331</value>
+ </data>
+ <data name="button6.Size" type="System.Drawing.Size, System.Drawing">
+ <value>96, 40</value>
+ </data>
+ <data name="button6.TabIndex" type="System.Int32, mscorlib">
+ <value>7</value>
+ </data>
+ <data name="button6.Text" xml:space="preserve">
+ <value>鎵惧渾</value>
+ </data>
+ <data name=">>button6.Name" xml:space="preserve">
+ <value>button6</value>
+ </data>
+ <data name=">>button6.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>button6.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>button6.ZOrder" xml:space="preserve">
+ <value>4</value>
+ </data>
+ <data name="button7.Location" type="System.Drawing.Point, System.Drawing">
+ <value>620, 131</value>
+ </data>
+ <data name="button7.Size" type="System.Drawing.Size, System.Drawing">
+ <value>80, 41</value>
+ </data>
+ <data name="button7.TabIndex" type="System.Int32, mscorlib">
+ <value>8</value>
+ </data>
+ <data name="button7.Text" xml:space="preserve">
+ <value>Jobs Form</value>
+ </data>
+ <data name=">>button7.Name" xml:space="preserve">
+ <value>button7</value>
+ </data>
+ <data name=">>button7.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>button7.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>button7.ZOrder" xml:space="preserve">
+ <value>3</value>
+ </data>
+ <data name="button8.Location" type="System.Drawing.Point, System.Drawing">
+ <value>706, 131</value>
+ </data>
+ <data name="button8.Size" type="System.Drawing.Size, System.Drawing">
+ <value>80, 41</value>
+ </data>
+ <data name="button8.TabIndex" type="System.Int32, mscorlib">
+ <value>9</value>
+ </data>
+ <data name="button8.Text" xml:space="preserve">
+ <value>Contour Form</value>
+ </data>
+ <data name=">>button8.Name" xml:space="preserve">
+ <value>button8</value>
+ </data>
+ <data name=">>button8.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>button8.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>button8.ZOrder" xml:space="preserve">
+ <value>2</value>
+ </data>
+ <data name="button9.Location" type="System.Drawing.Point, System.Drawing">
+ <value>795, 131</value>
+ </data>
+ <data name="button9.Size" type="System.Drawing.Size, System.Drawing">
+ <value>75, 41</value>
+ </data>
+ <data name="button9.TabIndex" type="System.Int32, mscorlib">
+ <value>10</value>
+ </data>
+ <data name="button9.Text" xml:space="preserve">
+ <value>Screw Form</value>
+ </data>
+ <data name=">>button9.Name" xml:space="preserve">
+ <value>button9</value>
+ </data>
+ <data name=">>button9.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>button9.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>button9.ZOrder" xml:space="preserve">
+ <value>1</value>
+ </data>
+ <data name="btnCalibrationForm.Location" type="System.Drawing.Point, System.Drawing">
+ <value>620, 191</value>
+ </data>
+ <data name="btnCalibrationForm.Size" type="System.Drawing.Size, System.Drawing">
+ <value>80, 52</value>
+ </data>
+ <data name="btnCalibrationForm.TabIndex" type="System.Int32, mscorlib">
+ <value>11</value>
+ </data>
+ <data name="btnCalibrationForm.Text" xml:space="preserve">
+ <value>Calibration Form</value>
+ </data>
+ <data name=">>btnCalibrationForm.Name" xml:space="preserve">
+ <value>btnCalibrationForm</value>
+ </data>
+ <data name=">>btnCalibrationForm.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name=">>btnCalibrationForm.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>btnCalibrationForm.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>True</value>
+ </metadata>
+ <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
+ <value>6, 12</value>
+ </data>
+ <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
+ <value>877, 472</value>
+ </data>
+ <data name="$this.Text" xml:space="preserve">
+ <value>Main Form</value>
+ </data>
+ <data name=">>$this.Name" xml:space="preserve">
+ <value>frmMain</value>
+ </data>
+ <data name=">>$this.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+</root>
\ No newline at end of file
diff --git a/HalconTools/frmMain.zh-CHS.resx b/HalconTools/frmMain.zh-CHS.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/HalconTools/frmMain.zh-CHS.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
\ No newline at end of file
diff --git a/HalconTools/frmMatchingAssistant.cs b/HalconTools/frmMatchingAssistant.cs
new file mode 100644
index 0000000..ccc141b
--- /dev/null
+++ b/HalconTools/frmMatchingAssistant.cs
@@ -0,0 +1,4774 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ /// <summary>
+ /// This project provides you with the functionality of the HDevelop
+ /// Matching Assistant, as a stand alone application. It contains
+ /// most of the data structures and menus that are offered with the
+ /// HDevelop Assistant.
+ /// It uses the ROI classes to create interactive ROI objects,
+ /// as introduced with the project InteractiveROI.
+ /// MatchingForm provides the graphical user interface, i.e., it contains
+ /// all display handles, GUI components, and event handles. It uses the
+ /// ROI class to create interactive ROI objects (see also the project
+ /// InteractiveROI). The class Matching Assistant is used as the
+ /// controller, which connects the GUI instance with the models. Changes
+ /// in the model are forwarded to the GUI by event delegates.
+ /// </summary>
+ public class frmMatchingAssistant : System.Windows.Forms.Form
+ {
+ // Main Panel
+ private System.Windows.Forms.TabControl tabControl;
+ private System.Windows.Forms.TabPage tabPageCreateModel;
+ private System.Windows.Forms.TabPage tabPageFindModel;
+ private System.Windows.Forms.TabPage tabPageInspectModel;
+ private System.Windows.Forms.Button loadImagebutton;
+ private System.Windows.Forms.OpenFileDialog openFileDialog1;
+ private System.Windows.Forms.Button saveModelbutton;
+ private System.Windows.Forms.RadioButton addToROIButton;
+ private System.Windows.Forms.RadioButton subFromROIButton;
+ private System.Windows.Forms.Button rect1Button;
+ private System.Windows.Forms.Button rect2Button;
+ private System.Windows.Forms.RadioButton moveButton;
+ private System.Windows.Forms.RadioButton zoomButton;
+ private System.ComponentModel.IContainer components;
+ /// <summary>Window control that manages visualization</summary>
+ public HWndCtrl mView;
+ /// <summary>ROI control that manages ROI objects</summary>
+ public ROIController roiController;
+
+ private HImage CurrentImg;
+ private HRegion ModelRegion;
+ private HXLD ModelContour;
+ private HXLD DetectionContour;
+ private MatchingAssistant mAssistant;
+ private MatchingParam parameterSet;
+ private MatchingOpt optInstance;
+ private MatchingOptSpeed speedOptHandler;
+ private MatchingOptStatistics inspectOptHandler;
+ private Color createModelWindowMode;
+ private Color trainModelWindowMode;
+
+
+ private System.Windows.Forms.OpenFileDialog openFileDialog2;
+ private System.Windows.Forms.Label label13;
+ private System.Windows.Forms.Label label14;
+ private System.Windows.Forms.Label label15;
+ private System.Windows.Forms.Label label16;
+ private System.Windows.Forms.Label label17;
+ private System.Windows.Forms.Label label18;
+ private System.Windows.Forms.Button loadTestImgButton;
+ private System.Windows.Forms.Button deleteTestImgButton;
+ private System.Windows.Forms.Button deleteAllTestImgButton;
+ private System.Windows.Forms.Button findModelButton;
+ private System.Windows.Forms.Button displayTestImgButton;
+ private System.Windows.Forms.TrackBar MinScoreTrackBar;
+ private System.Windows.Forms.NumericUpDown MinScoreUpDown;
+ private System.Windows.Forms.TrackBar NumMatchesTrackBar;
+ private System.Windows.Forms.NumericUpDown NumMatchesUpDown;
+ private System.Windows.Forms.TrackBar MaxOverlapTrackBar;
+ private System.Windows.Forms.NumericUpDown MaxOverlapUpDown;
+ private System.Windows.Forms.TrackBar GreedinessTrackBar;
+ private System.Windows.Forms.NumericUpDown GreedinessUpDown;
+ private System.Windows.Forms.ComboBox SubPixelBox;
+ private System.Windows.Forms.TrackBar LastPyrLevTrackBar;
+ private System.Windows.Forms.NumericUpDown LastPyrLevUpDown;
+ private System.Windows.Forms.ListBox testImgListBox;
+ private System.Windows.Forms.TabPage tabPageOptimRecognition;
+ private System.Windows.Forms.CheckBox FindAlwaysCheckBox;
+ private System.Windows.Forms.Button DisplayDataButton;
+ private System.Windows.Forms.GroupBox groupBoxCreateROI;
+ private System.Windows.Forms.Label label19;
+ private System.Windows.Forms.Label label20;
+ private System.Windows.Forms.RadioButton FindNoOfInstButton;
+ private System.Windows.Forms.RadioButton FindAtLeastOneModelButton;
+ private System.Windows.Forms.RadioButton FindMaxNoOfModelButton;
+ private System.Windows.Forms.TrackBar recogRateTrackBar;
+ private System.Windows.Forms.NumericUpDown recogRateUpDown;
+ private System.Windows.Forms.ComboBox RecognRateComboBox;
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.Label label29;
+ private System.Windows.Forms.Label label30;
+ private System.Windows.Forms.Label label31;
+ private System.Windows.Forms.Label label32;
+ private System.Windows.Forms.Label label33;
+ private System.Windows.Forms.Label label34;
+ private System.Windows.Forms.Label label35;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.Label labelRecogn21;
+ private System.Windows.Forms.Label labelRecogn24;
+ private System.Windows.Forms.Label labelRecogn14;
+ private System.Windows.Forms.Label labelRecogn23;
+ private System.Windows.Forms.Label labelRecogn13;
+ private System.Windows.Forms.Label labelRecogn22;
+ private System.Windows.Forms.Label labelRecogn12;
+ private System.Windows.Forms.Label labelRecogn11;
+ private System.Windows.Forms.Label labelOptStatus;
+ private System.Windows.Forms.Timer timer;
+ private System.Windows.Forms.Button StatisticsButton;
+ private System.Windows.Forms.NumericUpDown RecogNoManSelUpDown;
+ private System.Windows.Forms.GroupBox groupBox3;
+ private System.Windows.Forms.GroupBox groupBox4;
+ private System.Windows.Forms.Label label26;
+ private System.Windows.Forms.Label label27;
+ private System.Windows.Forms.Label label28;
+ private System.Windows.Forms.Label label36;
+ private System.Windows.Forms.Label label37;
+ private System.Windows.Forms.Label label38;
+ private System.Windows.Forms.Label label39;
+ private System.Windows.Forms.Label label43;
+ private System.Windows.Forms.Label label62;
+ private System.Windows.Forms.Label label63;
+ private System.Windows.Forms.Label label64;
+ private System.Windows.Forms.Label label65;
+ private System.Windows.Forms.Label label66;
+ private System.Windows.Forms.Label label67;
+ private System.Windows.Forms.Label label68;
+ private System.Windows.Forms.Label label69;
+ private System.Windows.Forms.Label label70;
+ private System.Windows.Forms.Label label71;
+ private System.Windows.Forms.Label label72;
+ private System.Windows.Forms.Label labelInspect11;
+ private System.Windows.Forms.Label labelInspect21;
+ private System.Windows.Forms.Label labelInspect31;
+ private System.Windows.Forms.Label labelInspect32;
+ private System.Windows.Forms.Label labelInspect22;
+ private System.Windows.Forms.Label labelInspect12;
+ private System.Windows.Forms.Label labelInspect33;
+ private System.Windows.Forms.Label labelInspect23;
+ private System.Windows.Forms.Label labelInspect13;
+ private System.Windows.Forms.Label labelInspect34;
+ private System.Windows.Forms.Label labelInspect24;
+ private System.Windows.Forms.Label labelInspect14;
+ private System.Windows.Forms.Label labelInspect35;
+ private System.Windows.Forms.Label labelInspect25;
+ private System.Windows.Forms.Label labelInspect15;
+ private System.Windows.Forms.Label labelInspect36;
+ private System.Windows.Forms.Label labelInspect26;
+ private System.Windows.Forms.Label labelInspect16;
+ private System.Windows.Forms.Label labelInspect37;
+ private System.Windows.Forms.Label labelInspect27;
+ private System.Windows.Forms.Label labelInspect17;
+ private System.Windows.Forms.Label labelInspect05;
+ private System.Windows.Forms.Label labelInspect04;
+ private System.Windows.Forms.Label labelInspect03;
+ private System.Windows.Forms.Label labelInspect02;
+ private System.Windows.Forms.Label labelInspect01;
+ private System.Windows.Forms.NumericUpDown InspectMaxNoMatchUpDown;
+ private System.Windows.Forms.Label label21;
+ private System.Windows.Forms.Button OptimizeButton;
+ private System.Windows.Forms.Button loadModelbutton;
+ private System.Windows.Forms.SaveFileDialog saveFileDialog1;
+ private System.Windows.Forms.OpenFileDialog openFileDialog3;
+ private System.Windows.Forms.GroupBox groupBoxCreateModel;
+ private System.Windows.Forms.NumericUpDown DispPyramidUpDown;
+ private System.Windows.Forms.TrackBar DispPyramidTrackBar;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Button ContrastAutoButton;
+ private System.Windows.Forms.NumericUpDown ContrastUpDown;
+ private System.Windows.Forms.TrackBar ContrastTrackBar;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.NumericUpDown MinScaleUpDown;
+ private System.Windows.Forms.TrackBar MinScaleTrackBar;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.NumericUpDown MaxScaleUpDown;
+ private System.Windows.Forms.TrackBar MaxScaleTrackBar;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.Button ScaleStepAutoButton;
+ private System.Windows.Forms.Label label11;
+ private System.Windows.Forms.NumericUpDown ScaleStepUpDown;
+ private System.Windows.Forms.TrackBar ScaleStepTrackBar;
+ private System.Windows.Forms.TrackBar StartingAngleTrackBar;
+ private System.Windows.Forms.NumericUpDown StartingAngleUpDown;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.TrackBar AngleExtentTrackBar;
+ private System.Windows.Forms.NumericUpDown AngleExtentUpDown;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.TrackBar AngleStepTrackBar;
+ private System.Windows.Forms.Button AngleStepAutoButton;
+ private System.Windows.Forms.NumericUpDown AngleStepUpDown;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.TrackBar PyramidLevelTrackBar;
+ private System.Windows.Forms.Button PyramidLevelAutoButton;
+ private System.Windows.Forms.NumericUpDown PyramidLevelUpDown;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.ComboBox MetricBox;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.ComboBox OptimizationBox;
+ private System.Windows.Forms.Button OptimizationAutoButton;
+ private System.Windows.Forms.Label label10;
+ private System.Windows.Forms.TrackBar MinContrastTrackBar;
+ private System.Windows.Forms.Button MinContrastAutoButton;
+ private System.Windows.Forms.NumericUpDown MinContrastUpDown;
+ private System.Windows.Forms.Label label12;
+ private System.Windows.Forms.Button resetModelbutton;
+ private System.Windows.Forms.Button delROIButton;
+ private System.Windows.Forms.RadioButton noneButton;
+ private System.Windows.Forms.Button circleButton;
+ private System.Windows.Forms.Button delAllROIButton;
+ private System.Windows.Forms.Button resetViewButton;
+ private Panel pnlBottom;
+ private GroupBox groupBox5;
+ private GroupBox groupBox6;
+ private Panel pnlRight;
+ private Panel WindowModePanel;
+ private TabPage tabPageSaveConfige;
+ private GroupBox groupBox2;
+ private Label label22;
+ private Label label23;
+ private Label label24;
+ private Label label25;
+ private Label label40;
+ private Label labScale;
+ private Label labAngle;
+ private Label labGreediness;
+ private Label labNumLevels;
+ private Label labMatches;
+ private Label labScore;
+ private Label labOverlapExt;
+ private Label labOverlapMax;
+ private Label labOverlapMin;
+ private Label labScaleExt;
+ private Label labScaleMax;
+ private Label labScaleMin;
+ private Label labAngleExt;
+ private Label labAngleMax;
+ private Label labAngleMin;
+ private Label labGreedinessExt;
+ private Label labGreedinessMax;
+ private Label labGreedinessMin;
+ private Label labNumLevelsExt;
+ private Label labNumLevelsMax;
+ private Label labNumLevelsMin;
+ private Label labMatchesMax;
+ private Label labMatchesMin;
+ private Label labScoreMin;
+ private Label labMatchesExt;
+ private Label labScoreExt;
+ private Label labScoreMax;
+ private Label labSubPixelSelect;
+ private Label labSubPixel;
+ private Button butSaveConfige;
+ private Label labLastPyramidLevel;
+ private Label labLastPyramidLevelExt;
+ private Label labLastPyramidLevelMax;
+ private Label label45;
+ private HWindowControl viewPort;
+ public bool locked;
+
+
+ /// <summary>
+ /// In the beginning, some initialization tasks are performed.
+ /// The control instances, like ROIController and WindowController,
+ /// are initialized and registered with each other. Also, the
+ /// delegates of the models are linked to update methods
+ /// to get notified about changes.
+ /// </summary>
+ public frmMatchingAssistant()
+ {
+ InitializeComponent();
+
+ initP();
+ }
+
+ public frmMatchingAssistant(string name)
+ {
+ InitializeComponent();
+
+ initP();
+
+ ResourceCulture.SetCurrentCulture(name);
+ ResourceCulture.SetLanguage((Control)this);
+ }
+
+ public void initP()
+ {
+ mView = new HWndCtrl(viewPort);
+
+ createModelWindowMode = Color.RoyalBlue;
+ trainModelWindowMode = Color.Chartreuse;
+
+ roiController = new ROIController();
+ mView.useROIController(roiController);
+
+ roiController.setROISign(ROIController.MODE_ROI_POS);
+
+ mView.NotifyIconObserver = new IconicDelegate(UpdateViewData);
+ roiController.NotifyRCObserver = new IconicDelegate(UpdateViewData);
+
+ mView.setViewState(HWndCtrl.MODE_VIEW_NONE);
+
+ locked = true;
+ parameterSet = new MatchingParam();
+ Init(parameterSet);
+ locked = false;
+
+ mAssistant = new MatchingAssistant(parameterSet);
+ mAssistant.NotifyIconObserver = new MatchingDelegate(UpdateMatching);
+ mAssistant.NotifyParamObserver = new AutoParamDelegate(UpdateButton);
+
+ speedOptHandler = new MatchingOptSpeed(mAssistant, parameterSet);
+ speedOptHandler.NotifyStatisticsObserver = new StatisticsDelegate(UpdateStatisticsData);
+
+ inspectOptHandler = new MatchingOptStatistics(mAssistant, parameterSet);
+ inspectOptHandler.NotifyStatisticsObserver = new StatisticsDelegate(UpdateStatisticsData);
+ }
+
+
+ /********************************************************************/
+ /********************************************************************/
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if (components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+
+ #region Windows Form Designer generated code
+
+ /********************************************************************/
+ /********************************************************************/
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.tabControl = new System.Windows.Forms.TabControl();
+ this.tabPageCreateModel = new System.Windows.Forms.TabPage();
+ this.groupBoxCreateModel = new System.Windows.Forms.GroupBox();
+ this.MinContrastTrackBar = new System.Windows.Forms.TrackBar();
+ this.MinContrastAutoButton = new System.Windows.Forms.Button();
+ this.MinContrastUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label12 = new System.Windows.Forms.Label();
+ this.OptimizationBox = new System.Windows.Forms.ComboBox();
+ this.OptimizationAutoButton = new System.Windows.Forms.Button();
+ this.label10 = new System.Windows.Forms.Label();
+ this.MetricBox = new System.Windows.Forms.ComboBox();
+ this.label9 = new System.Windows.Forms.Label();
+ this.PyramidLevelTrackBar = new System.Windows.Forms.TrackBar();
+ this.PyramidLevelAutoButton = new System.Windows.Forms.Button();
+ this.PyramidLevelUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label8 = new System.Windows.Forms.Label();
+ this.AngleStepTrackBar = new System.Windows.Forms.TrackBar();
+ this.AngleStepAutoButton = new System.Windows.Forms.Button();
+ this.AngleStepUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label7 = new System.Windows.Forms.Label();
+ this.AngleExtentTrackBar = new System.Windows.Forms.TrackBar();
+ this.AngleExtentUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label6 = new System.Windows.Forms.Label();
+ this.StartingAngleTrackBar = new System.Windows.Forms.TrackBar();
+ this.StartingAngleUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label5 = new System.Windows.Forms.Label();
+ this.ScaleStepAutoButton = new System.Windows.Forms.Button();
+ this.label11 = new System.Windows.Forms.Label();
+ this.ScaleStepUpDown = new System.Windows.Forms.NumericUpDown();
+ this.ScaleStepTrackBar = new System.Windows.Forms.TrackBar();
+ this.MaxScaleUpDown = new System.Windows.Forms.NumericUpDown();
+ this.MaxScaleTrackBar = new System.Windows.Forms.TrackBar();
+ this.label4 = new System.Windows.Forms.Label();
+ this.MinScaleUpDown = new System.Windows.Forms.NumericUpDown();
+ this.MinScaleTrackBar = new System.Windows.Forms.TrackBar();
+ this.label3 = new System.Windows.Forms.Label();
+ this.ContrastAutoButton = new System.Windows.Forms.Button();
+ this.ContrastUpDown = new System.Windows.Forms.NumericUpDown();
+ this.ContrastTrackBar = new System.Windows.Forms.TrackBar();
+ this.label2 = new System.Windows.Forms.Label();
+ this.DispPyramidUpDown = new System.Windows.Forms.NumericUpDown();
+ this.DispPyramidTrackBar = new System.Windows.Forms.TrackBar();
+ this.label1 = new System.Windows.Forms.Label();
+ this.tabPageFindModel = new System.Windows.Forms.TabPage();
+ this.FindAlwaysCheckBox = new System.Windows.Forms.CheckBox();
+ this.testImgListBox = new System.Windows.Forms.ListBox();
+ this.findModelButton = new System.Windows.Forms.Button();
+ this.displayTestImgButton = new System.Windows.Forms.Button();
+ this.deleteAllTestImgButton = new System.Windows.Forms.Button();
+ this.deleteTestImgButton = new System.Windows.Forms.Button();
+ this.LastPyrLevTrackBar = new System.Windows.Forms.TrackBar();
+ this.LastPyrLevUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label18 = new System.Windows.Forms.Label();
+ this.SubPixelBox = new System.Windows.Forms.ComboBox();
+ this.label17 = new System.Windows.Forms.Label();
+ this.MaxOverlapTrackBar = new System.Windows.Forms.TrackBar();
+ this.MaxOverlapUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label15 = new System.Windows.Forms.Label();
+ this.GreedinessTrackBar = new System.Windows.Forms.TrackBar();
+ this.GreedinessUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label16 = new System.Windows.Forms.Label();
+ this.NumMatchesTrackBar = new System.Windows.Forms.TrackBar();
+ this.NumMatchesUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label14 = new System.Windows.Forms.Label();
+ this.MinScoreTrackBar = new System.Windows.Forms.TrackBar();
+ this.MinScoreUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label13 = new System.Windows.Forms.Label();
+ this.loadTestImgButton = new System.Windows.Forms.Button();
+ this.tabPageOptimRecognition = new System.Windows.Forms.TabPage();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.RecogNoManSelUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label19 = new System.Windows.Forms.Label();
+ this.FindAtLeastOneModelButton = new System.Windows.Forms.RadioButton();
+ this.FindMaxNoOfModelButton = new System.Windows.Forms.RadioButton();
+ this.FindNoOfInstButton = new System.Windows.Forms.RadioButton();
+ this.recogRateTrackBar = new System.Windows.Forms.TrackBar();
+ this.recogRateUpDown = new System.Windows.Forms.NumericUpDown();
+ this.RecognRateComboBox = new System.Windows.Forms.ComboBox();
+ this.label20 = new System.Windows.Forms.Label();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.labelOptStatus = new System.Windows.Forms.Label();
+ this.label35 = new System.Windows.Forms.Label();
+ this.label34 = new System.Windows.Forms.Label();
+ this.label33 = new System.Windows.Forms.Label();
+ this.label32 = new System.Windows.Forms.Label();
+ this.label31 = new System.Windows.Forms.Label();
+ this.labelRecogn21 = new System.Windows.Forms.Label();
+ this.labelRecogn24 = new System.Windows.Forms.Label();
+ this.labelRecogn14 = new System.Windows.Forms.Label();
+ this.labelRecogn23 = new System.Windows.Forms.Label();
+ this.labelRecogn13 = new System.Windows.Forms.Label();
+ this.labelRecogn22 = new System.Windows.Forms.Label();
+ this.labelRecogn12 = new System.Windows.Forms.Label();
+ this.labelRecogn11 = new System.Windows.Forms.Label();
+ this.label29 = new System.Windows.Forms.Label();
+ this.label30 = new System.Windows.Forms.Label();
+ this.OptimizeButton = new System.Windows.Forms.Button();
+ this.tabPageInspectModel = new System.Windows.Forms.TabPage();
+ this.label21 = new System.Windows.Forms.Label();
+ this.InspectMaxNoMatchUpDown = new System.Windows.Forms.NumericUpDown();
+ this.groupBox4 = new System.Windows.Forms.GroupBox();
+ this.label72 = new System.Windows.Forms.Label();
+ this.label71 = new System.Windows.Forms.Label();
+ this.label70 = new System.Windows.Forms.Label();
+ this.label69 = new System.Windows.Forms.Label();
+ this.label68 = new System.Windows.Forms.Label();
+ this.label67 = new System.Windows.Forms.Label();
+ this.label66 = new System.Windows.Forms.Label();
+ this.label65 = new System.Windows.Forms.Label();
+ this.label64 = new System.Windows.Forms.Label();
+ this.label63 = new System.Windows.Forms.Label();
+ this.label62 = new System.Windows.Forms.Label();
+ this.label43 = new System.Windows.Forms.Label();
+ this.labelInspect37 = new System.Windows.Forms.Label();
+ this.labelInspect27 = new System.Windows.Forms.Label();
+ this.labelInspect17 = new System.Windows.Forms.Label();
+ this.labelInspect36 = new System.Windows.Forms.Label();
+ this.labelInspect26 = new System.Windows.Forms.Label();
+ this.labelInspect16 = new System.Windows.Forms.Label();
+ this.labelInspect35 = new System.Windows.Forms.Label();
+ this.labelInspect25 = new System.Windows.Forms.Label();
+ this.labelInspect15 = new System.Windows.Forms.Label();
+ this.labelInspect34 = new System.Windows.Forms.Label();
+ this.labelInspect24 = new System.Windows.Forms.Label();
+ this.labelInspect14 = new System.Windows.Forms.Label();
+ this.labelInspect33 = new System.Windows.Forms.Label();
+ this.labelInspect23 = new System.Windows.Forms.Label();
+ this.labelInspect13 = new System.Windows.Forms.Label();
+ this.labelInspect32 = new System.Windows.Forms.Label();
+ this.labelInspect22 = new System.Windows.Forms.Label();
+ this.labelInspect12 = new System.Windows.Forms.Label();
+ this.labelInspect31 = new System.Windows.Forms.Label();
+ this.labelInspect21 = new System.Windows.Forms.Label();
+ this.labelInspect11 = new System.Windows.Forms.Label();
+ this.groupBox3 = new System.Windows.Forms.GroupBox();
+ this.label39 = new System.Windows.Forms.Label();
+ this.label38 = new System.Windows.Forms.Label();
+ this.label37 = new System.Windows.Forms.Label();
+ this.label36 = new System.Windows.Forms.Label();
+ this.label28 = new System.Windows.Forms.Label();
+ this.label27 = new System.Windows.Forms.Label();
+ this.label26 = new System.Windows.Forms.Label();
+ this.labelInspect05 = new System.Windows.Forms.Label();
+ this.labelInspect04 = new System.Windows.Forms.Label();
+ this.labelInspect03 = new System.Windows.Forms.Label();
+ this.labelInspect02 = new System.Windows.Forms.Label();
+ this.labelInspect01 = new System.Windows.Forms.Label();
+ this.StatisticsButton = new System.Windows.Forms.Button();
+ this.tabPageSaveConfige = new System.Windows.Forms.TabPage();
+ this.butSaveConfige = new System.Windows.Forms.Button();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.labLastPyramidLevel = new System.Windows.Forms.Label();
+ this.labLastPyramidLevelExt = new System.Windows.Forms.Label();
+ this.labLastPyramidLevelMax = new System.Windows.Forms.Label();
+ this.label45 = new System.Windows.Forms.Label();
+ this.labSubPixelSelect = new System.Windows.Forms.Label();
+ this.label22 = new System.Windows.Forms.Label();
+ this.label23 = new System.Windows.Forms.Label();
+ this.label24 = new System.Windows.Forms.Label();
+ this.label25 = new System.Windows.Forms.Label();
+ this.label40 = new System.Windows.Forms.Label();
+ this.labScale = new System.Windows.Forms.Label();
+ this.labAngle = new System.Windows.Forms.Label();
+ this.labGreediness = new System.Windows.Forms.Label();
+ this.labNumLevels = new System.Windows.Forms.Label();
+ this.labSubPixel = new System.Windows.Forms.Label();
+ this.labMatches = new System.Windows.Forms.Label();
+ this.labScore = new System.Windows.Forms.Label();
+ this.labOverlapExt = new System.Windows.Forms.Label();
+ this.labOverlapMax = new System.Windows.Forms.Label();
+ this.labOverlapMin = new System.Windows.Forms.Label();
+ this.labScaleExt = new System.Windows.Forms.Label();
+ this.labScaleMax = new System.Windows.Forms.Label();
+ this.labScaleMin = new System.Windows.Forms.Label();
+ this.labAngleExt = new System.Windows.Forms.Label();
+ this.labAngleMax = new System.Windows.Forms.Label();
+ this.labAngleMin = new System.Windows.Forms.Label();
+ this.labGreedinessExt = new System.Windows.Forms.Label();
+ this.labGreedinessMax = new System.Windows.Forms.Label();
+ this.labGreedinessMin = new System.Windows.Forms.Label();
+ this.labNumLevelsExt = new System.Windows.Forms.Label();
+ this.labNumLevelsMax = new System.Windows.Forms.Label();
+ this.labNumLevelsMin = new System.Windows.Forms.Label();
+ this.labMatchesExt = new System.Windows.Forms.Label();
+ this.labMatchesMax = new System.Windows.Forms.Label();
+ this.labMatchesMin = new System.Windows.Forms.Label();
+ this.labScoreExt = new System.Windows.Forms.Label();
+ this.labScoreMax = new System.Windows.Forms.Label();
+ this.labScoreMin = new System.Windows.Forms.Label();
+ this.groupBoxCreateROI = new System.Windows.Forms.GroupBox();
+ this.circleButton = new System.Windows.Forms.Button();
+ this.delROIButton = new System.Windows.Forms.Button();
+ this.delAllROIButton = new System.Windows.Forms.Button();
+ this.rect2Button = new System.Windows.Forms.Button();
+ this.subFromROIButton = new System.Windows.Forms.RadioButton();
+ this.addToROIButton = new System.Windows.Forms.RadioButton();
+ this.rect1Button = new System.Windows.Forms.Button();
+ this.loadImagebutton = new System.Windows.Forms.Button();
+ this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
+ this.saveModelbutton = new System.Windows.Forms.Button();
+ this.loadModelbutton = new System.Windows.Forms.Button();
+ this.resetViewButton = new System.Windows.Forms.Button();
+ this.noneButton = new System.Windows.Forms.RadioButton();
+ this.zoomButton = new System.Windows.Forms.RadioButton();
+ this.moveButton = new System.Windows.Forms.RadioButton();
+ this.openFileDialog2 = new System.Windows.Forms.OpenFileDialog();
+ this.DisplayDataButton = new System.Windows.Forms.Button();
+ this.timer = new System.Windows.Forms.Timer(this.components);
+ this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();
+ this.openFileDialog3 = new System.Windows.Forms.OpenFileDialog();
+ this.resetModelbutton = new System.Windows.Forms.Button();
+ this.pnlBottom = new System.Windows.Forms.Panel();
+ this.groupBox6 = new System.Windows.Forms.GroupBox();
+ this.groupBox5 = new System.Windows.Forms.GroupBox();
+ this.pnlRight = new System.Windows.Forms.Panel();
+ this.WindowModePanel = new System.Windows.Forms.Panel();
+ this.viewPort = new HalconDotNet.HWindowControl();
+ this.tabControl.SuspendLayout();
+ this.tabPageCreateModel.SuspendLayout();
+ this.groupBoxCreateModel.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.MinContrastTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinContrastUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.PyramidLevelTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.PyramidLevelUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.AngleStepTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.AngleStepUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.AngleExtentTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.AngleExtentUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.StartingAngleTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.StartingAngleUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ScaleStepUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ScaleStepTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MaxScaleUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MaxScaleTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinScaleUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinScaleTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ContrastUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ContrastTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.DispPyramidUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.DispPyramidTrackBar)).BeginInit();
+ this.tabPageFindModel.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.LastPyrLevTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.LastPyrLevUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MaxOverlapTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MaxOverlapUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.GreedinessTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.GreedinessUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.NumMatchesTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.NumMatchesUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinScoreTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinScoreUpDown)).BeginInit();
+ this.tabPageOptimRecognition.SuspendLayout();
+ this.groupBox1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.RecogNoManSelUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.recogRateTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.recogRateUpDown)).BeginInit();
+ this.panel1.SuspendLayout();
+ this.tabPageInspectModel.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.InspectMaxNoMatchUpDown)).BeginInit();
+ this.groupBox4.SuspendLayout();
+ this.groupBox3.SuspendLayout();
+ this.tabPageSaveConfige.SuspendLayout();
+ this.groupBox2.SuspendLayout();
+ this.groupBoxCreateROI.SuspendLayout();
+ this.pnlBottom.SuspendLayout();
+ this.groupBox6.SuspendLayout();
+ this.groupBox5.SuspendLayout();
+ this.pnlRight.SuspendLayout();
+ this.WindowModePanel.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // tabControl
+ //
+ this.tabControl.Controls.Add(this.tabPageCreateModel);
+ this.tabControl.Controls.Add(this.tabPageFindModel);
+ this.tabControl.Controls.Add(this.tabPageOptimRecognition);
+ this.tabControl.Controls.Add(this.tabPageInspectModel);
+ this.tabControl.Controls.Add(this.tabPageSaveConfige);
+ this.tabControl.Location = new System.Drawing.Point(6, 15);
+ this.tabControl.Name = "tabControl";
+ this.tabControl.SelectedIndex = 0;
+ this.tabControl.Size = new System.Drawing.Size(490, 594);
+ this.tabControl.TabIndex = 1;
+ this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged);
+ //
+ // tabPageCreateModel
+ //
+ this.tabPageCreateModel.Controls.Add(this.groupBoxCreateModel);
+ this.tabPageCreateModel.Location = new System.Drawing.Point(4, 22);
+ this.tabPageCreateModel.Name = "tabPageCreateModel";
+ this.tabPageCreateModel.Size = new System.Drawing.Size(482, 568);
+ this.tabPageCreateModel.TabIndex = 0;
+ this.tabPageCreateModel.Text = " 创建模板 ";
+ this.tabPageCreateModel.UseVisualStyleBackColor = true;
+ //
+ // groupBoxCreateModel
+ //
+ this.groupBoxCreateModel.Controls.Add(this.MinContrastTrackBar);
+ this.groupBoxCreateModel.Controls.Add(this.MinContrastAutoButton);
+ this.groupBoxCreateModel.Controls.Add(this.MinContrastUpDown);
+ this.groupBoxCreateModel.Controls.Add(this.label12);
+ this.groupBoxCreateModel.Controls.Add(this.OptimizationBox);
+ this.groupBoxCreateModel.Controls.Add(this.OptimizationAutoButton);
+ this.groupBoxCreateModel.Controls.Add(this.label10);
+ this.groupBoxCreateModel.Controls.Add(this.MetricBox);
+ this.groupBoxCreateModel.Controls.Add(this.label9);
+ this.groupBoxCreateModel.Controls.Add(this.PyramidLevelTrackBar);
+ this.groupBoxCreateModel.Controls.Add(this.PyramidLevelAutoButton);
+ this.groupBoxCreateModel.Controls.Add(this.PyramidLevelUpDown);
+ this.groupBoxCreateModel.Controls.Add(this.label8);
+ this.groupBoxCreateModel.Controls.Add(this.AngleStepTrackBar);
+ this.groupBoxCreateModel.Controls.Add(this.AngleStepAutoButton);
+ this.groupBoxCreateModel.Controls.Add(this.AngleStepUpDown);
+ this.groupBoxCreateModel.Controls.Add(this.label7);
+ this.groupBoxCreateModel.Controls.Add(this.AngleExtentTrackBar);
+ this.groupBoxCreateModel.Controls.Add(this.AngleExtentUpDown);
+ this.groupBoxCreateModel.Controls.Add(this.label6);
+ this.groupBoxCreateModel.Controls.Add(this.StartingAngleTrackBar);
+ this.groupBoxCreateModel.Controls.Add(this.StartingAngleUpDown);
+ this.groupBoxCreateModel.Controls.Add(this.label5);
+ this.groupBoxCreateModel.Controls.Add(this.ScaleStepAutoButton);
+ this.groupBoxCreateModel.Controls.Add(this.label11);
+ this.groupBoxCreateModel.Controls.Add(this.ScaleStepUpDown);
+ this.groupBoxCreateModel.Controls.Add(this.ScaleStepTrackBar);
+ this.groupBoxCreateModel.Controls.Add(this.MaxScaleUpDown);
+ this.groupBoxCreateModel.Controls.Add(this.MaxScaleTrackBar);
+ this.groupBoxCreateModel.Controls.Add(this.label4);
+ this.groupBoxCreateModel.Controls.Add(this.MinScaleUpDown);
+ this.groupBoxCreateModel.Controls.Add(this.MinScaleTrackBar);
+ this.groupBoxCreateModel.Controls.Add(this.label3);
+ this.groupBoxCreateModel.Controls.Add(this.ContrastAutoButton);
+ this.groupBoxCreateModel.Controls.Add(this.ContrastUpDown);
+ this.groupBoxCreateModel.Controls.Add(this.ContrastTrackBar);
+ this.groupBoxCreateModel.Controls.Add(this.label2);
+ this.groupBoxCreateModel.Controls.Add(this.DispPyramidUpDown);
+ this.groupBoxCreateModel.Controls.Add(this.DispPyramidTrackBar);
+ this.groupBoxCreateModel.Controls.Add(this.label1);
+ this.groupBoxCreateModel.Location = new System.Drawing.Point(0, 0);
+ this.groupBoxCreateModel.Name = "groupBoxCreateModel";
+ this.groupBoxCreateModel.Size = new System.Drawing.Size(470, 526);
+ this.groupBoxCreateModel.TabIndex = 55;
+ this.groupBoxCreateModel.TabStop = false;
+ //
+ // MinContrastTrackBar
+ //
+ this.MinContrastTrackBar.Location = new System.Drawing.Point(221, 474);
+ this.MinContrastTrackBar.Maximum = 30;
+ this.MinContrastTrackBar.Name = "MinContrastTrackBar";
+ this.MinContrastTrackBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.MinContrastTrackBar.Size = new System.Drawing.Size(173, 45);
+ this.MinContrastTrackBar.TabIndex = 80;
+ this.MinContrastTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.MinContrastTrackBar.Value = 10;
+ this.MinContrastTrackBar.Scroll += new System.EventHandler(this.MinContrastTrackBar_Scroll);
+ //
+ // MinContrastAutoButton
+ //
+ this.MinContrastAutoButton.Location = new System.Drawing.Point(394, 474);
+ this.MinContrastAutoButton.Name = "MinContrastAutoButton";
+ this.MinContrastAutoButton.Size = new System.Drawing.Size(57, 26);
+ this.MinContrastAutoButton.TabIndex = 79;
+ this.MinContrastAutoButton.Text = "Auto";
+ this.MinContrastAutoButton.Click += new System.EventHandler(this.MinContrastAutoButton_Click);
+ //
+ // MinContrastUpDown
+ //
+ this.MinContrastUpDown.Location = new System.Drawing.Point(144, 474);
+ this.MinContrastUpDown.Maximum = new decimal(new int[] {
+ 30,
+ 0,
+ 0,
+ 0});
+ this.MinContrastUpDown.Name = "MinContrastUpDown";
+ this.MinContrastUpDown.Size = new System.Drawing.Size(58, 21);
+ this.MinContrastUpDown.TabIndex = 78;
+ this.MinContrastUpDown.Value = new decimal(new int[] {
+ 10,
+ 0,
+ 0,
+ 0});
+ this.MinContrastUpDown.ValueChanged += new System.EventHandler(this.MinContrastUpDown_ValueChanged);
+ //
+ // label12
+ //
+ this.label12.Location = new System.Drawing.Point(38, 465);
+ this.label12.Name = "label12";
+ this.label12.Size = new System.Drawing.Size(96, 43);
+ this.label12.TabIndex = 77;
+ this.label12.Text = "MinContrast";
+ this.label12.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // OptimizationBox
+ //
+ this.OptimizationBox.Items.AddRange(new object[] {
+ "none",
+ "point_reduction_low",
+ "point_reduction_medium",
+ "point_reduction_high"});
+ this.OptimizationBox.Location = new System.Drawing.Point(144, 439);
+ this.OptimizationBox.Name = "OptimizationBox";
+ this.OptimizationBox.Size = new System.Drawing.Size(240, 20);
+ this.OptimizationBox.TabIndex = 76;
+ this.OptimizationBox.SelectedIndexChanged += new System.EventHandler(this.OptimizationBox_SelectedIndexChanged);
+ //
+ // OptimizationAutoButton
+ //
+ this.OptimizationAutoButton.Location = new System.Drawing.Point(394, 439);
+ this.OptimizationAutoButton.Name = "OptimizationAutoButton";
+ this.OptimizationAutoButton.Size = new System.Drawing.Size(57, 26);
+ this.OptimizationAutoButton.TabIndex = 75;
+ this.OptimizationAutoButton.Text = "Auto";
+ this.OptimizationAutoButton.Click += new System.EventHandler(this.OptimizationAutoButton_Click);
+ //
+ // label10
+ //
+ this.label10.Location = new System.Drawing.Point(38, 431);
+ this.label10.Name = "label10";
+ this.label10.Size = new System.Drawing.Size(96, 43);
+ this.label10.TabIndex = 74;
+ this.label10.Text = "Optimization";
+ this.label10.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // MetricBox
+ //
+ this.MetricBox.Items.AddRange(new object[] {
+ "use_polarity",
+ "ignore_global_polarity",
+ "ignore_local_polarity",
+ "ignore_color_polarity"});
+ this.MetricBox.Location = new System.Drawing.Point(144, 405);
+ this.MetricBox.Name = "MetricBox";
+ this.MetricBox.Size = new System.Drawing.Size(240, 20);
+ this.MetricBox.TabIndex = 73;
+ this.MetricBox.SelectedIndexChanged += new System.EventHandler(this.MetricBox_SelectedIndexChanged);
+ //
+ // label9
+ //
+ this.label9.Location = new System.Drawing.Point(38, 396);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(96, 43);
+ this.label9.TabIndex = 72;
+ this.label9.Text = "Metric";
+ this.label9.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // PyramidLevelTrackBar
+ //
+ this.PyramidLevelTrackBar.Location = new System.Drawing.Point(221, 336);
+ this.PyramidLevelTrackBar.Maximum = 6;
+ this.PyramidLevelTrackBar.Minimum = 1;
+ this.PyramidLevelTrackBar.Name = "PyramidLevelTrackBar";
+ this.PyramidLevelTrackBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.PyramidLevelTrackBar.Size = new System.Drawing.Size(173, 45);
+ this.PyramidLevelTrackBar.TabIndex = 71;
+ this.PyramidLevelTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.PyramidLevelTrackBar.Value = 5;
+ this.PyramidLevelTrackBar.Scroll += new System.EventHandler(this.PyramidLevelTrackBar_Scroll);
+ //
+ // PyramidLevelAutoButton
+ //
+ this.PyramidLevelAutoButton.Location = new System.Drawing.Point(394, 336);
+ this.PyramidLevelAutoButton.Name = "PyramidLevelAutoButton";
+ this.PyramidLevelAutoButton.Size = new System.Drawing.Size(57, 26);
+ this.PyramidLevelAutoButton.TabIndex = 70;
+ this.PyramidLevelAutoButton.Text = "Auto";
+ this.PyramidLevelAutoButton.Click += new System.EventHandler(this.PyramidLevelAutoButton_Click);
+ //
+ // PyramidLevelUpDown
+ //
+ this.PyramidLevelUpDown.Location = new System.Drawing.Point(144, 336);
+ this.PyramidLevelUpDown.Maximum = new decimal(new int[] {
+ 6,
+ 0,
+ 0,
+ 0});
+ this.PyramidLevelUpDown.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.PyramidLevelUpDown.Name = "PyramidLevelUpDown";
+ this.PyramidLevelUpDown.Size = new System.Drawing.Size(58, 21);
+ this.PyramidLevelUpDown.TabIndex = 69;
+ this.PyramidLevelUpDown.Value = new decimal(new int[] {
+ 5,
+ 0,
+ 0,
+ 0});
+ this.PyramidLevelUpDown.ValueChanged += new System.EventHandler(this.PyramidLevelUpDown_ValueChanged);
+ //
+ // label8
+ //
+ this.label8.Location = new System.Drawing.Point(38, 327);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(96, 43);
+ this.label8.TabIndex = 68;
+ this.label8.Text = "PyramidLevel";
+ this.label8.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // AngleStepTrackBar
+ //
+ this.AngleStepTrackBar.Location = new System.Drawing.Point(221, 302);
+ this.AngleStepTrackBar.Maximum = 112;
+ this.AngleStepTrackBar.Name = "AngleStepTrackBar";
+ this.AngleStepTrackBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.AngleStepTrackBar.Size = new System.Drawing.Size(173, 45);
+ this.AngleStepTrackBar.TabIndex = 67;
+ this.AngleStepTrackBar.TickFrequency = 10;
+ this.AngleStepTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.AngleStepTrackBar.Value = 10;
+ this.AngleStepTrackBar.Scroll += new System.EventHandler(this.AngleStepTrackBar_Scroll);
+ //
+ // AngleStepAutoButton
+ //
+ this.AngleStepAutoButton.Location = new System.Drawing.Point(394, 302);
+ this.AngleStepAutoButton.Name = "AngleStepAutoButton";
+ this.AngleStepAutoButton.Size = new System.Drawing.Size(57, 25);
+ this.AngleStepAutoButton.TabIndex = 66;
+ this.AngleStepAutoButton.Text = "Auto";
+ this.AngleStepAutoButton.Click += new System.EventHandler(this.AngleStepAutoButton_Click);
+ //
+ // AngleStepUpDown
+ //
+ this.AngleStepUpDown.Location = new System.Drawing.Point(144, 302);
+ this.AngleStepUpDown.Maximum = new decimal(new int[] {
+ 112,
+ 0,
+ 0,
+ 0});
+ this.AngleStepUpDown.Name = "AngleStepUpDown";
+ this.AngleStepUpDown.Size = new System.Drawing.Size(58, 21);
+ this.AngleStepUpDown.TabIndex = 65;
+ this.AngleStepUpDown.Value = new decimal(new int[] {
+ 10,
+ 0,
+ 0,
+ 0});
+ this.AngleStepUpDown.ValueChanged += new System.EventHandler(this.AngleStepUpDown_ValueChanged);
+ //
+ // label7
+ //
+ this.label7.Location = new System.Drawing.Point(38, 293);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(96, 43);
+ this.label7.TabIndex = 64;
+ this.label7.Text = "AngleStep*10";
+ this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // AngleExtentTrackBar
+ //
+ this.AngleExtentTrackBar.Location = new System.Drawing.Point(221, 267);
+ this.AngleExtentTrackBar.Maximum = 360;
+ this.AngleExtentTrackBar.Name = "AngleExtentTrackBar";
+ this.AngleExtentTrackBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.AngleExtentTrackBar.Size = new System.Drawing.Size(173, 45);
+ this.AngleExtentTrackBar.TabIndex = 63;
+ this.AngleExtentTrackBar.TickFrequency = 20;
+ this.AngleExtentTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.AngleExtentTrackBar.Value = 360;
+ this.AngleExtentTrackBar.Scroll += new System.EventHandler(this.AngleExtentTrackBar_Scroll);
+ //
+ // AngleExtentUpDown
+ //
+ this.AngleExtentUpDown.Location = new System.Drawing.Point(144, 267);
+ this.AngleExtentUpDown.Maximum = new decimal(new int[] {
+ 360,
+ 0,
+ 0,
+ 0});
+ this.AngleExtentUpDown.Name = "AngleExtentUpDown";
+ this.AngleExtentUpDown.Size = new System.Drawing.Size(58, 21);
+ this.AngleExtentUpDown.TabIndex = 62;
+ this.AngleExtentUpDown.Value = new decimal(new int[] {
+ 360,
+ 0,
+ 0,
+ 0});
+ this.AngleExtentUpDown.ValueChanged += new System.EventHandler(this.AngleExtentUpDown_ValueChanged);
+ //
+ // label6
+ //
+ this.label6.Location = new System.Drawing.Point(38, 258);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(96, 44);
+ this.label6.TabIndex = 61;
+ this.label6.Text = "AngleExtent";
+ this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // StartingAngleTrackBar
+ //
+ this.StartingAngleTrackBar.Location = new System.Drawing.Point(221, 233);
+ this.StartingAngleTrackBar.Maximum = 180;
+ this.StartingAngleTrackBar.Minimum = -180;
+ this.StartingAngleTrackBar.Name = "StartingAngleTrackBar";
+ this.StartingAngleTrackBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.StartingAngleTrackBar.Size = new System.Drawing.Size(173, 45);
+ this.StartingAngleTrackBar.TabIndex = 60;
+ this.StartingAngleTrackBar.TickFrequency = 20;
+ this.StartingAngleTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.StartingAngleTrackBar.Scroll += new System.EventHandler(this.StartingAngleTrackBar_Scroll);
+ //
+ // StartingAngleUpDown
+ //
+ this.StartingAngleUpDown.Location = new System.Drawing.Point(144, 233);
+ this.StartingAngleUpDown.Maximum = new decimal(new int[] {
+ 180,
+ 0,
+ 0,
+ 0});
+ this.StartingAngleUpDown.Minimum = new decimal(new int[] {
+ 180,
+ 0,
+ 0,
+ -2147483648});
+ this.StartingAngleUpDown.Name = "StartingAngleUpDown";
+ this.StartingAngleUpDown.Size = new System.Drawing.Size(58, 21);
+ this.StartingAngleUpDown.TabIndex = 59;
+ this.StartingAngleUpDown.ValueChanged += new System.EventHandler(this.StartingAngleUpDown_ValueChanged);
+ //
+ // label5
+ //
+ this.label5.Location = new System.Drawing.Point(38, 224);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(96, 43);
+ this.label5.TabIndex = 58;
+ this.label5.Text = "StartingAngle";
+ this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // ScaleStepAutoButton
+ //
+ this.ScaleStepAutoButton.Location = new System.Drawing.Point(394, 198);
+ this.ScaleStepAutoButton.Name = "ScaleStepAutoButton";
+ this.ScaleStepAutoButton.Size = new System.Drawing.Size(57, 26);
+ this.ScaleStepAutoButton.TabIndex = 50;
+ this.ScaleStepAutoButton.Text = "Auto";
+ this.ScaleStepAutoButton.Click += new System.EventHandler(this.ScaleStepAutoButton_Click);
+ //
+ // label11
+ //
+ this.label11.Location = new System.Drawing.Point(38, 190);
+ this.label11.Name = "label11";
+ this.label11.Size = new System.Drawing.Size(106, 43);
+ this.label11.TabIndex = 49;
+ this.label11.Text = "ScaleStep*1000";
+ this.label11.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // ScaleStepUpDown
+ //
+ this.ScaleStepUpDown.Location = new System.Drawing.Point(144, 198);
+ this.ScaleStepUpDown.Maximum = new decimal(new int[] {
+ 190,
+ 0,
+ 0,
+ 0});
+ this.ScaleStepUpDown.Name = "ScaleStepUpDown";
+ this.ScaleStepUpDown.Size = new System.Drawing.Size(58, 21);
+ this.ScaleStepUpDown.TabIndex = 48;
+ this.ScaleStepUpDown.Value = new decimal(new int[] {
+ 10,
+ 0,
+ 0,
+ 0});
+ this.ScaleStepUpDown.ValueChanged += new System.EventHandler(this.ScaleStepUpDown_ValueChanged);
+ //
+ // ScaleStepTrackBar
+ //
+ this.ScaleStepTrackBar.Location = new System.Drawing.Point(221, 198);
+ this.ScaleStepTrackBar.Maximum = 190;
+ this.ScaleStepTrackBar.Name = "ScaleStepTrackBar";
+ this.ScaleStepTrackBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.ScaleStepTrackBar.Size = new System.Drawing.Size(173, 45);
+ this.ScaleStepTrackBar.TabIndex = 47;
+ this.ScaleStepTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.ScaleStepTrackBar.Value = 10;
+ this.ScaleStepTrackBar.Scroll += new System.EventHandler(this.ScaleStepTrackBar_Scroll);
+ //
+ // MaxScaleUpDown
+ //
+ this.MaxScaleUpDown.Location = new System.Drawing.Point(144, 164);
+ this.MaxScaleUpDown.Maximum = new decimal(new int[] {
+ 200,
+ 0,
+ 0,
+ 0});
+ this.MaxScaleUpDown.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.MaxScaleUpDown.Name = "MaxScaleUpDown";
+ this.MaxScaleUpDown.Size = new System.Drawing.Size(58, 21);
+ this.MaxScaleUpDown.TabIndex = 46;
+ this.MaxScaleUpDown.Value = new decimal(new int[] {
+ 100,
+ 0,
+ 0,
+ 0});
+ this.MaxScaleUpDown.ValueChanged += new System.EventHandler(this.MaxScaleUpDown_ValueChanged);
+ //
+ // MaxScaleTrackBar
+ //
+ this.MaxScaleTrackBar.Location = new System.Drawing.Point(221, 164);
+ this.MaxScaleTrackBar.Maximum = 200;
+ this.MaxScaleTrackBar.Minimum = 1;
+ this.MaxScaleTrackBar.Name = "MaxScaleTrackBar";
+ this.MaxScaleTrackBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.MaxScaleTrackBar.Size = new System.Drawing.Size(173, 45);
+ this.MaxScaleTrackBar.TabIndex = 45;
+ this.MaxScaleTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.MaxScaleTrackBar.Value = 100;
+ this.MaxScaleTrackBar.Scroll += new System.EventHandler(this.MaxScaleTrackBar_Scroll);
+ //
+ // label4
+ //
+ this.label4.Location = new System.Drawing.Point(38, 155);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(96, 43);
+ this.label4.TabIndex = 44;
+ this.label4.Text = "MaxScale*100";
+ this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // MinScaleUpDown
+ //
+ this.MinScaleUpDown.Location = new System.Drawing.Point(144, 129);
+ this.MinScaleUpDown.Maximum = new decimal(new int[] {
+ 200,
+ 0,
+ 0,
+ 0});
+ this.MinScaleUpDown.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.MinScaleUpDown.Name = "MinScaleUpDown";
+ this.MinScaleUpDown.Size = new System.Drawing.Size(58, 21);
+ this.MinScaleUpDown.TabIndex = 43;
+ this.MinScaleUpDown.Value = new decimal(new int[] {
+ 100,
+ 0,
+ 0,
+ 0});
+ this.MinScaleUpDown.ValueChanged += new System.EventHandler(this.MinScaleUpDown_ValueChanged);
+ //
+ // MinScaleTrackBar
+ //
+ this.MinScaleTrackBar.Location = new System.Drawing.Point(221, 129);
+ this.MinScaleTrackBar.Maximum = 200;
+ this.MinScaleTrackBar.Minimum = 1;
+ this.MinScaleTrackBar.Name = "MinScaleTrackBar";
+ this.MinScaleTrackBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.MinScaleTrackBar.Size = new System.Drawing.Size(173, 45);
+ this.MinScaleTrackBar.TabIndex = 42;
+ this.MinScaleTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.MinScaleTrackBar.Value = 100;
+ this.MinScaleTrackBar.Scroll += new System.EventHandler(this.MinScaleTrackBar_Scroll);
+ //
+ // label3
+ //
+ this.label3.Location = new System.Drawing.Point(38, 121);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(96, 43);
+ this.label3.TabIndex = 41;
+ this.label3.Text = "MinScale*100";
+ this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // ContrastAutoButton
+ //
+ this.ContrastAutoButton.BackColor = System.Drawing.SystemColors.Control;
+ this.ContrastAutoButton.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.ContrastAutoButton.Location = new System.Drawing.Point(394, 95);
+ this.ContrastAutoButton.Name = "ContrastAutoButton";
+ this.ContrastAutoButton.Size = new System.Drawing.Size(57, 26);
+ this.ContrastAutoButton.TabIndex = 40;
+ this.ContrastAutoButton.Text = "Auto";
+ this.ContrastAutoButton.UseVisualStyleBackColor = false;
+ this.ContrastAutoButton.Click += new System.EventHandler(this.ContrastAutoButton_Click);
+ //
+ // ContrastUpDown
+ //
+ this.ContrastUpDown.Location = new System.Drawing.Point(144, 95);
+ this.ContrastUpDown.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.ContrastUpDown.Name = "ContrastUpDown";
+ this.ContrastUpDown.Size = new System.Drawing.Size(58, 21);
+ this.ContrastUpDown.TabIndex = 39;
+ this.ContrastUpDown.Value = new decimal(new int[] {
+ 30,
+ 0,
+ 0,
+ 0});
+ this.ContrastUpDown.ValueChanged += new System.EventHandler(this.ContrastUpDown_ValueChanged);
+ //
+ // ContrastTrackBar
+ //
+ this.ContrastTrackBar.Location = new System.Drawing.Point(221, 95);
+ this.ContrastTrackBar.Maximum = 255;
+ this.ContrastTrackBar.Name = "ContrastTrackBar";
+ this.ContrastTrackBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.ContrastTrackBar.Size = new System.Drawing.Size(173, 45);
+ this.ContrastTrackBar.TabIndex = 38;
+ this.ContrastTrackBar.TickFrequency = 15;
+ this.ContrastTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.ContrastTrackBar.Value = 30;
+ this.ContrastTrackBar.Scroll += new System.EventHandler(this.ContrastTrackBar_Scroll);
+ //
+ // label2
+ //
+ this.label2.Location = new System.Drawing.Point(38, 86);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(96, 43);
+ this.label2.TabIndex = 37;
+ this.label2.Text = "Contrast";
+ this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // DispPyramidUpDown
+ //
+ this.DispPyramidUpDown.Location = new System.Drawing.Point(154, 34);
+ this.DispPyramidUpDown.Maximum = new decimal(new int[] {
+ 6,
+ 0,
+ 0,
+ 0});
+ this.DispPyramidUpDown.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.DispPyramidUpDown.Name = "DispPyramidUpDown";
+ this.DispPyramidUpDown.Size = new System.Drawing.Size(48, 21);
+ this.DispPyramidUpDown.TabIndex = 30;
+ this.DispPyramidUpDown.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.DispPyramidUpDown.ValueChanged += new System.EventHandler(this.DispPyramidUpDown_ValueChanged);
+ //
+ // DispPyramidTrackBar
+ //
+ this.DispPyramidTrackBar.Enabled = false;
+ this.DispPyramidTrackBar.Location = new System.Drawing.Point(221, 34);
+ this.DispPyramidTrackBar.Maximum = 6;
+ this.DispPyramidTrackBar.Minimum = 1;
+ this.DispPyramidTrackBar.Name = "DispPyramidTrackBar";
+ this.DispPyramidTrackBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.DispPyramidTrackBar.Size = new System.Drawing.Size(173, 45);
+ this.DispPyramidTrackBar.TabIndex = 29;
+ this.DispPyramidTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.DispPyramidTrackBar.Value = 1;
+ this.DispPyramidTrackBar.Scroll += new System.EventHandler(this.DispPyramidTrackBar_Scroll);
+ //
+ // label1
+ //
+ this.label1.Location = new System.Drawing.Point(38, 26);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(96, 43);
+ this.label1.TabIndex = 28;
+ this.label1.Text = "Display Image Pyramid";
+ this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // tabPageFindModel
+ //
+ this.tabPageFindModel.Controls.Add(this.FindAlwaysCheckBox);
+ this.tabPageFindModel.Controls.Add(this.testImgListBox);
+ this.tabPageFindModel.Controls.Add(this.findModelButton);
+ this.tabPageFindModel.Controls.Add(this.displayTestImgButton);
+ this.tabPageFindModel.Controls.Add(this.deleteAllTestImgButton);
+ this.tabPageFindModel.Controls.Add(this.deleteTestImgButton);
+ this.tabPageFindModel.Controls.Add(this.LastPyrLevTrackBar);
+ this.tabPageFindModel.Controls.Add(this.LastPyrLevUpDown);
+ this.tabPageFindModel.Controls.Add(this.label18);
+ this.tabPageFindModel.Controls.Add(this.SubPixelBox);
+ this.tabPageFindModel.Controls.Add(this.label17);
+ this.tabPageFindModel.Controls.Add(this.MaxOverlapTrackBar);
+ this.tabPageFindModel.Controls.Add(this.MaxOverlapUpDown);
+ this.tabPageFindModel.Controls.Add(this.label15);
+ this.tabPageFindModel.Controls.Add(this.GreedinessTrackBar);
+ this.tabPageFindModel.Controls.Add(this.GreedinessUpDown);
+ this.tabPageFindModel.Controls.Add(this.label16);
+ this.tabPageFindModel.Controls.Add(this.NumMatchesTrackBar);
+ this.tabPageFindModel.Controls.Add(this.NumMatchesUpDown);
+ this.tabPageFindModel.Controls.Add(this.label14);
+ this.tabPageFindModel.Controls.Add(this.MinScoreTrackBar);
+ this.tabPageFindModel.Controls.Add(this.MinScoreUpDown);
+ this.tabPageFindModel.Controls.Add(this.label13);
+ this.tabPageFindModel.Controls.Add(this.loadTestImgButton);
+ this.tabPageFindModel.Location = new System.Drawing.Point(4, 22);
+ this.tabPageFindModel.Name = "tabPageFindModel";
+ this.tabPageFindModel.Size = new System.Drawing.Size(482, 568);
+ this.tabPageFindModel.TabIndex = 0;
+ this.tabPageFindModel.Text = " 查找模板 ";
+ this.tabPageFindModel.UseVisualStyleBackColor = true;
+ //
+ // FindAlwaysCheckBox
+ //
+ this.FindAlwaysCheckBox.Location = new System.Drawing.Point(346, 228);
+ this.FindAlwaysCheckBox.Name = "FindAlwaysCheckBox";
+ this.FindAlwaysCheckBox.Size = new System.Drawing.Size(105, 35);
+ this.FindAlwaysCheckBox.TabIndex = 68;
+ this.FindAlwaysCheckBox.Text = "Always Find";
+ this.FindAlwaysCheckBox.CheckedChanged += new System.EventHandler(this.findAlwaysCheckBox_CheckedChanged);
+ //
+ // testImgListBox
+ //
+ this.testImgListBox.HorizontalScrollbar = true;
+ this.testImgListBox.ItemHeight = 12;
+ this.testImgListBox.Location = new System.Drawing.Point(38, 26);
+ this.testImgListBox.Name = "testImgListBox";
+ this.testImgListBox.Size = new System.Drawing.Size(288, 220);
+ this.testImgListBox.TabIndex = 67;
+ this.testImgListBox.SelectedIndexChanged += new System.EventHandler(this.testImgListBox_SelectedIndexChanged);
+ //
+ // findModelButton
+ //
+ this.findModelButton.Location = new System.Drawing.Point(346, 192);
+ this.findModelButton.Name = "findModelButton";
+ this.findModelButton.Size = new System.Drawing.Size(105, 30);
+ this.findModelButton.TabIndex = 66;
+ this.findModelButton.Text = "Find Model";
+ this.findModelButton.Click += new System.EventHandler(this.findModelButton_Click);
+ //
+ // displayTestImgButton
+ //
+ this.displayTestImgButton.Location = new System.Drawing.Point(346, 157);
+ this.displayTestImgButton.Name = "displayTestImgButton";
+ this.displayTestImgButton.Size = new System.Drawing.Size(105, 30);
+ this.displayTestImgButton.TabIndex = 65;
+ this.displayTestImgButton.Text = "Display";
+ this.displayTestImgButton.Click += new System.EventHandler(this.displayTestImgButton_Click);
+ //
+ // deleteAllTestImgButton
+ //
+ this.deleteAllTestImgButton.Location = new System.Drawing.Point(346, 95);
+ this.deleteAllTestImgButton.Name = "deleteAllTestImgButton";
+ this.deleteAllTestImgButton.Size = new System.Drawing.Size(105, 30);
+ this.deleteAllTestImgButton.TabIndex = 64;
+ this.deleteAllTestImgButton.Text = "Delete All";
+ this.deleteAllTestImgButton.Click += new System.EventHandler(this.deleteAllTestImgButton_Click);
+ //
+ // deleteTestImgButton
+ //
+ this.deleteTestImgButton.Location = new System.Drawing.Point(346, 60);
+ this.deleteTestImgButton.Name = "deleteTestImgButton";
+ this.deleteTestImgButton.Size = new System.Drawing.Size(105, 30);
+ this.deleteTestImgButton.TabIndex = 63;
+ this.deleteTestImgButton.Text = "Delete Image";
+ this.deleteTestImgButton.Click += new System.EventHandler(this.deleteTestImgButton_Click);
+ //
+ // LastPyrLevTrackBar
+ //
+ this.LastPyrLevTrackBar.Location = new System.Drawing.Point(230, 474);
+ this.LastPyrLevTrackBar.Maximum = 5;
+ this.LastPyrLevTrackBar.Minimum = 1;
+ this.LastPyrLevTrackBar.Name = "LastPyrLevTrackBar";
+ this.LastPyrLevTrackBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.LastPyrLevTrackBar.Size = new System.Drawing.Size(231, 45);
+ this.LastPyrLevTrackBar.TabIndex = 62;
+ this.LastPyrLevTrackBar.TickFrequency = 20;
+ this.LastPyrLevTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.LastPyrLevTrackBar.Value = 1;
+ this.LastPyrLevTrackBar.Scroll += new System.EventHandler(this.LastPyrLevTrackBar_Scroll);
+ //
+ // LastPyrLevUpDown
+ //
+ this.LastPyrLevUpDown.Location = new System.Drawing.Point(154, 474);
+ this.LastPyrLevUpDown.Maximum = new decimal(new int[] {
+ 5,
+ 0,
+ 0,
+ 0});
+ this.LastPyrLevUpDown.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.LastPyrLevUpDown.Name = "LastPyrLevUpDown";
+ this.LastPyrLevUpDown.Size = new System.Drawing.Size(57, 21);
+ this.LastPyrLevUpDown.TabIndex = 61;
+ this.LastPyrLevUpDown.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.LastPyrLevUpDown.ValueChanged += new System.EventHandler(this.LastPyrLevUpDown_ValueChanged);
+ //
+ // label18
+ //
+ this.label18.Location = new System.Drawing.Point(38, 465);
+ this.label18.Name = "label18";
+ this.label18.Size = new System.Drawing.Size(107, 43);
+ this.label18.TabIndex = 60;
+ this.label18.Text = "Last Pyramid Level";
+ this.label18.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // SubPixelBox
+ //
+ this.SubPixelBox.Items.AddRange(new object[] {
+ "none",
+ "interpolation",
+ "least_squares",
+ "least_squares_high",
+ "least_squares_very_high"});
+ this.SubPixelBox.Location = new System.Drawing.Point(154, 437);
+ this.SubPixelBox.Name = "SubPixelBox";
+ this.SubPixelBox.Size = new System.Drawing.Size(297, 20);
+ this.SubPixelBox.TabIndex = 59;
+ this.SubPixelBox.SelectedIndexChanged += new System.EventHandler(this.SubPixelBox_SelectedIndexChanged);
+ //
+ // label17
+ //
+ this.label17.Location = new System.Drawing.Point(38, 429);
+ this.label17.Name = "label17";
+ this.label17.Size = new System.Drawing.Size(107, 43);
+ this.label17.TabIndex = 58;
+ this.label17.Text = "Subpixel";
+ this.label17.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // MaxOverlapTrackBar
+ //
+ this.MaxOverlapTrackBar.LargeChange = 10;
+ this.MaxOverlapTrackBar.Location = new System.Drawing.Point(230, 388);
+ this.MaxOverlapTrackBar.Maximum = 100;
+ this.MaxOverlapTrackBar.Name = "MaxOverlapTrackBar";
+ this.MaxOverlapTrackBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.MaxOverlapTrackBar.Size = new System.Drawing.Size(231, 45);
+ this.MaxOverlapTrackBar.TabIndex = 57;
+ this.MaxOverlapTrackBar.TickFrequency = 20;
+ this.MaxOverlapTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.MaxOverlapTrackBar.Value = 50;
+ this.MaxOverlapTrackBar.Scroll += new System.EventHandler(this.MaxOverlapTrackBar_Scroll);
+ //
+ // MaxOverlapUpDown
+ //
+ this.MaxOverlapUpDown.Location = new System.Drawing.Point(154, 388);
+ this.MaxOverlapUpDown.Name = "MaxOverlapUpDown";
+ this.MaxOverlapUpDown.Size = new System.Drawing.Size(57, 21);
+ this.MaxOverlapUpDown.TabIndex = 56;
+ this.MaxOverlapUpDown.Value = new decimal(new int[] {
+ 50,
+ 0,
+ 0,
+ 0});
+ this.MaxOverlapUpDown.ValueChanged += new System.EventHandler(this.MaxOverlapUpDown_ValueChanged);
+ //
+ // label15
+ //
+ this.label15.Location = new System.Drawing.Point(38, 379);
+ this.label15.Name = "label15";
+ this.label15.Size = new System.Drawing.Size(107, 43);
+ this.label15.TabIndex = 55;
+ this.label15.Text = "MaxOverlap*100";
+ this.label15.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // GreedinessTrackBar
+ //
+ this.GreedinessTrackBar.LargeChange = 10;
+ this.GreedinessTrackBar.Location = new System.Drawing.Point(230, 362);
+ this.GreedinessTrackBar.Maximum = 100;
+ this.GreedinessTrackBar.Name = "GreedinessTrackBar";
+ this.GreedinessTrackBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.GreedinessTrackBar.Size = new System.Drawing.Size(231, 45);
+ this.GreedinessTrackBar.TabIndex = 54;
+ this.GreedinessTrackBar.TickFrequency = 20;
+ this.GreedinessTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.GreedinessTrackBar.Value = 75;
+ this.GreedinessTrackBar.Scroll += new System.EventHandler(this.GreedinessTrackBar_Scroll);
+ //
+ // GreedinessUpDown
+ //
+ this.GreedinessUpDown.Location = new System.Drawing.Point(154, 362);
+ this.GreedinessUpDown.Name = "GreedinessUpDown";
+ this.GreedinessUpDown.Size = new System.Drawing.Size(57, 21);
+ this.GreedinessUpDown.TabIndex = 53;
+ this.GreedinessUpDown.Value = new decimal(new int[] {
+ 75,
+ 0,
+ 0,
+ 0});
+ this.GreedinessUpDown.ValueChanged += new System.EventHandler(this.GreedinessUpDown_ValueChanged);
+ //
+ // label16
+ //
+ this.label16.Location = new System.Drawing.Point(38, 353);
+ this.label16.Name = "label16";
+ this.label16.Size = new System.Drawing.Size(107, 43);
+ this.label16.TabIndex = 52;
+ this.label16.Text = "Greediness*100";
+ this.label16.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // NumMatchesTrackBar
+ //
+ this.NumMatchesTrackBar.LargeChange = 10;
+ this.NumMatchesTrackBar.Location = new System.Drawing.Point(230, 310);
+ this.NumMatchesTrackBar.Maximum = 100;
+ this.NumMatchesTrackBar.Name = "NumMatchesTrackBar";
+ this.NumMatchesTrackBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.NumMatchesTrackBar.Size = new System.Drawing.Size(231, 45);
+ this.NumMatchesTrackBar.TabIndex = 51;
+ this.NumMatchesTrackBar.TickFrequency = 20;
+ this.NumMatchesTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.NumMatchesTrackBar.Value = 1;
+ this.NumMatchesTrackBar.Scroll += new System.EventHandler(this.NumMatchesTrackBar_Scroll);
+ //
+ // NumMatchesUpDown
+ //
+ this.NumMatchesUpDown.Location = new System.Drawing.Point(154, 310);
+ this.NumMatchesUpDown.Name = "NumMatchesUpDown";
+ this.NumMatchesUpDown.Size = new System.Drawing.Size(57, 21);
+ this.NumMatchesUpDown.TabIndex = 50;
+ this.NumMatchesUpDown.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.NumMatchesUpDown.ValueChanged += new System.EventHandler(this.NumMatchesUpDown_ValueChanged);
+ //
+ // label14
+ //
+ this.label14.Location = new System.Drawing.Point(38, 302);
+ this.label14.Name = "label14";
+ this.label14.Size = new System.Drawing.Size(107, 43);
+ this.label14.TabIndex = 49;
+ this.label14.Text = "NumMatches";
+ this.label14.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // MinScoreTrackBar
+ //
+ this.MinScoreTrackBar.LargeChange = 10;
+ this.MinScoreTrackBar.Location = new System.Drawing.Point(230, 284);
+ this.MinScoreTrackBar.Maximum = 100;
+ this.MinScoreTrackBar.Name = "MinScoreTrackBar";
+ this.MinScoreTrackBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.MinScoreTrackBar.Size = new System.Drawing.Size(231, 45);
+ this.MinScoreTrackBar.TabIndex = 48;
+ this.MinScoreTrackBar.TickFrequency = 20;
+ this.MinScoreTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.MinScoreTrackBar.Value = 50;
+ this.MinScoreTrackBar.Scroll += new System.EventHandler(this.MinScoreTrackBar_Scroll);
+ //
+ // MinScoreUpDown
+ //
+ this.MinScoreUpDown.Location = new System.Drawing.Point(154, 284);
+ this.MinScoreUpDown.Name = "MinScoreUpDown";
+ this.MinScoreUpDown.Size = new System.Drawing.Size(57, 21);
+ this.MinScoreUpDown.TabIndex = 47;
+ this.MinScoreUpDown.Value = new decimal(new int[] {
+ 50,
+ 0,
+ 0,
+ 0});
+ this.MinScoreUpDown.ValueChanged += new System.EventHandler(this.MinScoreUpDown_ValueChanged);
+ //
+ // label13
+ //
+ this.label13.Location = new System.Drawing.Point(38, 276);
+ this.label13.Name = "label13";
+ this.label13.Size = new System.Drawing.Size(107, 43);
+ this.label13.TabIndex = 46;
+ this.label13.Text = "MinScore*100";
+ this.label13.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // loadTestImgButton
+ //
+ this.loadTestImgButton.Location = new System.Drawing.Point(346, 26);
+ this.loadTestImgButton.Name = "loadTestImgButton";
+ this.loadTestImgButton.Size = new System.Drawing.Size(105, 30);
+ this.loadTestImgButton.TabIndex = 0;
+ this.loadTestImgButton.Text = "Load Images";
+ this.loadTestImgButton.Click += new System.EventHandler(this.LoadTestImgButton_Click);
+ //
+ // tabPageOptimRecognition
+ //
+ this.tabPageOptimRecognition.Controls.Add(this.groupBox1);
+ this.tabPageOptimRecognition.Controls.Add(this.panel1);
+ this.tabPageOptimRecognition.Controls.Add(this.OptimizeButton);
+ this.tabPageOptimRecognition.Location = new System.Drawing.Point(4, 22);
+ this.tabPageOptimRecognition.Name = "tabPageOptimRecognition";
+ this.tabPageOptimRecognition.Size = new System.Drawing.Size(482, 568);
+ this.tabPageOptimRecognition.TabIndex = 1;
+ this.tabPageOptimRecognition.Text = " 优化识别 ";
+ this.tabPageOptimRecognition.UseVisualStyleBackColor = true;
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.RecogNoManSelUpDown);
+ this.groupBox1.Controls.Add(this.label19);
+ this.groupBox1.Controls.Add(this.FindAtLeastOneModelButton);
+ this.groupBox1.Controls.Add(this.FindMaxNoOfModelButton);
+ this.groupBox1.Controls.Add(this.FindNoOfInstButton);
+ this.groupBox1.Controls.Add(this.recogRateTrackBar);
+ this.groupBox1.Controls.Add(this.recogRateUpDown);
+ this.groupBox1.Controls.Add(this.RecognRateComboBox);
+ this.groupBox1.Controls.Add(this.label20);
+ this.groupBox1.Location = new System.Drawing.Point(19, 26);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(437, 198);
+ this.groupBox1.TabIndex = 56;
+ this.groupBox1.TabStop = false;
+ //
+ // RecogNoManSelUpDown
+ //
+ this.RecogNoManSelUpDown.Location = new System.Drawing.Point(365, 39);
+ this.RecogNoManSelUpDown.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.RecogNoManSelUpDown.Name = "RecogNoManSelUpDown";
+ this.RecogNoManSelUpDown.Size = new System.Drawing.Size(57, 21);
+ this.RecogNoManSelUpDown.TabIndex = 54;
+ this.RecogNoManSelUpDown.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.RecogNoManSelUpDown.ValueChanged += new System.EventHandler(this.RecogNoManSelUpDown_ValueChanged);
+ //
+ // label19
+ //
+ this.label19.Location = new System.Drawing.Point(19, 43);
+ this.label19.Name = "label19";
+ this.label19.Size = new System.Drawing.Size(67, 52);
+ this.label19.TabIndex = 1;
+ this.label19.Text = "Mode";
+ this.label19.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // FindAtLeastOneModelButton
+ //
+ this.FindAtLeastOneModelButton.Location = new System.Drawing.Point(86, 60);
+ this.FindAtLeastOneModelButton.Name = "FindAtLeastOneModelButton";
+ this.FindAtLeastOneModelButton.Size = new System.Drawing.Size(336, 22);
+ this.FindAtLeastOneModelButton.TabIndex = 2;
+ this.FindAtLeastOneModelButton.Text = " Find at least one model instance per image";
+ this.FindAtLeastOneModelButton.CheckedChanged += new System.EventHandler(this.FindAtLeastOneModelButton_CheckedChanged);
+ //
+ // FindMaxNoOfModelButton
+ //
+ this.FindMaxNoOfModelButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FindMaxNoOfModelButton.Location = new System.Drawing.Point(86, 86);
+ this.FindMaxNoOfModelButton.Name = "FindMaxNoOfModelButton";
+ this.FindMaxNoOfModelButton.Size = new System.Drawing.Size(346, 17);
+ this.FindMaxNoOfModelButton.TabIndex = 3;
+ this.FindMaxNoOfModelButton.Text = " Find maximum number of model instances per image";
+ this.FindMaxNoOfModelButton.CheckedChanged += new System.EventHandler(this.FindMaxNoOfModelButton_CheckedChanged);
+ //
+ // FindNoOfInstButton
+ //
+ this.FindNoOfInstButton.Checked = true;
+ this.FindNoOfInstButton.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.FindNoOfInstButton.Location = new System.Drawing.Point(86, 34);
+ this.FindNoOfInstButton.Name = "FindNoOfInstButton";
+ this.FindNoOfInstButton.Size = new System.Drawing.Size(298, 26);
+ this.FindNoOfInstButton.TabIndex = 0;
+ this.FindNoOfInstButton.TabStop = true;
+ this.FindNoOfInstButton.Text = " Find number of instances specified";
+ this.FindNoOfInstButton.CheckedChanged += new System.EventHandler(this.FindNoOfInstButton_CheckedChanged);
+ //
+ // recogRateTrackBar
+ //
+ this.recogRateTrackBar.LargeChange = 10;
+ this.recogRateTrackBar.Location = new System.Drawing.Point(221, 138);
+ this.recogRateTrackBar.Maximum = 100;
+ this.recogRateTrackBar.Name = "recogRateTrackBar";
+ this.recogRateTrackBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.recogRateTrackBar.Size = new System.Drawing.Size(201, 45);
+ this.recogRateTrackBar.TabIndex = 53;
+ this.recogRateTrackBar.TickFrequency = 20;
+ this.recogRateTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.recogRateTrackBar.Value = 100;
+ this.recogRateTrackBar.Scroll += new System.EventHandler(this.recogRateTrackBar_Scroll);
+ //
+ // recogRateUpDown
+ //
+ this.recogRateUpDown.Location = new System.Drawing.Point(154, 138);
+ this.recogRateUpDown.Name = "recogRateUpDown";
+ this.recogRateUpDown.Size = new System.Drawing.Size(57, 21);
+ this.recogRateUpDown.TabIndex = 52;
+ this.recogRateUpDown.Value = new decimal(new int[] {
+ 100,
+ 0,
+ 0,
+ 0});
+ this.recogRateUpDown.ValueChanged += new System.EventHandler(this.recogRateUpDown_ValueChanged);
+ //
+ // RecognRateComboBox
+ //
+ this.RecognRateComboBox.Items.AddRange(new object[] {
+ "=",
+ ">="});
+ this.RecognRateComboBox.Location = new System.Drawing.Point(86, 138);
+ this.RecognRateComboBox.Name = "RecognRateComboBox";
+ this.RecognRateComboBox.Size = new System.Drawing.Size(48, 20);
+ this.RecognRateComboBox.TabIndex = 5;
+ this.RecognRateComboBox.SelectedIndexChanged += new System.EventHandler(this.RecognRateComboBox_SelectedIndexChanged);
+ //
+ // label20
+ //
+ this.label20.Location = new System.Drawing.Point(19, 129);
+ this.label20.Name = "label20";
+ this.label20.Size = new System.Drawing.Size(58, 43);
+ this.label20.TabIndex = 4;
+ this.label20.Text = "Recogn Rate";
+ this.label20.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // panel1
+ //
+ this.panel1.Controls.Add(this.labelOptStatus);
+ this.panel1.Controls.Add(this.label35);
+ this.panel1.Controls.Add(this.label34);
+ this.panel1.Controls.Add(this.label33);
+ this.panel1.Controls.Add(this.label32);
+ this.panel1.Controls.Add(this.label31);
+ this.panel1.Controls.Add(this.labelRecogn21);
+ this.panel1.Controls.Add(this.labelRecogn24);
+ this.panel1.Controls.Add(this.labelRecogn14);
+ this.panel1.Controls.Add(this.labelRecogn23);
+ this.panel1.Controls.Add(this.labelRecogn13);
+ this.panel1.Controls.Add(this.labelRecogn22);
+ this.panel1.Controls.Add(this.labelRecogn12);
+ this.panel1.Controls.Add(this.labelRecogn11);
+ this.panel1.Controls.Add(this.label29);
+ this.panel1.Controls.Add(this.label30);
+ this.panel1.Location = new System.Drawing.Point(19, 233);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(442, 232);
+ this.panel1.TabIndex = 55;
+ //
+ // labelOptStatus
+ //
+ this.labelOptStatus.BackColor = System.Drawing.Color.White;
+ this.labelOptStatus.Location = new System.Drawing.Point(10, 17);
+ this.labelOptStatus.Name = "labelOptStatus";
+ this.labelOptStatus.Size = new System.Drawing.Size(422, 26);
+ this.labelOptStatus.TabIndex = 63;
+ this.labelOptStatus.Text = " Optimization Status: ";
+ this.labelOptStatus.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label35
+ //
+ this.label35.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label35.Location = new System.Drawing.Point(10, 190);
+ this.label35.Name = "label35";
+ this.label35.Size = new System.Drawing.Size(134, 34);
+ this.label35.TabIndex = 62;
+ this.label35.Text = "Average Time";
+ this.label35.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label34
+ //
+ this.label34.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label34.Location = new System.Drawing.Point(10, 155);
+ this.label34.Name = "label34";
+ this.label34.Size = new System.Drawing.Size(134, 35);
+ this.label34.TabIndex = 61;
+ this.label34.Text = "Recognition Rate";
+ this.label34.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label33
+ //
+ this.label33.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label33.Location = new System.Drawing.Point(10, 121);
+ this.label33.Name = "label33";
+ this.label33.Size = new System.Drawing.Size(134, 34);
+ this.label33.TabIndex = 60;
+ this.label33.Text = "Greediness";
+ this.label33.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label32
+ //
+ this.label32.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label32.Location = new System.Drawing.Point(10, 43);
+ this.label32.Name = "label32";
+ this.label32.Size = new System.Drawing.Size(105, 35);
+ this.label32.TabIndex = 59;
+ this.label32.Text = "Statistics";
+ this.label32.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label31
+ //
+ this.label31.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label31.Location = new System.Drawing.Point(10, 86);
+ this.label31.Name = "label31";
+ this.label31.Size = new System.Drawing.Size(134, 35);
+ this.label31.TabIndex = 58;
+ this.label31.Text = "Minimum Score";
+ this.label31.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labelRecogn21
+ //
+ this.labelRecogn21.BackColor = System.Drawing.Color.White;
+ this.labelRecogn21.Location = new System.Drawing.Point(307, 78);
+ this.labelRecogn21.Name = "labelRecogn21";
+ this.labelRecogn21.Size = new System.Drawing.Size(125, 34);
+ this.labelRecogn21.TabIndex = 8;
+ this.labelRecogn21.Text = "-";
+ this.labelRecogn21.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelRecogn24
+ //
+ this.labelRecogn24.BackColor = System.Drawing.Color.White;
+ this.labelRecogn24.Location = new System.Drawing.Point(307, 194);
+ this.labelRecogn24.Name = "labelRecogn24";
+ this.labelRecogn24.Size = new System.Drawing.Size(125, 34);
+ this.labelRecogn24.TabIndex = 7;
+ this.labelRecogn24.Text = "-";
+ this.labelRecogn24.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelRecogn14
+ //
+ this.labelRecogn14.BackColor = System.Drawing.Color.White;
+ this.labelRecogn14.Location = new System.Drawing.Point(173, 194);
+ this.labelRecogn14.Name = "labelRecogn14";
+ this.labelRecogn14.Size = new System.Drawing.Size(125, 34);
+ this.labelRecogn14.TabIndex = 6;
+ this.labelRecogn14.Text = "-";
+ this.labelRecogn14.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelRecogn23
+ //
+ this.labelRecogn23.BackColor = System.Drawing.Color.White;
+ this.labelRecogn23.Location = new System.Drawing.Point(307, 155);
+ this.labelRecogn23.Name = "labelRecogn23";
+ this.labelRecogn23.Size = new System.Drawing.Size(125, 35);
+ this.labelRecogn23.TabIndex = 5;
+ this.labelRecogn23.Text = "-";
+ this.labelRecogn23.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelRecogn13
+ //
+ this.labelRecogn13.BackColor = System.Drawing.Color.White;
+ this.labelRecogn13.Location = new System.Drawing.Point(173, 155);
+ this.labelRecogn13.Name = "labelRecogn13";
+ this.labelRecogn13.Size = new System.Drawing.Size(125, 35);
+ this.labelRecogn13.TabIndex = 4;
+ this.labelRecogn13.Text = "-";
+ this.labelRecogn13.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelRecogn22
+ //
+ this.labelRecogn22.BackColor = System.Drawing.Color.White;
+ this.labelRecogn22.Location = new System.Drawing.Point(307, 116);
+ this.labelRecogn22.Name = "labelRecogn22";
+ this.labelRecogn22.Size = new System.Drawing.Size(125, 35);
+ this.labelRecogn22.TabIndex = 3;
+ this.labelRecogn22.Text = "-";
+ this.labelRecogn22.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelRecogn12
+ //
+ this.labelRecogn12.BackColor = System.Drawing.Color.White;
+ this.labelRecogn12.Location = new System.Drawing.Point(173, 116);
+ this.labelRecogn12.Name = "labelRecogn12";
+ this.labelRecogn12.Size = new System.Drawing.Size(125, 35);
+ this.labelRecogn12.TabIndex = 2;
+ this.labelRecogn12.Text = "-";
+ this.labelRecogn12.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelRecogn11
+ //
+ this.labelRecogn11.BackColor = System.Drawing.Color.White;
+ this.labelRecogn11.Location = new System.Drawing.Point(173, 78);
+ this.labelRecogn11.Name = "labelRecogn11";
+ this.labelRecogn11.Size = new System.Drawing.Size(125, 34);
+ this.labelRecogn11.TabIndex = 0;
+ this.labelRecogn11.Text = "-";
+ this.labelRecogn11.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label29
+ //
+ this.label29.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label29.Location = new System.Drawing.Point(163, 43);
+ this.label29.Name = "label29";
+ this.label29.Size = new System.Drawing.Size(135, 35);
+ this.label29.TabIndex = 56;
+ this.label29.Text = "Last Test Run";
+ this.label29.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label30
+ //
+ this.label30.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label30.Location = new System.Drawing.Point(298, 43);
+ this.label30.Name = "label30";
+ this.label30.Size = new System.Drawing.Size(134, 35);
+ this.label30.TabIndex = 57;
+ this.label30.Text = "Optimum Test Run";
+ this.label30.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // OptimizeButton
+ //
+ this.OptimizeButton.Location = new System.Drawing.Point(326, 470);
+ this.OptimizeButton.Name = "OptimizeButton";
+ this.OptimizeButton.Size = new System.Drawing.Size(125, 34);
+ this.OptimizeButton.TabIndex = 54;
+ this.OptimizeButton.Text = "Optimize";
+ this.OptimizeButton.Click += new System.EventHandler(this.runOptimizeSpeedButton_Click);
+ //
+ // tabPageInspectModel
+ //
+ this.tabPageInspectModel.Controls.Add(this.label21);
+ this.tabPageInspectModel.Controls.Add(this.InspectMaxNoMatchUpDown);
+ this.tabPageInspectModel.Controls.Add(this.groupBox4);
+ this.tabPageInspectModel.Controls.Add(this.groupBox3);
+ this.tabPageInspectModel.Controls.Add(this.StatisticsButton);
+ this.tabPageInspectModel.Location = new System.Drawing.Point(4, 22);
+ this.tabPageInspectModel.Name = "tabPageInspectModel";
+ this.tabPageInspectModel.Size = new System.Drawing.Size(482, 568);
+ this.tabPageInspectModel.TabIndex = 0;
+ this.tabPageInspectModel.Text = " 模板检测 ";
+ this.tabPageInspectModel.UseVisualStyleBackColor = true;
+ //
+ // label21
+ //
+ this.label21.Location = new System.Drawing.Point(19, 482);
+ this.label21.Name = "label21";
+ this.label21.Size = new System.Drawing.Size(192, 26);
+ this.label21.TabIndex = 4;
+ this.label21.Text = "Maximum Number of Matches";
+ //
+ // InspectMaxNoMatchUpDown
+ //
+ this.InspectMaxNoMatchUpDown.Location = new System.Drawing.Point(211, 482);
+ this.InspectMaxNoMatchUpDown.Name = "InspectMaxNoMatchUpDown";
+ this.InspectMaxNoMatchUpDown.Size = new System.Drawing.Size(58, 21);
+ this.InspectMaxNoMatchUpDown.TabIndex = 3;
+ this.InspectMaxNoMatchUpDown.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.InspectMaxNoMatchUpDown.ValueChanged += new System.EventHandler(this.InspectMaxNoMatchUpDown_ValueChanged);
+ //
+ // groupBox4
+ //
+ this.groupBox4.Controls.Add(this.label72);
+ this.groupBox4.Controls.Add(this.label71);
+ this.groupBox4.Controls.Add(this.label70);
+ this.groupBox4.Controls.Add(this.label69);
+ this.groupBox4.Controls.Add(this.label68);
+ this.groupBox4.Controls.Add(this.label67);
+ this.groupBox4.Controls.Add(this.label66);
+ this.groupBox4.Controls.Add(this.label65);
+ this.groupBox4.Controls.Add(this.label64);
+ this.groupBox4.Controls.Add(this.label63);
+ this.groupBox4.Controls.Add(this.label62);
+ this.groupBox4.Controls.Add(this.label43);
+ this.groupBox4.Controls.Add(this.labelInspect37);
+ this.groupBox4.Controls.Add(this.labelInspect27);
+ this.groupBox4.Controls.Add(this.labelInspect17);
+ this.groupBox4.Controls.Add(this.labelInspect36);
+ this.groupBox4.Controls.Add(this.labelInspect26);
+ this.groupBox4.Controls.Add(this.labelInspect16);
+ this.groupBox4.Controls.Add(this.labelInspect35);
+ this.groupBox4.Controls.Add(this.labelInspect25);
+ this.groupBox4.Controls.Add(this.labelInspect15);
+ this.groupBox4.Controls.Add(this.labelInspect34);
+ this.groupBox4.Controls.Add(this.labelInspect24);
+ this.groupBox4.Controls.Add(this.labelInspect14);
+ this.groupBox4.Controls.Add(this.labelInspect33);
+ this.groupBox4.Controls.Add(this.labelInspect23);
+ this.groupBox4.Controls.Add(this.labelInspect13);
+ this.groupBox4.Controls.Add(this.labelInspect32);
+ this.groupBox4.Controls.Add(this.labelInspect22);
+ this.groupBox4.Controls.Add(this.labelInspect12);
+ this.groupBox4.Controls.Add(this.labelInspect31);
+ this.groupBox4.Controls.Add(this.labelInspect21);
+ this.groupBox4.Controls.Add(this.labelInspect11);
+ this.groupBox4.Location = new System.Drawing.Point(19, 215);
+ this.groupBox4.Name = "groupBox4";
+ this.groupBox4.Size = new System.Drawing.Size(432, 250);
+ this.groupBox4.TabIndex = 2;
+ this.groupBox4.TabStop = false;
+ this.groupBox4.Text = "Statistics";
+ //
+ // label72
+ //
+ this.label72.BackColor = System.Drawing.SystemColors.Control;
+ this.label72.Location = new System.Drawing.Point(326, 26);
+ this.label72.Name = "label72";
+ this.label72.Size = new System.Drawing.Size(77, 21);
+ this.label72.TabIndex = 33;
+ this.label72.Text = "Extent";
+ this.label72.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label71
+ //
+ this.label71.BackColor = System.Drawing.SystemColors.Control;
+ this.label71.Location = new System.Drawing.Point(230, 26);
+ this.label71.Name = "label71";
+ this.label71.Size = new System.Drawing.Size(96, 21);
+ this.label71.TabIndex = 32;
+ this.label71.Text = "Maximum";
+ this.label71.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label70
+ //
+ this.label70.BackColor = System.Drawing.SystemColors.Control;
+ this.label70.Location = new System.Drawing.Point(134, 26);
+ this.label70.Name = "label70";
+ this.label70.Size = new System.Drawing.Size(96, 21);
+ this.label70.TabIndex = 31;
+ this.label70.Text = "Minimum";
+ this.label70.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label69
+ //
+ this.label69.BackColor = System.Drawing.SystemColors.Control;
+ this.label69.Location = new System.Drawing.Point(19, 26);
+ this.label69.Name = "label69";
+ this.label69.Size = new System.Drawing.Size(115, 21);
+ this.label69.TabIndex = 30;
+ this.label69.Text = "Recognition";
+ this.label69.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label68
+ //
+ this.label68.BackColor = System.Drawing.SystemColors.Control;
+ this.label68.Location = new System.Drawing.Point(19, 218);
+ this.label68.Name = "label68";
+ this.label68.Size = new System.Drawing.Size(115, 21);
+ this.label68.TabIndex = 29;
+ this.label68.Text = "Column Scale";
+ this.label68.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label67
+ //
+ this.label67.BackColor = System.Drawing.SystemColors.Control;
+ this.label67.Location = new System.Drawing.Point(19, 194);
+ this.label67.Name = "label67";
+ this.label67.Size = new System.Drawing.Size(115, 21);
+ this.label67.TabIndex = 28;
+ this.label67.Text = "Row Scale";
+ this.label67.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label66
+ //
+ this.label66.BackColor = System.Drawing.SystemColors.Control;
+ this.label66.Location = new System.Drawing.Point(19, 170);
+ this.label66.Name = "label66";
+ this.label66.Size = new System.Drawing.Size(115, 22);
+ this.label66.TabIndex = 27;
+ this.label66.Text = "Angle";
+ this.label66.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label65
+ //
+ this.label65.BackColor = System.Drawing.SystemColors.Control;
+ this.label65.Location = new System.Drawing.Point(19, 146);
+ this.label65.Name = "label65";
+ this.label65.Size = new System.Drawing.Size(115, 22);
+ this.label65.TabIndex = 26;
+ this.label65.Text = "Column";
+ this.label65.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label64
+ //
+ this.label64.BackColor = System.Drawing.SystemColors.Control;
+ this.label64.Location = new System.Drawing.Point(19, 123);
+ this.label64.Name = "label64";
+ this.label64.Size = new System.Drawing.Size(115, 21);
+ this.label64.TabIndex = 25;
+ this.label64.Text = "Row";
+ this.label64.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label63
+ //
+ this.label63.BackColor = System.Drawing.SystemColors.Control;
+ this.label63.Location = new System.Drawing.Point(19, 99);
+ this.label63.Name = "label63";
+ this.label63.Size = new System.Drawing.Size(115, 22);
+ this.label63.TabIndex = 24;
+ this.label63.Text = "Pose Bounds";
+ this.label63.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label62
+ //
+ this.label62.BackColor = System.Drawing.SystemColors.Control;
+ this.label62.Location = new System.Drawing.Point(19, 75);
+ this.label62.Name = "label62";
+ this.label62.Size = new System.Drawing.Size(115, 22);
+ this.label62.TabIndex = 23;
+ this.label62.Text = "Time (ms)";
+ this.label62.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label43
+ //
+ this.label43.BackColor = System.Drawing.SystemColors.Control;
+ this.label43.Location = new System.Drawing.Point(19, 52);
+ this.label43.Name = "label43";
+ this.label43.Size = new System.Drawing.Size(115, 21);
+ this.label43.TabIndex = 22;
+ this.label43.Text = "Score";
+ this.label43.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labelInspect37
+ //
+ this.labelInspect37.BackColor = System.Drawing.Color.White;
+ this.labelInspect37.Location = new System.Drawing.Point(326, 218);
+ this.labelInspect37.Name = "labelInspect37";
+ this.labelInspect37.Size = new System.Drawing.Size(92, 21);
+ this.labelInspect37.TabIndex = 21;
+ this.labelInspect37.Text = "-";
+ this.labelInspect37.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect27
+ //
+ this.labelInspect27.BackColor = System.Drawing.Color.White;
+ this.labelInspect27.Location = new System.Drawing.Point(230, 218);
+ this.labelInspect27.Name = "labelInspect27";
+ this.labelInspect27.Size = new System.Drawing.Size(92, 21);
+ this.labelInspect27.TabIndex = 20;
+ this.labelInspect27.Text = "-";
+ this.labelInspect27.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect17
+ //
+ this.labelInspect17.BackColor = System.Drawing.Color.White;
+ this.labelInspect17.Location = new System.Drawing.Point(134, 218);
+ this.labelInspect17.Name = "labelInspect17";
+ this.labelInspect17.Size = new System.Drawing.Size(92, 21);
+ this.labelInspect17.TabIndex = 19;
+ this.labelInspect17.Text = "-";
+ this.labelInspect17.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect36
+ //
+ this.labelInspect36.BackColor = System.Drawing.Color.White;
+ this.labelInspect36.Location = new System.Drawing.Point(326, 194);
+ this.labelInspect36.Name = "labelInspect36";
+ this.labelInspect36.Size = new System.Drawing.Size(92, 21);
+ this.labelInspect36.TabIndex = 18;
+ this.labelInspect36.Text = "-";
+ this.labelInspect36.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect26
+ //
+ this.labelInspect26.BackColor = System.Drawing.Color.White;
+ this.labelInspect26.Location = new System.Drawing.Point(230, 194);
+ this.labelInspect26.Name = "labelInspect26";
+ this.labelInspect26.Size = new System.Drawing.Size(92, 21);
+ this.labelInspect26.TabIndex = 17;
+ this.labelInspect26.Text = "-";
+ this.labelInspect26.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect16
+ //
+ this.labelInspect16.BackColor = System.Drawing.Color.White;
+ this.labelInspect16.Location = new System.Drawing.Point(134, 194);
+ this.labelInspect16.Name = "labelInspect16";
+ this.labelInspect16.Size = new System.Drawing.Size(92, 21);
+ this.labelInspect16.TabIndex = 16;
+ this.labelInspect16.Text = "-";
+ this.labelInspect16.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect35
+ //
+ this.labelInspect35.BackColor = System.Drawing.Color.White;
+ this.labelInspect35.Location = new System.Drawing.Point(326, 170);
+ this.labelInspect35.Name = "labelInspect35";
+ this.labelInspect35.Size = new System.Drawing.Size(92, 22);
+ this.labelInspect35.TabIndex = 15;
+ this.labelInspect35.Text = "-";
+ this.labelInspect35.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect25
+ //
+ this.labelInspect25.BackColor = System.Drawing.Color.White;
+ this.labelInspect25.Location = new System.Drawing.Point(230, 170);
+ this.labelInspect25.Name = "labelInspect25";
+ this.labelInspect25.Size = new System.Drawing.Size(92, 22);
+ this.labelInspect25.TabIndex = 14;
+ this.labelInspect25.Text = "-";
+ this.labelInspect25.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect15
+ //
+ this.labelInspect15.BackColor = System.Drawing.Color.White;
+ this.labelInspect15.Location = new System.Drawing.Point(134, 170);
+ this.labelInspect15.Name = "labelInspect15";
+ this.labelInspect15.Size = new System.Drawing.Size(92, 22);
+ this.labelInspect15.TabIndex = 13;
+ this.labelInspect15.Text = "-";
+ this.labelInspect15.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect34
+ //
+ this.labelInspect34.BackColor = System.Drawing.Color.White;
+ this.labelInspect34.Location = new System.Drawing.Point(326, 146);
+ this.labelInspect34.Name = "labelInspect34";
+ this.labelInspect34.Size = new System.Drawing.Size(92, 22);
+ this.labelInspect34.TabIndex = 12;
+ this.labelInspect34.Text = "-";
+ this.labelInspect34.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect24
+ //
+ this.labelInspect24.BackColor = System.Drawing.Color.White;
+ this.labelInspect24.Location = new System.Drawing.Point(230, 146);
+ this.labelInspect24.Name = "labelInspect24";
+ this.labelInspect24.Size = new System.Drawing.Size(92, 22);
+ this.labelInspect24.TabIndex = 11;
+ this.labelInspect24.Text = "-";
+ this.labelInspect24.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect14
+ //
+ this.labelInspect14.BackColor = System.Drawing.Color.White;
+ this.labelInspect14.Location = new System.Drawing.Point(134, 146);
+ this.labelInspect14.Name = "labelInspect14";
+ this.labelInspect14.Size = new System.Drawing.Size(92, 22);
+ this.labelInspect14.TabIndex = 10;
+ this.labelInspect14.Text = "-";
+ this.labelInspect14.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect33
+ //
+ this.labelInspect33.BackColor = System.Drawing.Color.White;
+ this.labelInspect33.Location = new System.Drawing.Point(326, 123);
+ this.labelInspect33.Name = "labelInspect33";
+ this.labelInspect33.Size = new System.Drawing.Size(92, 21);
+ this.labelInspect33.TabIndex = 9;
+ this.labelInspect33.Text = "-";
+ this.labelInspect33.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect23
+ //
+ this.labelInspect23.BackColor = System.Drawing.Color.White;
+ this.labelInspect23.Location = new System.Drawing.Point(230, 123);
+ this.labelInspect23.Name = "labelInspect23";
+ this.labelInspect23.Size = new System.Drawing.Size(92, 21);
+ this.labelInspect23.TabIndex = 8;
+ this.labelInspect23.Text = "-";
+ this.labelInspect23.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect13
+ //
+ this.labelInspect13.BackColor = System.Drawing.Color.White;
+ this.labelInspect13.Location = new System.Drawing.Point(134, 123);
+ this.labelInspect13.Name = "labelInspect13";
+ this.labelInspect13.Size = new System.Drawing.Size(92, 21);
+ this.labelInspect13.TabIndex = 7;
+ this.labelInspect13.Text = "-";
+ this.labelInspect13.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect32
+ //
+ this.labelInspect32.BackColor = System.Drawing.Color.White;
+ this.labelInspect32.Location = new System.Drawing.Point(326, 75);
+ this.labelInspect32.Name = "labelInspect32";
+ this.labelInspect32.Size = new System.Drawing.Size(92, 22);
+ this.labelInspect32.TabIndex = 6;
+ this.labelInspect32.Text = "-";
+ this.labelInspect32.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect22
+ //
+ this.labelInspect22.BackColor = System.Drawing.Color.White;
+ this.labelInspect22.Location = new System.Drawing.Point(230, 75);
+ this.labelInspect22.Name = "labelInspect22";
+ this.labelInspect22.Size = new System.Drawing.Size(92, 22);
+ this.labelInspect22.TabIndex = 5;
+ this.labelInspect22.Text = "-";
+ this.labelInspect22.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect12
+ //
+ this.labelInspect12.BackColor = System.Drawing.Color.White;
+ this.labelInspect12.Location = new System.Drawing.Point(134, 75);
+ this.labelInspect12.Name = "labelInspect12";
+ this.labelInspect12.Size = new System.Drawing.Size(92, 22);
+ this.labelInspect12.TabIndex = 4;
+ this.labelInspect12.Text = "-";
+ this.labelInspect12.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect31
+ //
+ this.labelInspect31.BackColor = System.Drawing.Color.White;
+ this.labelInspect31.Location = new System.Drawing.Point(326, 52);
+ this.labelInspect31.Name = "labelInspect31";
+ this.labelInspect31.Size = new System.Drawing.Size(92, 21);
+ this.labelInspect31.TabIndex = 2;
+ this.labelInspect31.Text = "-";
+ this.labelInspect31.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect21
+ //
+ this.labelInspect21.BackColor = System.Drawing.Color.White;
+ this.labelInspect21.Location = new System.Drawing.Point(230, 52);
+ this.labelInspect21.Name = "labelInspect21";
+ this.labelInspect21.Size = new System.Drawing.Size(92, 21);
+ this.labelInspect21.TabIndex = 1;
+ this.labelInspect21.Text = "-";
+ this.labelInspect21.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect11
+ //
+ this.labelInspect11.BackColor = System.Drawing.Color.White;
+ this.labelInspect11.Location = new System.Drawing.Point(134, 52);
+ this.labelInspect11.Name = "labelInspect11";
+ this.labelInspect11.Size = new System.Drawing.Size(92, 21);
+ this.labelInspect11.TabIndex = 0;
+ this.labelInspect11.Text = "-";
+ this.labelInspect11.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // groupBox3
+ //
+ this.groupBox3.Controls.Add(this.label39);
+ this.groupBox3.Controls.Add(this.label38);
+ this.groupBox3.Controls.Add(this.label37);
+ this.groupBox3.Controls.Add(this.label36);
+ this.groupBox3.Controls.Add(this.label28);
+ this.groupBox3.Controls.Add(this.label27);
+ this.groupBox3.Controls.Add(this.label26);
+ this.groupBox3.Controls.Add(this.labelInspect05);
+ this.groupBox3.Controls.Add(this.labelInspect04);
+ this.groupBox3.Controls.Add(this.labelInspect03);
+ this.groupBox3.Controls.Add(this.labelInspect02);
+ this.groupBox3.Controls.Add(this.labelInspect01);
+ this.groupBox3.Location = new System.Drawing.Point(19, 17);
+ this.groupBox3.Name = "groupBox3";
+ this.groupBox3.Size = new System.Drawing.Size(432, 190);
+ this.groupBox3.TabIndex = 1;
+ this.groupBox3.TabStop = false;
+ this.groupBox3.Text = "Recognition Rate";
+ //
+ // label39
+ //
+ this.label39.Location = new System.Drawing.Point(67, 146);
+ this.label39.Name = "label39";
+ this.label39.Size = new System.Drawing.Size(144, 35);
+ this.label39.TabIndex = 11;
+ this.label39.Text = "in rel. to maximum No. of matches";
+ this.label39.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label38
+ //
+ this.label38.Location = new System.Drawing.Point(67, 112);
+ this.label38.Name = "label38";
+ this.label38.Size = new System.Drawing.Size(144, 34);
+ this.label38.TabIndex = 10;
+ this.label38.Text = "in rel. to specified No. of vis. models";
+ this.label38.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label37
+ //
+ this.label37.Location = new System.Drawing.Point(67, 78);
+ this.label37.Name = "label37";
+ this.label37.Size = new System.Drawing.Size(144, 34);
+ this.label37.TabIndex = 9;
+ this.label37.Text = "with the maximum number of matches";
+ this.label37.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label36
+ //
+ this.label36.Location = new System.Drawing.Point(67, 43);
+ this.label36.Name = "label36";
+ this.label36.Size = new System.Drawing.Size(144, 35);
+ this.label36.TabIndex = 8;
+ this.label36.Text = "with at least the spec. number of models";
+ this.label36.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label28
+ //
+ this.label28.Location = new System.Drawing.Point(67, 17);
+ this.label28.Name = "label28";
+ this.label28.Size = new System.Drawing.Size(144, 26);
+ this.label28.TabIndex = 7;
+ this.label28.Text = "with at least one match";
+ this.label28.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label27
+ //
+ this.label27.Location = new System.Drawing.Point(10, 121);
+ this.label27.Name = "label27";
+ this.label27.Size = new System.Drawing.Size(67, 25);
+ this.label27.TabIndex = 6;
+ this.label27.Text = "Matches:";
+ //
+ // label26
+ //
+ this.label26.Location = new System.Drawing.Point(10, 17);
+ this.label26.Name = "label26";
+ this.label26.Size = new System.Drawing.Size(57, 26);
+ this.label26.TabIndex = 5;
+ this.label26.Text = "Images:";
+ this.label26.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect05
+ //
+ this.labelInspect05.BackColor = System.Drawing.Color.White;
+ this.labelInspect05.Location = new System.Drawing.Point(211, 151);
+ this.labelInspect05.Name = "labelInspect05";
+ this.labelInspect05.Size = new System.Drawing.Size(207, 26);
+ this.labelInspect05.TabIndex = 4;
+ this.labelInspect05.Text = "100.00 % (1 of 1 model)";
+ this.labelInspect05.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect04
+ //
+ this.labelInspect04.BackColor = System.Drawing.Color.White;
+ this.labelInspect04.Location = new System.Drawing.Point(209, 121);
+ this.labelInspect04.Name = "labelInspect04";
+ this.labelInspect04.Size = new System.Drawing.Size(209, 25);
+ this.labelInspect04.TabIndex = 3;
+ this.labelInspect04.Text = "100.00 % (1 of 1 model)";
+ this.labelInspect04.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect03
+ //
+ this.labelInspect03.BackColor = System.Drawing.Color.White;
+ this.labelInspect03.Location = new System.Drawing.Point(209, 80);
+ this.labelInspect03.Name = "labelInspect03";
+ this.labelInspect03.Size = new System.Drawing.Size(209, 26);
+ this.labelInspect03.TabIndex = 2;
+ this.labelInspect03.Text = "100.00 % (1 of 1 image)";
+ this.labelInspect03.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect02
+ //
+ this.labelInspect02.BackColor = System.Drawing.Color.White;
+ this.labelInspect02.Location = new System.Drawing.Point(209, 50);
+ this.labelInspect02.Name = "labelInspect02";
+ this.labelInspect02.Size = new System.Drawing.Size(209, 25);
+ this.labelInspect02.TabIndex = 1;
+ this.labelInspect02.Text = "100.00 % (1 of 1 image)";
+ this.labelInspect02.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelInspect01
+ //
+ this.labelInspect01.BackColor = System.Drawing.Color.White;
+ this.labelInspect01.Location = new System.Drawing.Point(209, 19);
+ this.labelInspect01.Name = "labelInspect01";
+ this.labelInspect01.Size = new System.Drawing.Size(209, 26);
+ this.labelInspect01.TabIndex = 0;
+ this.labelInspect01.Text = "100.00 % (1 of 1 image)";
+ this.labelInspect01.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // StatisticsButton
+ //
+ this.StatisticsButton.Location = new System.Drawing.Point(326, 474);
+ this.StatisticsButton.Name = "StatisticsButton";
+ this.StatisticsButton.Size = new System.Drawing.Size(125, 34);
+ this.StatisticsButton.TabIndex = 0;
+ this.StatisticsButton.Text = "Run";
+ this.StatisticsButton.Click += new System.EventHandler(this.runStatisticsButton_Click);
+ //
+ // tabPageSaveConfige
+ //
+ this.tabPageSaveConfige.Controls.Add(this.butSaveConfige);
+ this.tabPageSaveConfige.Controls.Add(this.groupBox2);
+ this.tabPageSaveConfige.Location = new System.Drawing.Point(4, 22);
+ this.tabPageSaveConfige.Name = "tabPageSaveConfige";
+ this.tabPageSaveConfige.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPageSaveConfige.Size = new System.Drawing.Size(482, 568);
+ this.tabPageSaveConfige.TabIndex = 2;
+ this.tabPageSaveConfige.Text = " 参数保存 ";
+ this.tabPageSaveConfige.UseVisualStyleBackColor = true;
+ //
+ // butSaveConfige
+ //
+ this.butSaveConfige.Location = new System.Drawing.Point(351, 442);
+ this.butSaveConfige.Name = "butSaveConfige";
+ this.butSaveConfige.Size = new System.Drawing.Size(101, 49);
+ this.butSaveConfige.TabIndex = 35;
+ this.butSaveConfige.Text = "SaveConfige";
+ this.butSaveConfige.UseVisualStyleBackColor = true;
+ this.butSaveConfige.Click += new System.EventHandler(this.butSaveConfige_Click);
+ //
+ // groupBox2
+ //
+ this.groupBox2.Controls.Add(this.labLastPyramidLevel);
+ this.groupBox2.Controls.Add(this.labLastPyramidLevelExt);
+ this.groupBox2.Controls.Add(this.labLastPyramidLevelMax);
+ this.groupBox2.Controls.Add(this.label45);
+ this.groupBox2.Controls.Add(this.labSubPixelSelect);
+ this.groupBox2.Controls.Add(this.label22);
+ this.groupBox2.Controls.Add(this.label23);
+ this.groupBox2.Controls.Add(this.label24);
+ this.groupBox2.Controls.Add(this.label25);
+ this.groupBox2.Controls.Add(this.label40);
+ this.groupBox2.Controls.Add(this.labScale);
+ this.groupBox2.Controls.Add(this.labAngle);
+ this.groupBox2.Controls.Add(this.labGreediness);
+ this.groupBox2.Controls.Add(this.labNumLevels);
+ this.groupBox2.Controls.Add(this.labSubPixel);
+ this.groupBox2.Controls.Add(this.labMatches);
+ this.groupBox2.Controls.Add(this.labScore);
+ this.groupBox2.Controls.Add(this.labOverlapExt);
+ this.groupBox2.Controls.Add(this.labOverlapMax);
+ this.groupBox2.Controls.Add(this.labOverlapMin);
+ this.groupBox2.Controls.Add(this.labScaleExt);
+ this.groupBox2.Controls.Add(this.labScaleMax);
+ this.groupBox2.Controls.Add(this.labScaleMin);
+ this.groupBox2.Controls.Add(this.labAngleExt);
+ this.groupBox2.Controls.Add(this.labAngleMax);
+ this.groupBox2.Controls.Add(this.labAngleMin);
+ this.groupBox2.Controls.Add(this.labGreedinessExt);
+ this.groupBox2.Controls.Add(this.labGreedinessMax);
+ this.groupBox2.Controls.Add(this.labGreedinessMin);
+ this.groupBox2.Controls.Add(this.labNumLevelsExt);
+ this.groupBox2.Controls.Add(this.labNumLevelsMax);
+ this.groupBox2.Controls.Add(this.labNumLevelsMin);
+ this.groupBox2.Controls.Add(this.labMatchesExt);
+ this.groupBox2.Controls.Add(this.labMatchesMax);
+ this.groupBox2.Controls.Add(this.labMatchesMin);
+ this.groupBox2.Controls.Add(this.labScoreExt);
+ this.groupBox2.Controls.Add(this.labScoreMax);
+ this.groupBox2.Controls.Add(this.labScoreMin);
+ this.groupBox2.Location = new System.Drawing.Point(20, 21);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(432, 394);
+ this.groupBox2.TabIndex = 3;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "Statistics";
+ //
+ // labLastPyramidLevel
+ //
+ this.labLastPyramidLevel.BackColor = System.Drawing.SystemColors.Control;
+ this.labLastPyramidLevel.Location = new System.Drawing.Point(19, 235);
+ this.labLastPyramidLevel.Name = "labLastPyramidLevel";
+ this.labLastPyramidLevel.Size = new System.Drawing.Size(115, 22);
+ this.labLastPyramidLevel.TabIndex = 38;
+ this.labLastPyramidLevel.Text = "LastPyramidLevel";
+ this.labLastPyramidLevel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labLastPyramidLevelExt
+ //
+ this.labLastPyramidLevelExt.BackColor = System.Drawing.Color.White;
+ this.labLastPyramidLevelExt.Location = new System.Drawing.Point(326, 235);
+ this.labLastPyramidLevelExt.Name = "labLastPyramidLevelExt";
+ this.labLastPyramidLevelExt.Size = new System.Drawing.Size(92, 22);
+ this.labLastPyramidLevelExt.TabIndex = 37;
+ this.labLastPyramidLevelExt.Text = "-";
+ this.labLastPyramidLevelExt.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labLastPyramidLevelMax
+ //
+ this.labLastPyramidLevelMax.BackColor = System.Drawing.Color.White;
+ this.labLastPyramidLevelMax.Location = new System.Drawing.Point(230, 235);
+ this.labLastPyramidLevelMax.Name = "labLastPyramidLevelMax";
+ this.labLastPyramidLevelMax.Size = new System.Drawing.Size(92, 22);
+ this.labLastPyramidLevelMax.TabIndex = 36;
+ this.labLastPyramidLevelMax.Text = "-";
+ this.labLastPyramidLevelMax.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label45
+ //
+ this.label45.BackColor = System.Drawing.Color.White;
+ this.label45.Location = new System.Drawing.Point(134, 235);
+ this.label45.Name = "label45";
+ this.label45.Size = new System.Drawing.Size(92, 22);
+ this.label45.TabIndex = 35;
+ this.label45.Text = "-";
+ this.label45.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labSubPixelSelect
+ //
+ this.labSubPixelSelect.BackColor = System.Drawing.Color.White;
+ this.labSubPixelSelect.Location = new System.Drawing.Point(230, 185);
+ this.labSubPixelSelect.Name = "labSubPixelSelect";
+ this.labSubPixelSelect.Size = new System.Drawing.Size(92, 21);
+ this.labSubPixelSelect.TabIndex = 34;
+ this.labSubPixelSelect.Text = "-";
+ this.labSubPixelSelect.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label22
+ //
+ this.label22.BackColor = System.Drawing.SystemColors.Control;
+ this.label22.Location = new System.Drawing.Point(326, 26);
+ this.label22.Name = "label22";
+ this.label22.Size = new System.Drawing.Size(77, 21);
+ this.label22.TabIndex = 33;
+ this.label22.Text = "Extent";
+ this.label22.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label23
+ //
+ this.label23.BackColor = System.Drawing.SystemColors.Control;
+ this.label23.Location = new System.Drawing.Point(230, 26);
+ this.label23.Name = "label23";
+ this.label23.Size = new System.Drawing.Size(96, 21);
+ this.label23.TabIndex = 32;
+ this.label23.Text = "Maximum";
+ this.label23.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label24
+ //
+ this.label24.BackColor = System.Drawing.SystemColors.Control;
+ this.label24.Location = new System.Drawing.Point(134, 26);
+ this.label24.Name = "label24";
+ this.label24.Size = new System.Drawing.Size(96, 21);
+ this.label24.TabIndex = 31;
+ this.label24.Text = "Minimum";
+ this.label24.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label25
+ //
+ this.label25.BackColor = System.Drawing.SystemColors.Control;
+ this.label25.Location = new System.Drawing.Point(19, 26);
+ this.label25.Name = "label25";
+ this.label25.Size = new System.Drawing.Size(115, 21);
+ this.label25.TabIndex = 30;
+ this.label25.Text = "Recognition";
+ this.label25.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label40
+ //
+ this.label40.BackColor = System.Drawing.SystemColors.Control;
+ this.label40.Location = new System.Drawing.Point(19, 159);
+ this.label40.Name = "label40";
+ this.label40.Size = new System.Drawing.Size(115, 21);
+ this.label40.TabIndex = 29;
+ this.label40.Text = "MaxOverlap";
+ this.label40.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labScale
+ //
+ this.labScale.BackColor = System.Drawing.SystemColors.Control;
+ this.labScale.Location = new System.Drawing.Point(19, 83);
+ this.labScale.Name = "labScale";
+ this.labScale.Size = new System.Drawing.Size(115, 21);
+ this.labScale.TabIndex = 28;
+ this.labScale.Text = "Scale";
+ this.labScale.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labAngle
+ //
+ this.labAngle.BackColor = System.Drawing.SystemColors.Control;
+ this.labAngle.Location = new System.Drawing.Point(19, 57);
+ this.labAngle.Name = "labAngle";
+ this.labAngle.Size = new System.Drawing.Size(115, 22);
+ this.labAngle.TabIndex = 27;
+ this.labAngle.Text = "Angle";
+ this.labAngle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labGreediness
+ //
+ this.labGreediness.BackColor = System.Drawing.SystemColors.Control;
+ this.labGreediness.Location = new System.Drawing.Point(19, 285);
+ this.labGreediness.Name = "labGreediness";
+ this.labGreediness.Size = new System.Drawing.Size(115, 22);
+ this.labGreediness.TabIndex = 26;
+ this.labGreediness.Text = "Greediness";
+ this.labGreediness.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labNumLevels
+ //
+ this.labNumLevels.BackColor = System.Drawing.SystemColors.Control;
+ this.labNumLevels.Location = new System.Drawing.Point(19, 210);
+ this.labNumLevels.Name = "labNumLevels";
+ this.labNumLevels.Size = new System.Drawing.Size(115, 21);
+ this.labNumLevels.TabIndex = 25;
+ this.labNumLevels.Text = "NumLevels";
+ this.labNumLevels.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labSubPixel
+ //
+ this.labSubPixel.BackColor = System.Drawing.SystemColors.Control;
+ this.labSubPixel.Location = new System.Drawing.Point(19, 184);
+ this.labSubPixel.Name = "labSubPixel";
+ this.labSubPixel.Size = new System.Drawing.Size(115, 22);
+ this.labSubPixel.TabIndex = 24;
+ this.labSubPixel.Text = "SubPixel";
+ this.labSubPixel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labMatches
+ //
+ this.labMatches.BackColor = System.Drawing.SystemColors.Control;
+ this.labMatches.Location = new System.Drawing.Point(19, 133);
+ this.labMatches.Name = "labMatches";
+ this.labMatches.Size = new System.Drawing.Size(115, 22);
+ this.labMatches.TabIndex = 23;
+ this.labMatches.Text = "NumMatches";
+ this.labMatches.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labScore
+ //
+ this.labScore.BackColor = System.Drawing.SystemColors.Control;
+ this.labScore.Location = new System.Drawing.Point(19, 108);
+ this.labScore.Name = "labScore";
+ this.labScore.Size = new System.Drawing.Size(115, 21);
+ this.labScore.TabIndex = 22;
+ this.labScore.Text = "Score";
+ this.labScore.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labOverlapExt
+ //
+ this.labOverlapExt.BackColor = System.Drawing.Color.White;
+ this.labOverlapExt.Location = new System.Drawing.Point(326, 159);
+ this.labOverlapExt.Name = "labOverlapExt";
+ this.labOverlapExt.Size = new System.Drawing.Size(92, 21);
+ this.labOverlapExt.TabIndex = 21;
+ this.labOverlapExt.Text = "-";
+ this.labOverlapExt.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labOverlapMax
+ //
+ this.labOverlapMax.BackColor = System.Drawing.Color.White;
+ this.labOverlapMax.Location = new System.Drawing.Point(230, 159);
+ this.labOverlapMax.Name = "labOverlapMax";
+ this.labOverlapMax.Size = new System.Drawing.Size(92, 21);
+ this.labOverlapMax.TabIndex = 20;
+ this.labOverlapMax.Text = "-";
+ this.labOverlapMax.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labOverlapMin
+ //
+ this.labOverlapMin.BackColor = System.Drawing.Color.White;
+ this.labOverlapMin.Location = new System.Drawing.Point(134, 159);
+ this.labOverlapMin.Name = "labOverlapMin";
+ this.labOverlapMin.Size = new System.Drawing.Size(92, 21);
+ this.labOverlapMin.TabIndex = 19;
+ this.labOverlapMin.Text = "-";
+ this.labOverlapMin.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labScaleExt
+ //
+ this.labScaleExt.BackColor = System.Drawing.Color.White;
+ this.labScaleExt.Location = new System.Drawing.Point(326, 83);
+ this.labScaleExt.Name = "labScaleExt";
+ this.labScaleExt.Size = new System.Drawing.Size(92, 21);
+ this.labScaleExt.TabIndex = 18;
+ this.labScaleExt.Text = "-";
+ this.labScaleExt.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labScaleMax
+ //
+ this.labScaleMax.BackColor = System.Drawing.Color.White;
+ this.labScaleMax.Location = new System.Drawing.Point(230, 83);
+ this.labScaleMax.Name = "labScaleMax";
+ this.labScaleMax.Size = new System.Drawing.Size(92, 21);
+ this.labScaleMax.TabIndex = 17;
+ this.labScaleMax.Text = "-";
+ this.labScaleMax.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labScaleMin
+ //
+ this.labScaleMin.BackColor = System.Drawing.Color.White;
+ this.labScaleMin.Location = new System.Drawing.Point(134, 83);
+ this.labScaleMin.Name = "labScaleMin";
+ this.labScaleMin.Size = new System.Drawing.Size(92, 21);
+ this.labScaleMin.TabIndex = 16;
+ this.labScaleMin.Text = "-";
+ this.labScaleMin.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labAngleExt
+ //
+ this.labAngleExt.BackColor = System.Drawing.Color.White;
+ this.labAngleExt.Location = new System.Drawing.Point(326, 57);
+ this.labAngleExt.Name = "labAngleExt";
+ this.labAngleExt.Size = new System.Drawing.Size(92, 22);
+ this.labAngleExt.TabIndex = 15;
+ this.labAngleExt.Text = "-";
+ this.labAngleExt.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labAngleMax
+ //
+ this.labAngleMax.BackColor = System.Drawing.Color.White;
+ this.labAngleMax.Location = new System.Drawing.Point(230, 57);
+ this.labAngleMax.Name = "labAngleMax";
+ this.labAngleMax.Size = new System.Drawing.Size(92, 22);
+ this.labAngleMax.TabIndex = 14;
+ this.labAngleMax.Text = "-";
+ this.labAngleMax.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labAngleMin
+ //
+ this.labAngleMin.BackColor = System.Drawing.Color.White;
+ this.labAngleMin.Location = new System.Drawing.Point(134, 57);
+ this.labAngleMin.Name = "labAngleMin";
+ this.labAngleMin.Size = new System.Drawing.Size(92, 22);
+ this.labAngleMin.TabIndex = 13;
+ this.labAngleMin.Text = "-";
+ this.labAngleMin.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labGreedinessExt
+ //
+ this.labGreedinessExt.BackColor = System.Drawing.Color.White;
+ this.labGreedinessExt.Location = new System.Drawing.Point(326, 285);
+ this.labGreedinessExt.Name = "labGreedinessExt";
+ this.labGreedinessExt.Size = new System.Drawing.Size(92, 22);
+ this.labGreedinessExt.TabIndex = 12;
+ this.labGreedinessExt.Text = "-";
+ this.labGreedinessExt.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labGreedinessMax
+ //
+ this.labGreedinessMax.BackColor = System.Drawing.Color.White;
+ this.labGreedinessMax.Location = new System.Drawing.Point(230, 285);
+ this.labGreedinessMax.Name = "labGreedinessMax";
+ this.labGreedinessMax.Size = new System.Drawing.Size(92, 22);
+ this.labGreedinessMax.TabIndex = 11;
+ this.labGreedinessMax.Text = "-";
+ this.labGreedinessMax.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labGreedinessMin
+ //
+ this.labGreedinessMin.BackColor = System.Drawing.Color.White;
+ this.labGreedinessMin.Location = new System.Drawing.Point(134, 285);
+ this.labGreedinessMin.Name = "labGreedinessMin";
+ this.labGreedinessMin.Size = new System.Drawing.Size(92, 22);
+ this.labGreedinessMin.TabIndex = 10;
+ this.labGreedinessMin.Text = "-";
+ this.labGreedinessMin.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labNumLevelsExt
+ //
+ this.labNumLevelsExt.BackColor = System.Drawing.Color.White;
+ this.labNumLevelsExt.Location = new System.Drawing.Point(326, 210);
+ this.labNumLevelsExt.Name = "labNumLevelsExt";
+ this.labNumLevelsExt.Size = new System.Drawing.Size(92, 21);
+ this.labNumLevelsExt.TabIndex = 9;
+ this.labNumLevelsExt.Text = "-";
+ this.labNumLevelsExt.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labNumLevelsMax
+ //
+ this.labNumLevelsMax.BackColor = System.Drawing.Color.White;
+ this.labNumLevelsMax.Location = new System.Drawing.Point(230, 210);
+ this.labNumLevelsMax.Name = "labNumLevelsMax";
+ this.labNumLevelsMax.Size = new System.Drawing.Size(92, 21);
+ this.labNumLevelsMax.TabIndex = 8;
+ this.labNumLevelsMax.Text = "-";
+ this.labNumLevelsMax.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labNumLevelsMin
+ //
+ this.labNumLevelsMin.BackColor = System.Drawing.Color.White;
+ this.labNumLevelsMin.Location = new System.Drawing.Point(134, 210);
+ this.labNumLevelsMin.Name = "labNumLevelsMin";
+ this.labNumLevelsMin.Size = new System.Drawing.Size(92, 21);
+ this.labNumLevelsMin.TabIndex = 7;
+ this.labNumLevelsMin.Text = "-";
+ this.labNumLevelsMin.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labMatchesExt
+ //
+ this.labMatchesExt.BackColor = System.Drawing.Color.White;
+ this.labMatchesExt.Location = new System.Drawing.Point(326, 133);
+ this.labMatchesExt.Name = "labMatchesExt";
+ this.labMatchesExt.Size = new System.Drawing.Size(92, 22);
+ this.labMatchesExt.TabIndex = 6;
+ this.labMatchesExt.Text = "-";
+ this.labMatchesExt.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labMatchesMax
+ //
+ this.labMatchesMax.BackColor = System.Drawing.Color.White;
+ this.labMatchesMax.Location = new System.Drawing.Point(230, 133);
+ this.labMatchesMax.Name = "labMatchesMax";
+ this.labMatchesMax.Size = new System.Drawing.Size(92, 22);
+ this.labMatchesMax.TabIndex = 5;
+ this.labMatchesMax.Text = "-";
+ this.labMatchesMax.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labMatchesMin
+ //
+ this.labMatchesMin.BackColor = System.Drawing.Color.White;
+ this.labMatchesMin.Location = new System.Drawing.Point(134, 133);
+ this.labMatchesMin.Name = "labMatchesMin";
+ this.labMatchesMin.Size = new System.Drawing.Size(92, 22);
+ this.labMatchesMin.TabIndex = 4;
+ this.labMatchesMin.Text = "-";
+ this.labMatchesMin.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labScoreExt
+ //
+ this.labScoreExt.BackColor = System.Drawing.Color.White;
+ this.labScoreExt.Location = new System.Drawing.Point(326, 108);
+ this.labScoreExt.Name = "labScoreExt";
+ this.labScoreExt.Size = new System.Drawing.Size(92, 21);
+ this.labScoreExt.TabIndex = 2;
+ this.labScoreExt.Text = "-";
+ this.labScoreExt.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labScoreMax
+ //
+ this.labScoreMax.BackColor = System.Drawing.Color.White;
+ this.labScoreMax.Location = new System.Drawing.Point(230, 108);
+ this.labScoreMax.Name = "labScoreMax";
+ this.labScoreMax.Size = new System.Drawing.Size(92, 21);
+ this.labScoreMax.TabIndex = 1;
+ this.labScoreMax.Text = "-";
+ this.labScoreMax.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labScoreMin
+ //
+ this.labScoreMin.BackColor = System.Drawing.Color.White;
+ this.labScoreMin.Location = new System.Drawing.Point(134, 108);
+ this.labScoreMin.Name = "labScoreMin";
+ this.labScoreMin.Size = new System.Drawing.Size(92, 21);
+ this.labScoreMin.TabIndex = 0;
+ this.labScoreMin.Text = "-";
+ this.labScoreMin.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // groupBoxCreateROI
+ //
+ this.groupBoxCreateROI.Controls.Add(this.circleButton);
+ this.groupBoxCreateROI.Controls.Add(this.delROIButton);
+ this.groupBoxCreateROI.Controls.Add(this.delAllROIButton);
+ this.groupBoxCreateROI.Controls.Add(this.rect2Button);
+ this.groupBoxCreateROI.Controls.Add(this.subFromROIButton);
+ this.groupBoxCreateROI.Controls.Add(this.addToROIButton);
+ this.groupBoxCreateROI.Controls.Add(this.rect1Button);
+ this.groupBoxCreateROI.Dock = System.Windows.Forms.DockStyle.Right;
+ this.groupBoxCreateROI.Enabled = false;
+ this.groupBoxCreateROI.Location = new System.Drawing.Point(759, 0);
+ this.groupBoxCreateROI.Name = "groupBoxCreateROI";
+ this.groupBoxCreateROI.Size = new System.Drawing.Size(500, 163);
+ this.groupBoxCreateROI.TabIndex = 2;
+ this.groupBoxCreateROI.TabStop = false;
+ this.groupBoxCreateROI.Text = "Create ROI";
+ //
+ // circleButton
+ //
+ this.circleButton.Location = new System.Drawing.Point(375, 16);
+ this.circleButton.Name = "circleButton";
+ this.circleButton.Size = new System.Drawing.Size(101, 49);
+ this.circleButton.TabIndex = 12;
+ this.circleButton.Text = "Circle";
+ this.circleButton.Click += new System.EventHandler(this.circleButton_Click);
+ //
+ // delROIButton
+ //
+ this.delROIButton.Location = new System.Drawing.Point(102, 86);
+ this.delROIButton.Name = "delROIButton";
+ this.delROIButton.Size = new System.Drawing.Size(101, 49);
+ this.delROIButton.TabIndex = 11;
+ this.delROIButton.Text = "Del ActROI ";
+ this.delROIButton.Click += new System.EventHandler(this.delROIButton_Click);
+ //
+ // delAllROIButton
+ //
+ this.delAllROIButton.Location = new System.Drawing.Point(235, 86);
+ this.delAllROIButton.Name = "delAllROIButton";
+ this.delAllROIButton.Size = new System.Drawing.Size(101, 49);
+ this.delAllROIButton.TabIndex = 10;
+ this.delAllROIButton.Text = "Del All ROI";
+ this.delAllROIButton.Click += new System.EventHandler(this.delAllROIButton_Click);
+ //
+ // rect2Button
+ //
+ this.rect2Button.Location = new System.Drawing.Point(237, 16);
+ this.rect2Button.Name = "rect2Button";
+ this.rect2Button.Size = new System.Drawing.Size(101, 49);
+ this.rect2Button.TabIndex = 9;
+ this.rect2Button.Text = "Rect2";
+ this.rect2Button.Click += new System.EventHandler(this.rect2Button_Click);
+ //
+ // subFromROIButton
+ //
+ this.subFromROIButton.Location = new System.Drawing.Point(15, 86);
+ this.subFromROIButton.Name = "subFromROIButton";
+ this.subFromROIButton.Size = new System.Drawing.Size(57, 36);
+ this.subFromROIButton.TabIndex = 8;
+ this.subFromROIButton.Text = "( - )";
+ this.subFromROIButton.Click += new System.EventHandler(this.subFromROIButton_Click);
+ //
+ // addToROIButton
+ //
+ this.addToROIButton.Checked = true;
+ this.addToROIButton.Location = new System.Drawing.Point(16, 26);
+ this.addToROIButton.Name = "addToROIButton";
+ this.addToROIButton.Size = new System.Drawing.Size(56, 36);
+ this.addToROIButton.TabIndex = 7;
+ this.addToROIButton.TabStop = true;
+ this.addToROIButton.Text = "( + )";
+ this.addToROIButton.Click += new System.EventHandler(this.addToROIButton_Click);
+ //
+ // rect1Button
+ //
+ this.rect1Button.Location = new System.Drawing.Point(102, 16);
+ this.rect1Button.Name = "rect1Button";
+ this.rect1Button.Size = new System.Drawing.Size(101, 49);
+ this.rect1Button.TabIndex = 5;
+ this.rect1Button.Text = "Rect1";
+ this.rect1Button.Click += new System.EventHandler(this.rect1Button_Click);
+ //
+ // loadImagebutton
+ //
+ this.loadImagebutton.Location = new System.Drawing.Point(12, 20);
+ this.loadImagebutton.Name = "loadImagebutton";
+ this.loadImagebutton.Size = new System.Drawing.Size(101, 49);
+ this.loadImagebutton.TabIndex = 0;
+ this.loadImagebutton.Text = "Load Image";
+ this.loadImagebutton.Click += new System.EventHandler(this.loadImage);
+ //
+ // openFileDialog1
+ //
+ this.openFileDialog1.Filter = "png (*.png)|*.png|tiff (*.tif)|*.tif|jpeg (*.jpg)| *.jpg|all files (*.*)|*.*";
+ this.openFileDialog1.FilterIndex = 4;
+ this.openFileDialog1.RestoreDirectory = true;
+ //
+ // saveModelbutton
+ //
+ this.saveModelbutton.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.saveModelbutton.Location = new System.Drawing.Point(12, 86);
+ this.saveModelbutton.Name = "saveModelbutton";
+ this.saveModelbutton.Size = new System.Drawing.Size(101, 49);
+ this.saveModelbutton.TabIndex = 3;
+ this.saveModelbutton.Text = "Save Model";
+ this.saveModelbutton.Click += new System.EventHandler(this.saveModelbutton_Click);
+ //
+ // loadModelbutton
+ //
+ this.loadModelbutton.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.loadModelbutton.Location = new System.Drawing.Point(143, 86);
+ this.loadModelbutton.Name = "loadModelbutton";
+ this.loadModelbutton.Size = new System.Drawing.Size(101, 49);
+ this.loadModelbutton.TabIndex = 4;
+ this.loadModelbutton.Text = "Load Model";
+ this.loadModelbutton.Click += new System.EventHandler(this.loadModelbutton_Click);
+ //
+ // resetViewButton
+ //
+ this.resetViewButton.Location = new System.Drawing.Point(109, 86);
+ this.resetViewButton.Name = "resetViewButton";
+ this.resetViewButton.Size = new System.Drawing.Size(101, 49);
+ this.resetViewButton.TabIndex = 3;
+ this.resetViewButton.Text = "Reset View";
+ this.resetViewButton.Click += new System.EventHandler(this.resetViewButton_Click);
+ //
+ // noneButton
+ //
+ this.noneButton.Checked = true;
+ this.noneButton.Location = new System.Drawing.Point(14, 27);
+ this.noneButton.Name = "noneButton";
+ this.noneButton.Size = new System.Drawing.Size(87, 35);
+ this.noneButton.TabIndex = 2;
+ this.noneButton.TabStop = true;
+ this.noneButton.Text = "none";
+ this.noneButton.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.noneButton.CheckedChanged += new System.EventHandler(this.noneButton_CheckedChanged);
+ //
+ // zoomButton
+ //
+ this.zoomButton.Location = new System.Drawing.Point(238, 27);
+ this.zoomButton.Name = "zoomButton";
+ this.zoomButton.Size = new System.Drawing.Size(87, 35);
+ this.zoomButton.TabIndex = 1;
+ this.zoomButton.Text = "zoom";
+ this.zoomButton.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.zoomButton.CheckedChanged += new System.EventHandler(this.zoomButton_CheckedChanged);
+ //
+ // moveButton
+ //
+ this.moveButton.Location = new System.Drawing.Point(123, 27);
+ this.moveButton.Name = "moveButton";
+ this.moveButton.Size = new System.Drawing.Size(87, 34);
+ this.moveButton.TabIndex = 0;
+ this.moveButton.Text = "move";
+ this.moveButton.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.moveButton.CheckedChanged += new System.EventHandler(this.moveButton_CheckedChanged);
+ //
+ // openFileDialog2
+ //
+ this.openFileDialog2.Filter = "png (*.png)|*.png|tiff (*.tif)|*.tif|jpeg (*.jpg)| *.jpg|all files (*.*)|*.*";
+ this.openFileDialog2.FilterIndex = 4;
+ this.openFileDialog2.Multiselect = true;
+ //
+ // DisplayDataButton
+ //
+ this.DisplayDataButton.BackColor = System.Drawing.SystemColors.Control;
+ this.DisplayDataButton.Location = new System.Drawing.Point(143, 20);
+ this.DisplayDataButton.Name = "DisplayDataButton";
+ this.DisplayDataButton.Size = new System.Drawing.Size(101, 49);
+ this.DisplayDataButton.TabIndex = 7;
+ this.DisplayDataButton.Text = "Display";
+ this.DisplayDataButton.UseVisualStyleBackColor = false;
+ this.DisplayDataButton.Click += new System.EventHandler(this.DisplayDataButton_Click);
+ //
+ // timer
+ //
+ this.timer.Interval = 10;
+ this.timer.Tick += new System.EventHandler(this.timer_ticked);
+ //
+ // saveFileDialog1
+ //
+ this.saveFileDialog1.Filter = "HALCON ShapeModel File|*.shm|All files|*.*";
+ this.saveFileDialog1.RestoreDirectory = true;
+ //
+ // openFileDialog3
+ //
+ this.openFileDialog3.Filter = "HALCON ShapeModel File|*.shm|All files|*.*";
+ //
+ // resetModelbutton
+ //
+ this.resetModelbutton.Enabled = false;
+ this.resetModelbutton.Location = new System.Drawing.Point(273, 86);
+ this.resetModelbutton.Name = "resetModelbutton";
+ this.resetModelbutton.Size = new System.Drawing.Size(101, 49);
+ this.resetModelbutton.TabIndex = 8;
+ this.resetModelbutton.Text = "Clear Model";
+ this.resetModelbutton.Click += new System.EventHandler(this.resetModelbutton_Click);
+ //
+ // pnlBottom
+ //
+ this.pnlBottom.Controls.Add(this.groupBox6);
+ this.pnlBottom.Controls.Add(this.groupBox5);
+ this.pnlBottom.Controls.Add(this.groupBoxCreateROI);
+ this.pnlBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.pnlBottom.Location = new System.Drawing.Point(0, 589);
+ this.pnlBottom.Name = "pnlBottom";
+ this.pnlBottom.Size = new System.Drawing.Size(1259, 163);
+ this.pnlBottom.TabIndex = 11;
+ //
+ // groupBox6
+ //
+ this.groupBox6.Controls.Add(this.resetViewButton);
+ this.groupBox6.Controls.Add(this.moveButton);
+ this.groupBox6.Controls.Add(this.noneButton);
+ this.groupBox6.Controls.Add(this.zoomButton);
+ this.groupBox6.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.groupBox6.Location = new System.Drawing.Point(406, 0);
+ this.groupBox6.Name = "groupBox6";
+ this.groupBox6.Size = new System.Drawing.Size(353, 163);
+ this.groupBox6.TabIndex = 10;
+ this.groupBox6.TabStop = false;
+ this.groupBox6.Text = "View Interaction";
+ //
+ // groupBox5
+ //
+ this.groupBox5.Controls.Add(this.resetModelbutton);
+ this.groupBox5.Controls.Add(this.DisplayDataButton);
+ this.groupBox5.Controls.Add(this.loadModelbutton);
+ this.groupBox5.Controls.Add(this.saveModelbutton);
+ this.groupBox5.Controls.Add(this.loadImagebutton);
+ this.groupBox5.Dock = System.Windows.Forms.DockStyle.Left;
+ this.groupBox5.Location = new System.Drawing.Point(0, 0);
+ this.groupBox5.Name = "groupBox5";
+ this.groupBox5.Size = new System.Drawing.Size(406, 163);
+ this.groupBox5.TabIndex = 9;
+ this.groupBox5.TabStop = false;
+ this.groupBox5.Text = "groupBox5";
+ //
+ // pnlRight
+ //
+ this.pnlRight.Controls.Add(this.tabControl);
+ this.pnlRight.Dock = System.Windows.Forms.DockStyle.Right;
+ this.pnlRight.Location = new System.Drawing.Point(759, 0);
+ this.pnlRight.Name = "pnlRight";
+ this.pnlRight.Size = new System.Drawing.Size(500, 589);
+ this.pnlRight.TabIndex = 14;
+ //
+ // WindowModePanel
+ //
+ this.WindowModePanel.BackColor = System.Drawing.Color.RoyalBlue;
+ this.WindowModePanel.Controls.Add(this.viewPort);
+ this.WindowModePanel.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.WindowModePanel.Location = new System.Drawing.Point(0, 0);
+ this.WindowModePanel.Name = "WindowModePanel";
+ this.WindowModePanel.Size = new System.Drawing.Size(759, 589);
+ this.WindowModePanel.TabIndex = 15;
+ //
+ // viewPort
+ //
+ this.viewPort.BackColor = System.Drawing.Color.Black;
+ this.viewPort.BorderColor = System.Drawing.Color.Black;
+ this.viewPort.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.viewPort.ImagePart = new System.Drawing.Rectangle(0, 0, 640, 480);
+ this.viewPort.Location = new System.Drawing.Point(0, 0);
+ this.viewPort.Name = "viewPort";
+ this.viewPort.Size = new System.Drawing.Size(759, 589);
+ this.viewPort.TabIndex = 5;
+ this.viewPort.WindowSize = new System.Drawing.Size(759, 589);
+ //
+ // frmMatchingAssistant
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
+ this.ClientSize = new System.Drawing.Size(1259, 752);
+ this.Controls.Add(this.WindowModePanel);
+ this.Controls.Add(this.pnlRight);
+ this.Controls.Add(this.pnlBottom);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.MaximizeBox = false;
+ this.Name = "frmMatchingAssistant";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "Matching Assistant";
+ this.Load += new System.EventHandler(this.frmMatchingAssistant_Load);
+ this.tabControl.ResumeLayout(false);
+ this.tabPageCreateModel.ResumeLayout(false);
+ this.groupBoxCreateModel.ResumeLayout(false);
+ this.groupBoxCreateModel.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.MinContrastTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinContrastUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.PyramidLevelTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.PyramidLevelUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.AngleStepTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.AngleStepUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.AngleExtentTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.AngleExtentUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.StartingAngleTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.StartingAngleUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ScaleStepUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ScaleStepTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MaxScaleUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MaxScaleTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinScaleUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinScaleTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ContrastUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ContrastTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.DispPyramidUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.DispPyramidTrackBar)).EndInit();
+ this.tabPageFindModel.ResumeLayout(false);
+ this.tabPageFindModel.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.LastPyrLevTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.LastPyrLevUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MaxOverlapTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MaxOverlapUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.GreedinessTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.GreedinessUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.NumMatchesTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.NumMatchesUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinScoreTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinScoreUpDown)).EndInit();
+ this.tabPageOptimRecognition.ResumeLayout(false);
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.RecogNoManSelUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.recogRateTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.recogRateUpDown)).EndInit();
+ this.panel1.ResumeLayout(false);
+ this.tabPageInspectModel.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.InspectMaxNoMatchUpDown)).EndInit();
+ this.groupBox4.ResumeLayout(false);
+ this.groupBox3.ResumeLayout(false);
+ this.tabPageSaveConfige.ResumeLayout(false);
+ this.groupBox2.ResumeLayout(false);
+ this.groupBoxCreateROI.ResumeLayout(false);
+ this.pnlBottom.ResumeLayout(false);
+ this.groupBox6.ResumeLayout(false);
+ this.groupBox5.ResumeLayout(false);
+ this.pnlRight.ResumeLayout(false);
+ this.WindowModePanel.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+
+ /// <summary>
+ /// Updates all model parameters to the initial settings of the GUI
+ /// components.
+ /// </summary>
+ /// <param name="parSet">holds all necessary parameter values</param>
+ private void Init(MatchingParam parSet)
+ {
+ this.PyramidLevelUpDown.Value = 5;
+ this.MinContrastUpDown.Maximum = this.ContrastUpDown.Value;
+ this.MinContrastTrackBar.Maximum = (int)this.ContrastUpDown.Value;
+ this.MetricBox.SelectedIndex = 0;
+ this.OptimizationBox.SelectedIndex = 0;
+ this.SubPixelBox.SelectedIndex = 2;
+ this.RecognRateComboBox.SelectedIndex = 0;
+
+ parSet.mAngleExtent = (double)(AngleExtentUpDown.Value)*Math.PI/180.0;
+ parSet.mAngleStep = ((double)AngleStepUpDown.Value /10.0)*Math.PI/180.0;
+ parSet.mContrast = (int) ContrastUpDown.Value;
+ parSet.mMaxScale = (double)MaxScaleUpDown.Value/100.0;
+ parSet.mMetric = (string)MetricBox.Items[MetricBox.SelectedIndex];
+ parSet.mMinContrast = (int) MinContrastUpDown.Value;
+ parSet.mMinScale = (double)MinScaleUpDown.Value/100.0;
+ parSet.mNumLevel = (int)PyramidLevelUpDown.Value;
+ parSet.mOptimization = (string)OptimizationBox.Items[OptimizationBox.SelectedIndex];
+ parSet.mScaleStep = (double)ScaleStepUpDown.Value/1000.0;
+ parSet.mStartingAngle = (double)(StartingAngleUpDown.Value)*Math.PI/180.0;
+
+ parSet.mMinScore = (double)MinScoreUpDown.Value/100.0;
+ parSet.mNumMatches = (int)NumMatchesUpDown.Value;
+ parSet.mGreediness = (double)GreedinessUpDown.Value/100.0;
+ parSet.mMaxOverlap = (double)MaxOverlapUpDown.Value/100.0;
+ parSet.mSubpixel = (string)SubPixelBox.Items[SubPixelBox.SelectedIndex];
+ parSet.mLastPyramidLevel= (int)LastPyrLevUpDown.Value;
+
+ parSet.mRecogRateOpt = (int)RecognRateComboBox.SelectedIndex;
+ parSet.mRecogRate = (int)recogRateUpDown.Value;
+ parSet.mRecogSpeedMode = MatchingParam.RECOGM_MANUALSELECT;
+ parSet.mRecogManualSel = (int)RecogNoManSelUpDown.Value;
+ parSet.mInspectMaxNoMatch = (int)InspectMaxNoMatchUpDown.Value;
+
+ string imPathValue = (string)(HSystem.GetSystem("image_dir").TupleSplit(";"));
+ openFileDialog1.InitialDirectory = imPathValue;
+
+ openFileDialog2.InitialDirectory = imPathValue;
+
+ openFileDialog3.InitialDirectory =
+ Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
+
+ saveFileDialog1.InitialDirectory =
+ Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void loadImage(object sender, System.EventArgs e)
+ {
+ if(openFileDialog1.ShowDialog() == DialogResult.OK)
+ {
+ locked = true;
+
+ DetectionContour = null;
+ DispPyramidTrackBar.Enabled = false;
+ DispPyramidTrackBar.Value = 1;
+ DispPyramidUpDown.Enabled = false;
+ DispPyramidUpDown.Value = 1;
+
+ locked = false;
+
+ FindAlwaysCheckBox.Checked = false;
+
+ if(!mAssistant.setImage(openFileDialog1.FileName))
+ return;
+
+ mView.resetAll();
+
+ if(mAssistant.onExternalModelID)
+ ModelContour = mAssistant.getLoadedModelContour();
+
+ // to add ROI instances to the display as well
+ if(tabControl.SelectedIndex != 0)
+ {
+ tabControl.SelectedIndex = 0;
+ }
+ else
+ {
+ changeWindowMode(1);
+ CreateModelGraphics();
+ mView.repaint();
+ }
+ }
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void DisplayDataButton_Click(object sender, System.EventArgs e)
+ {
+ changeWindowMode(1);
+ CreateModelGraphics();
+ mView.repaint();
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void saveModelbutton_Click(object sender, System.EventArgs e)
+ {
+ string files;
+
+ if(saveFileDialog1.ShowDialog() == DialogResult.OK)
+ {
+ files = saveFileDialog1.FileName;
+
+ if(!files.EndsWith(".shm") && !files.EndsWith(".SHM"))
+ files += ".shm";
+
+ mAssistant.saveShapeModel(files);
+ }/* if */
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void loadModelbutton_Click(object sender, System.EventArgs e)
+ {
+ string file;
+
+ if(openFileDialog3.ShowDialog() == DialogResult.OK)
+ {
+ file = openFileDialog3.FileName;
+
+ if(!file.EndsWith(".shm") || !file.EndsWith(".shm"))
+ {
+ UpdateMatching(MatchingAssistant.ERR_NO_VALID_FILE);
+ return;
+ }
+
+ roiController.reset();
+ DetectionContour = null;
+ mAssistant.reset();
+ FindAlwaysCheckBox.Checked = false;
+
+ if(mAssistant.loadShapeModel(file))
+ {
+ groupBoxCreateROI.Enabled = false;
+ groupBoxCreateModel.Enabled = false;
+ resetModelbutton.Enabled = true;
+ saveModelbutton.Enabled = false;
+
+
+ ModelContour = mAssistant.getLoadedModelContour();
+
+ if(tabControl.SelectedIndex != 0)
+ {
+ tabControl.SelectedIndex = 0;
+ }
+ else
+ {
+ changeWindowMode(1);
+ CreateModelGraphics();
+ mView.repaint();
+ }
+ }
+ }/* if */
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void resetModelbutton_Click(object sender, System.EventArgs e)
+ {
+
+ groupBoxCreateModel.Enabled = true;
+ mAssistant.onExternalModelID = false;
+ FindAlwaysCheckBox.Checked = false;
+ resetModelbutton.Enabled = false;
+ saveModelbutton.Enabled = true;
+
+ DetectionContour = null;
+ ModelContour = null;
+
+ if(mAssistant.getDispImage()!=null)
+ groupBoxCreateROI.Enabled = true;
+
+ speedOptHandler.reset();
+ optInstance = speedOptHandler;
+ UpdateStatisticsData(MatchingOpt.UPDATE_RECOG_UPDATE_VALS);
+ UpdateStatisticsData(MatchingOpt.UPDATE_RECOG_OPTIMUM_VALS);
+ UpdateStatisticsData(MatchingOpt.UPDATE_RECOG_STATISTICS_STATUS);
+
+ inspectOptHandler.reset();
+ optInstance = inspectOptHandler;
+ UpdateStatisticsData(MatchingOpt.UPDATE_INSP_STATISTICS);
+ UpdateStatisticsData(MatchingOpt.UPDATE_INSP_RECOGRATE);
+
+ //reset Model parameters
+ mAssistant.resetCachedModelParams();
+
+ if(tabControl.SelectedIndex != 0)
+ {
+ tabControl.SelectedIndex = 0;
+ }
+ else
+ {
+ changeWindowMode(1);
+ CreateModelGraphics();
+ mView.repaint();
+ }
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void rect1Button_Click(object sender, System.EventArgs e)
+ {
+ roiController.setROIShape(new ROIRectangle1());
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void rect2Button_Click(object sender, System.EventArgs e)
+ {
+ roiController.setROIShape(new ROIRectangle2());
+ }
+
+
+ private void circleButton_Click(object sender, System.EventArgs e)
+ {
+ roiController.setROIShape(new ROICircle());
+ }
+ /********************************************************************/
+ /********************************************************************/
+ private void moveButton_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mView.setViewState(HWndCtrl.MODE_VIEW_MOVE);
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void zoomButton_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mView.setViewState(HWndCtrl.MODE_VIEW_ZOOM);
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void noneButton_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mView.setViewState(HWndCtrl.MODE_VIEW_NONE);
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void delROIButton_Click(object sender, System.EventArgs e)
+ {
+ roiController.removeActive();
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void delAllROIButton_Click(object sender, System.EventArgs e)
+ {
+ roiController.reset();
+ DetectionContour = null;
+ mAssistant.reset();
+
+ DispPyramidTrackBar.Value = 1;
+ DispPyramidTrackBar.Enabled = false;
+ DispPyramidUpDown.Value = 1;
+ DispPyramidUpDown.Enabled = false;
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void resetViewButton_Click(object sender, System.EventArgs e)
+ {
+ locked = true;
+ mView.resetWindow();
+ locked = false;
+ mView.repaint();
+
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void addToROIButton_Click(object sender, System.EventArgs e)
+ {
+ if(addToROIButton.Checked)
+ roiController.setROISign(ROIController.MODE_ROI_POS);
+
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void subFromROIButton_Click(object sender, System.EventArgs e)
+ {
+ if(subFromROIButton.Checked)
+ roiController.setROISign(ROIController.MODE_ROI_NEG);
+
+ }
+
+
+ /****************************************************************************/
+ /****************** 1. Tab: CREATE MODEL ***********************************/
+ /********************** Eventhandling ***************************************/
+ /****************************************************************************/
+
+ /********************************************************************/
+ /* DispPyramid */
+ /********************************************************************/
+ private void DispPyramidUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)DispPyramidUpDown.Value;
+ DispPyramidTrackBar.Value = val;
+
+
+ mView.setDispLevel(1);
+
+ if(!locked)
+ setDisplayLevel(val);
+ }
+
+ private void DispPyramidTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ DispPyramidUpDown.Value = DispPyramidTrackBar.Value;
+ DispPyramidUpDown.Refresh();
+ }
+
+ private void setDisplayLevel(int val)
+ {
+ mAssistant.setDispLevel(val);
+ }
+
+ /********************************************************************/
+ /* Auto Contrast */
+ /********************************************************************/
+ private void ContrastUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+
+ int val = (int)ContrastUpDown.Value;
+ ContrastTrackBar.Value = val;
+ MinContrastTrackBar.Maximum = val;
+ MinContrastUpDown.Maximum = val;
+
+ if(!locked)
+ setContrast(val);
+
+ if(!parameterSet.isAuto(MatchingParam.AUTO_CONTRAST))
+ {
+ ContrastAutoButton.ForeColor = System.Drawing.SystemColors.ControlText;
+ ContrastAutoButton.Text = "Auto";
+ }
+ }
+
+
+ private void ContrastTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ ContrastUpDown.Value = ContrastTrackBar.Value;
+ ContrastUpDown.Refresh();
+ }
+
+
+ private void ContrastAutoButton_Click(object sender, System.EventArgs e)
+ {
+ if(mAssistant.removeAuto(MatchingParam.AUTO_CONTRAST))
+ {
+ ContrastAutoButton.ForeColor = System.Drawing.SystemColors.ControlText;
+ ContrastAutoButton.Text = "Auto";
+ }
+ else
+ {
+ ContrastAutoButton.ForeColor = System.Drawing.SystemColors.ControlLightLight;
+ ContrastAutoButton.Text = "Auto!";
+ mAssistant.setAuto(MatchingParam.AUTO_CONTRAST);
+ }
+ }
+
+ private void setContrast(int val)
+ {
+ mAssistant.setContrast(val);
+ }
+
+ /********************************************************************/
+ /* MinScale */
+ /********************************************************************/
+ private void MinScaleUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)MinScaleUpDown.Value;
+ MinScaleTrackBar.Value = val;
+
+ if(val >= MaxScaleUpDown.Value)
+ MaxScaleUpDown.Value = val;
+
+ if(!locked)
+ setMinScale(val);
+ }
+
+ private void MinScaleTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ MinScaleUpDown.Value = MinScaleTrackBar.Value;
+ MinScaleUpDown.Refresh();
+ }
+
+ private void setMinScale(int val)
+ {
+ mAssistant.setMinScale((double)val/100);
+ }
+
+ /********************************************************************/
+ /* MaxScale */
+ /********************************************************************/
+ private void MaxScaleUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)MaxScaleUpDown.Value;
+ MaxScaleTrackBar.Value = val;
+
+ if(val<= MinScaleUpDown.Value)
+ MinScaleUpDown.Value = val;
+
+ if(!locked)
+ setMaxScale(val);
+ }
+
+ private void MaxScaleTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ MaxScaleUpDown.Value = MaxScaleTrackBar.Value;
+ MaxScaleUpDown.Refresh();
+ }
+
+ private void setMaxScale(int val)
+ {
+ mAssistant.setMaxScale((double)val/100);
+ }
+
+ /********************************************************************/
+ /* Auto scaleStep */
+ /********************************************************************/
+ private void ScaleStepUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)ScaleStepUpDown.Value;
+ ScaleStepTrackBar.Value = val;
+
+ if(!locked)
+ setScaleStep(val);
+
+ if(!parameterSet.isAuto(MatchingParam.AUTO_SCALE_STEP))
+ {
+ ScaleStepAutoButton.ForeColor = System.Drawing.SystemColors.ControlText;
+ ScaleStepAutoButton.Text = "Auto";
+ }
+ }
+
+ private void ScaleStepTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ ScaleStepUpDown.Value = ScaleStepTrackBar.Value;
+ ScaleStepUpDown.Refresh();
+ }
+
+ private void ScaleStepAutoButton_Click(object sender, System.EventArgs e)
+ {
+ if(mAssistant.removeAuto(MatchingParam.AUTO_SCALE_STEP))
+ {
+ ScaleStepAutoButton.ForeColor = System.Drawing.SystemColors.ControlText;
+ ScaleStepAutoButton.Text = "Auto";
+ }
+ else
+ {
+ ScaleStepAutoButton.ForeColor = System.Drawing.SystemColors.ControlLightLight;
+ ScaleStepAutoButton.Text = "Auto!";
+ mAssistant.setAuto(MatchingParam.AUTO_SCALE_STEP);
+ }
+ }
+
+
+ private void setScaleStep(int val)
+ {
+ mAssistant.setScaleStep((double)val/1000);
+ }
+
+ /********************************************************************/
+ /* startingAngle */
+ /********************************************************************/
+ private void StartingAngleUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)StartingAngleUpDown.Value;
+ StartingAngleTrackBar.Value = val;
+
+ if(!locked)
+ setStartingAngle(val);
+ }
+
+ private void StartingAngleTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ StartingAngleUpDown.Value = StartingAngleTrackBar.Value;
+ StartingAngleUpDown.Refresh();
+ }
+
+ private void setStartingAngle(int val)
+ {
+ double rad = val*Math.PI/180;
+ mAssistant.setStartingAngle(rad);
+ }
+
+ /********************************************************************/
+ /* angleExtent */
+ /********************************************************************/
+ private void AngleExtentUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int) AngleExtentUpDown.Value;
+ AngleExtentTrackBar.Value = val;
+
+ if(!locked)
+ setAngleExtent(val);
+ }
+
+ private void AngleExtentTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ AngleExtentUpDown.Value = AngleExtentTrackBar.Value;
+ AngleExtentUpDown.Refresh();
+ }
+
+ private void setAngleExtent(int val)
+ {
+ double rad = val*Math.PI/180;
+ mAssistant.setAngleExtent(rad);
+ }
+
+ /********************************************************************/
+ /* Auto angleStep */
+ /********************************************************************/
+ private void AngleStepUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)AngleStepUpDown.Value;
+ AngleStepTrackBar.Value = val;
+
+ if(!locked)
+ setAngleStep(val);
+
+ if(!parameterSet.isAuto(MatchingParam.AUTO_ANGLE_STEP))
+ {
+ AngleStepAutoButton.ForeColor = System.Drawing.SystemColors.ControlText;
+ AngleStepAutoButton.Text = "Auto";
+ }
+ }
+
+ private void AngleStepTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ AngleStepUpDown.Value = AngleStepTrackBar.Value;
+ AngleStepUpDown.Refresh();
+ }
+
+ private void AngleStepAutoButton_Click(object sender, System.EventArgs e)
+ {
+ if(mAssistant.removeAuto(MatchingParam.AUTO_ANGLE_STEP))
+ {
+ AngleStepAutoButton.ForeColor = System.Drawing.SystemColors.ControlText;
+ AngleStepAutoButton.Text = "Auto";
+ }
+ else
+ {
+ AngleStepAutoButton.ForeColor = System.Drawing.SystemColors.ControlLightLight;
+ AngleStepAutoButton.Text = "Auto!";
+ mAssistant.setAuto(MatchingParam.AUTO_ANGLE_STEP);
+ }
+ }
+
+ private void setAngleStep(int val)
+ {
+ double rad = (double)(val/10.0)*Math.PI/180.0;
+ mAssistant.setAngleStep(rad);
+ }
+
+ /********************************************************************/
+ /* Auto pyramidLevel */
+ /********************************************************************/
+ private void PyramidLevelUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)PyramidLevelUpDown.Value;
+ PyramidLevelTrackBar.Value = val;
+
+ if(!locked)
+ setPyramidLevel(val);
+
+ if(!parameterSet.isAuto(MatchingParam.AUTO_NUM_LEVEL))
+ {
+ PyramidLevelAutoButton.ForeColor = System.Drawing.SystemColors.ControlText;
+ PyramidLevelAutoButton.Text = "Auto";
+ }
+ }
+
+ private void PyramidLevelTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ PyramidLevelUpDown.Value = PyramidLevelTrackBar.Value;
+ PyramidLevelUpDown.Refresh();
+ }
+
+ private void PyramidLevelAutoButton_Click(object sender, System.EventArgs e)
+ {
+ if(mAssistant.removeAuto(MatchingParam.AUTO_NUM_LEVEL))
+ {
+ PyramidLevelAutoButton.ForeColor = System.Drawing.SystemColors.ControlText;
+ PyramidLevelAutoButton.Text = "Auto";
+ }
+ else
+ {
+ PyramidLevelAutoButton.ForeColor = System.Drawing.SystemColors.ControlLightLight;
+ PyramidLevelAutoButton.Text = "Auto!";
+ mAssistant.setAuto(MatchingParam.AUTO_NUM_LEVEL);
+ }
+ }
+
+ private void setPyramidLevel(int val)
+ {
+ mAssistant.setPyramidLevel(val);
+ }
+
+ /********************************************************************/
+ /* metricBox */
+ /********************************************************************/
+ private void MetricBox_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ if(!locked)
+ mAssistant.setMetric(MetricBox.Text);
+ }
+
+
+ /********************************************************************/
+ /* Auto optimizationBox */
+ /********************************************************************/
+ private void OptimizationBox_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ if(!locked)
+ mAssistant.setOptimization((string)OptimizationBox.Text);
+
+ if(!parameterSet.isAuto(MatchingParam.AUTO_OPTIMIZATION))
+ {
+ OptimizationAutoButton.ForeColor = System.Drawing.SystemColors.ControlText;
+ OptimizationAutoButton.Text = "Auto";
+ }
+ }
+ private void OptimizationAutoButton_Click(object sender, System.EventArgs e)
+ {
+ if(mAssistant.removeAuto(MatchingParam.AUTO_OPTIMIZATION))
+ {
+ OptimizationAutoButton.ForeColor = System.Drawing.SystemColors.ControlText;
+ OptimizationAutoButton.Text = "Auto";
+ }
+ else
+ {
+ OptimizationAutoButton.ForeColor = System.Drawing.SystemColors.ControlLightLight;
+ OptimizationAutoButton.Text = "Auto!";
+ mAssistant.setAuto(MatchingParam.AUTO_OPTIMIZATION);
+ }
+
+ }
+
+ /********************************************************************/
+ /* Auto minContrast */
+ /********************************************************************/
+ private void MinContrastUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)MinContrastUpDown.Value;
+ MinContrastTrackBar.Value = val;
+
+ if(!locked)
+ setMinContrast(val);
+
+ if(!parameterSet.isAuto(MatchingParam.AUTO_MIN_CONTRAST))
+ {
+ MinContrastAutoButton.ForeColor = System.Drawing.SystemColors.ControlText;
+ MinContrastAutoButton.Text = "Auto";
+ }
+ }
+
+ private void MinContrastTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ MinContrastUpDown.Value = MinContrastTrackBar.Value;
+ MinContrastUpDown.Refresh();
+ }
+
+ private void MinContrastAutoButton_Click(object sender, System.EventArgs e)
+ {
+ if(mAssistant.removeAuto(MatchingParam.AUTO_MIN_CONTRAST))
+ {
+ MinContrastAutoButton.ForeColor = System.Drawing.SystemColors.ControlText;
+ MinContrastAutoButton.Text = "Auto";
+ }
+ else
+ {
+ MinContrastAutoButton.ForeColor = System.Drawing.SystemColors.ControlLightLight;
+ MinContrastAutoButton.Text = "Auto!";
+ mAssistant.setAuto(MatchingParam.AUTO_MIN_CONTRAST);
+ }
+ }
+
+
+ private void setMinContrast(int val)
+ {
+ mAssistant.setMinContrast(val);
+ }
+
+
+ /**********************************************************************/
+ /************ 2. Tab: USE MODEL **************************************/
+ /**************** Eventhandling ***************************************/
+ /**********************************************************************/
+
+ private void LoadTestImgButton_Click(object sender, System.EventArgs e)
+ {
+ string [] files;
+ int count = 0;
+
+ if(openFileDialog2.ShowDialog() == DialogResult.OK)
+ {
+ files = openFileDialog2.FileNames;
+ count = files.Length;
+
+ for(int i=0; i<count; i++)
+ {
+ if(mAssistant.addTestImages(files[i]))
+ testImgListBox.Items.Add(files[i]);
+ }
+
+ if(testImgListBox.SelectedIndex<0 && testImgListBox.Items.Count != 0)
+ {
+ CurrentImg = mAssistant.getTestImage((string)testImgListBox.Items[0]);
+ testImgListBox.SelectedIndex = 0;
+ FindModelGraphics();
+ }
+ }//if
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void deleteTestImgButton_Click(object sender, System.EventArgs e)
+ {
+ int count;
+ if((count = testImgListBox.SelectedIndex) < 0)
+ return;
+
+ string fileName = (string)testImgListBox.SelectedItem;
+
+ if((--count) < 0)
+ count+=2;
+
+ if((count < testImgListBox.Items.Count))
+ {
+ testImgListBox.SelectedIndex = count;
+ }
+
+ mAssistant.removeTestImage(fileName);
+ testImgListBox.Items.Remove(fileName);
+ }
+
+
+ /********************************************************************/
+ /********************************************************************/
+ private void deleteAllTestImgButton_Click(object sender, System.EventArgs e)
+ {
+ if(testImgListBox.Items.Count>0)
+ {
+ testImgListBox.Items.Clear();
+ mAssistant.removeTestImage();
+ DetectionContour = null;
+
+ mView.clearList();
+ changeWindowMode(2);
+ mView.repaint();
+ }
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void testImgListBox_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ string file;
+
+ if(testImgListBox.SelectedIndex < 0)
+ {
+ mView.clearList();
+ changeWindowMode(2);
+ mView.repaint();
+ return;
+ }
+
+ DetectionContour = null;
+ file = (string)testImgListBox.SelectedItem;
+ mAssistant.setTestImage(file);
+
+ changeWindowMode(2);
+
+ if(FindAlwaysCheckBox.Checked
+ && (mAssistant.onExternalModelID || (ModelRegion != null)))
+ {
+ mAssistant.applyFindModel();
+ }
+ else
+ {
+ mView.repaint();
+ }
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void displayTestImgButton_Click(object sender, System.EventArgs e)
+ {
+ string file;
+
+ if(testImgListBox.Items.Count == 0)
+ {
+ mView.clearList();
+ changeWindowMode(2);
+ mView.repaint();
+
+ UpdateMatching(MatchingAssistant.ERR_NO_TESTIMAGE);
+ return;
+ }
+
+
+ file = (string)testImgListBox.SelectedItem;
+ CurrentImg = mAssistant.getTestImage(file);
+
+ changeWindowMode(2, CurrentImg);
+
+ if(!FindAlwaysCheckBox.Checked)
+ DetectionContour = null;
+
+ FindModelGraphics();
+
+ if(ModelContour != null && FindAlwaysCheckBox.Checked)
+ {
+ mAssistant.applyFindModel();
+ }
+ else
+ {
+ mView.repaint();
+ }
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void findModelButton_Click(object sender, System.EventArgs e)
+ {
+
+ if(testImgListBox.Items.Count!=0)
+ changeWindowMode(2);
+
+ mAssistant.applyFindModel();
+ }
+
+ private void findAlwaysCheckBox_CheckedChanged(object sender, System.EventArgs e)
+ {
+ bool flag = FindAlwaysCheckBox.Checked;
+
+ if(flag && testImgListBox.Items.Count!=0)
+ changeWindowMode(2);
+
+ mAssistant.setFindAlways(flag);
+ }
+
+ /********************************************************************/
+ /* minScore */
+ /********************************************************************/
+ private void MinScoreUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)MinScoreUpDown.Value;
+ MinScoreTrackBar.Value = val;
+
+ if(!locked)
+ setMinScore(val);
+ }
+
+ private void MinScoreTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ MinScoreUpDown.Value = MinScoreTrackBar.Value;
+ MinScoreUpDown.Refresh();
+
+ }
+
+ private void setMinScore(int val)
+ {
+ if(testImgListBox.Items.Count!=0 && FindAlwaysCheckBox.Checked)
+ changeWindowMode(2);
+
+ mAssistant.setMinScore((double)val/100.0);
+ }
+
+ /********************************************************************/
+ /* numMatches */
+ /********************************************************************/
+ private void NumMatchesUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int) NumMatchesUpDown.Value;
+ NumMatchesTrackBar.Value = val;
+ InspectMaxNoMatchUpDown.Value = val;
+
+ if(!locked)
+ setNumMatches(val);
+ }
+
+ private void NumMatchesTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ NumMatchesUpDown.Value = NumMatchesTrackBar.Value;
+ NumMatchesUpDown.Refresh();
+ }
+
+ private void setNumMatches(int val)
+ {
+ if(testImgListBox.Items.Count!=0 && FindAlwaysCheckBox.Checked)
+ changeWindowMode(2);
+
+ if(val==0)
+ {
+ if(FindMaxNoOfModelButton.Checked==true)
+ FindAtLeastOneModelButton.Checked=true;
+
+ FindMaxNoOfModelButton.Enabled=false;
+ }
+ else
+ {
+ FindMaxNoOfModelButton.Enabled=true;
+ }
+
+
+ mAssistant.setNumMatches(val);
+ }
+
+ /********************************************************************/
+ /* greediness */
+ /********************************************************************/
+ private void GreedinessUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int) GreedinessUpDown.Value;
+ GreedinessTrackBar.Value = val;
+
+ if(!locked)
+ setGreediness(val);
+ }
+
+ private void GreedinessTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ GreedinessUpDown.Value = GreedinessTrackBar.Value;
+ GreedinessUpDown.Refresh();
+ }
+
+ private void setGreediness(int val)
+ {
+ if(testImgListBox.Items.Count!=0 && FindAlwaysCheckBox.Checked)
+ changeWindowMode(2);
+
+ mAssistant.setGreediness((double)val/100.0);
+ }
+
+ /********************************************************************/
+ /* maxOverlap */
+ /********************************************************************/
+ private void MaxOverlapUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int) MaxOverlapUpDown.Value;
+ MaxOverlapTrackBar.Value = val;
+
+ if(!locked)
+ setMaxOverlap(val);
+ }
+
+ private void MaxOverlapTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ MaxOverlapUpDown.Value = MaxOverlapTrackBar.Value;
+ MaxOverlapUpDown.Refresh();
+ }
+
+ private void setMaxOverlap(int val)
+ {
+ if(testImgListBox.Items.Count!=0 && FindAlwaysCheckBox.Checked)
+ changeWindowMode(2);
+
+ mAssistant.setMaxOverlap((double)val/100.0);
+ }
+
+ /********************************************************************/
+ /* subpixelBox */
+ /********************************************************************/
+ private void SubPixelBox_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ if(!locked)
+ {
+ if(testImgListBox.Items.Count!=0 && FindAlwaysCheckBox.Checked)
+ changeWindowMode(2);
+
+ mAssistant.setSubPixel(SubPixelBox.Text);
+ }
+ }
+
+ /********************************************************************/
+ /* lastPyramidLevel */
+ /********************************************************************/
+ private void LastPyrLevUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int) LastPyrLevUpDown.Value;
+ LastPyrLevTrackBar.Value = val;
+
+ if(!locked)
+ setLastPyramidLevel(val);
+ }
+
+ private void LastPyrLevTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ LastPyrLevUpDown.Value = LastPyrLevTrackBar.Value;
+ LastPyrLevUpDown.Refresh();
+ }
+
+ private void setLastPyramidLevel(int val)
+ {
+ if(testImgListBox.Items.Count!=0 && FindAlwaysCheckBox.Checked)
+ changeWindowMode(2);
+
+ mAssistant.setLastPyramLevel(val);
+ }
+
+
+ /*************************************************************************/
+ /******** 3. Tab: Optimize Recognition Speed ****************************/
+ /******************* Eventhandling ***************************************/
+ /*************************************************************************/
+ private void FindNoOfInstButton_CheckedChanged(object sender, System.EventArgs e)
+ {
+ if(!locked && FindNoOfInstButton.Checked)
+ mAssistant.setRecogSpeedMode(MatchingParam.RECOGM_MANUALSELECT);
+ }
+
+ private void FindAtLeastOneModelButton_CheckedChanged(object sender, System.EventArgs e)
+ {
+ if(!locked && FindAtLeastOneModelButton.Checked)
+ mAssistant.setRecogSpeedMode(MatchingParam.RECOGM_ATLEASTONE);
+ }
+
+ private void FindMaxNoOfModelButton_CheckedChanged(object sender, System.EventArgs e)
+ {
+ if(!locked && FindMaxNoOfModelButton.Checked)
+ mAssistant.setRecogSpeedMode(MatchingParam.RECOGM_MAXNUMBER);
+ }
+
+ /********************************************************************/
+ /* RecognitionRate */
+ /********************************************************************/
+ private void RecognRateComboBox_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ int val = RecognRateComboBox.SelectedIndex;
+
+ if(!locked)
+ mAssistant.setRecogRateOption(val);
+ }
+
+ private void recogRateUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)recogRateUpDown.Value;
+ recogRateTrackBar.Value = val;
+ mAssistant.setRecogitionRate(val);
+ }
+
+ private void recogRateTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ recogRateUpDown.Value = recogRateTrackBar.Value;
+ recogRateUpDown.Refresh();
+ }
+
+ private void RecogNoManSelUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)RecogNoManSelUpDown.Value;
+ if(!locked)
+ mAssistant.setRecogManualSelection(val);
+ }
+
+ /*******************************************************************/
+ /*******************************************************************/
+ private void runOptimizeSpeedButton_Click(object sender, System.EventArgs e)
+ {
+ if(testImgListBox.Items.Count!=0)
+ changeWindowMode(2);
+
+ if(!timer.Enabled)
+ {
+ FindAlwaysCheckBox.Checked = false;
+ optInstance = speedOptHandler;
+ optInstance.reset();
+ UpdateStatisticsData(MatchingOpt.UPDATE_RECOG_UPDATE_VALS);
+ UpdateStatisticsData(MatchingOpt.UPDATE_RECOG_OPTIMUM_VALS);
+ UpdateStatisticsData(MatchingOpt.UPDATE_RECOG_STATISTICS_STATUS);
+
+ OptimizeButton.Text = "Stop";
+ mAssistant.onTimer = true;
+ timer.Enabled = true;
+ }
+ else
+ {
+ timer.Enabled = false;
+ OptimizeButton.Text = "Run Optimization";
+ mAssistant.onTimer = false;
+ UpdateStatisticsData(MatchingOpt.RUN_FAILED);
+ }
+ }
+
+ /*******************************************************************/
+ /*******************************************************************/
+ private void runStatisticsButton_Click(object sender, System.EventArgs e)
+ {
+ if(testImgListBox.Items.Count!=0)
+ changeWindowMode(2);
+
+ if(!timer.Enabled)
+ {
+ FindAlwaysCheckBox.Checked = false;
+ optInstance = inspectOptHandler;
+ optInstance.reset();
+ UpdateStatisticsData(MatchingOpt.UPDATE_INSP_RECOGRATE);
+ UpdateStatisticsData(MatchingOpt.UPDATE_INSP_STATISTICS);
+
+ StatisticsButton.Text = "Stop";
+ timer.Enabled = true;
+ mAssistant.onTimer = true;
+ }
+ else
+ {
+ timer.Enabled = false;
+ StatisticsButton.Text = "Run Inspect";
+ mAssistant.onTimer = false;
+ }
+ }
+
+ private void InspectMaxNoMatchUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ if(InspectMaxNoMatchUpDown.Value != NumMatchesUpDown.Value)
+ NumMatchesUpDown.Value = (int)InspectMaxNoMatchUpDown.Value;
+ }
+
+ /*******************************************************************/
+ /*******************************************************************/
+ private void timer_ticked(object sender, System.EventArgs e)
+ {
+ bool run;
+ run = optInstance.ExecuteStep();
+
+ if(!run)
+ {
+ timer.Enabled = false;
+ optInstance.stop();
+ mAssistant.onTimer = false;
+
+ OptimizeButton.Text = "Run Optimization";
+ StatisticsButton.Text = "Run Inspect";
+ }
+ }
+
+ /**********************************************************************/
+ /**********************************************************************/
+ /* Delegate Routines */
+ /**********************************************************************/
+ /**********************************************************************/
+
+ /// <summary>
+ /// This method is invoked if changes occur in the HWndCtrl instance
+ /// or the ROIController. In either case, the HALCON
+ /// window needs to be updated/repainted.
+ /// </summary>
+ public void UpdateViewData(int val)
+ {
+
+ switch(val)
+ {
+ case ROIController.EVENT_CHANGED_ROI_SIGN:
+ case ROIController.EVENT_DELETED_ACTROI:
+ case ROIController.EVENT_DELETED_ALL_ROIS:
+ case ROIController.EVENT_UPDATE_ROI:
+ ModelContour = null;
+ DetectionContour = null;
+ bool genROI = roiController.defineModelROI();
+ ModelRegion = roiController.getModelRegion();
+ mAssistant.setModelROI(ModelRegion);
+ CreateModelGraphics();
+ if(!genROI)
+ mView.repaint();
+
+ break;
+ case HWndCtrl.ERR_READING_IMG:
+ MessageBox.Show("Problem occured while reading file! \n" + mView.exceptionText,
+ "Matching assistant",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ break;
+ default:
+ break;
+ }
+ }
+
+ /// <summary>
+ /// This method is invoked for any changes in the
+ /// MatchingAssistant, concerning the model creation and
+ /// the model finding. Also changes in the display mode
+ /// (e.g., pyramid level) are mapped here.
+ /// </summary>
+ public void UpdateMatching(int val)
+ {
+ bool paint=false;
+ switch(val)
+ {
+ case MatchingAssistant.UPDATE_XLD:
+ ModelContour = mAssistant.getModelContour();
+ CreateModelGraphics();
+ paint = true;
+ break;
+ case MatchingAssistant.UPDATE_DISPLEVEL:
+ CurrentImg = mAssistant.getDispImage();
+ ModelContour = mAssistant.getModelContour();
+ CreateModelGraphics();
+ paint = true;
+ break;
+ case MatchingAssistant.UPDATE_PYRAMID:
+ DispPyramidTrackBar.Enabled = true;
+ DispPyramidUpDown.Enabled = true;
+ break;
+ case MatchingAssistant.UPDATE_DETECTION_RESULT:
+ DetectionContour = mAssistant.getDetectionResults();
+ FindModelGraphics();
+ paint = true;
+ break;
+ case MatchingAssistant.UPDATE_TESTVIEW:
+ CurrentImg = mAssistant.getCurrTestImage();
+ FindModelGraphics();
+ break;
+ case MatchingAssistant.ERR_WRITE_SHAPEMODEL:
+ MessageBox.Show("Problem occured while writing into file \n" + mAssistant.exceptionText,
+ "Matching Wizard",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+ break;
+ case MatchingAssistant.ERR_READ_SHAPEMODEL:
+ MessageBox.Show("Problem occured while reading from file \n" + mAssistant.exceptionText,
+ "Matching Wizard",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+ break;
+ case MatchingAssistant.ERR_NO_MODEL_DEFINED:
+ MessageBox.Show("Please define a Model!",
+ "Matching Wizard",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ paint = true;
+ break;
+ case MatchingAssistant.ERR_NO_IMAGE:
+ MessageBox.Show("Please load an image",
+ "Matching Wizard",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ break;
+ case MatchingAssistant.ERR_NO_TESTIMAGE:
+ MessageBox.Show("Please load a testimage",
+ "Matching Wizard",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ paint = true;
+ break;
+ case MatchingAssistant.ERR_NO_VALID_FILE:
+ MessageBox.Show("Selected file is not a HALCON ShapeModel file .shm",
+ "Matching Wizard",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ break;
+ case MatchingAssistant.ERR_READING_IMG:
+ UpdateViewData(HWndCtrl.ERR_READING_IMG);
+ break;
+ case MatchingAssistant.ERR_FINDSHAPEMODEL:
+ MessageBox.Show("模板匹配失败",
+ "Matching Wizard",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ break;
+ case MatchingAssistant.ERR_PARAMSET:
+ MessageBox.Show("错误的参数设置",
+ "Matching Wizard",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ break;
+ default:
+ break;
+ }
+ if(paint)
+ mView.repaint();
+ }
+
+
+ /// <summary>
+ /// Calculates new optimal values for a parameter, if the parameter is
+ /// in the auto-mode list. The new settings are forwarded to the GUI
+ /// components to update the display.
+ /// </summary>
+ public void UpdateButton(string mode)
+ {
+ int [] r;
+ locked = true;
+ switch (mode)
+ {
+ case MatchingParam.AUTO_ANGLE_STEP:
+ AngleStepUpDown.Value = (int)((parameterSet.mAngleStep*10.0)*180.0/Math.PI);
+ break;
+ case MatchingParam.AUTO_CONTRAST:
+ ContrastUpDown.Value = (int)parameterSet.mContrast;
+ break;
+ case MatchingParam.AUTO_MIN_CONTRAST:
+ MinContrastUpDown.Value = (int)parameterSet.mMinContrast;
+ break;
+ case MatchingParam.AUTO_NUM_LEVEL:
+ PyramidLevelUpDown.Value = (int)parameterSet.mNumLevel;
+ break;
+ case MatchingParam.AUTO_OPTIMIZATION:
+ OptimizationBox.Text = parameterSet.mOptimization;
+ break;
+ case MatchingParam.AUTO_SCALE_STEP:
+ ScaleStepUpDown.Value = (int)(parameterSet.mScaleStep*1000);
+ break;
+ case MatchingParam.BUTTON_ANGLE_EXTENT:
+ AngleExtentUpDown.Value = (int)(parameterSet.mAngleExtent*180.0/Math.PI);
+ break;
+ case MatchingParam.BUTTON_ANGLE_START:
+ StartingAngleUpDown.Value = (int)(parameterSet.mStartingAngle*180.0/Math.PI);
+ break;
+ case MatchingParam.BUTTON_METRIC:
+ MetricBox.Text = parameterSet.mMetric;
+ break;
+ case MatchingParam.BUTTON_SCALE_MAX:
+ MaxScaleUpDown.Value = (int)(parameterSet.mMaxScale*100.0);
+ break;
+ case MatchingParam.BUTTON_SCALE_MIN:
+ MinScaleUpDown.Value = (int)(parameterSet.mMinScale*100.0);
+ break;
+ case MatchingParam.BUTTON_MINSCORE:
+ MinScoreUpDown.Value = (int)(parameterSet.mMinScore*100);
+ break;
+ case MatchingParam.BUTTON_GREEDINESS:
+ GreedinessUpDown.Value = (int)(parameterSet.mGreediness*100);
+ break;
+ case MatchingParam.H_ERR_MESSAGE:
+ MessageBox.Show("Bad Parameters! \n" + mAssistant.exceptionText,
+ "Matching Wizard",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Exclamation);
+ break;
+ case MatchingParam.RANGE_ANGLE_STEP:
+ r = mAssistant.getStepRange(MatchingParam.RANGE_ANGLE_STEP);
+ AngleStepTrackBar.Minimum = r[0];
+ AngleStepUpDown.Minimum = r[0];
+ AngleStepTrackBar.Maximum = r[1];
+ AngleStepUpDown.Maximum = r[1];
+
+ AngleStepUpDown.Value = (int)((parameterSet.mAngleStep*10.0)*180.0/Math.PI);
+ break;
+ case MatchingParam.RANGE_SCALE_STEP:
+ r = mAssistant.getStepRange(MatchingParam.RANGE_SCALE_STEP);
+ ScaleStepTrackBar.Minimum = r[0];
+ ScaleStepUpDown.Minimum = r[0];
+ ScaleStepTrackBar.Maximum = r[1];
+ ScaleStepUpDown.Maximum = r[1];
+
+ ScaleStepUpDown.Value = (int)(parameterSet.mScaleStep*1000);
+ break;
+ default:
+ break;
+ }
+ locked = false;
+ }
+
+
+ /// <summary>
+ /// This method is invoked when the inspection tab or the
+ /// recognition tab are triggered to compute the optimized values
+ /// and to forward the results to the display.
+ /// </summary>
+ public void UpdateStatisticsData(int mode)
+ {
+
+ switch (mode)
+ {
+ case MatchingOpt.UPDATE_RECOG_STATISTICS_STATUS:
+ labelOptStatus.Text = optInstance.statusString;
+ break;
+ case MatchingOpt.UPDATE_RECOG_UPDATE_VALS:
+ labelRecogn11.Text = optInstance.recogTabOptimizationData[0];
+ labelRecogn12.Text = optInstance.recogTabOptimizationData[1];
+ labelRecogn13.Text = optInstance.recogTabOptimizationData[2];
+ labelRecogn14.Text = optInstance.recogTabOptimizationData[3];
+ break;
+ case MatchingOpt.UPDATE_RECOG_OPTIMUM_VALS:
+ labelRecogn21.Text = optInstance.recogTabOptimizationData[4];
+ labelRecogn22.Text = optInstance.recogTabOptimizationData[5];
+ labelRecogn23.Text = optInstance.recogTabOptimizationData[6];
+ labelRecogn24.Text = optInstance.recogTabOptimizationData[7];
+ break;
+ case MatchingOpt.UPDATE_INSP_RECOGRATE:
+ labelInspect01.Text = optInstance.inspectTabRecogRateData[0];
+ labelInspect02.Text = optInstance.inspectTabRecogRateData[1];
+ labelInspect03.Text = optInstance.inspectTabRecogRateData[2];
+ labelInspect04.Text = optInstance.inspectTabRecogRateData[3];
+ labelInspect05.Text = optInstance.inspectTabRecogRateData[4];
+ break;
+ case MatchingOpt.UPDATE_INSP_STATISTICS:
+ labelInspect11.Text = optInstance.inspectTabStatisticsData[0];
+ labelInspect21.Text = optInstance.inspectTabStatisticsData[1];
+ labelInspect31.Text = optInstance.inspectTabStatisticsData[2];
+
+ labelInspect12.Text = optInstance.inspectTabStatisticsData[3];
+ labelInspect22.Text = optInstance.inspectTabStatisticsData[4];
+ labelInspect32.Text = optInstance.inspectTabStatisticsData[5];
+
+ labelInspect13.Text = optInstance.inspectTabStatisticsData[6];
+ labelInspect23.Text = optInstance.inspectTabStatisticsData[7];
+ labelInspect33.Text = optInstance.inspectTabStatisticsData[8];
+
+ labelInspect14.Text = optInstance.inspectTabStatisticsData[9];
+ labelInspect24.Text = optInstance.inspectTabStatisticsData[10];
+ labelInspect34.Text = optInstance.inspectTabStatisticsData[11];
+
+ labelInspect15.Text = optInstance.inspectTabStatisticsData[12];
+ labelInspect25.Text = optInstance.inspectTabStatisticsData[13];
+ labelInspect35.Text = optInstance.inspectTabStatisticsData[14];
+
+ labelInspect16.Text = optInstance.inspectTabStatisticsData[15];
+ labelInspect26.Text = optInstance.inspectTabStatisticsData[16];
+ labelInspect36.Text = optInstance.inspectTabStatisticsData[17];
+
+ labelInspect17.Text = optInstance.inspectTabStatisticsData[18];
+ labelInspect27.Text = optInstance.inspectTabStatisticsData[19];
+ labelInspect37.Text = optInstance.inspectTabStatisticsData[20];
+ break;
+ case MatchingOpt.UPDATE_TEST_ERR:
+ MessageBox.Show("Optimization failed! \n Please check if your model is well defined\n(e.g contains some model contours)!?",
+ "Shapebases Matching Assistant",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Exclamation);
+ break;
+ case MatchingOpt.UPDATE_RECOG_ERR:
+ labelOptStatus.Text = "Optimization failed";
+ MessageBox.Show("There was no appropriate set of parameters to match - \n" +
+ "Check if your model is well defined and the parameters\nfor model creation are set appropriately!",
+ "Shapebases Matching Assistant",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Exclamation);
+ break;
+ case MatchingAssistant.ERR_NO_TESTIMAGE:
+ UpdateMatching(MatchingAssistant.ERR_NO_TESTIMAGE);
+ break;
+ case MatchingOpt.RUN_SUCCESSFUL:
+ UpdateButton(MatchingParam.BUTTON_GREEDINESS);
+ UpdateButton(MatchingParam.BUTTON_MINSCORE);
+ break;
+ case MatchingOpt.RUN_FAILED:
+ setMinScore((int)MinScoreUpDown.Value);
+ setGreediness((int)GreedinessUpDown.Value);
+ break;
+ default:
+ break;
+ }
+ }
+
+
+ /********************************************************************/
+ /********************************************************************/
+ private void CreateModelGraphics()
+ {
+ mView.clearList();
+ mView.changeGraphicSettings(GraphicsContext.GC_LINESTYLE, new HTuple());
+ mView.addIconicVar(CurrentImg);
+ if(ModelRegion != null)
+ {
+ mView.changeGraphicSettings(GraphicsContext.GC_COLOR, "blue");
+ mView.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 3);
+ mView.addIconicVar(ModelRegion);
+ }
+ if(ModelContour != null)
+ {
+ mView.changeGraphicSettings(GraphicsContext.GC_COLOR, "red");
+ mView.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 1);
+ mView.addIconicVar(ModelContour);
+ }
+ }
+
+ private void FindModelGraphics()
+ {
+ mView.clearList();
+ mView.changeGraphicSettings(GraphicsContext.GC_LINESTYLE, new HTuple());
+ mView.addIconicVar(CurrentImg);
+ if(DetectionContour != null)
+ {
+ mView.changeGraphicSettings(GraphicsContext.GC_COLOR, "green");
+ mView.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 3);
+ mView.addIconicVar(DetectionContour);
+ }
+ }
+
+
+ /********************************************************************/
+ /********************************************************************/
+ private void tabControl_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ if(tabControl.SelectedIndex == 0)
+ {
+ changeWindowMode(1);
+ CreateModelGraphics();
+ }
+ else if (tabControl.SelectedIndex == 4)
+ {
+ this.labAngleMin.Text = mAssistant.getParameterSet.mStartingAngle.ToString();
+ this.labAngleExt.Text = mAssistant.getParameterSet.mAngleExtent.ToString();
+
+ this.labScaleMin.Text = mAssistant.getParameterSet.mMinScale.ToString();
+ this.labScaleMax.Text = mAssistant.getParameterSet.mMaxScale.ToString();
+
+ this.labScoreMin.Text = mAssistant.getParameterSet.mMinScore.ToString();
+
+ this.labMatchesMax.Text = mAssistant.getParameterSet.mNumMatches.ToString();
+
+ this.labOverlapMax.Text = mAssistant.getParameterSet.mMaxOverlap.ToString();
+
+ this.labSubPixelSelect.Text = mAssistant.getParameterSet.mSubpixel.ToString();
+
+ this.labNumLevelsMax.Text = mAssistant.getParameterSet.mNumLevel.ToString();
+
+ this.labGreedinessMax.Text = mAssistant.getParameterSet.mGreediness.ToString();
+
+ }
+ else
+ {
+ changeWindowMode(2);
+ FindModelGraphics();
+ }
+ mView.repaint();
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ private void changeWindowMode(int mode)
+ {
+ HImage img = null;
+
+ if(mode==2)
+ img = mAssistant.getCurrTestImage();
+
+ changeWindowMode(mode, img);
+ }
+
+ private void changeWindowMode(int mode, HImage testImage)
+ {
+ mView.setDispLevel(mode);
+
+ switch(mode)
+ {
+ case 1:
+ CurrentImg = mAssistant.getDispImage();
+ if(mAssistant.onExternalModelID)
+ {
+ WindowModePanel.BackColor = System.Drawing.SystemColors.ControlDark;
+ }
+ else if(CurrentImg==null)
+ {
+ WindowModePanel.BackColor = createModelWindowMode;
+ }
+ else
+ {
+ WindowModePanel.BackColor = createModelWindowMode;
+ groupBoxCreateROI.Enabled = true;
+ }
+ break;
+
+ case 2:
+ WindowModePanel.BackColor = trainModelWindowMode;
+ CurrentImg = testImage;
+ groupBoxCreateROI.Enabled = false;
+ break;
+ }
+ }
+
+ private void butSaveConfige_Click(object sender, EventArgs e)
+ {
+ MatchingParamSave param = new MatchingParamSave();
+
+ param.Save(mAssistant);
+ }
+
+ private void frmMatchingAssistant_Load(object sender, EventArgs e)
+ {
+
+ }
+
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/frmMatchingAssistant.resx b/HalconTools/frmMatchingAssistant.resx
new file mode 100644
index 0000000..2446714
--- /dev/null
+++ b/HalconTools/frmMatchingAssistant.resx
@@ -0,0 +1,138 @@
+<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="openFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <metadata name="openFileDialog2.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>165, 17</value>
+ </metadata>
+ <metadata name="timer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>461, 17</value>
+ </metadata>
+ <metadata name="saveFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>544, 17</value>
+ </metadata>
+ <metadata name="openFileDialog3.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>313, 17</value>
+ </metadata>
+ <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>55</value>
+ </metadata>
+</root>
\ No newline at end of file
diff --git a/HalconTools/frmMeasureAssistant.cs b/HalconTools/frmMeasureAssistant.cs
new file mode 100644
index 0000000..ba9b77d
--- /dev/null
+++ b/HalconTools/frmMeasureAssistant.cs
@@ -0,0 +1,2649 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ /// <summary>
+ /// This project provides the main functionality of HDevelop's Measure Assistant,
+ /// with the main exception of fuzzy measure.
+ /// In the first tab you can adjust the parameters for edge
+ /// detection. The second tab displays the measure results and the
+ /// third tab plots the gray value profile of the selected ROI.
+ /// The project is composed of several classes for paremeterizing
+ /// the measurements (like MeasurementEdge, MeasurementPair or
+ /// MeasurementResult) and the controller class MeasureAssistant,
+ /// which is in charge of the communication between the GUI-frontend
+ /// and the model classes.
+ /// </summary>
+ public class frmMeasureAssistant : System.Windows.Forms.Form
+ {
+
+ /* base variables */
+ private HWindowControl viewPort;
+ private HWndCtrl mView;
+ private ROIController roiController;
+ private MeasureAssistant mAssistant;
+ private HXLDCont mShadow;
+ private FunctionPlot plotGraphWindow;
+ private HImage currImage;
+
+ /* display parameters */
+ private string regionColor;
+ private string edgeColor;
+ private int lineWidth;
+
+ private bool displayRegion;
+ private bool useShadow;
+ private bool updateLineProfile;
+
+
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.Button LoadImgButton;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.RadioButton NoneButton;
+ private System.Windows.Forms.RadioButton MoveButton;
+ private System.Windows.Forms.RadioButton ZoomButton;
+ private System.Windows.Forms.Button LineButton;
+ private System.Windows.Forms.Button DeleteActRoiButton;
+ private System.Windows.Forms.Button ResetROIButton;
+ private System.Windows.Forms.TabControl tabControl;
+ private System.Windows.Forms.TabPage tabPageEdges;
+ private System.Windows.Forms.TabPage tabPageResults;
+ private System.Windows.Forms.OpenFileDialog openImageFileDialog;
+ private System.Windows.Forms.GroupBox groupBox4;
+ private System.Windows.Forms.GroupBox groupBox5;
+ private System.Windows.Forms.CheckBox EdgeToPaircheckBox;
+ private System.Windows.Forms.RadioButton MagnifyButton;
+ private System.Windows.Forms.GroupBox groupBox6;
+ private System.Windows.Forms.ComboBox TransitionComboBox;
+ private System.Windows.Forms.ComboBox PositionComboBox;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.ComboBox RegionColorComboBox;
+ private System.Windows.Forms.ComboBox EdgeColorComboBox;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.NumericUpDown EdgeLengthUpDown;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.NumericUpDown LineWidthDown;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.CheckBox ShowRegionCheckBox;
+ private System.Windows.Forms.CheckBox UseShadowsCheckBox;
+ private System.Windows.Forms.CheckBox UseROIWidthCheckBox;
+ private System.Windows.Forms.NumericUpDown ROIWidthUpDown;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.Label label10;
+ private System.Windows.Forms.NumericUpDown SmoothingUpDown;
+ private System.Windows.Forms.NumericUpDown MinEdgAmplUpDown;
+ private System.Windows.Forms.ComboBox InterpolationComboBox;
+ private System.Windows.Forms.Button ResetViewButton;
+ private System.Windows.Forms.TrackBar MinEdgAmplTrackBar;
+ private System.Windows.Forms.TrackBar SmoothingTrackBar;
+ private System.Windows.Forms.TrackBar ROIWidthTrackBar;
+ private System.Windows.Forms.Button ResetMinEdgAmplButton;
+ private System.Windows.Forms.Label StatusLabel;
+ private System.Windows.Forms.Button ResetSmoothingButton;
+ private System.Windows.Forms.Button ResetROIWidthButton;
+ private System.Windows.Forms.GroupBox groupBox7;
+ private System.Windows.Forms.CheckBox PositionCheckBox;
+ private System.Windows.Forms.CheckBox PairWidthCheckBox;
+ private System.Windows.Forms.CheckBox AmplitudeCheckBox;
+ private System.Windows.Forms.CheckBox DistanceCheckBox;
+ private System.Windows.Forms.GroupBox groupBox8;
+ private System.Windows.Forms.CheckBox TransWCoordCheckBox;
+ private System.Windows.Forms.Button LoadPoseButton;
+ private System.Windows.Forms.Button LoadCalibButton;
+ private System.Windows.Forms.TextBox CalibCamTextBox;
+ private System.Windows.Forms.TextBox CalibPoseTextBox;
+ private System.Windows.Forms.ListView EdgeResultListView;
+ private System.Windows.Forms.OpenFileDialog openCamparFileDialog;
+ private System.Windows.Forms.Label label14;
+ private System.Windows.Forms.ComboBox UnitComboBox;
+ private System.Windows.Forms.Panel UnitPanel;
+ private System.Windows.Forms.ListBox ActiveROIListBox;
+ private System.Windows.Forms.Label label15;
+ private System.Windows.Forms.CheckBox ShowROIcheckBox;
+ private System.Windows.Forms.Button CircArcButton;
+ private System.Windows.Forms.TabPage tabPageLineProfile;
+ private System.Windows.Forms.GroupBox groupBox9;
+ private System.Windows.Forms.Label label16;
+ private System.Windows.Forms.Label label17;
+ private System.Windows.Forms.Label label18;
+ private System.Windows.Forms.Label label19;
+ private System.Windows.Forms.Label label22;
+ private System.Windows.Forms.Label label23;
+ private System.Windows.Forms.Label label24;
+ private System.Windows.Forms.Label label25;
+ private System.Windows.Forms.Panel panelAxis;
+ private System.Windows.Forms.Label labelDeviation;
+ private System.Windows.Forms.Label labelMean;
+ private System.Windows.Forms.Label labelRange;
+ private System.Windows.Forms.Label labelPeak;
+ private System.Windows.Forms.Label labelRangeX;
+ private System.Windows.Forms.Label labelPeakX;
+ private System.Windows.Forms.Label label20;
+ private System.Windows.Forms.ComboBox CSScaleComboBox;
+ private GroupBox groupBox3;
+ private TabPage tabPageSaveConfige;
+ private Button btnSaveConfige;
+ private Label label11;
+ private Label labMinEdgeAmpl;
+ private Label label12;
+ private Label labMinEdgeAmplSet;
+ private Label labROIWidth;
+ private Label labROIWidthSet;
+ private Label labSmoothing;
+ private Label labSmoothingSet;
+ private Label labROIHeightSet;
+ private Label labTransition;
+ private Label labTransitionSet;
+ private Label labInterpolation;
+ private Label labInterpolationSet;
+ private Label labPosition;
+ private Label labPositionSet;
+ private GroupBox groupBox10;
+ private Button butRoiHeightReset;
+ private TrackBar tBroiHeight;
+ private NumericUpDown numUDRoiHeight;
+ private Label labROIHeight1;
+ private Label labROIHeight;
+
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.Container components = null;
+
+ public frmMeasureAssistant()
+ {
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent();
+
+ //
+ // TODO: Add any constructor code after InitializeComponent call
+ //
+ }
+
+ private HImage mImage;
+ public frmMeasureAssistant(HImage image)
+ {
+ InitializeComponent();
+ mImage = image;
+ initLoadImage();
+ }
+
+ private void initLoadImage()
+ {
+ InitViewer();
+
+ int dispROI = HWndCtrl.MODE_INCLUDE_ROI;
+
+ roiController.reset();
+ mView.resetWindow();
+
+ mAssistant.setImage(mImage);
+
+ currImage = mAssistant.getImage();
+
+ mView.setDispLevel(dispROI);
+ UpdateView();
+ }
+
+ public frmMeasureAssistant(string name)
+ {
+ InitializeComponent();
+ ResourceCulture.SetCurrentCulture(name);
+ ResourceCulture.SetLanguage((Control)this);
+ }
+
+ /// <summary>
+ /// Cleans up the used resources.
+ /// </summary>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ if (components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.viewPort = new HalconDotNet.HWindowControl();
+ this.tabControl = new System.Windows.Forms.TabControl();
+ this.tabPageEdges = new System.Windows.Forms.TabPage();
+ this.groupBox6 = new System.Windows.Forms.GroupBox();
+ this.ShowROIcheckBox = new System.Windows.Forms.CheckBox();
+ this.UseROIWidthCheckBox = new System.Windows.Forms.CheckBox();
+ this.UseShadowsCheckBox = new System.Windows.Forms.CheckBox();
+ this.ShowRegionCheckBox = new System.Windows.Forms.CheckBox();
+ this.label6 = new System.Windows.Forms.Label();
+ this.LineWidthDown = new System.Windows.Forms.NumericUpDown();
+ this.label5 = new System.Windows.Forms.Label();
+ this.EdgeLengthUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.EdgeColorComboBox = new System.Windows.Forms.ComboBox();
+ this.RegionColorComboBox = new System.Windows.Forms.ComboBox();
+ this.groupBox5 = new System.Windows.Forms.GroupBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.PositionComboBox = new System.Windows.Forms.ComboBox();
+ this.TransitionComboBox = new System.Windows.Forms.ComboBox();
+ this.EdgeToPaircheckBox = new System.Windows.Forms.CheckBox();
+ this.groupBox4 = new System.Windows.Forms.GroupBox();
+ this.butRoiHeightReset = new System.Windows.Forms.Button();
+ this.tBroiHeight = new System.Windows.Forms.TrackBar();
+ this.numUDRoiHeight = new System.Windows.Forms.NumericUpDown();
+ this.labROIHeight1 = new System.Windows.Forms.Label();
+ this.ResetROIWidthButton = new System.Windows.Forms.Button();
+ this.ResetSmoothingButton = new System.Windows.Forms.Button();
+ this.ResetMinEdgAmplButton = new System.Windows.Forms.Button();
+ this.ROIWidthTrackBar = new System.Windows.Forms.TrackBar();
+ this.SmoothingTrackBar = new System.Windows.Forms.TrackBar();
+ this.MinEdgAmplTrackBar = new System.Windows.Forms.TrackBar();
+ this.label10 = new System.Windows.Forms.Label();
+ this.label9 = new System.Windows.Forms.Label();
+ this.label8 = new System.Windows.Forms.Label();
+ this.label7 = new System.Windows.Forms.Label();
+ this.MinEdgAmplUpDown = new System.Windows.Forms.NumericUpDown();
+ this.SmoothingUpDown = new System.Windows.Forms.NumericUpDown();
+ this.InterpolationComboBox = new System.Windows.Forms.ComboBox();
+ this.ROIWidthUpDown = new System.Windows.Forms.NumericUpDown();
+ this.tabPageResults = new System.Windows.Forms.TabPage();
+ this.label15 = new System.Windows.Forms.Label();
+ this.ActiveROIListBox = new System.Windows.Forms.ListBox();
+ this.EdgeResultListView = new System.Windows.Forms.ListView();
+ this.groupBox8 = new System.Windows.Forms.GroupBox();
+ this.UnitPanel = new System.Windows.Forms.Panel();
+ this.label14 = new System.Windows.Forms.Label();
+ this.UnitComboBox = new System.Windows.Forms.ComboBox();
+ this.CalibPoseTextBox = new System.Windows.Forms.TextBox();
+ this.CalibCamTextBox = new System.Windows.Forms.TextBox();
+ this.LoadPoseButton = new System.Windows.Forms.Button();
+ this.LoadCalibButton = new System.Windows.Forms.Button();
+ this.TransWCoordCheckBox = new System.Windows.Forms.CheckBox();
+ this.groupBox7 = new System.Windows.Forms.GroupBox();
+ this.DistanceCheckBox = new System.Windows.Forms.CheckBox();
+ this.AmplitudeCheckBox = new System.Windows.Forms.CheckBox();
+ this.PairWidthCheckBox = new System.Windows.Forms.CheckBox();
+ this.PositionCheckBox = new System.Windows.Forms.CheckBox();
+ this.tabPageLineProfile = new System.Windows.Forms.TabPage();
+ this.label20 = new System.Windows.Forms.Label();
+ this.CSScaleComboBox = new System.Windows.Forms.ComboBox();
+ this.panelAxis = new System.Windows.Forms.Panel();
+ this.groupBox9 = new System.Windows.Forms.GroupBox();
+ this.labelDeviation = new System.Windows.Forms.Label();
+ this.labelMean = new System.Windows.Forms.Label();
+ this.labelRange = new System.Windows.Forms.Label();
+ this.labelPeak = new System.Windows.Forms.Label();
+ this.label24 = new System.Windows.Forms.Label();
+ this.label25 = new System.Windows.Forms.Label();
+ this.labelRangeX = new System.Windows.Forms.Label();
+ this.labelPeakX = new System.Windows.Forms.Label();
+ this.label23 = new System.Windows.Forms.Label();
+ this.label22 = new System.Windows.Forms.Label();
+ this.label19 = new System.Windows.Forms.Label();
+ this.label18 = new System.Windows.Forms.Label();
+ this.label17 = new System.Windows.Forms.Label();
+ this.label16 = new System.Windows.Forms.Label();
+ this.tabPageSaveConfige = new System.Windows.Forms.TabPage();
+ this.groupBox10 = new System.Windows.Forms.GroupBox();
+ this.labROIHeight = new System.Windows.Forms.Label();
+ this.labROIHeightSet = new System.Windows.Forms.Label();
+ this.labPosition = new System.Windows.Forms.Label();
+ this.labPositionSet = new System.Windows.Forms.Label();
+ this.labTransition = new System.Windows.Forms.Label();
+ this.labTransitionSet = new System.Windows.Forms.Label();
+ this.labInterpolation = new System.Windows.Forms.Label();
+ this.labInterpolationSet = new System.Windows.Forms.Label();
+ this.labROIWidth = new System.Windows.Forms.Label();
+ this.labROIWidthSet = new System.Windows.Forms.Label();
+ this.labSmoothing = new System.Windows.Forms.Label();
+ this.labSmoothingSet = new System.Windows.Forms.Label();
+ this.labMinEdgeAmpl = new System.Windows.Forms.Label();
+ this.label12 = new System.Windows.Forms.Label();
+ this.labMinEdgeAmplSet = new System.Windows.Forms.Label();
+ this.label11 = new System.Windows.Forms.Label();
+ this.btnSaveConfige = new System.Windows.Forms.Button();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.CircArcButton = new System.Windows.Forms.Button();
+ this.LineButton = new System.Windows.Forms.Button();
+ this.DeleteActRoiButton = new System.Windows.Forms.Button();
+ this.ResetROIButton = new System.Windows.Forms.Button();
+ this.LoadImgButton = new System.Windows.Forms.Button();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.ResetViewButton = new System.Windows.Forms.Button();
+ this.MagnifyButton = new System.Windows.Forms.RadioButton();
+ this.ZoomButton = new System.Windows.Forms.RadioButton();
+ this.MoveButton = new System.Windows.Forms.RadioButton();
+ this.NoneButton = new System.Windows.Forms.RadioButton();
+ this.openImageFileDialog = new System.Windows.Forms.OpenFileDialog();
+ this.StatusLabel = new System.Windows.Forms.Label();
+ this.openCamparFileDialog = new System.Windows.Forms.OpenFileDialog();
+ this.groupBox3 = new System.Windows.Forms.GroupBox();
+ this.tabControl.SuspendLayout();
+ this.tabPageEdges.SuspendLayout();
+ this.groupBox6.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.LineWidthDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.EdgeLengthUpDown)).BeginInit();
+ this.groupBox5.SuspendLayout();
+ this.groupBox4.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.tBroiHeight)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.numUDRoiHeight)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ROIWidthTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.SmoothingTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinEdgAmplTrackBar)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinEdgAmplUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.SmoothingUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ROIWidthUpDown)).BeginInit();
+ this.tabPageResults.SuspendLayout();
+ this.groupBox8.SuspendLayout();
+ this.UnitPanel.SuspendLayout();
+ this.groupBox7.SuspendLayout();
+ this.tabPageLineProfile.SuspendLayout();
+ this.groupBox9.SuspendLayout();
+ this.tabPageSaveConfige.SuspendLayout();
+ this.groupBox10.SuspendLayout();
+ this.groupBox2.SuspendLayout();
+ this.groupBox1.SuspendLayout();
+ this.groupBox3.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // viewPort
+ //
+ this.viewPort.BackColor = System.Drawing.Color.Black;
+ this.viewPort.BorderColor = System.Drawing.Color.Black;
+ this.viewPort.ImagePart = new System.Drawing.Rectangle(0, 0, 640, 480);
+ this.viewPort.Location = new System.Drawing.Point(10, 55);
+ this.viewPort.Name = "viewPort";
+ this.viewPort.Size = new System.Drawing.Size(785, 545);
+ this.viewPort.TabIndex = 0;
+ this.viewPort.WindowSize = new System.Drawing.Size(785, 545);
+ this.viewPort.HMouseMove += new HalconDotNet.HMouseEventHandler(this.viewPort_HMouseMove);
+ //
+ // tabControl
+ //
+ this.tabControl.Controls.Add(this.tabPageEdges);
+ this.tabControl.Controls.Add(this.tabPageResults);
+ this.tabControl.Controls.Add(this.tabPageLineProfile);
+ this.tabControl.Controls.Add(this.tabPageSaveConfige);
+ this.tabControl.Location = new System.Drawing.Point(801, 12);
+ this.tabControl.Name = "tabControl";
+ this.tabControl.SelectedIndex = 0;
+ this.tabControl.Size = new System.Drawing.Size(430, 593);
+ this.tabControl.TabIndex = 1;
+ this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged);
+ //
+ // tabPageEdges
+ //
+ this.tabPageEdges.Controls.Add(this.groupBox6);
+ this.tabPageEdges.Controls.Add(this.groupBox5);
+ this.tabPageEdges.Controls.Add(this.groupBox4);
+ this.tabPageEdges.Location = new System.Drawing.Point(4, 22);
+ this.tabPageEdges.Name = "tabPageEdges";
+ this.tabPageEdges.Size = new System.Drawing.Size(422, 567);
+ this.tabPageEdges.TabIndex = 1;
+ this.tabPageEdges.Text = " Edges ";
+ this.tabPageEdges.UseVisualStyleBackColor = true;
+ //
+ // groupBox6
+ //
+ this.groupBox6.Controls.Add(this.ShowROIcheckBox);
+ this.groupBox6.Controls.Add(this.UseROIWidthCheckBox);
+ this.groupBox6.Controls.Add(this.UseShadowsCheckBox);
+ this.groupBox6.Controls.Add(this.ShowRegionCheckBox);
+ this.groupBox6.Controls.Add(this.label6);
+ this.groupBox6.Controls.Add(this.LineWidthDown);
+ this.groupBox6.Controls.Add(this.label5);
+ this.groupBox6.Controls.Add(this.EdgeLengthUpDown);
+ this.groupBox6.Controls.Add(this.label4);
+ this.groupBox6.Controls.Add(this.label3);
+ this.groupBox6.Controls.Add(this.EdgeColorComboBox);
+ this.groupBox6.Controls.Add(this.RegionColorComboBox);
+ this.groupBox6.Location = new System.Drawing.Point(10, 392);
+ this.groupBox6.Name = "groupBox6";
+ this.groupBox6.Size = new System.Drawing.Size(403, 172);
+ this.groupBox6.TabIndex = 3;
+ this.groupBox6.TabStop = false;
+ this.groupBox6.Text = "Display Parameters";
+ //
+ // ShowROIcheckBox
+ //
+ this.ShowROIcheckBox.Location = new System.Drawing.Point(259, 138);
+ this.ShowROIcheckBox.Name = "ShowROIcheckBox";
+ this.ShowROIcheckBox.Size = new System.Drawing.Size(125, 26);
+ this.ShowROIcheckBox.TabIndex = 11;
+ this.ShowROIcheckBox.Text = " Show ROIs";
+ this.ShowROIcheckBox.CheckedChanged += new System.EventHandler(this.ShowROIcheckBox_CheckedChanged);
+ //
+ // UseROIWidthCheckBox
+ //
+ this.UseROIWidthCheckBox.Location = new System.Drawing.Point(259, 103);
+ this.UseROIWidthCheckBox.Name = "UseROIWidthCheckBox";
+ this.UseROIWidthCheckBox.Size = new System.Drawing.Size(125, 26);
+ this.UseROIWidthCheckBox.TabIndex = 10;
+ this.UseROIWidthCheckBox.Text = "Use ROI Width";
+ this.UseROIWidthCheckBox.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.UseROIWidthCheckBox.CheckedChanged += new System.EventHandler(this.UseROIWidthCheckBox_CheckedChanged);
+ //
+ // UseShadowsCheckBox
+ //
+ this.UseShadowsCheckBox.Location = new System.Drawing.Point(259, 69);
+ this.UseShadowsCheckBox.Name = "UseShadowsCheckBox";
+ this.UseShadowsCheckBox.Size = new System.Drawing.Size(115, 26);
+ this.UseShadowsCheckBox.TabIndex = 9;
+ this.UseShadowsCheckBox.Text = "Use Shadows";
+ this.UseShadowsCheckBox.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.UseShadowsCheckBox.CheckedChanged += new System.EventHandler(this.UseShadowsCheckBox_CheckedChanged);
+ //
+ // ShowRegionCheckBox
+ //
+ this.ShowRegionCheckBox.Location = new System.Drawing.Point(259, 34);
+ this.ShowRegionCheckBox.Name = "ShowRegionCheckBox";
+ this.ShowRegionCheckBox.Size = new System.Drawing.Size(115, 26);
+ this.ShowRegionCheckBox.TabIndex = 8;
+ this.ShowRegionCheckBox.Text = "Show Region";
+ this.ShowRegionCheckBox.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.ShowRegionCheckBox.CheckedChanged += new System.EventHandler(this.ShowRegionCheckBox_CheckedChanged);
+ //
+ // label6
+ //
+ this.label6.Location = new System.Drawing.Point(10, 138);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(86, 26);
+ this.label6.TabIndex = 7;
+ this.label6.Text = "Line Width";
+ this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // LineWidthDown
+ //
+ this.LineWidthDown.Location = new System.Drawing.Point(106, 138);
+ this.LineWidthDown.Maximum = new decimal(new int[] {
+ 9,
+ 0,
+ 0,
+ 0});
+ this.LineWidthDown.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.LineWidthDown.Name = "LineWidthDown";
+ this.LineWidthDown.Size = new System.Drawing.Size(134, 21);
+ this.LineWidthDown.TabIndex = 6;
+ this.LineWidthDown.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ this.LineWidthDown.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.LineWidthDown.ValueChanged += new System.EventHandler(this.LineWidthDown_ValueChanged);
+ //
+ // label5
+ //
+ this.label5.Location = new System.Drawing.Point(10, 103);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(86, 26);
+ this.label5.TabIndex = 5;
+ this.label5.Text = "Edge Length";
+ this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // EdgeLengthUpDown
+ //
+ this.EdgeLengthUpDown.Location = new System.Drawing.Point(106, 103);
+ this.EdgeLengthUpDown.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.EdgeLengthUpDown.Name = "EdgeLengthUpDown";
+ this.EdgeLengthUpDown.Size = new System.Drawing.Size(134, 21);
+ this.EdgeLengthUpDown.TabIndex = 4;
+ this.EdgeLengthUpDown.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ this.EdgeLengthUpDown.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.EdgeLengthUpDown.ValueChanged += new System.EventHandler(this.EdgeLengthUpDown_ValueChanged);
+ //
+ // label4
+ //
+ this.label4.Location = new System.Drawing.Point(10, 69);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(86, 26);
+ this.label4.TabIndex = 3;
+ this.label4.Text = "Edge Color";
+ this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label3
+ //
+ this.label3.Location = new System.Drawing.Point(10, 34);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(86, 26);
+ this.label3.TabIndex = 2;
+ this.label3.Text = "Region Color";
+ this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // EdgeColorComboBox
+ //
+ this.EdgeColorComboBox.Items.AddRange(new object[] {
+ "green",
+ "red",
+ "blue",
+ "black",
+ "white",
+ "yellow",
+ "magenta",
+ "cyan",
+ "gray"});
+ this.EdgeColorComboBox.Location = new System.Drawing.Point(106, 69);
+ this.EdgeColorComboBox.Name = "EdgeColorComboBox";
+ this.EdgeColorComboBox.Size = new System.Drawing.Size(134, 20);
+ this.EdgeColorComboBox.TabIndex = 1;
+ this.EdgeColorComboBox.Text = "EdgeColor";
+ this.EdgeColorComboBox.SelectedIndexChanged += new System.EventHandler(this.EdgeColorComboBox_SelectedIndexChanged);
+ //
+ // RegionColorComboBox
+ //
+ this.RegionColorComboBox.Items.AddRange(new object[] {
+ "green",
+ "red",
+ "blue",
+ "black",
+ "white",
+ "yellow",
+ "magenta",
+ "cyan",
+ "gray"});
+ this.RegionColorComboBox.Location = new System.Drawing.Point(106, 34);
+ this.RegionColorComboBox.Name = "RegionColorComboBox";
+ this.RegionColorComboBox.Size = new System.Drawing.Size(134, 20);
+ this.RegionColorComboBox.TabIndex = 0;
+ this.RegionColorComboBox.Text = "RegionColor";
+ this.RegionColorComboBox.SelectedIndexChanged += new System.EventHandler(this.RegionColorComboBox_SelectedIndexChanged);
+ //
+ // groupBox5
+ //
+ this.groupBox5.Controls.Add(this.label2);
+ this.groupBox5.Controls.Add(this.label1);
+ this.groupBox5.Controls.Add(this.PositionComboBox);
+ this.groupBox5.Controls.Add(this.TransitionComboBox);
+ this.groupBox5.Controls.Add(this.EdgeToPaircheckBox);
+ this.groupBox5.Location = new System.Drawing.Point(10, 252);
+ this.groupBox5.Name = "groupBox5";
+ this.groupBox5.Size = new System.Drawing.Size(403, 134);
+ this.groupBox5.TabIndex = 2;
+ this.groupBox5.TabStop = false;
+ this.groupBox5.Text = "Edge Selection";
+ //
+ // label2
+ //
+ this.label2.Location = new System.Drawing.Point(21, 93);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(76, 26);
+ this.label2.TabIndex = 5;
+ this.label2.Text = "Position";
+ this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label1
+ //
+ this.label1.Location = new System.Drawing.Point(21, 50);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(76, 26);
+ this.label1.TabIndex = 4;
+ this.label1.Text = "Transition";
+ this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // PositionComboBox
+ //
+ this.PositionComboBox.Items.AddRange(new object[] {
+ "all",
+ "first",
+ "last"});
+ this.PositionComboBox.Location = new System.Drawing.Point(117, 93);
+ this.PositionComboBox.Name = "PositionComboBox";
+ this.PositionComboBox.Size = new System.Drawing.Size(192, 20);
+ this.PositionComboBox.TabIndex = 3;
+ this.PositionComboBox.Text = "Position";
+ this.PositionComboBox.SelectedIndexChanged += new System.EventHandler(this.PositionComboBox_SelectedIndexChanged);
+ //
+ // TransitionComboBox
+ //
+ this.TransitionComboBox.Items.AddRange(new object[] {
+ "all",
+ "positive",
+ "negative"});
+ this.TransitionComboBox.Location = new System.Drawing.Point(117, 50);
+ this.TransitionComboBox.Name = "TransitionComboBox";
+ this.TransitionComboBox.Size = new System.Drawing.Size(192, 20);
+ this.TransitionComboBox.TabIndex = 2;
+ this.TransitionComboBox.Text = "Transition";
+ this.TransitionComboBox.SelectedIndexChanged += new System.EventHandler(this.TransitionComboBox_SelectedIndexChanged);
+ //
+ // EdgeToPaircheckBox
+ //
+ this.EdgeToPaircheckBox.Location = new System.Drawing.Point(117, 16);
+ this.EdgeToPaircheckBox.Name = "EdgeToPaircheckBox";
+ this.EdgeToPaircheckBox.Size = new System.Drawing.Size(172, 26);
+ this.EdgeToPaircheckBox.TabIndex = 1;
+ this.EdgeToPaircheckBox.Text = "Group Edges to Pairs";
+ this.EdgeToPaircheckBox.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.EdgeToPaircheckBox.CheckedChanged += new System.EventHandler(this.EdgeToPaircheckBox_CheckedChanged);
+ //
+ // groupBox4
+ //
+ this.groupBox4.Controls.Add(this.butRoiHeightReset);
+ this.groupBox4.Controls.Add(this.tBroiHeight);
+ this.groupBox4.Controls.Add(this.numUDRoiHeight);
+ this.groupBox4.Controls.Add(this.labROIHeight1);
+ this.groupBox4.Controls.Add(this.ResetROIWidthButton);
+ this.groupBox4.Controls.Add(this.ResetSmoothingButton);
+ this.groupBox4.Controls.Add(this.ResetMinEdgAmplButton);
+ this.groupBox4.Controls.Add(this.ROIWidthTrackBar);
+ this.groupBox4.Controls.Add(this.SmoothingTrackBar);
+ this.groupBox4.Controls.Add(this.MinEdgAmplTrackBar);
+ this.groupBox4.Controls.Add(this.label10);
+ this.groupBox4.Controls.Add(this.label9);
+ this.groupBox4.Controls.Add(this.label8);
+ this.groupBox4.Controls.Add(this.label7);
+ this.groupBox4.Controls.Add(this.MinEdgAmplUpDown);
+ this.groupBox4.Controls.Add(this.SmoothingUpDown);
+ this.groupBox4.Controls.Add(this.InterpolationComboBox);
+ this.groupBox4.Controls.Add(this.ROIWidthUpDown);
+ this.groupBox4.Location = new System.Drawing.Point(10, 17);
+ this.groupBox4.Name = "groupBox4";
+ this.groupBox4.Size = new System.Drawing.Size(403, 229);
+ this.groupBox4.TabIndex = 1;
+ this.groupBox4.TabStop = false;
+ this.groupBox4.Text = "Edge Extraction";
+ //
+ // butRoiHeightReset
+ //
+ this.butRoiHeightReset.Location = new System.Drawing.Point(339, 141);
+ this.butRoiHeightReset.Name = "butRoiHeightReset";
+ this.butRoiHeightReset.Size = new System.Drawing.Size(58, 26);
+ this.butRoiHeightReset.TabIndex = 53;
+ this.butRoiHeightReset.Text = "Reset";
+ this.butRoiHeightReset.Click += new System.EventHandler(this.butRoiHeightReset_Click);
+ //
+ // tBroiHeight
+ //
+ this.tBroiHeight.Location = new System.Drawing.Point(163, 127);
+ this.tBroiHeight.Maximum = 2000;
+ this.tBroiHeight.Minimum = 5;
+ this.tBroiHeight.Name = "tBroiHeight";
+ this.tBroiHeight.Size = new System.Drawing.Size(173, 45);
+ this.tBroiHeight.TabIndex = 52;
+ this.tBroiHeight.TickFrequency = 10;
+ this.tBroiHeight.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.tBroiHeight.Value = 20;
+ this.tBroiHeight.ValueChanged += new System.EventHandler(this.tBroiHeight_ValueChanged);
+ //
+ // numUDRoiHeight
+ //
+ this.numUDRoiHeight.Location = new System.Drawing.Point(106, 127);
+ this.numUDRoiHeight.Maximum = new decimal(new int[] {
+ 2000,
+ 0,
+ 0,
+ 0});
+ this.numUDRoiHeight.Minimum = new decimal(new int[] {
+ 5,
+ 0,
+ 0,
+ 0});
+ this.numUDRoiHeight.Name = "numUDRoiHeight";
+ this.numUDRoiHeight.Size = new System.Drawing.Size(57, 21);
+ this.numUDRoiHeight.TabIndex = 51;
+ this.numUDRoiHeight.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
+ this.numUDRoiHeight.Value = new decimal(new int[] {
+ 20,
+ 0,
+ 0,
+ 0});
+ this.numUDRoiHeight.ValueChanged += new System.EventHandler(this.numUDRoiHeight_ValueChanged);
+ //
+ // labROIHeight1
+ //
+ this.labROIHeight1.BackColor = System.Drawing.SystemColors.Control;
+ this.labROIHeight1.Location = new System.Drawing.Point(10, 127);
+ this.labROIHeight1.Name = "labROIHeight1";
+ this.labROIHeight1.Size = new System.Drawing.Size(96, 26);
+ this.labROIHeight1.TabIndex = 50;
+ this.labROIHeight1.Text = "ROI Height";
+ this.labROIHeight1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // ResetROIWidthButton
+ //
+ this.ResetROIWidthButton.Location = new System.Drawing.Point(336, 95);
+ this.ResetROIWidthButton.Name = "ResetROIWidthButton";
+ this.ResetROIWidthButton.Size = new System.Drawing.Size(58, 26);
+ this.ResetROIWidthButton.TabIndex = 14;
+ this.ResetROIWidthButton.Text = "Reset";
+ this.ResetROIWidthButton.Click += new System.EventHandler(this.ResetROIWidthButton_Click);
+ //
+ // ResetSmoothingButton
+ //
+ this.ResetSmoothingButton.Location = new System.Drawing.Point(336, 60);
+ this.ResetSmoothingButton.Name = "ResetSmoothingButton";
+ this.ResetSmoothingButton.Size = new System.Drawing.Size(58, 26);
+ this.ResetSmoothingButton.TabIndex = 13;
+ this.ResetSmoothingButton.Text = "Reset";
+ this.ResetSmoothingButton.Click += new System.EventHandler(this.ResetSmoothingButton_Click);
+ //
+ // ResetMinEdgAmplButton
+ //
+ this.ResetMinEdgAmplButton.Location = new System.Drawing.Point(336, 26);
+ this.ResetMinEdgAmplButton.Name = "ResetMinEdgAmplButton";
+ this.ResetMinEdgAmplButton.Size = new System.Drawing.Size(58, 26);
+ this.ResetMinEdgAmplButton.TabIndex = 12;
+ this.ResetMinEdgAmplButton.Text = "Reset";
+ this.ResetMinEdgAmplButton.Click += new System.EventHandler(this.ResetMinEdgAmplButton_Click);
+ //
+ // ROIWidthTrackBar
+ //
+ this.ROIWidthTrackBar.Location = new System.Drawing.Point(163, 93);
+ this.ROIWidthTrackBar.Maximum = 255;
+ this.ROIWidthTrackBar.Minimum = 1;
+ this.ROIWidthTrackBar.Name = "ROIWidthTrackBar";
+ this.ROIWidthTrackBar.Size = new System.Drawing.Size(173, 45);
+ this.ROIWidthTrackBar.TabIndex = 11;
+ this.ROIWidthTrackBar.TickFrequency = 10;
+ this.ROIWidthTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.ROIWidthTrackBar.Value = 1;
+ this.ROIWidthTrackBar.Scroll += new System.EventHandler(this.ROIWidthTrackBar_Scroll);
+ //
+ // SmoothingTrackBar
+ //
+ this.SmoothingTrackBar.Location = new System.Drawing.Point(163, 58);
+ this.SmoothingTrackBar.Maximum = 250;
+ this.SmoothingTrackBar.Minimum = 4;
+ this.SmoothingTrackBar.Name = "SmoothingTrackBar";
+ this.SmoothingTrackBar.Size = new System.Drawing.Size(173, 45);
+ this.SmoothingTrackBar.TabIndex = 10;
+ this.SmoothingTrackBar.TickFrequency = 10;
+ this.SmoothingTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.SmoothingTrackBar.Value = 4;
+ this.SmoothingTrackBar.Scroll += new System.EventHandler(this.SmoothingTrackBar_Scroll);
+ //
+ // MinEdgAmplTrackBar
+ //
+ this.MinEdgAmplTrackBar.Location = new System.Drawing.Point(163, 22);
+ this.MinEdgAmplTrackBar.Maximum = 255;
+ this.MinEdgAmplTrackBar.Minimum = 1;
+ this.MinEdgAmplTrackBar.Name = "MinEdgAmplTrackBar";
+ this.MinEdgAmplTrackBar.Size = new System.Drawing.Size(173, 45);
+ this.MinEdgAmplTrackBar.TabIndex = 9;
+ this.MinEdgAmplTrackBar.TickFrequency = 10;
+ this.MinEdgAmplTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.MinEdgAmplTrackBar.Value = 1;
+ this.MinEdgAmplTrackBar.Scroll += new System.EventHandler(this.MinEdgAmplTrackBar_Scroll);
+ //
+ // label10
+ //
+ this.label10.Location = new System.Drawing.Point(10, 93);
+ this.label10.Name = "label10";
+ this.label10.Size = new System.Drawing.Size(96, 26);
+ this.label10.TabIndex = 8;
+ this.label10.Text = "ROI Width";
+ this.label10.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label9
+ //
+ this.label9.Location = new System.Drawing.Point(10, 60);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(96, 26);
+ this.label9.TabIndex = 7;
+ this.label9.Text = "Smoothing*10";
+ this.label9.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label8
+ //
+ this.label8.Location = new System.Drawing.Point(7, 184);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(87, 40);
+ this.label8.TabIndex = 6;
+ this.label8.Text = "Interpolation Method";
+ this.label8.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label7
+ //
+ this.label7.Location = new System.Drawing.Point(10, 26);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(96, 26);
+ this.label7.TabIndex = 5;
+ this.label7.Text = "Min.EdgeAmpl";
+ this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // MinEdgAmplUpDown
+ //
+ this.MinEdgAmplUpDown.Location = new System.Drawing.Point(106, 26);
+ this.MinEdgAmplUpDown.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.MinEdgAmplUpDown.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.MinEdgAmplUpDown.Name = "MinEdgAmplUpDown";
+ this.MinEdgAmplUpDown.Size = new System.Drawing.Size(57, 21);
+ this.MinEdgAmplUpDown.TabIndex = 3;
+ this.MinEdgAmplUpDown.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ this.MinEdgAmplUpDown.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.MinEdgAmplUpDown.ValueChanged += new System.EventHandler(this.MinEdgAmplUpDown_ValueChanged);
+ //
+ // SmoothingUpDown
+ //
+ this.SmoothingUpDown.Location = new System.Drawing.Point(106, 60);
+ this.SmoothingUpDown.Maximum = new decimal(new int[] {
+ 250,
+ 0,
+ 0,
+ 0});
+ this.SmoothingUpDown.Minimum = new decimal(new int[] {
+ 4,
+ 0,
+ 0,
+ 0});
+ this.SmoothingUpDown.Name = "SmoothingUpDown";
+ this.SmoothingUpDown.Size = new System.Drawing.Size(57, 21);
+ this.SmoothingUpDown.TabIndex = 2;
+ this.SmoothingUpDown.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ this.SmoothingUpDown.Value = new decimal(new int[] {
+ 4,
+ 0,
+ 0,
+ 0});
+ this.SmoothingUpDown.ValueChanged += new System.EventHandler(this.SmoothingUpDown_ValueChanged);
+ //
+ // InterpolationComboBox
+ //
+ this.InterpolationComboBox.Items.AddRange(new object[] {
+ "nearest_neighbor",
+ "bilinear",
+ "bicubic"});
+ this.InterpolationComboBox.Location = new System.Drawing.Point(106, 194);
+ this.InterpolationComboBox.Name = "InterpolationComboBox";
+ this.InterpolationComboBox.Size = new System.Drawing.Size(192, 20);
+ this.InterpolationComboBox.TabIndex = 1;
+ this.InterpolationComboBox.Text = "Interpolation";
+ this.InterpolationComboBox.SelectedIndexChanged += new System.EventHandler(this.InterpolationComboBox_SelectedIndexChanged);
+ //
+ // ROIWidthUpDown
+ //
+ this.ROIWidthUpDown.Location = new System.Drawing.Point(106, 95);
+ this.ROIWidthUpDown.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.ROIWidthUpDown.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.ROIWidthUpDown.Name = "ROIWidthUpDown";
+ this.ROIWidthUpDown.Size = new System.Drawing.Size(57, 21);
+ this.ROIWidthUpDown.TabIndex = 0;
+ this.ROIWidthUpDown.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ this.ROIWidthUpDown.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.ROIWidthUpDown.ValueChanged += new System.EventHandler(this.ROIWidthUpDown_ValueChanged);
+ //
+ // tabPageResults
+ //
+ this.tabPageResults.Controls.Add(this.label15);
+ this.tabPageResults.Controls.Add(this.ActiveROIListBox);
+ this.tabPageResults.Controls.Add(this.EdgeResultListView);
+ this.tabPageResults.Controls.Add(this.groupBox8);
+ this.tabPageResults.Controls.Add(this.groupBox7);
+ this.tabPageResults.Location = new System.Drawing.Point(4, 22);
+ this.tabPageResults.Name = "tabPageResults";
+ this.tabPageResults.Size = new System.Drawing.Size(422, 567);
+ this.tabPageResults.TabIndex = 2;
+ this.tabPageResults.Text = " Results ";
+ this.tabPageResults.UseVisualStyleBackColor = true;
+ //
+ // label15
+ //
+ this.label15.Location = new System.Drawing.Point(48, 207);
+ this.label15.Name = "label15";
+ this.label15.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.label15.Size = new System.Drawing.Size(86, 26);
+ this.label15.TabIndex = 16;
+ this.label15.Text = "Active ROI";
+ this.label15.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // ActiveROIListBox
+ //
+ this.ActiveROIListBox.ItemHeight = 12;
+ this.ActiveROIListBox.Location = new System.Drawing.Point(137, 207);
+ this.ActiveROIListBox.Name = "ActiveROIListBox";
+ this.ActiveROIListBox.Size = new System.Drawing.Size(276, 76);
+ this.ActiveROIListBox.TabIndex = 15;
+ this.ActiveROIListBox.SelectedIndexChanged += new System.EventHandler(this.ActiveROIListBox_SelectedIndexChanged);
+ //
+ // EdgeResultListView
+ //
+ this.EdgeResultListView.AutoArrange = false;
+ this.EdgeResultListView.FullRowSelect = true;
+ this.EdgeResultListView.GridLines = true;
+ this.EdgeResultListView.Location = new System.Drawing.Point(12, 312);
+ this.EdgeResultListView.Name = "EdgeResultListView";
+ this.EdgeResultListView.Size = new System.Drawing.Size(401, 205);
+ this.EdgeResultListView.TabIndex = 14;
+ this.EdgeResultListView.UseCompatibleStateImageBehavior = false;
+ this.EdgeResultListView.View = System.Windows.Forms.View.Details;
+ //
+ // groupBox8
+ //
+ this.groupBox8.Controls.Add(this.UnitPanel);
+ this.groupBox8.Controls.Add(this.CalibPoseTextBox);
+ this.groupBox8.Controls.Add(this.CalibCamTextBox);
+ this.groupBox8.Controls.Add(this.LoadPoseButton);
+ this.groupBox8.Controls.Add(this.LoadCalibButton);
+ this.groupBox8.Controls.Add(this.TransWCoordCheckBox);
+ this.groupBox8.Location = new System.Drawing.Point(10, 78);
+ this.groupBox8.Name = "groupBox8";
+ this.groupBox8.Size = new System.Drawing.Size(403, 116);
+ this.groupBox8.TabIndex = 12;
+ this.groupBox8.TabStop = false;
+ this.groupBox8.Text = "Feature Processing";
+ //
+ // UnitPanel
+ //
+ this.UnitPanel.Controls.Add(this.label14);
+ this.UnitPanel.Controls.Add(this.UnitComboBox);
+ this.UnitPanel.Location = new System.Drawing.Point(259, 17);
+ this.UnitPanel.Name = "UnitPanel";
+ this.UnitPanel.Size = new System.Drawing.Size(135, 35);
+ this.UnitPanel.TabIndex = 16;
+ //
+ // label14
+ //
+ this.label14.Location = new System.Drawing.Point(10, 9);
+ this.label14.Name = "label14";
+ this.label14.Size = new System.Drawing.Size(48, 25);
+ this.label14.TabIndex = 4;
+ this.label14.Text = "Unit";
+ this.label14.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // UnitComboBox
+ //
+ this.UnitComboBox.Items.AddRange(new object[] {
+ "m",
+ "cm",
+ "mm",
+ "祄"});
+ this.UnitComboBox.Location = new System.Drawing.Point(67, 9);
+ this.UnitComboBox.Name = "UnitComboBox";
+ this.UnitComboBox.Size = new System.Drawing.Size(67, 20);
+ this.UnitComboBox.TabIndex = 3;
+ this.UnitComboBox.Text = "unit";
+ this.UnitComboBox.SelectedIndexChanged += new System.EventHandler(this.UnitComboBox_SelectedIndexChanged);
+ //
+ // CalibPoseTextBox
+ //
+ this.CalibPoseTextBox.Location = new System.Drawing.Point(144, 84);
+ this.CalibPoseTextBox.Name = "CalibPoseTextBox";
+ this.CalibPoseTextBox.ReadOnly = true;
+ this.CalibPoseTextBox.Size = new System.Drawing.Size(250, 21);
+ this.CalibPoseTextBox.TabIndex = 15;
+ this.CalibPoseTextBox.Text = " *.dat";
+ //
+ // CalibCamTextBox
+ //
+ this.CalibCamTextBox.Location = new System.Drawing.Point(144, 60);
+ this.CalibCamTextBox.Name = "CalibCamTextBox";
+ this.CalibCamTextBox.ReadOnly = true;
+ this.CalibCamTextBox.Size = new System.Drawing.Size(250, 21);
+ this.CalibCamTextBox.TabIndex = 14;
+ this.CalibCamTextBox.Text = " *.cal";
+ //
+ // LoadPoseButton
+ //
+ this.LoadPoseButton.Location = new System.Drawing.Point(19, 84);
+ this.LoadPoseButton.Name = "LoadPoseButton";
+ this.LoadPoseButton.Size = new System.Drawing.Size(106, 22);
+ this.LoadPoseButton.TabIndex = 13;
+ this.LoadPoseButton.Text = " Load Pose";
+ this.LoadPoseButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.LoadPoseButton.Click += new System.EventHandler(this.LoadCamParamButton_Click);
+ //
+ // LoadCalibButton
+ //
+ this.LoadCalibButton.Location = new System.Drawing.Point(19, 60);
+ this.LoadCalibButton.Name = "LoadCalibButton";
+ this.LoadCalibButton.Size = new System.Drawing.Size(106, 22);
+ this.LoadCalibButton.TabIndex = 12;
+ this.LoadCalibButton.Text = " Load CamPar";
+ this.LoadCalibButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.LoadCalibButton.Click += new System.EventHandler(this.LoadCamParamButton_Click);
+ //
+ // TransWCoordCheckBox
+ //
+ this.TransWCoordCheckBox.Location = new System.Drawing.Point(19, 26);
+ this.TransWCoordCheckBox.Name = "TransWCoordCheckBox";
+ this.TransWCoordCheckBox.Size = new System.Drawing.Size(234, 26);
+ this.TransWCoordCheckBox.TabIndex = 0;
+ this.TransWCoordCheckBox.Text = "Transform into World Coordinates";
+ this.TransWCoordCheckBox.CheckedChanged += new System.EventHandler(this.TransWCoordCheckBox_CheckedChanged);
+ //
+ // groupBox7
+ //
+ this.groupBox7.Controls.Add(this.DistanceCheckBox);
+ this.groupBox7.Controls.Add(this.AmplitudeCheckBox);
+ this.groupBox7.Controls.Add(this.PairWidthCheckBox);
+ this.groupBox7.Controls.Add(this.PositionCheckBox);
+ this.groupBox7.Location = new System.Drawing.Point(10, 17);
+ this.groupBox7.Name = "groupBox7";
+ this.groupBox7.Size = new System.Drawing.Size(403, 52);
+ this.groupBox7.TabIndex = 11;
+ this.groupBox7.TabStop = false;
+ this.groupBox7.Text = "Feature Selection";
+ //
+ // DistanceCheckBox
+ //
+ this.DistanceCheckBox.Location = new System.Drawing.Point(206, 20);
+ this.DistanceCheckBox.Name = "DistanceCheckBox";
+ this.DistanceCheckBox.Size = new System.Drawing.Size(87, 26);
+ this.DistanceCheckBox.TabIndex = 3;
+ this.DistanceCheckBox.Text = "Distance";
+ this.DistanceCheckBox.CheckedChanged += new System.EventHandler(this.DistanceCheckBox_CheckedChanged);
+ //
+ // AmplitudeCheckBox
+ //
+ this.AmplitudeCheckBox.Location = new System.Drawing.Point(108, 20);
+ this.AmplitudeCheckBox.Name = "AmplitudeCheckBox";
+ this.AmplitudeCheckBox.Size = new System.Drawing.Size(96, 26);
+ this.AmplitudeCheckBox.TabIndex = 2;
+ this.AmplitudeCheckBox.Text = "Amplitude";
+ this.AmplitudeCheckBox.CheckedChanged += new System.EventHandler(this.AmplitudeCheckBox_CheckedChanged);
+ //
+ // PairWidthCheckBox
+ //
+ this.PairWidthCheckBox.Enabled = false;
+ this.PairWidthCheckBox.Location = new System.Drawing.Point(300, 20);
+ this.PairWidthCheckBox.Name = "PairWidthCheckBox";
+ this.PairWidthCheckBox.Size = new System.Drawing.Size(96, 26);
+ this.PairWidthCheckBox.TabIndex = 1;
+ this.PairWidthCheckBox.Text = "Pair Width";
+ this.PairWidthCheckBox.CheckedChanged += new System.EventHandler(this.PairWidthCheckBox_CheckedChanged);
+ //
+ // PositionCheckBox
+ //
+ this.PositionCheckBox.Location = new System.Drawing.Point(19, 20);
+ this.PositionCheckBox.Name = "PositionCheckBox";
+ this.PositionCheckBox.Size = new System.Drawing.Size(77, 26);
+ this.PositionCheckBox.TabIndex = 0;
+ this.PositionCheckBox.Text = "Position";
+ this.PositionCheckBox.CheckedChanged += new System.EventHandler(this.PositionCheckBox_CheckedChanged);
+ //
+ // tabPageLineProfile
+ //
+ this.tabPageLineProfile.Controls.Add(this.label20);
+ this.tabPageLineProfile.Controls.Add(this.CSScaleComboBox);
+ this.tabPageLineProfile.Controls.Add(this.panelAxis);
+ this.tabPageLineProfile.Controls.Add(this.groupBox9);
+ this.tabPageLineProfile.Location = new System.Drawing.Point(4, 22);
+ this.tabPageLineProfile.Name = "tabPageLineProfile";
+ this.tabPageLineProfile.Size = new System.Drawing.Size(422, 567);
+ this.tabPageLineProfile.TabIndex = 3;
+ this.tabPageLineProfile.Text = " LineProfile ";
+ this.tabPageLineProfile.UseVisualStyleBackColor = true;
+ //
+ // label20
+ //
+ this.label20.Location = new System.Drawing.Point(192, 43);
+ this.label20.Name = "label20";
+ this.label20.Size = new System.Drawing.Size(96, 26);
+ this.label20.TabIndex = 6;
+ this.label20.Text = "Y-axis scale:";
+ this.label20.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // CSScaleComboBox
+ //
+ this.CSScaleComboBox.Items.AddRange(new object[] {
+ "Adaptive",
+ "Increasing",
+ "Fixed"});
+ this.CSScaleComboBox.Location = new System.Drawing.Point(298, 43);
+ this.CSScaleComboBox.Name = "CSScaleComboBox";
+ this.CSScaleComboBox.Size = new System.Drawing.Size(115, 20);
+ this.CSScaleComboBox.TabIndex = 5;
+ this.CSScaleComboBox.Text = "Scale Y-Axis";
+ this.CSScaleComboBox.SelectedIndexChanged += new System.EventHandler(this.CSScaleComboBox_SelectedIndexChanged);
+ //
+ // panelAxis
+ //
+ this.panelAxis.Location = new System.Drawing.Point(10, 95);
+ this.panelAxis.Name = "panelAxis";
+ this.panelAxis.Size = new System.Drawing.Size(403, 250);
+ this.panelAxis.TabIndex = 4;
+ //
+ // groupBox9
+ //
+ this.groupBox9.Controls.Add(this.labelDeviation);
+ this.groupBox9.Controls.Add(this.labelMean);
+ this.groupBox9.Controls.Add(this.labelRange);
+ this.groupBox9.Controls.Add(this.labelPeak);
+ this.groupBox9.Controls.Add(this.label24);
+ this.groupBox9.Controls.Add(this.label25);
+ this.groupBox9.Controls.Add(this.labelRangeX);
+ this.groupBox9.Controls.Add(this.labelPeakX);
+ this.groupBox9.Controls.Add(this.label23);
+ this.groupBox9.Controls.Add(this.label22);
+ this.groupBox9.Controls.Add(this.label19);
+ this.groupBox9.Controls.Add(this.label18);
+ this.groupBox9.Controls.Add(this.label17);
+ this.groupBox9.Controls.Add(this.label16);
+ this.groupBox9.Location = new System.Drawing.Point(10, 370);
+ this.groupBox9.Name = "groupBox9";
+ this.groupBox9.Size = new System.Drawing.Size(403, 121);
+ this.groupBox9.TabIndex = 2;
+ this.groupBox9.TabStop = false;
+ this.groupBox9.Text = "Statistics";
+ //
+ // labelDeviation
+ //
+ this.labelDeviation.Location = new System.Drawing.Point(269, 95);
+ this.labelDeviation.Name = "labelDeviation";
+ this.labelDeviation.Size = new System.Drawing.Size(86, 17);
+ this.labelDeviation.TabIndex = 18;
+ this.labelDeviation.Text = "0";
+ this.labelDeviation.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labelMean
+ //
+ this.labelMean.Location = new System.Drawing.Point(269, 78);
+ this.labelMean.Name = "labelMean";
+ this.labelMean.Size = new System.Drawing.Size(86, 17);
+ this.labelMean.TabIndex = 17;
+ this.labelMean.Text = "0";
+ this.labelMean.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labelRange
+ //
+ this.labelRange.Location = new System.Drawing.Point(269, 60);
+ this.labelRange.Name = "labelRange";
+ this.labelRange.Size = new System.Drawing.Size(115, 18);
+ this.labelRange.TabIndex = 15;
+ this.labelRange.Text = "0 ... 0";
+ this.labelRange.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labelPeak
+ //
+ this.labelPeak.Location = new System.Drawing.Point(269, 43);
+ this.labelPeak.Name = "labelPeak";
+ this.labelPeak.Size = new System.Drawing.Size(86, 17);
+ this.labelPeak.TabIndex = 14;
+ this.labelPeak.Text = "0";
+ this.labelPeak.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label24
+ //
+ this.label24.Location = new System.Drawing.Point(154, 95);
+ this.label24.Name = "label24";
+ this.label24.Size = new System.Drawing.Size(86, 17);
+ this.label24.TabIndex = 13;
+ this.label24.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label25
+ //
+ this.label25.Location = new System.Drawing.Point(154, 78);
+ this.label25.Name = "label25";
+ this.label25.Size = new System.Drawing.Size(86, 17);
+ this.label25.TabIndex = 12;
+ this.label25.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labelRangeX
+ //
+ this.labelRangeX.Location = new System.Drawing.Point(154, 60);
+ this.labelRangeX.Name = "labelRangeX";
+ this.labelRangeX.Size = new System.Drawing.Size(86, 18);
+ this.labelRangeX.TabIndex = 9;
+ this.labelRangeX.Text = "0 ... 0";
+ this.labelRangeX.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labelPeakX
+ //
+ this.labelPeakX.Location = new System.Drawing.Point(154, 43);
+ this.labelPeakX.Name = "labelPeakX";
+ this.labelPeakX.Size = new System.Drawing.Size(86, 17);
+ this.labelPeakX.TabIndex = 8;
+ this.labelPeakX.Text = "0";
+ this.labelPeakX.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label23
+ //
+ this.label23.Location = new System.Drawing.Point(19, 95);
+ this.label23.Name = "label23";
+ this.label23.Size = new System.Drawing.Size(106, 17);
+ this.label23.TabIndex = 7;
+ this.label23.Text = "Deviation:";
+ this.label23.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label22
+ //
+ this.label22.Location = new System.Drawing.Point(19, 78);
+ this.label22.Name = "label22";
+ this.label22.Size = new System.Drawing.Size(106, 17);
+ this.label22.TabIndex = 6;
+ this.label22.Text = "Mean:";
+ this.label22.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label19
+ //
+ this.label19.Location = new System.Drawing.Point(19, 60);
+ this.label19.Name = "label19";
+ this.label19.Size = new System.Drawing.Size(106, 18);
+ this.label19.TabIndex = 3;
+ this.label19.Text = "Range:";
+ this.label19.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label18
+ //
+ this.label18.Location = new System.Drawing.Point(19, 43);
+ this.label18.Name = "label18";
+ this.label18.Size = new System.Drawing.Size(106, 17);
+ this.label18.TabIndex = 2;
+ this.label18.Text = "Peak:";
+ this.label18.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label17
+ //
+ this.label17.Location = new System.Drawing.Point(269, 17);
+ this.label17.Name = "label17";
+ this.label17.Size = new System.Drawing.Size(105, 17);
+ this.label17.TabIndex = 1;
+ this.label17.Text = "Gray Values";
+ this.label17.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label16
+ //
+ this.label16.Location = new System.Drawing.Point(154, 17);
+ this.label16.Name = "label16";
+ this.label16.Size = new System.Drawing.Size(105, 17);
+ this.label16.TabIndex = 0;
+ this.label16.Text = "x-Value";
+ this.label16.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // tabPageSaveConfige
+ //
+ this.tabPageSaveConfige.Controls.Add(this.groupBox10);
+ this.tabPageSaveConfige.Controls.Add(this.btnSaveConfige);
+ this.tabPageSaveConfige.Location = new System.Drawing.Point(4, 22);
+ this.tabPageSaveConfige.Name = "tabPageSaveConfige";
+ this.tabPageSaveConfige.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPageSaveConfige.Size = new System.Drawing.Size(422, 567);
+ this.tabPageSaveConfige.TabIndex = 4;
+ this.tabPageSaveConfige.Text = "参数保存";
+ this.tabPageSaveConfige.UseVisualStyleBackColor = true;
+ //
+ // groupBox10
+ //
+ this.groupBox10.Controls.Add(this.labROIHeight);
+ this.groupBox10.Controls.Add(this.labROIHeightSet);
+ this.groupBox10.Controls.Add(this.labPosition);
+ this.groupBox10.Controls.Add(this.labPositionSet);
+ this.groupBox10.Controls.Add(this.labTransition);
+ this.groupBox10.Controls.Add(this.labTransitionSet);
+ this.groupBox10.Controls.Add(this.labInterpolation);
+ this.groupBox10.Controls.Add(this.labInterpolationSet);
+ this.groupBox10.Controls.Add(this.labROIWidth);
+ this.groupBox10.Controls.Add(this.labROIWidthSet);
+ this.groupBox10.Controls.Add(this.labSmoothing);
+ this.groupBox10.Controls.Add(this.labSmoothingSet);
+ this.groupBox10.Controls.Add(this.labMinEdgeAmpl);
+ this.groupBox10.Controls.Add(this.label12);
+ this.groupBox10.Controls.Add(this.labMinEdgeAmplSet);
+ this.groupBox10.Controls.Add(this.label11);
+ this.groupBox10.Location = new System.Drawing.Point(7, 24);
+ this.groupBox10.Name = "groupBox10";
+ this.groupBox10.Size = new System.Drawing.Size(356, 321);
+ this.groupBox10.TabIndex = 50;
+ this.groupBox10.TabStop = false;
+ this.groupBox10.Text = "groupBox10";
+ //
+ // labROIHeight
+ //
+ this.labROIHeight.BackColor = System.Drawing.SystemColors.Control;
+ this.labROIHeight.Location = new System.Drawing.Point(14, 206);
+ this.labROIHeight.Name = "labROIHeight";
+ this.labROIHeight.Size = new System.Drawing.Size(115, 21);
+ this.labROIHeight.TabIndex = 47;
+ this.labROIHeight.Text = "ROI Height";
+ this.labROIHeight.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labROIHeightSet
+ //
+ this.labROIHeightSet.BackColor = System.Drawing.Color.White;
+ this.labROIHeightSet.Location = new System.Drawing.Point(135, 206);
+ this.labROIHeightSet.Name = "labROIHeightSet";
+ this.labROIHeightSet.Size = new System.Drawing.Size(115, 21);
+ this.labROIHeightSet.TabIndex = 39;
+ this.labROIHeightSet.Text = "-";
+ this.labROIHeightSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labPosition
+ //
+ this.labPosition.BackColor = System.Drawing.SystemColors.Control;
+ this.labPosition.Location = new System.Drawing.Point(14, 155);
+ this.labPosition.Name = "labPosition";
+ this.labPosition.Size = new System.Drawing.Size(115, 21);
+ this.labPosition.TabIndex = 46;
+ this.labPosition.Text = "Position";
+ this.labPosition.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labPositionSet
+ //
+ this.labPositionSet.BackColor = System.Drawing.Color.White;
+ this.labPositionSet.Location = new System.Drawing.Point(135, 154);
+ this.labPositionSet.Name = "labPositionSet";
+ this.labPositionSet.Size = new System.Drawing.Size(115, 21);
+ this.labPositionSet.TabIndex = 45;
+ this.labPositionSet.Text = "-";
+ this.labPositionSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labTransition
+ //
+ this.labTransition.BackColor = System.Drawing.SystemColors.Control;
+ this.labTransition.Location = new System.Drawing.Point(14, 130);
+ this.labTransition.Name = "labTransition";
+ this.labTransition.Size = new System.Drawing.Size(115, 21);
+ this.labTransition.TabIndex = 44;
+ this.labTransition.Text = "Transition";
+ this.labTransition.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labTransitionSet
+ //
+ this.labTransitionSet.BackColor = System.Drawing.Color.White;
+ this.labTransitionSet.Location = new System.Drawing.Point(135, 129);
+ this.labTransitionSet.Name = "labTransitionSet";
+ this.labTransitionSet.Size = new System.Drawing.Size(115, 21);
+ this.labTransitionSet.TabIndex = 43;
+ this.labTransitionSet.Text = "-";
+ this.labTransitionSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labInterpolation
+ //
+ this.labInterpolation.BackColor = System.Drawing.SystemColors.Control;
+ this.labInterpolation.Location = new System.Drawing.Point(14, 105);
+ this.labInterpolation.Name = "labInterpolation";
+ this.labInterpolation.Size = new System.Drawing.Size(115, 21);
+ this.labInterpolation.TabIndex = 42;
+ this.labInterpolation.Text = "Interpolation";
+ this.labInterpolation.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labInterpolationSet
+ //
+ this.labInterpolationSet.BackColor = System.Drawing.Color.White;
+ this.labInterpolationSet.Location = new System.Drawing.Point(135, 104);
+ this.labInterpolationSet.Name = "labInterpolationSet";
+ this.labInterpolationSet.Size = new System.Drawing.Size(115, 21);
+ this.labInterpolationSet.TabIndex = 41;
+ this.labInterpolationSet.Text = "-";
+ this.labInterpolationSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labROIWidth
+ //
+ this.labROIWidth.BackColor = System.Drawing.SystemColors.Control;
+ this.labROIWidth.Location = new System.Drawing.Point(14, 180);
+ this.labROIWidth.Name = "labROIWidth";
+ this.labROIWidth.Size = new System.Drawing.Size(115, 21);
+ this.labROIWidth.TabIndex = 38;
+ this.labROIWidth.Text = "ROI Width";
+ this.labROIWidth.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labROIWidthSet
+ //
+ this.labROIWidthSet.BackColor = System.Drawing.Color.White;
+ this.labROIWidthSet.Location = new System.Drawing.Point(135, 179);
+ this.labROIWidthSet.Name = "labROIWidthSet";
+ this.labROIWidthSet.Size = new System.Drawing.Size(115, 21);
+ this.labROIWidthSet.TabIndex = 37;
+ this.labROIWidthSet.Text = "-";
+ this.labROIWidthSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labSmoothing
+ //
+ this.labSmoothing.BackColor = System.Drawing.SystemColors.Control;
+ this.labSmoothing.Location = new System.Drawing.Point(14, 80);
+ this.labSmoothing.Name = "labSmoothing";
+ this.labSmoothing.Size = new System.Drawing.Size(115, 21);
+ this.labSmoothing.TabIndex = 36;
+ this.labSmoothing.Text = "Smoothing";
+ this.labSmoothing.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labSmoothingSet
+ //
+ this.labSmoothingSet.BackColor = System.Drawing.Color.White;
+ this.labSmoothingSet.Location = new System.Drawing.Point(135, 79);
+ this.labSmoothingSet.Name = "labSmoothingSet";
+ this.labSmoothingSet.Size = new System.Drawing.Size(115, 21);
+ this.labSmoothingSet.TabIndex = 35;
+ this.labSmoothingSet.Text = "-";
+ this.labSmoothingSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labMinEdgeAmpl
+ //
+ this.labMinEdgeAmpl.BackColor = System.Drawing.SystemColors.Control;
+ this.labMinEdgeAmpl.Location = new System.Drawing.Point(14, 55);
+ this.labMinEdgeAmpl.Name = "labMinEdgeAmpl";
+ this.labMinEdgeAmpl.Size = new System.Drawing.Size(115, 21);
+ this.labMinEdgeAmpl.TabIndex = 34;
+ this.labMinEdgeAmpl.Text = "Min.EdgeAmpl";
+ this.labMinEdgeAmpl.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label12
+ //
+ this.label12.BackColor = System.Drawing.SystemColors.Control;
+ this.label12.Location = new System.Drawing.Point(135, 29);
+ this.label12.Name = "label12";
+ this.label12.Size = new System.Drawing.Size(115, 21);
+ this.label12.TabIndex = 33;
+ this.label12.Text = "Recognition";
+ this.label12.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labMinEdgeAmplSet
+ //
+ this.labMinEdgeAmplSet.BackColor = System.Drawing.Color.White;
+ this.labMinEdgeAmplSet.Location = new System.Drawing.Point(135, 54);
+ this.labMinEdgeAmplSet.Name = "labMinEdgeAmplSet";
+ this.labMinEdgeAmplSet.Size = new System.Drawing.Size(115, 21);
+ this.labMinEdgeAmplSet.TabIndex = 32;
+ this.labMinEdgeAmplSet.Text = "-";
+ this.labMinEdgeAmplSet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label11
+ //
+ this.label11.BackColor = System.Drawing.SystemColors.Control;
+ this.label11.Location = new System.Drawing.Point(14, 29);
+ this.label11.Name = "label11";
+ this.label11.Size = new System.Drawing.Size(115, 21);
+ this.label11.TabIndex = 31;
+ this.label11.Text = "Recognition";
+ this.label11.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // btnSaveConfige
+ //
+ this.btnSaveConfige.Location = new System.Drawing.Point(277, 451);
+ this.btnSaveConfige.Name = "btnSaveConfige";
+ this.btnSaveConfige.Size = new System.Drawing.Size(106, 42);
+ this.btnSaveConfige.TabIndex = 0;
+ this.btnSaveConfige.Text = "保存参数";
+ this.btnSaveConfige.UseVisualStyleBackColor = true;
+ this.btnSaveConfige.Click += new System.EventHandler(this.btnSaveConfige_Click);
+ //
+ // groupBox2
+ //
+ this.groupBox2.Controls.Add(this.CircArcButton);
+ this.groupBox2.Controls.Add(this.LineButton);
+ this.groupBox2.Controls.Add(this.DeleteActRoiButton);
+ this.groupBox2.Controls.Add(this.ResetROIButton);
+ this.groupBox2.Location = new System.Drawing.Point(12, 610);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(614, 70);
+ this.groupBox2.TabIndex = 3;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "ROIs";
+ //
+ // CircArcButton
+ //
+ this.CircArcButton.Location = new System.Drawing.Point(154, 17);
+ this.CircArcButton.Name = "CircArcButton";
+ this.CircArcButton.Size = new System.Drawing.Size(120, 47);
+ this.CircArcButton.TabIndex = 10;
+ this.CircArcButton.Text = "Create Circular Arc";
+ this.CircArcButton.Click += new System.EventHandler(this.CircArcButton_Click);
+ //
+ // LineButton
+ //
+ this.LineButton.Location = new System.Drawing.Point(19, 17);
+ this.LineButton.Name = "LineButton";
+ this.LineButton.Size = new System.Drawing.Size(120, 47);
+ this.LineButton.TabIndex = 1;
+ this.LineButton.Text = "Create Line";
+ this.LineButton.Click += new System.EventHandler(this.LineButton_Click);
+ //
+ // DeleteActRoiButton
+ //
+ this.DeleteActRoiButton.Location = new System.Drawing.Point(365, 17);
+ this.DeleteActRoiButton.Name = "DeleteActRoiButton";
+ this.DeleteActRoiButton.Size = new System.Drawing.Size(120, 47);
+ this.DeleteActRoiButton.TabIndex = 2;
+ this.DeleteActRoiButton.Text = "Delete";
+ this.DeleteActRoiButton.Click += new System.EventHandler(this.DeleteActRoiButton_Click);
+ //
+ // ResetROIButton
+ //
+ this.ResetROIButton.Location = new System.Drawing.Point(490, 17);
+ this.ResetROIButton.Name = "ResetROIButton";
+ this.ResetROIButton.Size = new System.Drawing.Size(120, 47);
+ this.ResetROIButton.TabIndex = 3;
+ this.ResetROIButton.Text = "Delete All";
+ this.ResetROIButton.Click += new System.EventHandler(this.ResetROIButton_Click);
+ //
+ // LoadImgButton
+ //
+ this.LoadImgButton.Location = new System.Drawing.Point(107, 13);
+ this.LoadImgButton.Name = "LoadImgButton";
+ this.LoadImgButton.Size = new System.Drawing.Size(95, 28);
+ this.LoadImgButton.TabIndex = 4;
+ this.LoadImgButton.Text = "Load ...";
+ this.LoadImgButton.Click += new System.EventHandler(this.LoadImgButton_Click);
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.ResetViewButton);
+ this.groupBox1.Controls.Add(this.MagnifyButton);
+ this.groupBox1.Controls.Add(this.ZoomButton);
+ this.groupBox1.Controls.Add(this.MoveButton);
+ this.groupBox1.Controls.Add(this.NoneButton);
+ this.groupBox1.Location = new System.Drawing.Point(239, 0);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(529, 48);
+ this.groupBox1.TabIndex = 8;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "View Interaction";
+ //
+ // ResetViewButton
+ //
+ this.ResetViewButton.Location = new System.Drawing.Point(403, 13);
+ this.ResetViewButton.Name = "ResetViewButton";
+ this.ResetViewButton.Size = new System.Drawing.Size(111, 28);
+ this.ResetViewButton.TabIndex = 10;
+ this.ResetViewButton.Text = "Reset ";
+ this.ResetViewButton.Click += new System.EventHandler(this.ResetViewButton_Click);
+ //
+ // MagnifyButton
+ //
+ this.MagnifyButton.Location = new System.Drawing.Point(298, 20);
+ this.MagnifyButton.Name = "MagnifyButton";
+ this.MagnifyButton.Size = new System.Drawing.Size(76, 18);
+ this.MagnifyButton.TabIndex = 4;
+ this.MagnifyButton.Text = "magnify";
+ this.MagnifyButton.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.MagnifyButton.CheckedChanged += new System.EventHandler(this.MagnifyButton_CheckedChanged);
+ //
+ // ZoomButton
+ //
+ this.ZoomButton.Location = new System.Drawing.Point(218, 20);
+ this.ZoomButton.Name = "ZoomButton";
+ this.ZoomButton.Size = new System.Drawing.Size(68, 18);
+ this.ZoomButton.TabIndex = 2;
+ this.ZoomButton.Text = "zoom";
+ this.ZoomButton.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.ZoomButton.CheckedChanged += new System.EventHandler(this.ZoomButton_CheckedChanged);
+ //
+ // MoveButton
+ //
+ this.MoveButton.Location = new System.Drawing.Point(125, 20);
+ this.MoveButton.Name = "MoveButton";
+ this.MoveButton.Size = new System.Drawing.Size(67, 18);
+ this.MoveButton.TabIndex = 1;
+ this.MoveButton.Text = "move";
+ this.MoveButton.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.MoveButton.CheckedChanged += new System.EventHandler(this.MoveButton_CheckedChanged);
+ //
+ // NoneButton
+ //
+ this.NoneButton.Checked = true;
+ this.NoneButton.Location = new System.Drawing.Point(29, 20);
+ this.NoneButton.Name = "NoneButton";
+ this.NoneButton.Size = new System.Drawing.Size(67, 18);
+ this.NoneButton.TabIndex = 0;
+ this.NoneButton.TabStop = true;
+ this.NoneButton.Text = "none";
+ this.NoneButton.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.NoneButton.CheckedChanged += new System.EventHandler(this.NoneButton_CheckedChanged);
+ //
+ // openImageFileDialog
+ //
+ this.openImageFileDialog.Filter = "png (*.png)|*.png|tiff (*.tif)|*.tif|jpeg (*.jpg)| *.jpg|all files (*.*)|*.*";
+ this.openImageFileDialog.RestoreDirectory = true;
+ //
+ // StatusLabel
+ //
+ this.StatusLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.StatusLabel.Location = new System.Drawing.Point(799, 618);
+ this.StatusLabel.Name = "StatusLabel";
+ this.StatusLabel.Size = new System.Drawing.Size(428, 56);
+ this.StatusLabel.TabIndex = 9;
+ this.StatusLabel.Text = "Status";
+ this.StatusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // openCamparFileDialog
+ //
+ this.openCamparFileDialog.Filter = "camera parameters (*.cal)|*.cal|camera parameters (*.dat)|*dat|all files (*.*)|*." +
+ "*";
+ //
+ // groupBox3
+ //
+ this.groupBox3.Controls.Add(this.LoadImgButton);
+ this.groupBox3.Location = new System.Drawing.Point(10, 0);
+ this.groupBox3.Name = "groupBox3";
+ this.groupBox3.Size = new System.Drawing.Size(211, 48);
+ this.groupBox3.TabIndex = 11;
+ this.groupBox3.TabStop = false;
+ this.groupBox3.Text = "Image";
+ //
+ // frmMeasureAssistant
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
+ this.ClientSize = new System.Drawing.Size(1253, 679);
+ this.Controls.Add(this.groupBox3);
+ this.Controls.Add(this.StatusLabel);
+ this.Controls.Add(this.groupBox1);
+ this.Controls.Add(this.groupBox2);
+ this.Controls.Add(this.tabControl);
+ this.Controls.Add(this.viewPort);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.MaximizeBox = false;
+ this.Name = "frmMeasureAssistant";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "Measure Assistant";
+ this.Load += new System.EventHandler(this.MeasureForm_Load);
+ this.tabControl.ResumeLayout(false);
+ this.tabPageEdges.ResumeLayout(false);
+ this.groupBox6.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.LineWidthDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.EdgeLengthUpDown)).EndInit();
+ this.groupBox5.ResumeLayout(false);
+ this.groupBox4.ResumeLayout(false);
+ this.groupBox4.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.tBroiHeight)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.numUDRoiHeight)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ROIWidthTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.SmoothingTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinEdgAmplTrackBar)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MinEdgAmplUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.SmoothingUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.ROIWidthUpDown)).EndInit();
+ this.tabPageResults.ResumeLayout(false);
+ this.groupBox8.ResumeLayout(false);
+ this.groupBox8.PerformLayout();
+ this.UnitPanel.ResumeLayout(false);
+ this.groupBox7.ResumeLayout(false);
+ this.tabPageLineProfile.ResumeLayout(false);
+ this.groupBox9.ResumeLayout(false);
+ this.tabPageSaveConfige.ResumeLayout(false);
+ this.groupBox10.ResumeLayout(false);
+ this.groupBox2.ResumeLayout(false);
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox3.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+
+
+ /// <summary>
+ /// Loads MeasureForm and initializes view functions
+ /// to include in the MeasureAssistant.
+ /// </summary>
+ private void MeasureForm_Load(object sender, System.EventArgs e)
+ {
+ InitViewer();
+ }
+
+ private void InitViewer()
+ {
+ mView = new HWndCtrl(viewPort);
+ roiController = new ROIController();
+ mView.useROIController(roiController);
+ mAssistant = new MeasureAssistant(roiController);
+ mShadow = new HXLDCont();
+
+ mView.setViewState(HWndCtrl.MODE_VIEW_NONE);
+ mView.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 1);
+
+ roiController.NotifyRCObserver = new IconicDelegate(UpdateROIData);
+ mAssistant.NotifyMeasureObserver = new MeasureDelegate(UpdateMeasureResults);
+
+ plotGraphWindow = new FunctionPlot(panelAxis, true);
+
+ openImageFileDialog.InitialDirectory =
+ (string)(HSystem.GetSystem("image_dir").TupleSplit(";"));
+ Init();
+
+ mView.setDispLevel(HWndCtrl.MODE_EXCLUDE_ROI);
+ }
+
+ /// <summary>
+ /// Initializes the parameters for the edges measurement and
+ /// sets up the measure assistant.
+ /// </summary>
+ private void Init()
+ {
+ MinEdgAmplUpDown.Value = 40;
+ SmoothingUpDown.Value = 10;
+ ROIWidthUpDown.Value = 10;
+ InterpolationComboBox.SelectedIndex = 0;
+ EdgeToPaircheckBox.Checked = false;
+ TransitionComboBox.SelectedIndex = 0;
+ PositionComboBox.SelectedIndex = 0;
+ EdgeLengthUpDown.Value = 30;
+ UseROIWidthCheckBox.Checked = true;
+ ShowRegionCheckBox.Checked = true;
+ ShowROIcheckBox.Checked = true;
+ UseShadowsCheckBox.Checked = false;
+ ResetMinEdgAmplButton.ForeColor = System.Drawing.Color.Gray;
+ ResetROIWidthButton.ForeColor = System.Drawing.Color.Gray;
+ ResetSmoothingButton.ForeColor = System.Drawing.Color.Gray;
+
+ PositionCheckBox.Checked = true;
+ PairWidthCheckBox.Checked = true;
+ AmplitudeCheckBox.Checked = true;
+ DistanceCheckBox.Checked = true;
+ TransWCoordCheckBox.Enabled = false;
+ TransWCoordCheckBox.Checked = false;
+ UnitComboBox.SelectedIndex = 1;
+ UnitPanel.Enabled = false;
+
+ mAssistant.mThresh = 40.0;
+ mAssistant.mSigma = 1.0;
+ mAssistant.mRoiWidth = 10;
+ mAssistant.mRoiHeight = 50;
+ mAssistant.mInterpolation = "nearest_neighbor";
+ mAssistant.mSelPair = false;
+ mAssistant.mTransition = "all";
+ mAssistant.mPosition = "all";
+ mAssistant.mDispEdgeLength = 30;
+ mAssistant.mDispROIWidth = true;
+ mAssistant.setUnit(UnitComboBox.Text);
+
+ mAssistant.mInitThresh = 40.0;
+ mAssistant.mInitSigma = 1.0;
+ mAssistant.mInitRoiWidth = 10;
+
+ RegionColorComboBox.SelectedIndex = 2;
+ EdgeColorComboBox.SelectedIndex = 7;
+ LineWidthDown.Value = 1;
+
+ CSScaleComboBox.SelectedIndex = 0;
+
+ regionColor = "blue";
+ edgeColor = "cyan";
+ lineWidth = 1;
+ useShadow = false;
+ }
+
+
+
+ /********************************************************************/
+ /* Display Parameters */
+ /********************************************************************/
+
+ /// <summary>
+ /// Loads image and passes it to the controller class. Only images of
+ /// type "byte" are allowed.
+ /// </summary>
+ private void LoadImgButton_Click(object sender, System.EventArgs e)
+ {
+ string file,info;
+
+ int dispROI = HWndCtrl.MODE_INCLUDE_ROI;
+
+
+ if (openImageFileDialog.ShowDialog() == DialogResult.OK)
+ {
+ file = openImageFileDialog.FileName;
+
+ roiController.reset();
+ mView.resetWindow();
+
+ if (mAssistant.setImage(file))
+ {
+ currImage = mAssistant.getImage();
+ info = currImage.GetChannelInfo("type", 1);
+ }
+ else
+ {
+ info = "wrong file type";
+ }
+
+ if (info != "byte")
+ {
+ currImage = null;
+ mAssistant.setImage(currImage);
+ dispROI = HWndCtrl.MODE_EXCLUDE_ROI;
+
+ MessageBox.Show("Problem occured: The Image is of type \"" + info + "\".\nOnly byte images are supported by this Measure Assistant!",
+ "Measure assistant",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+
+ }
+ mView.setDispLevel(dispROI);
+ UpdateView();
+ }
+ }
+
+
+
+ /* *******************************************************
+ * Window Interaction
+ * *******************************************************/
+
+
+ private void NoneButton_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mView.setViewState(HWndCtrl.MODE_VIEW_NONE);
+ }
+
+
+ private void MoveButton_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mView.setViewState(HWndCtrl.MODE_VIEW_MOVE);
+ }
+
+ private void ZoomButton_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mView.setViewState(HWndCtrl.MODE_VIEW_ZOOM);
+ }
+
+ private void MagnifyButton_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mView.setViewState(HWndCtrl.MODE_VIEW_ZOOMWINDOW);
+ }
+
+ private void ResetViewButton_Click(object sender, System.EventArgs e)
+ {
+ mView.resetWindow();
+ UpdateView();
+ }
+
+
+ /* *******************************************************
+ * ROI Interaction
+ * *******************************************************/
+
+
+ /// <summary>
+ /// Creates linear ROI.
+ /// </summary>
+ private void LineButton_Click(object sender, System.EventArgs e)
+ {
+ if (ShowROIcheckBox.Checked)
+ roiController.setROIShape(new ROILine());
+ }
+
+ /// <summary>
+ /// Creates circular ROI.
+ /// </summary>
+ private void CircArcButton_Click(object sender, System.EventArgs e)
+ {
+ if (ShowROIcheckBox.Checked)
+ roiController.setROIShape(new ROICircularArc());
+ }
+
+ /// <summary>Deletes selected ROI.</summary>
+ private void DeleteActRoiButton_Click(object sender, System.EventArgs e)
+ {
+ roiController.removeActive();
+ }
+
+ /// <summary>Deletes all ROIs.</summary>
+ private void ResetROIButton_Click(object sender, System.EventArgs e)
+ {
+ roiController.reset();
+ UpdateView();
+ }
+
+ /********************************************************************/
+ /* Edges Tab */
+ /********************************************************************/
+
+ /* Edge Extraction */
+
+ private void ROIWidthUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)ROIWidthUpDown.Value;
+ ROIWidthTrackBar.Value = val;
+
+ setRoiWidth(val);
+ }
+
+ private void ROIWidthTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ ROIWidthUpDown.Value = ROIWidthTrackBar.Value;
+ ROIWidthUpDown.Refresh();
+ }
+
+ private void ResetROIWidthButton_Click(object sender, System.EventArgs e)
+ {
+ ROIWidthUpDown.Value = (int)mAssistant.mInitRoiWidth;
+ ResetROIWidthButton.ForeColor = System.Drawing.Color.Gray;
+ }
+
+ private void setRoiWidth(int val)
+ {
+ ResetROIWidthButton.ForeColor = System.Drawing.Color.Black;
+ mAssistant.setRoiWidth((double)val);
+ }
+
+ private void setRoiHeight(int val)
+ {
+ butRoiHeightReset.ForeColor = System.Drawing.Color.Gray;
+ mAssistant.setRoiHeight((double)val);
+ }
+
+ /********************************************************************/
+ private void SmoothingUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)SmoothingUpDown.Value;
+ SmoothingTrackBar.Value = val;
+
+ setSigma(val);
+ }
+
+ private void SmoothingTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ SmoothingUpDown.Value = SmoothingTrackBar.Value;
+ SmoothingUpDown.Refresh();
+ }
+
+ private void ResetSmoothingButton_Click(object sender, System.EventArgs e)
+ {
+ SmoothingUpDown.Value = (int)mAssistant.mInitSigma * 10;
+ ResetSmoothingButton.ForeColor = System.Drawing.Color.Gray;
+ }
+
+ private void setSigma(int val)
+ {
+ double valD = (double)val / 10.0;
+
+ ResetSmoothingButton.ForeColor = System.Drawing.Color.Black;
+ mAssistant.setSigma(valD);
+ }
+
+ /********************************************************************/
+ private void MinEdgAmplUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ int val = (int)MinEdgAmplUpDown.Value;
+ MinEdgAmplTrackBar.Value = val;
+
+ setMinEdgeAmpl(val);
+ }
+
+ private void MinEdgAmplTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ MinEdgAmplUpDown.Value = MinEdgAmplTrackBar.Value;
+ MinEdgAmplUpDown.Refresh();
+ }
+
+ private void ResetMinEdgAmplButton_Click(object sender, System.EventArgs e)
+ {
+ MinEdgAmplUpDown.Value = (int)mAssistant.mInitThresh;
+ ResetMinEdgAmplButton.ForeColor = System.Drawing.Color.Gray;
+ }
+
+ private void setMinEdgeAmpl(int val)
+ {
+ ResetMinEdgAmplButton.ForeColor = System.Drawing.Color.Black;
+ mAssistant.setMinEdgeAmpl((double)val);
+ }
+
+
+ /********************************************************************/
+ private void InterpolationComboBox_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ mAssistant.setInterpolation((string)InterpolationComboBox.Text);
+ }
+
+
+ /********************************************************************/
+ /********************************************************************/
+ /* Define Edge Selection */
+
+ private void EdgeToPaircheckBox_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mAssistant.setSelPair(EdgeToPaircheckBox.Checked);
+ UpdateMeasureResultComposition();
+
+ if (EdgeToPaircheckBox.Checked)
+ {
+ PairWidthCheckBox.Enabled = true;
+ TransitionComboBox.Items.AddRange(new object[] {"all_strongest",
+ "positive_strongest",
+ "negative_strongest"});
+
+
+ }
+ else
+ {
+ PairWidthCheckBox.Enabled = false;
+ TransitionComboBox.Items.Clear();
+ TransitionComboBox.Items.AddRange(new object[] { "all", "positive", "negative" });
+ TransitionComboBox.SelectedIndex = 0;
+ }
+ }
+
+ private void TransitionComboBox_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ mAssistant.setTransition((string)TransitionComboBox.Text);
+ }
+
+ private void PositionComboBox_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ mAssistant.setPosition((string)PositionComboBox.Text);
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ /* Define Edge Display Parameters */
+
+ private void RegionColorComboBox_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ regionColor = (string)RegionColorComboBox.SelectedItem;
+ UpdateView();
+ }
+
+ private void EdgeColorComboBox_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ edgeColor = (string)EdgeColorComboBox.SelectedItem;
+ UpdateView();
+ }
+
+ private void LineWidthDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ lineWidth = (int)LineWidthDown.Value;
+ UpdateView();
+ }
+
+ private void ShowRegionCheckBox_CheckedChanged(object sender, System.EventArgs e)
+ {
+ displayRegion = ShowRegionCheckBox.Checked;
+ UpdateView();
+ }
+
+ private void UseShadowsCheckBox_CheckedChanged(object sender, System.EventArgs e)
+ {
+ useShadow = UseShadowsCheckBox.Checked;
+ UpdateView();
+ }
+
+ /********************************************************************/
+ /********************************************************************/
+ /* Definition for Result EdgeXLD Format */
+
+ private void EdgeLengthUpDown_ValueChanged(object sender, System.EventArgs e)
+ {
+ mAssistant.setDispEdgeLength((int)EdgeLengthUpDown.Value);
+ }
+
+ private void UseROIWidthCheckBox_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mAssistant.setFlagDispROIWidth(UseROIWidthCheckBox.Checked);
+
+ if (UseROIWidthCheckBox.Checked)
+ EdgeLengthUpDown.Enabled = false;
+ else
+ EdgeLengthUpDown.Enabled = true;
+
+ }
+
+ private void ShowROIcheckBox_CheckedChanged(object sender, System.EventArgs e)
+ {
+
+ int mode;
+
+ if (ShowROIcheckBox.Checked)
+ mode = HWndCtrl.MODE_INCLUDE_ROI;
+ else
+ mode = HWndCtrl.MODE_EXCLUDE_ROI;
+
+ mView.setDispLevel(mode);
+ UpdateView();
+ }
+
+ /********************************************************************/
+ /* Edges Results */
+ /********************************************************************/
+
+ private void PositionCheckBox_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mAssistant.showPosition(PositionCheckBox.Checked);
+ UpdateMeasureResultComposition();
+ }
+
+ private void PairWidthCheckBox_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mAssistant.showPairWidth(PairWidthCheckBox.Checked);
+ UpdateMeasureResultComposition();
+ }
+
+ private void AmplitudeCheckBox_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mAssistant.showAmplitude(AmplitudeCheckBox.Checked);
+ UpdateMeasureResultComposition();
+ }
+
+ private void DistanceCheckBox_CheckedChanged(object sender, System.EventArgs e)
+ {
+ mAssistant.showDistance(DistanceCheckBox.Checked);
+ UpdateMeasureResultComposition();
+ }
+
+ private void TransWCoordCheckBox_CheckedChanged(object sender, System.EventArgs e)
+ {
+ if (TransWCoordCheckBox.Checked)
+ UnitPanel.Enabled = true;
+ else
+ UnitPanel.Enabled = false;
+
+ mAssistant.setTransWorldCoord(TransWCoordCheckBox.Checked);
+
+ }
+
+ private void UnitComboBox_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ mAssistant.setUnit((string)UnitComboBox.SelectedItem);
+ }
+
+ /// <summary>Loads HALCON calibration data.</summary>
+ private void LoadCamParamButton_Click(object sender, System.EventArgs e)
+ {
+ HTuple buttonType, valType;
+ string file;
+ string [] val;
+ bool isCalFile;
+
+
+ StatusLabel.Text = "";
+ buttonType = new HTuple(sender.ToString());
+ valType = buttonType.TupleStrrstr(new HTuple("CamPar"));
+
+ if (valType[0].I > 0)
+ openCamparFileDialog.FilterIndex = 1;
+ else
+ openCamparFileDialog.FilterIndex = 2;
+
+ openCamparFileDialog.FileName = "";
+
+ if (openCamparFileDialog.ShowDialog() == DialogResult.OK)
+ {
+ file = openCamparFileDialog.FileName;
+ StatusLabel.Text = "";
+
+ if ((isCalFile = file.EndsWith(".cal")) || file.EndsWith(".dat"))
+ {
+
+ try
+ {
+ if (valType[0].I > 0)
+ {
+ mAssistant.LoadCamParFile(file);
+ val = file.Split(new Char[] { '\\' });
+ file = val[val.Length - 1];
+ CalibCamTextBox.Text = file;
+
+ }
+ else
+ {
+ mAssistant.LoadCamPoseFile(file);
+ val = file.Split(new Char[] { '\\' });
+ file = val[val.Length - 1];
+ CalibPoseTextBox.Text = file;
+ }
+ }
+ catch (HOperatorException)
+ {
+ if (valType[0].I > 0)
+ CalibCamTextBox.Text = "*.cal";
+ else
+ CalibPoseTextBox.Text = "*.dat";
+
+ StatusLabel.Text = mAssistant.exceptionText;
+ valType = mAssistant.exceptionText.TupleSplit(":");
+ MessageBox.Show("File is corrupted or has a wrong format:\nPlease check if you chose a valid calibration file (or format)!",
+ "Measure Assistant",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+
+ }
+
+ }
+ else
+ {
+ MessageBox.Show("Fileformat is wrong: Data is not a calibration file!",
+ "Measure Assistant",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ }
+
+
+ if (mAssistant.mIsCalibValid)
+ {
+ TransWCoordCheckBox.Enabled = true;
+ }
+ else
+ {
+ TransWCoordCheckBox.Enabled = false;
+ TransWCoordCheckBox.Checked = false;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Changes index of the selected ROI displayed in the listbox.
+ /// </summary>
+ private void ActiveROIListBox_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ roiController.activeROIidx = ActiveROIListBox.SelectedIndex;
+ mAssistant.mActRoiIdx = roiController.activeROIidx;
+ UpdateCodeTable();
+ UpdateView();
+ }
+
+
+ /********************************************************************/
+ /* Update methods invoked by delegates */
+ /********************************************************************/
+
+ /// <summary>
+ /// Updates HALCON display and result table according to new measure
+ /// results.
+ /// </summary>
+ /// <param name="mode">Type of measure update</param>
+ public void UpdateMeasureResults(int mode)
+ {
+ StatusLabel.Text = "";
+
+ switch (mode)
+ {
+ case MeasureAssistant.ERR_READING_FILE:
+ MessageBox.Show("Problem occured while reading file! \n" + mAssistant.exceptionText,
+ "Measure assistant",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ mAssistant.exceptionText = "";
+ break;
+ case MeasureAssistant.EVENT_UPDATE_MEASUREMENT:
+ case MeasureAssistant.EVENT_UPDATE_RESULT_XLD:
+ case MeasureAssistant.EVENT_UPDATE_REMOVE:
+ UpdateView();
+ break;
+ default:
+ break;
+ }
+
+ if (mAssistant.exceptionText != "")
+ {
+ HTuple segment = mAssistant.exceptionText.TupleSplit(":");
+ StatusLabel.Text = " Measure failed: " + mAssistant.exceptionText;
+ }
+ UpdateCodeTable();
+ }
+
+
+ /// <summary>
+ /// Responds to changes in the selected ROI.
+ /// </summary>
+ /// <param name="mode">Type of ROI update</param>
+ public void UpdateROIData(int mode)
+ {
+ switch (mode)
+ {
+ case ROIController.EVENT_CREATED_ROI:
+ mAssistant.AddMeasureObject();
+ UpdateROIClickList("new");
+ break;
+ case ROIController.EVENT_ACTIVATED_ROI:
+ mAssistant.ClickedActiveROI();
+ UpdateROIClickList("active");
+ break;
+ case ROIController.EVENT_MOVING_ROI:
+ mAssistant.UpdateMeasure(roiController.getActiveROIIdx());
+ break;
+ case ROIController.EVENT_DELETED_ACTROI:
+ mAssistant.RemoveMeasureObjectActIdx();
+ UpdateROIClickList("removeIdx");
+ break;
+ case ROIController.EVENT_DELETED_ALL_ROIS:
+ mAssistant.RemoveAllMeasureObjects();
+ UpdateROIClickList("removeAll");
+ break;
+ }
+
+ if (updateLineProfile)
+ PaintGraph();
+
+ }
+
+
+ /// <summary>
+ /// Triggers an update of the HALCON window. Displays all valid iconic
+ /// objects.
+ /// </summary>
+ public void UpdateView()
+ {
+ HObject edges, regions;
+
+ if (currImage == null)
+ {
+ mView.clearList();
+ }
+ else
+ {
+ mView.addIconicVar(currImage);
+
+ if (roiController.getROIList().Count > 0)
+ {
+ edges = mAssistant.getMeasureResults();
+
+ if (edges.IsInitialized())
+ {
+ if (useShadow)
+ {
+ UpdateShadowContours(edges);
+ mView.changeGraphicSettings(GraphicsContext.GC_COLOR, "black");
+ mView.addIconicVar(mShadow);
+ }
+
+ mView.changeGraphicSettings(GraphicsContext.GC_COLOR, edgeColor);
+ mView.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, lineWidth);
+ mView.addIconicVar(edges);
+ }
+
+ regions = mAssistant.getMeasureRegions();
+
+ if (displayRegion && regions.IsInitialized())
+ {
+ mView.changeGraphicSettings(GraphicsContext.GC_COLOR, regionColor);
+ mView.addIconicVar(regions);
+ }
+ }
+ }
+ mView.repaint();
+ }
+
+
+ /// <summary>
+ /// Adds visual effects (shadows)
+ /// to the measure results.
+ /// </summary>
+ /// <param name="edges">
+ /// Add shadows along the edges provided
+ /// </param>
+ public void UpdateShadowContours(HObject edges)
+ {
+ double shift;
+ HXLDCont shadow1, shadow2;
+ HHomMat2D hom2D = new HHomMat2D();
+
+ mShadow.Dispose();
+ mShadow.GenEmptyObj();
+
+ shift = Math.Min(0.5 * lineWidth, 2.0);
+
+ hom2D.HomMat2dIdentity();
+ hom2D = hom2D.HomMat2dTranslate(shift, 1);
+ shadow1 = ((HXLDCont)edges).AffineTransContourXld(hom2D);
+
+ hom2D.HomMat2dIdentity();
+ hom2D = hom2D.HomMat2dTranslate(1, shift);
+ shadow2 = ((HXLDCont)edges).AffineTransContourXld(hom2D);
+
+ mShadow = mShadow.ConcatObj(shadow1);
+ mShadow = mShadow.ConcatObj(shadow2);
+
+ shadow1.Dispose();
+ shadow2.Dispose();
+ }
+
+
+ /// <summary>
+ /// Adapts column header for measure result table.
+ /// </summary>
+ public void UpdateMeasureResultComposition()
+ {
+ ArrayList composition;
+ ColumnHeader header;
+ int length;
+ int size = -1;
+
+ composition = mAssistant.getMeasureResultComposition();
+ length = composition.Count;
+ EdgeResultListView.Columns.Clear();
+
+ if (length <= 5 && length > 0)
+ size = (EdgeResultListView.Size.Width / length) - 1;
+
+ for (int i=0; i < length; i++)
+ {
+ header = new ColumnHeader();
+ header.Text = (string)composition[i];
+ header.Width = (size != -1) ? size : 20 + header.Text.Length * 5;
+ EdgeResultListView.Columns.Add(header);
+ }
+
+ UpdateCodeTable();
+ }
+
+
+ /// <summary>Creates table for measure results.</summary>
+ public void UpdateCodeTable()
+ {
+ ArrayList table;
+ ListViewItem item;
+ int rowCount,colCount;
+ string val;
+ rowCount = 0;
+
+ table = mAssistant.getMeasureTableData();
+ EdgeResultListView.Items.Clear();
+
+ if ((colCount = table.Count) == 0 || (table[0] == null))
+ return;
+
+ for (int i=0; i < colCount; i++)
+ rowCount = Math.Max(rowCount, ((HTuple)table[i]).Length);
+
+ for (int i=0; i < rowCount; i++)
+ {
+ val = (i >= ((HTuple)table[0]).Length) ? "" : ((HTuple)table[0])[i].D.ToString("f6");
+ item = new ListViewItem(val);
+
+ for (int j=1; j < colCount; j++)
+ {
+ val = (i >= ((HTuple)table[j]).Length) ? "" : ((HTuple)table[j])[i].D.ToString("f6");
+ item.SubItems.Add(val);
+ }
+ EdgeResultListView.Items.Add(item);
+ }
+ }
+
+
+ /// <summary>
+ /// Updates listbox displaying current set of ROIs.
+ /// </summary>
+ public void UpdateROIClickList(string mode)
+ {
+ int count = roiController.ROIList.Count;
+
+ switch (mode)
+ {
+ case "active":
+ ActiveROIListBox.SelectedIndex = mAssistant.mActRoiIdx;
+ break;
+ case "new":
+ ActiveROIListBox.Items.Add(" InterActive ROI " + (mAssistant.mActRoiIdx + 1).ToString("d2"));
+ ActiveROIListBox.SelectedIndex = mAssistant.mActRoiIdx;
+ break;
+ case "removeIdx":
+ ActiveROIListBox.Items.Clear();
+ for (int i=1; i <= count; i++)
+ ActiveROIListBox.Items.Add(" InterActive ROI " + i.ToString("d2"));
+ break;
+ case "removeAll":
+ ActiveROIListBox.Items.Clear();
+ break;
+ }
+ }
+
+
+ /// <summary>
+ /// Updates function plot (line profile) of measure projection for the
+ /// selected ROI.
+ /// </summary>
+ public void PaintGraph()
+ {
+ double [] grayVals;
+
+ grayVals = mAssistant.getMeasureProjection();
+ plotGraphWindow.plotFunction(grayVals);
+ ComputeStatistics(grayVals);
+ }
+
+
+ /// <summary>Adjusts statistics of measure projection (line profile).</summary>
+ public void ComputeStatistics(double[] grayVals)
+ {
+ HTuple tuple, val;
+ int max =0;
+
+ if (grayVals != null)
+ {
+ tuple = new HTuple(grayVals);
+
+ val = tuple.TupleMean();
+ labelMean.Text = val[0].D.ToString("f2");
+ val = tuple.TupleDeviation();
+ labelDeviation.Text = val[0].D.ToString("f2");
+
+ val = tuple.TupleSortIndex();
+ labelPeakX.Text = val[val.Length - 1].I + "";
+ max = (int)tuple[val[val.Length - 1].I].D;
+ labelPeak.Text = max + "";
+
+ labelRange.Text = (int)tuple[0].D + " ... " + (int)tuple[tuple.Length - 1].D;
+ labelRangeX.Text = "0 ... " + (tuple.Length - 1);
+ }
+ else
+ {
+ labelMean.Text = "0";
+ labelDeviation.Text = "0";
+
+ labelPeakX.Text = "0";
+ labelPeak.Text = "0";
+
+ labelRange.Text = "0 ... 0";
+ labelRangeX.Text = "0 ... 0";
+ }
+ }
+
+ /// <summary>Activates update for function plot (line profile).</summary>
+ private void tabControl_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ int tab = tabControl.SelectedIndex;
+ updateLineProfile = false;
+
+ if (tab == 2)
+ {
+ updateLineProfile = true;
+ PaintGraph();
+ }
+ else if (tab == 3)
+ {
+ //显示当前设定的参数
+ labMinEdgeAmplSet.Text = mAssistant.mThresh.ToString();
+ labSmoothingSet.Text = mAssistant.mSigma.ToString();
+ labROIWidthSet.Text = mAssistant.mRoiWidth.ToString();
+ labROIHeightSet.Text = mAssistant.mRoiHeight.ToString();
+
+ labInterpolationSet.Text = mAssistant.mInterpolation;
+ labTransitionSet.Text = mAssistant.mTransition;
+ labPositionSet.Text = mAssistant.mPosition;
+ }
+ }
+
+
+ /// <summary>
+ /// Adapts mode for scaling the y-axis in the plot (line profile) window.
+ /// </summary>
+ private void CSScaleComboBox_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ switch (CSScaleComboBox.SelectedIndex)
+ {
+ case 0: // Adaptive
+ plotGraphWindow.setAxisAdaption(FunctionPlot.AXIS_RANGE_ADAPTING);
+ break;
+ case 1: // Increasing
+ plotGraphWindow.setAxisAdaption(FunctionPlot.AXIS_RANGE_INCREASING);
+ break;
+ case 2: // Fixed
+ plotGraphWindow.setAxisAdaption(FunctionPlot.AXIS_RANGE_FIXED, 255.0f);
+ break;
+ }
+ PaintGraph();
+ }
+
+ private void butRoiHeightReset_Click(object sender, EventArgs e)
+ {
+ this.numUDRoiHeight.Value = Convert.ToDecimal(20);
+ butRoiHeightReset.ForeColor = System.Drawing.Color.Gray;
+ }
+
+ private void numUDRoiHeight_ValueChanged(object sender, EventArgs e)
+ {
+ this.tBroiHeight.Value = Convert.ToInt16(this.numUDRoiHeight.Value);
+
+ int val = (int)this.numUDRoiHeight.Value;
+ this.tBroiHeight.Value = val;
+
+ setRoiHeight(val);
+ }
+
+ private void tBroiHeight_ValueChanged(object sender, EventArgs e)
+ {
+ numUDRoiHeight.Value = this.tBroiHeight.Value;
+ numUDRoiHeight.Refresh();
+ }
+
+ private void btnSaveConfige_Click(object sender, EventArgs e)
+ {
+ HalconTools.MeasureParamSave param = new MeasureParamSave();
+ param.Save(mAssistant);
+
+ }
+
+ private void viewPort_HMouseMove(object sender, HMouseEventArgs e)
+ {
+
+ }
+
+
+
+ }//end of class
+}//end of namespace
diff --git a/HalconTools/frmMeasureAssistant.resx b/HalconTools/frmMeasureAssistant.resx
new file mode 100644
index 0000000..e386287
--- /dev/null
+++ b/HalconTools/frmMeasureAssistant.resx
@@ -0,0 +1,129 @@
+<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="openImageFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <metadata name="openCamparFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>173, 17</value>
+ </metadata>
+ <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>25</value>
+ </metadata>
+</root>
\ No newline at end of file
diff --git a/HalconTools/frmScrewAssistant.Designer.cs b/HalconTools/frmScrewAssistant.Designer.cs
new file mode 100644
index 0000000..23516e9
--- /dev/null
+++ b/HalconTools/frmScrewAssistant.Designer.cs
@@ -0,0 +1,354 @@
+锘縩amespace HalconTools
+{
+ partial class frmScrewAssistant
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.hWindowControl1 = new HalconDotNet.HWindowControl();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.btnLoadImage = new System.Windows.Forms.Button();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.btnReset = new System.Windows.Forms.Button();
+ this.rbZoom = new System.Windows.Forms.RadioButton();
+ this.rbMove = new System.Windows.Forms.RadioButton();
+ this.rbNone = new System.Windows.Forms.RadioButton();
+ this.groupBox3 = new System.Windows.Forms.GroupBox();
+ this.btnRadius = new System.Windows.Forms.Button();
+ this.txtRadiusMax = new System.Windows.Forms.TextBox();
+ this.label4 = new System.Windows.Forms.Label();
+ this.txtRadiusMin = new System.Windows.Forms.TextBox();
+ this.label5 = new System.Windows.Forms.Label();
+ this.btnRoundness = new System.Windows.Forms.Button();
+ this.txtRoundnessMax = new System.Windows.Forms.TextBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.txtRoundnessMin = new System.Windows.Forms.TextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.btnThresholdSubPix = new System.Windows.Forms.Button();
+ this.txtThresholdSubPix = new System.Windows.Forms.TextBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.btnRun = new System.Windows.Forms.Button();
+ this.btnSavePara = new System.Windows.Forms.Button();
+ this.groupBox1.SuspendLayout();
+ this.groupBox2.SuspendLayout();
+ this.groupBox3.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // hWindowControl1
+ //
+ this.hWindowControl1.BackColor = System.Drawing.Color.Black;
+ this.hWindowControl1.BorderColor = System.Drawing.Color.Black;
+ this.hWindowControl1.ImagePart = new System.Drawing.Rectangle(0, 0, 640, 480);
+ this.hWindowControl1.Location = new System.Drawing.Point(11, 12);
+ this.hWindowControl1.Name = "hWindowControl1";
+ this.hWindowControl1.Size = new System.Drawing.Size(621, 488);
+ this.hWindowControl1.TabIndex = 0;
+ this.hWindowControl1.WindowSize = new System.Drawing.Size(621, 488);
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.btnLoadImage);
+ this.groupBox1.Location = new System.Drawing.Point(640, 9);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(332, 86);
+ this.groupBox1.TabIndex = 1;
+ this.groupBox1.TabStop = false;
+ //
+ // btnLoadImage
+ //
+ this.btnLoadImage.Location = new System.Drawing.Point(22, 20);
+ this.btnLoadImage.Name = "btnLoadImage";
+ this.btnLoadImage.Size = new System.Drawing.Size(117, 53);
+ this.btnLoadImage.TabIndex = 0;
+ this.btnLoadImage.Text = "鍔犺浇鍥剧墖";
+ this.btnLoadImage.UseVisualStyleBackColor = true;
+ this.btnLoadImage.Click += new System.EventHandler(this.btnLoadImage_Click);
+ //
+ // groupBox2
+ //
+ this.groupBox2.Controls.Add(this.btnReset);
+ this.groupBox2.Controls.Add(this.rbZoom);
+ this.groupBox2.Controls.Add(this.rbMove);
+ this.groupBox2.Controls.Add(this.rbNone);
+ this.groupBox2.Location = new System.Drawing.Point(640, 99);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(332, 59);
+ this.groupBox2.TabIndex = 2;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "鍥剧墖鎿嶄綔";
+ //
+ // btnReset
+ //
+ this.btnReset.Location = new System.Drawing.Point(234, 20);
+ this.btnReset.Name = "btnReset";
+ this.btnReset.Size = new System.Drawing.Size(83, 29);
+ this.btnReset.TabIndex = 3;
+ this.btnReset.Text = "杩樺師";
+ this.btnReset.UseVisualStyleBackColor = true;
+ this.btnReset.Click += new System.EventHandler(this.btnReset_Click);
+ //
+ // rbZoom
+ //
+ this.rbZoom.AutoSize = true;
+ this.rbZoom.Location = new System.Drawing.Point(160, 26);
+ this.rbZoom.Name = "rbZoom";
+ this.rbZoom.Size = new System.Drawing.Size(47, 16);
+ this.rbZoom.TabIndex = 2;
+ this.rbZoom.TabStop = true;
+ this.rbZoom.Text = "Zoom";
+ this.rbZoom.UseVisualStyleBackColor = true;
+ this.rbZoom.CheckedChanged += new System.EventHandler(this.rbZoom_CheckedChanged);
+ //
+ // rbMove
+ //
+ this.rbMove.AutoSize = true;
+ this.rbMove.Location = new System.Drawing.Point(92, 26);
+ this.rbMove.Name = "rbMove";
+ this.rbMove.Size = new System.Drawing.Size(47, 16);
+ this.rbMove.TabIndex = 1;
+ this.rbMove.TabStop = true;
+ this.rbMove.Text = "Move";
+ this.rbMove.UseVisualStyleBackColor = true;
+ this.rbMove.CheckedChanged += new System.EventHandler(this.rbMove_CheckedChanged);
+ //
+ // rbNone
+ //
+ this.rbNone.AutoSize = true;
+ this.rbNone.Checked = true;
+ this.rbNone.Location = new System.Drawing.Point(22, 26);
+ this.rbNone.Name = "rbNone";
+ this.rbNone.Size = new System.Drawing.Size(47, 16);
+ this.rbNone.TabIndex = 0;
+ this.rbNone.TabStop = true;
+ this.rbNone.Text = "None";
+ this.rbNone.UseVisualStyleBackColor = true;
+ this.rbNone.CheckedChanged += new System.EventHandler(this.rbNone_CheckedChanged);
+ //
+ // groupBox3
+ //
+ this.groupBox3.Controls.Add(this.btnRadius);
+ this.groupBox3.Controls.Add(this.txtRadiusMax);
+ this.groupBox3.Controls.Add(this.label4);
+ this.groupBox3.Controls.Add(this.txtRadiusMin);
+ this.groupBox3.Controls.Add(this.label5);
+ this.groupBox3.Controls.Add(this.btnRoundness);
+ this.groupBox3.Controls.Add(this.txtRoundnessMax);
+ this.groupBox3.Controls.Add(this.label3);
+ this.groupBox3.Controls.Add(this.txtRoundnessMin);
+ this.groupBox3.Controls.Add(this.label2);
+ this.groupBox3.Controls.Add(this.btnThresholdSubPix);
+ this.groupBox3.Controls.Add(this.txtThresholdSubPix);
+ this.groupBox3.Controls.Add(this.label1);
+ this.groupBox3.Location = new System.Drawing.Point(642, 171);
+ this.groupBox3.Name = "groupBox3";
+ this.groupBox3.Size = new System.Drawing.Size(330, 171);
+ this.groupBox3.TabIndex = 3;
+ this.groupBox3.TabStop = false;
+ this.groupBox3.Text = "鍙傛暟";
+ //
+ // btnRadius
+ //
+ this.btnRadius.Location = new System.Drawing.Point(257, 120);
+ this.btnRadius.Name = "btnRadius";
+ this.btnRadius.Size = new System.Drawing.Size(48, 23);
+ this.btnRadius.TabIndex = 12;
+ this.btnRadius.Text = "娴嬭瘯";
+ this.btnRadius.UseVisualStyleBackColor = true;
+ this.btnRadius.Click += new System.EventHandler(this.btnRadius_Click);
+ //
+ // txtRadiusMax
+ //
+ this.txtRadiusMax.Location = new System.Drawing.Point(160, 122);
+ this.txtRadiusMax.Name = "txtRadiusMax";
+ this.txtRadiusMax.Size = new System.Drawing.Size(60, 21);
+ this.txtRadiusMax.TabIndex = 11;
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(143, 125);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(11, 12);
+ this.label4.TabIndex = 10;
+ this.label4.Text = "-";
+ //
+ // txtRadiusMin
+ //
+ this.txtRadiusMin.Location = new System.Drawing.Point(77, 122);
+ this.txtRadiusMin.Name = "txtRadiusMin";
+ this.txtRadiusMin.Size = new System.Drawing.Size(60, 21);
+ this.txtRadiusMin.TabIndex = 9;
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(6, 125);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(65, 12);
+ this.label5.TabIndex = 8;
+ this.label5.Text = "鍦嗗崐寰勮寖鍥�";
+ //
+ // btnRoundness
+ //
+ this.btnRoundness.Location = new System.Drawing.Point(257, 70);
+ this.btnRoundness.Name = "btnRoundness";
+ this.btnRoundness.Size = new System.Drawing.Size(48, 23);
+ this.btnRoundness.TabIndex = 7;
+ this.btnRoundness.Text = "娴嬭瘯";
+ this.btnRoundness.UseVisualStyleBackColor = true;
+ this.btnRoundness.Click += new System.EventHandler(this.btnRoundness_Click);
+ //
+ // txtRoundnessMax
+ //
+ this.txtRoundnessMax.Location = new System.Drawing.Point(160, 72);
+ this.txtRoundnessMax.Name = "txtRoundnessMax";
+ this.txtRoundnessMax.Size = new System.Drawing.Size(60, 21);
+ this.txtRoundnessMax.TabIndex = 6;
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(143, 75);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(11, 12);
+ this.label3.TabIndex = 5;
+ this.label3.Text = "-";
+ //
+ // txtRoundnessMin
+ //
+ this.txtRoundnessMin.Location = new System.Drawing.Point(77, 72);
+ this.txtRoundnessMin.Name = "txtRoundnessMin";
+ this.txtRoundnessMin.Size = new System.Drawing.Size(60, 21);
+ this.txtRoundnessMin.TabIndex = 4;
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(6, 75);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(65, 12);
+ this.label2.TabIndex = 3;
+ this.label2.Text = "鐪熷渾搴﹁寖鍥�";
+ //
+ // btnThresholdSubPix
+ //
+ this.btnThresholdSubPix.Location = new System.Drawing.Point(257, 23);
+ this.btnThresholdSubPix.Name = "btnThresholdSubPix";
+ this.btnThresholdSubPix.Size = new System.Drawing.Size(48, 23);
+ this.btnThresholdSubPix.TabIndex = 2;
+ this.btnThresholdSubPix.Text = "娴嬭瘯";
+ this.btnThresholdSubPix.UseVisualStyleBackColor = true;
+ this.btnThresholdSubPix.Click += new System.EventHandler(this.btnThresholdSubPix_Click);
+ //
+ // txtThresholdSubPix
+ //
+ this.txtThresholdSubPix.Location = new System.Drawing.Point(77, 25);
+ this.txtThresholdSubPix.Name = "txtThresholdSubPix";
+ this.txtThresholdSubPix.Size = new System.Drawing.Size(60, 21);
+ this.txtThresholdSubPix.TabIndex = 1;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(6, 28);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(65, 12);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "杈圭紭浜屽�煎寲";
+ //
+ // btnRun
+ //
+ this.btnRun.Font = new System.Drawing.Font("瀹嬩綋", 21.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.btnRun.Location = new System.Drawing.Point(640, 378);
+ this.btnRun.Name = "btnRun";
+ this.btnRun.Size = new System.Drawing.Size(133, 68);
+ this.btnRun.TabIndex = 4;
+ this.btnRun.Text = "杩愯";
+ this.btnRun.UseVisualStyleBackColor = true;
+ this.btnRun.Click += new System.EventHandler(this.btnRun_Click);
+ //
+ // btnSavePara
+ //
+ this.btnSavePara.Font = new System.Drawing.Font("瀹嬩綋", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.btnSavePara.Location = new System.Drawing.Point(819, 378);
+ this.btnSavePara.Name = "btnSavePara";
+ this.btnSavePara.Size = new System.Drawing.Size(128, 68);
+ this.btnSavePara.TabIndex = 5;
+ this.btnSavePara.Text = "淇濆瓨鍙傛暟";
+ this.btnSavePara.UseVisualStyleBackColor = true;
+ this.btnSavePara.Click += new System.EventHandler(this.btnSavePara_Click);
+ //
+ // frmScrewAssistant
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(984, 515);
+ this.Controls.Add(this.btnSavePara);
+ this.Controls.Add(this.btnRun);
+ this.Controls.Add(this.groupBox3);
+ this.Controls.Add(this.groupBox2);
+ this.Controls.Add(this.groupBox1);
+ this.Controls.Add(this.hWindowControl1);
+ this.Name = "frmScrewAssistant";
+ this.Text = "frmScrewAssistant";
+ this.Load += new System.EventHandler(this.frmScrewAssistant_Load);
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox2.ResumeLayout(false);
+ this.groupBox2.PerformLayout();
+ this.groupBox3.ResumeLayout(false);
+ this.groupBox3.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private HalconDotNet.HWindowControl hWindowControl1;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.Button btnLoadImage;
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.RadioButton rbNone;
+ private System.Windows.Forms.Button btnReset;
+ private System.Windows.Forms.RadioButton rbZoom;
+ private System.Windows.Forms.RadioButton rbMove;
+ private System.Windows.Forms.GroupBox groupBox3;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.TextBox txtThresholdSubPix;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Button btnThresholdSubPix;
+ private System.Windows.Forms.TextBox txtRoundnessMax;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.TextBox txtRoundnessMin;
+ private System.Windows.Forms.Button btnRadius;
+ private System.Windows.Forms.TextBox txtRadiusMax;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.TextBox txtRadiusMin;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.Button btnRoundness;
+ private System.Windows.Forms.Button btnRun;
+ private System.Windows.Forms.Button btnSavePara;
+ }
+}
\ No newline at end of file
diff --git a/HalconTools/frmScrewAssistant.cs b/HalconTools/frmScrewAssistant.cs
new file mode 100644
index 0000000..2ec29bc
--- /dev/null
+++ b/HalconTools/frmScrewAssistant.cs
@@ -0,0 +1,202 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.IO;
+using HalconDotNet;
+
+namespace HalconTools
+{
+ public partial class frmScrewAssistant : Form
+ {
+ HImage MainImage = new HImage();
+ ScrewAssistant mScrewAssistant;
+ public ScrewParam mScrewPara = new ScrewParam();
+ ScrewResult mScrewResult = new ScrewResult();
+ HXLDCont thresholdXLD = new HXLDCont();
+ HXLDCont roundnessXLD = new HXLDCont();
+ HXLDCont selectedXLD = new HXLDCont();
+
+ SerializeFileTool<ScrewParam> sft = new SerializeFileTool<ScrewParam>();
+
+ public frmScrewAssistant()
+ {
+ InitializeComponent();
+
+ init();
+ }
+
+ public frmScrewAssistant(JobTool tool ,HImage image)
+ {
+ InitializeComponent();
+
+ init();
+
+ MainImage = image;
+ mScrewAssistant.SetImage(MainImage);
+ mScrewAssistant.UpdateImage();
+
+ if (tool.screwParam == null)
+ {
+ mScrewPara.ThresholdSubPix = 200;
+ mScrewPara.RoundnessMin = 0.8;
+ mScrewPara.RoundnessMax = 1;
+ mScrewPara.RadiusMin = 100;
+ mScrewPara.RadiusMax = 200;
+ }
+ else
+ {
+ mScrewPara = tool.screwParam;
+ }
+ }
+
+ private void frmScrewAssistant_Load(object sender, EventArgs e)
+ {
+ if (mScrewPara.ThresholdSubPix == null)
+ {
+ string path = System.Windows.Forms.Application.StartupPath + "\\ScrewConfige";
+ if (!Directory.Exists(path))
+ {
+ Directory.CreateDirectory(path);
+ }
+ path += "\\ScrewConfige.xml";
+
+ if (!File.Exists(path))
+ {
+ mScrewPara.ThresholdSubPix = 200;
+ mScrewPara.RoundnessMin = 0.8;
+ mScrewPara.RoundnessMax = 1;
+ mScrewPara.RadiusMin = 100;
+ mScrewPara.RadiusMax = 200;
+
+ sft.SetConfig(path, mScrewPara);
+ }
+
+ mScrewPara = sft.GetConfig(path);
+ }
+
+ txtThresholdSubPix.Text = mScrewPara.ThresholdSubPix.ToString();
+ txtRoundnessMin.Text = mScrewPara.RoundnessMin.ToString();
+ txtRoundnessMax.Text = mScrewPara.RoundnessMax.ToString();
+ txtRadiusMin.Text = mScrewPara.RadiusMin.ToString();
+ txtRadiusMax.Text = mScrewPara.RadiusMax.ToString();
+ }
+
+ private void init()
+ {
+ mScrewAssistant = new ScrewAssistant(hWindowControl1);
+ mScrewAssistant.SetPara(mScrewPara);
+
+ mScrewAssistant.ScrewDone += new ScrewDelegate(mScrewAssistant_ScrewDone);
+ }
+
+ void mScrewAssistant_ScrewDone(ScrewResult result)
+ {
+ if (result == null)
+ {
+ MessageBox.Show("娌℃壘鍒�");
+ }
+ else
+ {
+ HOperatorSet.DispCircle(hWindowControl1.HalconWindow, result.row, result.col, result.radius);
+ }
+ }
+
+ private void rbNone_CheckedChanged(object sender, EventArgs e)
+ {
+ mScrewAssistant.viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
+ }
+
+ private void rbMove_CheckedChanged(object sender, EventArgs e)
+ {
+ mScrewAssistant.viewController.setViewState(HWndCtrl.MODE_VIEW_MOVE);
+ }
+
+ private void rbZoom_CheckedChanged(object sender, EventArgs e)
+ {
+ mScrewAssistant.viewController.setViewState(HWndCtrl.MODE_VIEW_ZOOM);
+ }
+
+ private void btnReset_Click(object sender, EventArgs e)
+ {
+ mScrewAssistant.viewController.resetWindow();
+ mScrewAssistant.viewController.repaint();
+ }
+
+ private void btnThresholdSubPix_Click(object sender, EventArgs e)
+ {
+ mScrewPara.ThresholdSubPix = Convert.ToDouble(txtThresholdSubPix.Text);
+ mScrewAssistant.SetPara(mScrewPara);
+
+ thresholdXLD = mScrewAssistant.ThresholdSubPix(mScrewAssistant.mImage);
+ mScrewAssistant.UpdateObj((HObject)thresholdXLD, "green");
+ }
+
+ private void btnRoundness_Click(object sender, EventArgs e)
+ {
+ mScrewPara.RoundnessMin = Convert.ToDouble(txtRoundnessMin.Text);
+ mScrewPara.RoundnessMax = Convert.ToDouble(txtRoundnessMax.Text);
+ mScrewAssistant.SetPara(mScrewPara);
+
+ roundnessXLD = mScrewAssistant.RoundnessXLD(thresholdXLD);
+ mScrewAssistant.UpdateObj((HObject)roundnessXLD, "red");
+ }
+
+ private void btnRadius_Click(object sender, EventArgs e)
+ {
+ mScrewPara.RadiusMin = Convert.ToDouble(txtRadiusMin.Text);
+ mScrewPara.RadiusMax = Convert.ToDouble(txtRadiusMax.Text);
+ mScrewAssistant.SetPara(mScrewPara);
+
+ selectedXLD = mScrewAssistant.SelectXLD(roundnessXLD);
+ mScrewAssistant.UpdateObj((HObject)selectedXLD, "black");
+ }
+
+ private void btnRun_Click(object sender, EventArgs e)
+ {
+ mScrewAssistant.UpdateImage();
+ mScrewAssistant.Run();
+ }
+
+ private void btnSavePara_Click(object sender, EventArgs e)
+ {
+ mScrewPara.RadiusMax = Convert.ToDouble(txtRadiusMax.Text);
+ mScrewPara.RadiusMin = Convert.ToDouble(txtRadiusMin.Text);
+ mScrewPara.RoundnessMax = Convert.ToDouble(txtRoundnessMax.Text);
+ mScrewPara.RoundnessMin = Convert.ToDouble(txtRoundnessMin.Text);
+ mScrewPara.ThresholdSubPix = Convert.ToDouble(txtThresholdSubPix.Text);
+
+ mScrewAssistant.SetPara(mScrewPara);
+
+ string path = System.Windows.Forms.Application.StartupPath + "\\ScrewConfige";
+ if (!Directory.Exists(path))
+ {
+ Directory.CreateDirectory(path);
+ }
+ path += "\\ScrewConfige.xml";
+
+ sft.SetConfig(path, mScrewPara);
+ }
+
+ private void btnLoadImage_Click(object sender, EventArgs e)
+ {
+ OpenFileDialog imagePath = new OpenFileDialog();
+ imagePath.Filter = "*.jpg,*.jpeg,*.bmp,*.gif,*.ico,*.png,*.tif,*.wmf|*.jpg;*.jpeg;*.bmp;*.gif;*.ico;*.png;*.tif;*.wmf";
+
+ if (imagePath.ShowDialog() == DialogResult.OK)
+ {
+ if (!mScrewAssistant.SetImage(imagePath.FileName))
+ {
+ return;
+ }
+
+ MainImage = mScrewAssistant.mImage;
+ mScrewAssistant.UpdateImage();
+ }
+ }
+ }
+}
diff --git a/HalconTools/frmScrewAssistant.resx b/HalconTools/frmScrewAssistant.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/HalconTools/frmScrewAssistant.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
\ No newline at end of file
diff --git a/LLMF.sln b/LLMF.sln
new file mode 100644
index 0000000..6ce6ed4
--- /dev/null
+++ b/LLMF.sln
@@ -0,0 +1,52 @@
+锘�
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.28010.2046
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LLMF", "LLMF\LLMF.csproj", "{2D99C0F2-ACB1-4985-BC17-27AA52F881E1}"
+ ProjectSection(ProjectDependencies) = postProject
+ {461F5DE4-F558-41B7-9494-F76854E0E7C7} = {461F5DE4-F558-41B7-9494-F76854E0E7C7}
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventTool", "EventTool\EventTool.csproj", "{2EBB374F-7C87-4A83-8AF4-503CDF0D1B0E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileToolkit", "FileToolkit\FileToolkit.csproj", "{EC3A7C8F-C3FB-461C-9AF1-2456E1CBEC46}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HalconTools", "HalconTools\HalconTools.csproj", "{461F5DE4-F558-41B7-9494-F76854E0E7C7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PointGreyAndHalcon", "PointGreyAndHalcon\PointGreyAndHalcon\PointGreyAndHalcon.csproj", "{91B96D0B-F745-4850-9166-63A07917AC04}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {2D99C0F2-ACB1-4985-BC17-27AA52F881E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2D99C0F2-ACB1-4985-BC17-27AA52F881E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2D99C0F2-ACB1-4985-BC17-27AA52F881E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2D99C0F2-ACB1-4985-BC17-27AA52F881E1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2EBB374F-7C87-4A83-8AF4-503CDF0D1B0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2EBB374F-7C87-4A83-8AF4-503CDF0D1B0E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2EBB374F-7C87-4A83-8AF4-503CDF0D1B0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2EBB374F-7C87-4A83-8AF4-503CDF0D1B0E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EC3A7C8F-C3FB-461C-9AF1-2456E1CBEC46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EC3A7C8F-C3FB-461C-9AF1-2456E1CBEC46}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EC3A7C8F-C3FB-461C-9AF1-2456E1CBEC46}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EC3A7C8F-C3FB-461C-9AF1-2456E1CBEC46}.Release|Any CPU.Build.0 = Release|Any CPU
+ {461F5DE4-F558-41B7-9494-F76854E0E7C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {461F5DE4-F558-41B7-9494-F76854E0E7C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {461F5DE4-F558-41B7-9494-F76854E0E7C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {461F5DE4-F558-41B7-9494-F76854E0E7C7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {91B96D0B-F745-4850-9166-63A07917AC04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {91B96D0B-F745-4850-9166-63A07917AC04}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {91B96D0B-F745-4850-9166-63A07917AC04}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {91B96D0B-F745-4850-9166-63A07917AC04}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {B5F06DB0-60BB-4339-BA90-BC309153D291}
+ EndGlobalSection
+EndGlobal
diff --git a/LLMF/FrmActive.cs b/LLMF/FrmActive.cs
new file mode 100644
index 0000000..dfe0fb2
--- /dev/null
+++ b/LLMF/FrmActive.cs
@@ -0,0 +1,251 @@
+锘縰sing Microsoft.Win32;
+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;
+
+namespace LLMF
+{
+ public partial class FrmActive : Form
+ {
+ RegistryHelper registryHelper = new RegistryHelper();
+ RegistryKey localMachineRegistry
+ = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
+ Environment.Is64BitOperatingSystem
+ ? RegistryView.Registry64
+ : RegistryView.Registry32);
+
+ public FrmActive()
+ {
+ InitializeComponent();
+ }
+
+ private void btnActive_Click(object sender, EventArgs e)
+ {
+ string softTime = registryHelper.GetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftTime");
+ string softLastTime = registryHelper.GetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftLastTime");
+ string softParam6 = registryHelper.GetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftParam6");
+ string softParam1 = registryHelper.GetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftParam1");
+ string softParam2 = registryHelper.GetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftParam2");
+ string softParam3 = registryHelper.GetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftParam3");
+ string softParam4 = registryHelper.GetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftParam4");
+ string softParam5 = registryHelper.GetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftParam5");
+ string active = txtActive.Text;
+ if (string.IsNullOrEmpty(active))
+ {
+ return;
+ }
+ if (active == "7418259015")
+ {
+ if (softParam1 == "0")
+ {
+ if (softParam2 == "1")
+ {
+ SetOver("SoftParam2");
+ }
+ if (softParam3 == "1")
+ {
+ SetOver("SoftParam3");
+ }
+ if (softParam4 == "1")
+ {
+ SetOver("SoftParam4");
+ }
+ if (softParam5 == "1")
+ {
+ SetOver("SoftParam5");
+ }
+ Set("SoftParam1");
+ Close();
+ }
+ else
+ {
+ MessageBox.Show("璇ユ縺娲荤爜宸蹭娇鐢�");
+ return;
+ }
+ }
+ if (active == "7886093651")
+ {
+ if (softParam2 == "0")
+ {
+ if (softParam1 == "1")
+ {
+ SetOver("SoftParam1");
+ }
+ if (softParam3 == "1")
+ {
+ SetOver("SoftParam3");
+ }
+ if (softParam4 == "1")
+ {
+ SetOver("SoftParam4");
+ }
+ if (softParam5 == "1")
+ {
+ SetOver("SoftParam5");
+ }
+ Set("SoftParam2");
+ Close();
+ }
+ else
+ {
+ MessageBox.Show("璇ユ縺娲荤爜宸蹭娇鐢�");
+ return;
+ }
+ }
+ if (active == "3051805492")
+ {
+ if (softParam3 == "0")
+ {
+ if (softParam1 == "1")
+ {
+ SetOver("SoftParam1");
+ }
+ if (softParam2 == "1")
+ {
+ SetOver("SoftParam2");
+ }
+ if (softParam4 == "1")
+ {
+ SetOver("SoftParam4");
+ }
+ if (softParam5 == "1")
+ {
+ SetOver("SoftParam5");
+ }
+ Set("SoftParam3");
+ Close();
+ }
+ else
+ {
+ MessageBox.Show("璇ユ縺娲荤爜宸蹭娇鐢�");
+ return;
+ }
+ }
+ if (active == "3085803765")
+ {
+ if (softParam4 == "0")
+ {
+ if (softParam1 == "1")
+ {
+ SetOver("SoftParam1");
+ }
+ if (softParam2 == "1")
+ {
+ SetOver("SoftParam2");
+ }
+ if (softParam3 == "1")
+ {
+ SetOver("SoftParam3");
+ }
+ if (softParam5 == "1")
+ {
+ SetOver("SoftParam5");
+ }
+ Set("SoftParam4");
+ Close();
+ }
+ else
+ {
+ MessageBox.Show("璇ユ縺娲荤爜宸蹭娇鐢�");
+ return;
+ }
+ }
+ if (active == "3067035900")
+ {
+ if (softParam5 == "0")
+ {
+ if (softParam1 == "1")
+ {
+ SetOver("SoftParam1");
+ }
+ if (softParam2 == "1")
+ {
+ SetOver("SoftParam2");
+ }
+ if (softParam3 == "1")
+ {
+ SetOver("SoftParam3");
+ }
+ if (softParam4 == "1")
+ {
+ SetOver("SoftParam4");
+ }
+ Set("SoftParam5");
+ Close();
+ }
+ else
+ {
+ MessageBox.Show("璇ユ縺娲荤爜宸蹭娇鐢�");
+ return;
+ }
+ }
+ if (active == "9975640068")
+ {
+ if (softParam6 == "0")
+ {
+ if (softParam1 == "1")
+ {
+ SetOver("SoftParam1");
+ }
+ if (softParam2 == "1")
+ {
+ SetOver("SoftParam2");
+ }
+ if (softParam3 == "1")
+ {
+ SetOver("SoftParam3");
+ }
+ if (softParam4 == "1")
+ {
+ SetOver("SoftParam4");
+ }
+ if (softParam5 == "1")
+ {
+ SetOver("SoftParam5");
+ }
+ Set("SoftParam6");
+ Close();
+ }
+ else
+ {
+ MessageBox.Show("璇ユ縺娲荤爜宸蹭娇鐢�");
+ return;
+ }
+ }
+ if (active == "9966775500")
+ {
+ Init();
+ Close();
+ }
+ }
+
+ public void Init()
+ {
+ registryHelper.SetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftTime", DateTime.Now.ToString());
+ registryHelper.SetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftLastTime", DateTime.Now.ToString());
+ registryHelper.SetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftParam1", "0");
+ registryHelper.SetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftParam2", "0");
+ registryHelper.SetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftParam3", "0");
+ registryHelper.SetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftParam4", "0");
+ registryHelper.SetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftParam5", "0");
+ registryHelper.SetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftParam6", "0");
+ }
+
+ public void Set(string name)
+ {
+ registryHelper.SetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", name, "1");
+ registryHelper.SetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", "SoftLastTime", DateTime.Now.ToString());
+ }
+
+ public void SetOver(string name)
+ {
+ registryHelper.SetRegistryData(localMachineRegistry, "SOFTWARE\\TagReceiver", name, "2");
+ }
+ }
+}
diff --git a/LLMF/FrmActive.designer.cs b/LLMF/FrmActive.designer.cs
new file mode 100644
index 0000000..07c67a5
--- /dev/null
+++ b/LLMF/FrmActive.designer.cs
@@ -0,0 +1,86 @@
+锘縩amespace LLMF
+{
+ partial class FrmActive
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.label1 = new System.Windows.Forms.Label();
+ this.txtActive = new System.Windows.Forms.TextBox();
+ this.btnActive = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(21, 38);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(62, 18);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "婵�娲荤爜";
+ //
+ // txtActive
+ //
+ this.txtActive.Location = new System.Drawing.Point(89, 33);
+ this.txtActive.Name = "txtActive";
+ this.txtActive.Size = new System.Drawing.Size(351, 28);
+ this.txtActive.TabIndex = 1;
+ //
+ // btnActive
+ //
+ this.btnActive.Location = new System.Drawing.Point(458, 33);
+ this.btnActive.Name = "btnActive";
+ this.btnActive.Size = new System.Drawing.Size(89, 34);
+ this.btnActive.TabIndex = 2;
+ this.btnActive.Text = "纭畾";
+ this.btnActive.UseVisualStyleBackColor = true;
+ this.btnActive.Click += new System.EventHandler(this.btnActive_Click);
+ //
+ // FrmActive
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(559, 93);
+ this.Controls.Add(this.btnActive);
+ this.Controls.Add(this.txtActive);
+ this.Controls.Add(this.label1);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "FrmActive";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "婵�娲�";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.TextBox txtActive;
+ private System.Windows.Forms.Button btnActive;
+ }
+}
\ No newline at end of file
diff --git a/LLMF/FrmActive.resx b/LLMF/FrmActive.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/LLMF/FrmActive.resx
@@ -0,0 +1,120 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
\ No newline at end of file
diff --git a/LLMF/LLMF.csproj b/LLMF/LLMF.csproj
new file mode 100644
index 0000000..1c67bb5
--- /dev/null
+++ b/LLMF/LLMF.csproj
@@ -0,0 +1,186 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>9.0.21022</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{2D99C0F2-ACB1-4985-BC17-27AA52F881E1}</ProjectGuid>
+ <OutputType>WinExe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>LLMF</RootNamespace>
+ <AssemblyName>LLMF</AssemblyName>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <ApplicationIcon>ico.ico</ApplicationIcon>
+ <FileUpgradeFlags>
+ </FileUpgradeFlags>
+ <UpgradeBackupLocation>
+ </UpgradeBackupLocation>
+ <OldToolsVersion>3.5</OldToolsVersion>
+ <TargetFrameworkProfile />
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <PlatformTarget>x86</PlatformTarget>
+ <Prefer32Bit>false</Prefer32Bit>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <Prefer32Bit>false</Prefer32Bit>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="dog_net_windows">
+ <HintPath>..\Lib\SuperDog\dog_net_windows.dll</HintPath>
+ </Reference>
+ <Reference Include="halcondotnet, Version=11.0.1.0, Culture=neutral, PublicKeyToken=4973bed59ddbf2b8, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\Lib\halcon\halcondotnet.dll</HintPath>
+ </Reference>
+ <Reference Include="HalconTools, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\HalconTools\bin\Debug\HalconTools.dll</HintPath>
+ </Reference>
+ <Reference Include="Interop.OPCAutomation, Version=1.0.0.0, Culture=neutral">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>C:\Program Files\KEPServerEx\Examples\Simple VB .NET OPC Example\bin\Interop.OPCAutomation.dll</HintPath>
+ </Reference>
+ <Reference Include="PresentationCore">
+ <RequiredTargetFramework>3.0</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="PresentationFramework">
+ <RequiredTargetFramework>3.0</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System" />
+ <Reference Include="System.Core">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Xml.Linq">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Data.DataSetExtensions">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Data" />
+ <Reference Include="System.Deployment" />
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Windows.Forms" />
+ <Reference Include="System.Xml" />
+ <Reference Include="WindowsBase">
+ <RequiredTargetFramework>3.0</RequiredTargetFramework>
+ </Reference>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="FrmActive.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="FrmActive.designer.cs">
+ <DependentUpon>FrmActive.cs</DependentUpon>
+ </Compile>
+ <Compile Include="frmConfig.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmConfig.Designer.cs">
+ <DependentUpon>frmConfig.cs</DependentUpon>
+ </Compile>
+ <Compile Include="frmMain.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmMain.Designer.cs">
+ <DependentUpon>frmMain.cs</DependentUpon>
+ </Compile>
+ <Compile Include="frmPassword.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmPassword.Designer.cs">
+ <DependentUpon>frmPassword.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Log.cs" />
+ <Compile Include="Program.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="RegistryHelper.cs" />
+ <Compile Include="WelcomeUser.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="WelcomeUser.Designer.cs">
+ <DependentUpon>WelcomeUser.cs</DependentUpon>
+ </Compile>
+ <EmbeddedResource Include="FrmActive.resx">
+ <DependentUpon>FrmActive.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmConfig.resx">
+ <DependentUpon>frmConfig.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmMain.resx">
+ <DependentUpon>frmMain.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmPassword.resx">
+ <DependentUpon>frmPassword.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Resources.resx</DependentUpon>
+ <DesignTime>True</DesignTime>
+ </Compile>
+ <EmbeddedResource Include="WelcomeUser.resx">
+ <DependentUpon>WelcomeUser.cs</DependentUpon>
+ </EmbeddedResource>
+ <None Include="app.config" />
+ <None Include="Properties\Settings.settings">
+ <Generator>SettingsSingleFileGenerator</Generator>
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+ </None>
+ <Compile Include="Properties\Settings.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Settings.settings</DependentUpon>
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
+ </Compile>
+ <Compile Include="Toolkit\ConfigStruct.cs" />
+ <Compile Include="Toolkit\OPC.cs" />
+ <Compile Include="Toolkit\StarterTool.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="ico.ico" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\EventTool\EventTool.csproj">
+ <Project>{2EBB374F-7C87-4A83-8AF4-503CDF0D1B0E}</Project>
+ <Name>EventTool</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\FileToolkit\FileToolkit.csproj">
+ <Project>{EC3A7C8F-C3FB-461C-9AF1-2456E1CBEC46}</Project>
+ <Name>FileToolkit</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\PointGreyAndHalcon\PointGreyAndHalcon\PointGreyAndHalcon.csproj">
+ <Project>{91b96d0b-f745-4850-9166-63a07917ac04}</Project>
+ <Name>PointGreyAndHalcon</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project>
\ No newline at end of file
diff --git a/LLMF/Log.cs b/LLMF/Log.cs
new file mode 100644
index 0000000..7b6d50a
--- /dev/null
+++ b/LLMF/Log.cs
@@ -0,0 +1,92 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.IO;
+using System.Windows.Forms;
+
+namespace LLMF
+{
+ public class Log
+ {
+ private static string logPath = string.Empty;
+ private static string resultPath = string.Empty;
+ private static object _lock = new object();
+
+ public static string LogPath
+ {
+ get
+ {
+ if (logPath == string.Empty)
+ {
+ //logPath = System.AppDomain.CurrentDomain.BaseDirectory+"\\Log\\";
+ //logPath = Application.StartupPath + "\\";
+ logPath = "D:\\Log\\";
+ }
+ return logPath;
+ }
+ set { Log.logPath = value; }
+ }
+ public static string ResultPath
+ {
+ get
+ {
+ if (resultPath == string.Empty)
+ {
+ resultPath = System.AppDomain.CurrentDomain.BaseDirectory + "\\Result\\";
+ //logPath = Application.StartupPath + "\\";
+ }
+ return resultPath;
+ }
+ set { Log.resultPath = value; }
+ }
+ public static void WriteLog(string text)
+ {
+ System.IO.StreamWriter sw = null;
+ if (!Directory.Exists(LogPath))
+ {
+ Directory.CreateDirectory(LogPath);
+ }
+ string fileFullFileName = LogPath + DateTime.Now.ToString("yyyyMMdd") + ".Log";
+ try
+ {
+ lock (_lock)
+ {
+ using (sw = System.IO.File.AppendText(fileFullFileName))
+ {
+ sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss: ") + text);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message);
+ }
+
+ }
+
+ public static void WriteExcel(string name, string str1, string str2, string str3, string flag)
+ {
+
+ string stringpath = resultPath + name + ".csv";
+
+ if (!File.Exists(stringpath))
+ {
+ StringBuilder tile = new StringBuilder();
+
+ tile.Append("Time" + "," + "Row" + "," + "Column" + "," + "Radius");
+ File.AppendAllText(stringpath, tile.ToString());
+ File.AppendAllText(stringpath, "\r\n");
+ }
+
+ StringBuilder Result = new StringBuilder();
+ Result.Append(DateTime.Now.ToString("MM-dd HH:mm:ss"));
+
+
+ Result.Append("," + str1 + "," + str2 + "," + str3 + "," + flag);
+
+ File.AppendAllText(stringpath, Result.ToString());
+ File.AppendAllText(stringpath, "\r\n");
+ }
+ }
+}
diff --git a/LLMF/Program.cs b/LLMF/Program.cs
new file mode 100644
index 0000000..d285f55
--- /dev/null
+++ b/LLMF/Program.cs
@@ -0,0 +1,51 @@
+锘縰sing Microsoft.Win32;
+using SuperDog;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace LLMF
+{
+ static class Program
+ {
+ public const string defaultScope = "<dogscope />";
+ /// <summary>
+ /// 搴旂敤绋嬪簭鐨勪富鍏ュ彛鐐广��
+ /// </summary>
+ [STAThread]
+ static void Main()
+ {
+ DogFeature feature = new DogFeature(1);
+ using (var dog = new Dog(feature))
+ {
+ string vendorcodes = "tn+2bpxTE0MhQDarbNvbJEPpez6LfT6oB2DjZLKQMs0H2ap3YfmDIzYaLqDsZliOKL677L28ZbDhxwdP3Mq2xIbi/5zkXQ7ybvG9HLKaYXN3ql8yY5XJ1WHn7ISI+m7M9t1SzzQaUwnW/NV2VUslx/PdI5hZ1VVwsIaus042E5u8QGCSPJcDOXBeGIJeJSezvM+scip87hDujXsrubV0n+xCAdrTAs/WU5O1JwpgYNArqrFCpYSV4nO5ZveQRcPchUuED+gaNpHfsKZYAtW/43ud3IYcnTg6HuQPo+9fRu8iDpi18+j8USasj6M8EY9g7x3YjwO1DHCPpNEWB3IrHA0rhWG+c2emcCc3q8r8Qx8yHBCAUdZV7F8CTar/co5NbVv3FNObKULZxqrESWkPhoIKBtuCutspoGkTBHger+2A5qtfEMy6ZHt6MRvmgmiIO23AQGQ3yXKHXkq6HsDtrl1P+8coQTFnqopDOGaPi6C+Pb7qIqCJx+IBnWnjuZEfawKMcR+1hB9m1rSfhY+UQ0crh8jYr5a+tOAbSU9tPw3ZmKLQYbm6m8gLAHIv+EOq1rRfH5XxhUUbL4Lv4mrTFcmWl1Ibnaiz7140PqVqaquI8h8Mj4tL/5u/f1iJTKvnUywmPUDZXAecu6FmwDeQpvGJwa+q1Fgn3WXqBitT/lnEox7pp8deMpT/ol0wpcmlU40Cq5XsvnLmbGdK/qcXYBa+ZYhLYnXpzTe4XUDbatIFKfNVwZsSgXaMPpRLghEMQupv/H9uJ2vtlRYjt0ysoFDgzb3W0qr3bK7T55a8bhiptfh/dq7Q5hHZUolRprjXTbcUlmyhjzrH+bAz+BdmwiHJInx/najqyflknUUuOdO8IrMFAh0zWiICkijghbvWUwjg/DTpLKRO2e6hTaWtvCHTBHfBRV0/0EVW0kMmdx/huL1k1BBo11Fv/X7feCskl0m5rot1ubw/T/shAAvVBg==";
+ var status = dog.Login(vendorcodes, defaultScope);
+ if (status != DogStatus.StatusOk)
+ {
+ if (status == DogStatus.TimeError)
+ {
+ MessageBox.Show("绂佹绡℃敼鏃堕棿!");
+ return;
+ }
+ else
+ {
+ MessageBox.Show("璇锋彃鍏ユ湁鏁堢殑鍔犲瘑鐙�!");
+ return;
+ }
+ }
+ }
+
+ System.Threading.Mutex mutex = new System.Threading.Mutex();
+ if (ToolKit.StarterTool.IsExistMutex("LLMF",out mutex ))
+ {
+ MessageBox.Show("绋嬪簭宸插惎鍔紝璇峰嬁閲嶅鍚姩锛�");
+ Application.Exit();
+ return;
+ }
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new frmMain());
+ }
+ }
+}
diff --git a/LLMF/Properties/AssemblyInfo.cs b/LLMF/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..c9fbe60
--- /dev/null
+++ b/LLMF/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+锘縰sing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 鏈夊叧绋嬪簭闆嗙殑甯歌淇℃伅閫氳繃涓嬪垪灞炴�ч泦
+// 鎺у埗銆傛洿鏀硅繖浜涘睘鎬у�煎彲淇敼
+// 涓庣▼搴忛泦鍏宠仈鐨勪俊鎭��
+[assembly: AssemblyTitle("LLMF")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("BroConcentric")]
+[assembly: AssemblyProduct("LLMF")]
+[assembly: AssemblyCopyright("Copyright 漏 BroConcentric 2016")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 灏� ComVisible 璁剧疆涓� false 浣挎绋嬪簭闆嗕腑鐨勭被鍨�
+// 瀵� COM 缁勪欢涓嶅彲瑙併�傚鏋滈渶瑕佷粠 COM 璁块棶姝ょ▼搴忛泦涓殑绫诲瀷锛�
+// 鍒欏皢璇ョ被鍨嬩笂鐨� ComVisible 灞炴�ц缃负 true銆�
+[assembly: ComVisible(false)]
+
+// 濡傛灉姝ら」鐩悜 COM 鍏紑锛屽垯涓嬪垪 GUID 鐢ㄤ簬绫诲瀷搴撶殑 ID
+[assembly: Guid("920ff02f-5730-4f56-9944-d7bfdb85c698")]
+
+// 绋嬪簭闆嗙殑鐗堟湰淇℃伅鐢变笅闈㈠洓涓�肩粍鎴�:
+//
+// 涓荤増鏈�
+// 娆$増鏈�
+// 鍐呴儴鐗堟湰鍙�
+// 淇鍙�
+//
+// 鍙互鎸囧畾鎵�鏈夎繖浜涘�硷紝涔熷彲浠ヤ娇鐢ㄢ�滃唴閮ㄧ増鏈彿鈥濆拰鈥滀慨璁㈠彿鈥濈殑榛樿鍊硷紝
+// 鏂规硶鏄寜濡備笅鎵�绀轰娇鐢ㄢ��*鈥�:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.0.0")]
diff --git a/LLMF/Properties/Resources.Designer.cs b/LLMF/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..535a2bb
--- /dev/null
+++ b/LLMF/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+锘�//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.17929
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace LLMF.Properties {
+ using System;
+
+
+ /// <summary>
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ /// </summary>
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ /// <summary>
+ /// Returns the cached ResourceManager instance used by this class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("LLMF.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/LLMF/Properties/Resources.resx b/LLMF/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/LLMF/Properties/Resources.resx
@@ -0,0 +1,117 @@
+锘�<?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.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: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" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ </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" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ </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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
\ No newline at end of file
diff --git a/LLMF/Properties/Settings.Designer.cs b/LLMF/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..b902679
--- /dev/null
+++ b/LLMF/Properties/Settings.Designer.cs
@@ -0,0 +1,26 @@
+锘�//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.17929
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace LLMF.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/LLMF/Properties/Settings.settings b/LLMF/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/LLMF/Properties/Settings.settings
@@ -0,0 +1,7 @@
+锘�<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+ <Profiles>
+ <Profile Name="(Default)" />
+ </Profiles>
+ <Settings />
+</SettingsFile>
diff --git a/LLMF/RegistryHelper.cs b/LLMF/RegistryHelper.cs
new file mode 100644
index 0000000..aa1c696
--- /dev/null
+++ b/LLMF/RegistryHelper.cs
@@ -0,0 +1,79 @@
+锘縰sing Microsoft.Win32;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace LLMF
+{
+ class RegistryHelper
+ {
+ /// <summary>
+ /// 璇诲彇鎸囧畾鍚嶇О鐨勬敞鍐岃〃鐨勫��
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public string GetRegistryData(RegistryKey root, string subkey, string name)
+ {
+ string registData = "";
+ RegistryKey myKey = root.OpenSubKey(subkey, true);
+ if (myKey != null)
+ {
+ registData = myKey.GetValue(name).ToString();
+ }
+
+ return registData;
+ }
+
+ /// <summary>
+ /// 鍚戞敞鍐岃〃涓啓鏁版嵁
+ /// </summary>
+ /// <param name="name"></param>
+ /// <param name="tovalue"></param>
+ public void SetRegistryData(RegistryKey root, string subkey, string name, string value)
+ {
+ RegistryKey aimdir = root.CreateSubKey(subkey);
+ aimdir.SetValue(name, value);
+ }
+
+ /// <summary>
+ /// 鍒犻櫎娉ㄥ唽琛ㄤ腑鎸囧畾鐨勬敞鍐岃〃椤�
+ /// </summary>
+ /// <param name="name"></param>
+ public void DeleteRegist(RegistryKey root, string subkey, string name)
+ {
+ string[] subkeyNames;
+ RegistryKey myKey = root.OpenSubKey(subkey, true);
+ subkeyNames = myKey.GetSubKeyNames();
+ foreach (string aimKey in subkeyNames)
+ {
+ if (aimKey == name)
+ myKey.DeleteSubKeyTree(name);
+ }
+ }
+
+ /// <summary>
+ /// 鍒ゆ柇鎸囧畾娉ㄥ唽琛ㄩ」鏄惁瀛樺湪
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public bool IsRegistryExist(RegistryKey root, string subkey, string name)
+ {
+ bool _exit = false;
+ string[] valueNames;
+ RegistryKey myKey = root.OpenSubKey(subkey, true);
+ valueNames = myKey.GetValueNames();
+ foreach (string valueName in valueNames)
+ {
+ if (valueName == name)
+ {
+ _exit = true;
+ return _exit;
+ }
+ }
+
+ return _exit;
+ }
+ }
+}
diff --git a/LLMF/Toolkit/ConfigStruct.cs b/LLMF/Toolkit/ConfigStruct.cs
new file mode 100644
index 0000000..843eaf1
--- /dev/null
+++ b/LLMF/Toolkit/ConfigStruct.cs
@@ -0,0 +1,208 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace LLMF
+{
+ #region 杩愯鐘舵��
+ public enum RunStatus
+ {
+ /// <summary>
+ /// 姝e父鐘舵��
+ /// </summary>
+ Normal = 0,
+
+ /// <summary>
+ /// 璋冩暣鐘舵��
+ /// </summary>
+ adjustMent = 1,
+
+ /// <summary>
+ /// 绗竴娆℃媿鐓�
+ /// </summary>
+ firstCapture = 2,
+
+ /// <summary>
+ /// 鏍囧畾
+ /// </summary>
+ calibration = 3,
+
+ /// <summary>
+ /// 鎸佺画鎷嶇収
+ /// </summary>
+ continueCapture = 4,
+
+ /// <summary>
+ /// 娴嬭瘯鐘舵��
+ /// </summary>
+ testMent = 5,
+ }
+ #endregion
+
+ #region OPC Parameters
+ public struct OPCConfig
+ {
+ public string serverName;
+ public string serverIP;
+ public int itmHandleClient;
+ public GroupProperty groupProperty;
+ }
+
+ public struct GroupProperty
+ {
+ public bool defaultGroupIsActive;
+ public int defaultGroupDeadband;
+ public int updateRate;
+ public bool isActive;
+ public bool isSubscribed;
+ }
+ #endregion OPC Parameters
+
+ public struct CamerasConfig
+ {
+ public uint[] SerialNumber;
+ }
+
+ [Serializable]
+ public class ConfigStruct
+ {
+ public string title;
+ public OPCConfig opcConfig;
+ public double angleOffset;
+ public double angleOffset_Left;
+ public CamerasConfig cams;
+ public string password;
+ public double minAngle;
+ public double maxAngle;
+ public int pulsePerDegree;
+ public int pulsePerDegree_Left;
+ public double calAngle;
+ public bool leftUsed;
+ public bool rightUsed;
+ public bool saveImage;
+ public long inch13;
+ public long inch15;
+ public long inch16;
+ public int selectedSizeIndex;
+ }
+
+ #region OPC Tags
+ public class InputTag
+ {
+ /* Command */
+ public const string Alarm = "LLMF.Green.Input.Alarm";
+ public const string Start = "LLMF.Green.Input.Start";
+ public const string Capture = "LLMF.Green.Input.Capture";
+ public const string Position = "LLMF.Green.Input.Position";
+
+ public const string Alarm_left = "LLMF.Left.Input.Alarm";
+ public const string Start_left = "LLMF.Left.Input.Start";
+ public const string Capture_left = "LLMF.Left.Input.Capture";
+ public const string Position_left = "LLMF.Left.Input.Position";
+ //input 鏄剧ず
+ public const string X_JinDian = "LLMF.Green.Input.X_JinDian";
+ public const string Z_JinDian = "LLMF.Green.Input.Z_JinDian";
+ public const string X_Alarm = "LLMF.Green.Input.X_Alarm";
+ public const string Z_Alarm = "LLMF.Green.Input.Z_Alarm";
+
+ public const string X_CW = "LLMF.Green.Input.X_CW";
+ public const string X_CCW = "LLMF.Green.Input.X_CCW";
+ public const string Z_CW = "LLMF.Green.Input.Z_CW";
+ public const string Z_CCW = "LLMF.Green.Input.Z_CCW";
+ public const string DingWei_CW = "LLMF.Green.Input.DingWei_CW";
+ public const string DingWei_CCW = "LLMF.Green.Input.DingWei_CCW";
+ public const string DingWei_JinDian = "LLMF.Green.Input.DingWei_JinDian";
+ public const string DingWei_Alarm = "LLMF.Green.Input.DingWei_Alarm";
+
+
+
+
+ public const string Start1 = "LLMF.Green.Input.Start1";
+ public const string Start2 = "LLMF.Green.Input.Start2";
+ public const string Reset = "LLMF.Green.Input.Reset";
+ public const string E_Stop = "LLMF.Green.Input.E_Stop";
+ public const string SafeCurtain = "LLMF.Green.Input.SafeCurtain";
+ public const string OpenJieJin = "LLMF.Green.Input.OpenJieJin";
+ public const string CeBianQian = "LLMF.Green.Input.CeBianQian";
+ public const string CeBianHou = "LLMF.Green.Input.CeBianHou";
+
+ public const string WuGanQian = "LLMF.Green.Input.WuGanQian";
+ public const string WuGanHou = "LLMF.Green.Input.WuGanHou";
+
+
+ }
+
+ public class OutputTag
+ {
+ /* Command */
+ public const string Move_Distance = "LLMF.Green.Output.Move_Distance";
+ public const string Move = "LLMF.Green.Output.Move";
+ public const string Move_OK = "LLMF.Green.Output.Move_OK";
+ public const string CameraLight = "LLMF.Green.Output.CameraLight";
+ public const string Move_Test = "LLMF.Green.Output.Move_Test";
+ public const string ORI = "LLMF.Green.Output.ORI";
+ public const string CaptureFail_Right = "LLMF.Green.Output.CaptureFail_Right";
+ public const string Start = "LLMF.Green.Output.Start";
+
+ public const string Manual = "LLMF.Green.Output.Manual";
+ public const string qigangjiajin = "LLMF.Green.Output.qigangjiajin";
+ public const string qigangsongkai = "LLMF.Green.Output.qigangsongkai";
+ public const string guanmen = "LLMF.Green.Output.guanmen";
+ public const string kaimen = "LLMF.Green.Output.kaimen";
+ public const string huataiqigang = "LLMF.Green.Output.huataiqigang";
+ public const string songliao = "LLMF.Green.Output.songliao";
+ public const string chuliao = "LLMF.Green.Output.chuliao";
+ public const string shoudongdingwei = "LLMF.Green.Output.shoudongdingwei";
+
+ public const string X_Start = "LLMF.Green.Output.X_Start";
+ public const string X_Work = "LLMF.Green.Output.X_Work";
+ public const string Z_Start = "LLMF.Green.Output.Z_Start";
+ public const string Z_Work = "LLMF.Green.Output.Z_Work";
+
+
+ public const string Move_Distance_left = "LLMF.Left.Output.Move_Distance";
+ public const string Move_left = "LLMF.Left.Output.Move";
+ public const string Move_OK_left = "LLMF.Left.Output.Move_OK";
+ public const string CameraLight_left = "LLMF.Left.Output.CameraLight";
+ public const string Move_Test_left = "LLMF.Left.Output.Move_Test";
+ public const string ORI_left = "LLMF.Left.Output.ORI";
+ public const string CaptureFail_left = "LLMF.Left.Output.CaptureFail_Left";
+ public const string Start_left = "LLMF.Left.Output.Start";
+
+ public const string Manual_left = "LLMF.Left.Output.Manual";
+ public const string qigangjiajin_left = "LLMF.Left.Output.qigangjiajin";
+ public const string qigangsongkai_left = "LLMF.Left.Output.qigangsongkai";
+ public const string guanmen_left = "LLMF.Left.Output.guanmen";
+ public const string kaimen_left = "LLMF.Left.Output.kaimen";
+ public const string huataiqigang_left = "LLMF.Left.Output.huataiqigang";
+ public const string songliao_left = "LLMF.Left.Output.songliao";
+ public const string chuliao_left = "LLMF.Left.Output.chuliao";
+ public const string shoudongdingwei_left = "LLMF.Left.Output.shoudongdingwei";
+
+ public const string X_Start_left = "LLMF.Left.Output.X_Start";
+ public const string X_Work_left = "LLMF.Left.Output.X_Work";
+ public const string Z_Start_left = "LLMF.Left.Output.Z_Start";
+ public const string Z_Work_left = "LLMF.Left.Output.Z_Work";
+ //Output鏄剧ず
+ public const string Red = "LLMF.Green.Output.Red";
+ public const string Yellow = "LLMF.Green.Output.Yellow";
+ public const string Green = "LLMF.Green.Output.Green";
+ public const string Buzzer = "LLMF.Green.Output.Buzzer";
+ public const string CeBianCylider = "LLMF.Green.Output.CeBianCylider";
+ public const string ZhengBianCylider = "LLMF.Green.Output.ZhengBianCylider";
+ public const string WuGanCylider = "LLMF.Green.Output.WuGanCylider";
+ public const string HuaTaiCylider = "LLMF.Green.Output.HuaTaiCylider";
+ public const string SiFuPowerOn = "LLMF.Green.Output.SiFuPowerOn";
+
+ public const string X_SRV_ON = "LLMF.Green.Output.X_SRV_ON";
+ public const string Z_SRV_ON = "LLMF.Green.Output.Z_SRV_ON";
+ public const string DingWei_SRV_ON = "LLMF.Green.Output.DingWei_SRV_ON";
+ public const string Z_ShaChe = "LLMF.Green.Output.Z_ShaChe";
+ public const string ForApple = "LLMF.Green.Output.ForApple";
+ public const string CameraLighto = "LLMF.Green.Output.CameraLighto";
+ public const string WuGanCylider2 = "LLMF.Green.Output.WuGanCylider2";
+ }
+
+ #endregion OPC Tags
+}
diff --git a/LLMF/Toolkit/OPC.cs b/LLMF/Toolkit/OPC.cs
new file mode 100644
index 0000000..8766f6d
--- /dev/null
+++ b/LLMF/Toolkit/OPC.cs
@@ -0,0 +1,483 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using OPCAutomation;
+using EventTool;
+
+namespace LLMF
+{
+ public class OPC
+ {
+ public const int TransIDMainform = 2012;
+ public const int TransIDSetttings = 2013;
+ public const int ReadTagNum = 3;
+
+ private OPCServer opcServer;
+ private OPCGroups opcGroups;
+ public OPCGroup opcReadGroup;
+ public OPCGroup opcWriteGroup;
+ public OPCGroup opcRobotGroup;
+
+ private int itmHandleClient;
+ private string serverIP;
+ private string serverName;
+ private GroupProperty groupProperty;
+
+ public ListenEventCreater listenEventCreater;
+
+ public class Item
+ {
+ public string name;
+ public int clientHandle;
+ public int serverHandle;
+ public object value;
+ public Control control;
+ public string onText;
+ public string offText;
+
+ //鎶ヨ鐘舵��
+ public AlarmState alarmState;
+ }
+
+ public Dictionary<string, Item> itemReadDict;
+ public Dictionary<string, Item> itemWriteDict;
+ public Dictionary<string, Item> itemRobotDict;
+
+ public OPC(OPCConfig opcConfig)
+ {
+ serverIP = opcConfig.serverIP;
+ serverName = opcConfig.serverName;
+ itmHandleClient = opcConfig.itmHandleClient;
+ groupProperty = opcConfig.groupProperty;
+ }
+
+ public enum AlarmState
+ {
+ Ready,
+ NReady,
+ Alarm,
+ Warning
+ }
+
+ /// <summary>
+ /// 杩炴帴OPC鏈嶅姟鍣�
+ /// </summary>
+ public bool Connect()
+ {
+ try
+ {
+ opcServer = new OPCServer();
+ opcServer.Connect(serverName, serverIP);
+ if (opcServer.ServerState == (int) OPCServerState.OPCRunning)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ catch (Exception err)
+ {
+ MessageBox.Show("杩炴帴 OPC-Server 鍑虹幇閿欒锛�" + err.Message, "鎻愮ず淇℃伅", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return false;
+ }
+ }
+
+ /// <summary>
+ /// 鍒楀嚭OPC鏈嶅姟鍣ㄤ腑鎵�鏈塗ag 骞跺姞鍏ュ埌opcBrowser涓�
+ /// </summary>
+ /// <param name="opcBrowser"></param>
+ private void RecurBrowse(OPCBrowser opcBrowser)
+ {
+ //灞曞紑鍒嗘敮
+ opcBrowser.ShowBranches();
+ //灞曞紑鍙跺瓙
+ opcBrowser.ShowLeafs(true);
+ // 鍒濆鍖杋tem鍒楄〃
+ itemReadDict = new Dictionary<string, Item>();
+ itemWriteDict = new Dictionary<string, Item>();
+ itemRobotDict = new Dictionary<string, Item>();
+
+ foreach (object turn in opcBrowser)
+ {
+ Item item = new Item();
+
+ item.name = turn.ToString();
+ if (turn.ToString().Contains("Input"))
+ {
+ itemReadDict.Add(item.name, item);
+ }
+ else if (turn.ToString().Contains("Output"))
+ {
+ itemWriteDict.Add(item.name, item);
+ }
+ }
+ }
+
+ /// <summary>
+ /// 鏁版嵁鏀瑰彉鏃惰繍琛�
+ /// </summary>
+ /// <param name="TransactionID"></param>
+ /// <param name="NumItems"></param>
+ /// <param name="ClientHandles"></param>
+ /// <param name="ItemValues"></param>
+ /// <param name="Qualities"></param>
+ /// <param name="TimeStamps"></param>
+ private void opcReadGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
+ {
+ for (int i = 1; i <= NumItems; i++)
+ {
+ foreach (Item item in itemReadDict.Values)
+ {
+ if (item.clientHandle == Convert.ToInt32(ClientHandles.GetValue(i)))
+ {
+ itemReadDict[item.name].value = Convert.ToInt32(ItemValues.GetValue(i));
+ string state = item.name; // 鏀瑰彉鐨刬tem鐨勫悕绉�
+ item.value = ItemValues.GetValue(i);
+ listenEventCreater.ChangeValue(new EventData(item));
+ switch (state)
+ {
+
+ //I/O鐣岄潰杈撳叆鏄剧ず
+ case InputTag.X_JinDian:
+ case InputTag.Z_JinDian:
+
+ case InputTag.X_CW:
+ case InputTag.X_CCW:
+ case InputTag.Z_CW:
+ case InputTag.Z_CCW:
+ case InputTag.DingWei_CW:
+ case InputTag.DingWei_CCW:
+ case InputTag.DingWei_JinDian:
+
+ case InputTag.Reset:
+
+
+ case InputTag.OpenJieJin:
+ case InputTag.CeBianQian:
+ case InputTag.CeBianHou:
+ case InputTag.WuGanQian:
+ case InputTag.WuGanHou:
+ SignalSensorAndElse(item,true);
+ break; //浼犳劅鍣ㄣ�佽酱鍜屽叾浠栦俊鍙�
+ case InputTag.Start1:
+ case InputTag.Start2:
+ SignalSensorAndElse(item, false);
+ break; //浼犳劅鍣ㄣ�佽酱鍜屽叾浠栦俊鍙�
+ case InputTag.X_Alarm:
+ case InputTag.Z_Alarm:
+ case InputTag.E_Stop:
+ case InputTag.SafeCurtain:
+ case InputTag.DingWei_Alarm:
+ SignalAlarm(item);
+ break; //鎶ヨ淇″彿
+
+ }
+ }
+ }
+ }
+ }
+ public void SignalSensorAndElse(Item item, bool IsPlus)
+ {
+ if (item.control != null)
+ {
+ if (IsPlus)
+ {
+ if (Convert.ToBoolean(item.value))
+ {
+ item.control.BackColor = System.Drawing.Color.Green;
+ }
+ else
+ {
+ item.control.BackColor = System.Drawing.Color.Gray;
+ }
+ }
+ else
+ {
+ if (Convert.ToBoolean(item.value))
+ {
+ item.control.BackColor = System.Drawing.Color.Gray;
+ }
+ else
+ {
+ item.control.BackColor = System.Drawing.Color.Green;
+ }
+
+ }
+ }
+ }
+ public void SignalAlarm(Item item)
+ {
+ if (item.control != null)
+ {
+
+ if (Convert.ToBoolean(item.value))
+ {
+ item.control.BackColor = System.Drawing.Color.Gray;
+ }
+ else
+ {
+ item.control.BackColor = System.Drawing.Color.Red;
+ }
+ }
+
+ }
+ private void opcRobotGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
+ {
+ for (int i = 1; i <= NumItems; i++)
+ {
+ foreach (Item item in itemRobotDict.Values)
+ {
+ if (item.clientHandle == Convert.ToInt32(ClientHandles.GetValue(i)))
+ {
+ itemRobotDict[item.name].value = Convert.ToInt32(ItemValues.GetValue(i));
+ string state = item.name; // 鏀瑰彉鐨刬tem鐨勫悕绉�
+ item.value = ItemValues.GetValue(i);
+ listenEventCreater.ChangeValue(new EventData(item));
+ }
+ }
+ }
+ }
+
+ private void opcWriteGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
+ {
+ for (int i = 1; i <= NumItems; i++)
+ {
+ foreach (Item item in itemWriteDict.Values)
+ {
+ if (item.clientHandle == Convert.ToInt32(ClientHandles.GetValue(i)))
+ {
+ itemWriteDict[item.name].value = Convert.ToInt32(ItemValues.GetValue(i));
+ item.value = ItemValues.GetValue(i);
+ listenEventCreater.ChangeValue(new EventData(item));
+ string state = item.name; // 鏀瑰彉鐨刬tem鐨勫悕绉�
+ switch (state)
+ {
+ //I/O鐣岄潰杈撳嚭鏄剧ず
+ case OutputTag.Red:
+ case OutputTag.Yellow:
+ case OutputTag.Green:
+ case OutputTag.Buzzer:
+ case OutputTag.CeBianCylider:
+ case OutputTag.ZhengBianCylider:
+ case OutputTag.WuGanCylider:
+ case OutputTag.HuaTaiCylider
+:
+ case OutputTag.SiFuPowerOn:
+ case OutputTag.X_SRV_ON:
+ case OutputTag.Z_SRV_ON:
+ case OutputTag.DingWei_SRV_ON
+:
+
+ case OutputTag.Z_ShaChe:
+ case OutputTag.ForApple
+:
+ case OutputTag.CameraLighto:
+ case OutputTag.WuGanCylider2:
+
+ SignalSensorAndElse(item, true);
+ break;
+ }
+
+ }
+ }
+ }
+
+ }
+
+ /// <summary>
+ /// 鍒涘缓Group
+ /// </summary>
+ /// <returns></returns>
+ public bool CreateGroup()
+ {
+ try
+ {
+ OPCBrowser browser = opcServer.CreateBrowser();
+ RecurBrowse(browser); // 寤虹珛璇诲瓧鍏稿拰鍐欏瓧鍏�
+
+ opcGroups = opcServer.OPCGroups;
+ opcReadGroup = opcGroups.Add("ReadGroup");
+ opcWriteGroup = opcGroups.Add("WriteGroup");
+ opcRobotGroup = opcGroups.Add("RobotGroup");
+
+ /* 璁剧疆鐩戝惉鐩稿叧灞炴�� */
+ SetGroupProperty(opcReadGroup);
+ SetGroupProperty(opcWriteGroup);
+ SetGroupProperty(opcRobotGroup);
+
+ listenEventCreater = new ListenEventCreater(); // 鍒濆鍖栫洃鍚�
+ opcReadGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(opcReadGroup_DataChange); // 璇诲尯鍩熸暟鎹彉鍖�
+ opcWriteGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(opcWriteGroup_DataChange); // 鍐欏尯鍩熸暟鎹彉鍖�
+
+ /* 璁剧疆handles */
+ SetHandles(opcReadGroup, itemReadDict);
+ SetHandles(opcWriteGroup, itemWriteDict);
+ }
+ catch (Exception err)
+ {
+ MessageBox.Show("鍒涘缓缁勫嚭鐜伴敊璇細" + err.Message, "鎻愮ず淇℃伅", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return false;
+ }
+ return true;
+ }
+
+
+ /// <summary>
+ /// 璁剧疆灞炴��
+ /// </summary>
+ private void SetGroupProperty(OPCGroup opcGroup)
+ {
+ opcServer.OPCGroups.DefaultGroupIsActive = groupProperty.defaultGroupIsActive;
+ opcServer.OPCGroups.DefaultGroupDeadband = groupProperty.defaultGroupDeadband;
+ opcGroup.UpdateRate = groupProperty.updateRate;
+ opcGroup.IsActive = groupProperty.isActive;
+ opcGroup.IsSubscribed = groupProperty.isSubscribed;
+ }
+
+ /// <summary>
+ /// 璁剧疆ClientHandles鍜孲erverHandles
+ /// </summary>
+ /// <param name="opcGroup"></param>
+ /// <returns></returns>
+ public bool SetHandles(OPCGroup opcGroup, Dictionary<string, Item> itemDict)
+ {
+
+ OPCItems opcItems;
+ OPCItem opcItem;
+
+ opcItems = opcGroup.OPCItems;
+
+ foreach (var item in itemDict.Values)
+ {
+ item.clientHandle = itmHandleClient;
+ itmHandleClient++;
+ opcItem = opcItems.AddItem(item.name, item.clientHandle);
+ item.serverHandle = opcItem.ServerHandle;
+ }
+
+ return true;
+ }
+
+ /// <summary>
+ /// 寮傛鍐�
+ /// </summary>
+ /// <param name="name"></param>
+ /// <param name="value"></param>
+ /// <returns></returns>
+ public bool Write(string name, object value)
+ {
+ Array serverHandles = new int[2] { 0, itemWriteDict[name].serverHandle};
+ Array values; // = new object[2] { "", value.ToString()};
+ Array Errors;
+ int cancelID;
+
+ values = new object[2] { "", value.ToString()};
+
+ opcWriteGroup.AsyncWrite(1, ref serverHandles, ref values, out Errors, TransIDMainform, out cancelID);
+ //KepItem.Write(txtWriteTagValue.Text);//杩欏彞涔熷彲浠ュ啓鍏ワ紝浣嗗苟涓嶈Е鍙戝啓鍏ヤ簨浠�
+
+ GC.Collect();
+
+ return true;
+ }
+
+ public bool Write(string name, object value, ref string warning)
+ {
+ Array serverHandles = new int[2] { 0, itemWriteDict[name].serverHandle };
+ Array values = new object[2] { "", value.ToString() };
+ Array Errors;
+ int cancelID;
+
+ try
+ {
+ opcWriteGroup.AsyncWrite(1, ref serverHandles, ref values, out Errors, TransIDMainform, out cancelID);
+ //KepItem.Write(txtWriteTagValue.Text);//杩欏彞涔熷彲浠ュ啓鍏ワ紝浣嗗苟涓嶈Е鍙戝啓鍏ヤ簨浠�
+ }
+ catch (Exception e)
+ {
+ warning = e.Message;
+
+ GC.Collect();
+ return false;
+ }
+
+ GC.Collect();
+ return true;
+ }
+
+ public bool Write(OPCGroup group, int handle, object value, ref string warning)
+ {
+ Array serverHandles = new int[2] { 0, handle };
+ Array values = new object[2] { "", value.ToString() };
+ Array Errors;
+ int cancelID;
+
+ try
+ {
+ group.AsyncWrite(1, ref serverHandles, ref values, out Errors, TransIDMainform, out cancelID);
+ //KepItem.Write(txtWriteTagValue.Text);//杩欏彞涔熷彲浠ュ啓鍏ワ紝浣嗗苟涓嶈Е鍙戝啓鍏ヤ簨浠�
+ }
+ catch (Exception e)
+ {
+ warning = e.Message;
+
+ GC.Collect();
+ return false;
+ }
+
+ GC.Collect();
+ return true;
+ }
+
+ public bool ReadOneItem_Wrapper(string name, ref object result)
+ {
+ Item item;
+
+ if (itemReadDict.ContainsKey(name))
+ {
+ item = itemReadDict[name];
+ ReadOneItem(ref item, opcReadGroup);
+ result = item.value;
+ itemReadDict[name].value = result;
+ }
+ else if (itemWriteDict.ContainsKey(name))
+ {
+ item = itemWriteDict[name];
+ ReadOneItem(ref item, opcWriteGroup);
+ result = item.value;
+ itemWriteDict[name].value = result;
+ }
+ else
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public bool ReadOneItem(ref Item item, OPCGroup opcGroup)
+ {
+ Array serverHandles;
+ Array values;
+ Array errors;
+ object qualities;
+ object timeStamps;
+
+ serverHandles = new int[2] { 0, item.serverHandle };
+ opcGroup.SyncRead(1, 1, ref serverHandles, out values, out errors, out qualities, out timeStamps);
+ item.value = values.GetValue(1);
+
+ GC.Collect();
+
+ return true;
+ }
+
+ internal void Close()
+ {
+ opcServer.Disconnect();
+ }
+
+ }
+}
diff --git a/LLMF/Toolkit/StarterTool.cs b/LLMF/Toolkit/StarterTool.cs
new file mode 100644
index 0000000..beef772
--- /dev/null
+++ b/LLMF/Toolkit/StarterTool.cs
@@ -0,0 +1,33 @@
+锘縰sing System.Diagnostics;
+using System.Threading;
+
+namespace LLMF
+{
+ public class StarterTool
+ {
+ public static bool IsExistMutex(string mutexName, out Mutex mutex)
+ {
+ bool flag;
+ mutex = new Mutex(true, mutexName, out flag);
+ return !flag;
+ }
+
+ public static bool IsSingle()
+ {
+ return (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length <= 1);
+ }
+
+ public static void PowerWait(string[] args)
+ {
+ if ((((args != null) && (args.Length > 1)) && args[0].ToUpper().Equals("-S")) && (args[1] != null))
+ {
+ int result = 0;
+ if (int.TryParse(args[1], out result) && (result > 0))
+ {
+ Thread.Sleep((int) (result * 0x3e8));
+ }
+ }
+ }
+ }
+}
+
diff --git a/LLMF/WelcomeUser.Designer.cs b/LLMF/WelcomeUser.Designer.cs
new file mode 100644
index 0000000..18aca2b
--- /dev/null
+++ b/LLMF/WelcomeUser.Designer.cs
@@ -0,0 +1,66 @@
+锘縩amespace LLMF
+{
+ partial class WelcomeUser
+ {
+ /// <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(WelcomeUser));
+ this.label1 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Font = new System.Drawing.Font("瀹嬩綋", 21.75F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label1.ForeColor = System.Drawing.Color.Red;
+ this.label1.Location = new System.Drawing.Point(23, 196);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(403, 29);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "绋嬪簭姝e湪鍚姩涓紝璇风◢鍚庘�︹��";
+ //
+ // WelcomeUser
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage")));
+ this.ClientSize = new System.Drawing.Size(449, 323);
+ this.Controls.Add(this.label1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+ this.Name = "WelcomeUser";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "WelcomeUser";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ }
+}
\ No newline at end of file
diff --git a/LLMF/WelcomeUser.cs b/LLMF/WelcomeUser.cs
new file mode 100644
index 0000000..85e010c
--- /dev/null
+++ b/LLMF/WelcomeUser.cs
@@ -0,0 +1,19 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace LLMF
+{
+ public partial class WelcomeUser : Form
+ {
+ public WelcomeUser()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/LLMF/WelcomeUser.resx b/LLMF/WelcomeUser.resx
new file mode 100644
index 0000000..e15616d
--- /dev/null
+++ b/LLMF/WelcomeUser.resx
@@ -0,0 +1,2544 @@
+锘�<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="$this.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ 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
+ AElFTkSuQmCC
+</value>
+ </data>
+</root>
\ No newline at end of file
diff --git a/LLMF/app.config b/LLMF/app.config
new file mode 100644
index 0000000..c5e1dae
--- /dev/null
+++ b/LLMF/app.config
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup></configuration>
diff --git a/LLMF/frmConfig.Designer.cs b/LLMF/frmConfig.Designer.cs
new file mode 100644
index 0000000..ea4e442
--- /dev/null
+++ b/LLMF/frmConfig.Designer.cs
@@ -0,0 +1,421 @@
+锘縩amespace LLMF
+{
+ partial class frmConfig
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.tabControl1 = new System.Windows.Forms.TabControl();
+ this.tabPage1 = new System.Windows.Forms.TabPage();
+ this.btnSet = new System.Windows.Forms.Button();
+ this.txtConfigPulsePerDegree = new System.Windows.Forms.TextBox();
+ this.label4 = new System.Windows.Forms.Label();
+ this.txtConfigCalAngle = new System.Windows.Forms.TextBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.txtConfigMaxAngle = new System.Windows.Forms.TextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.txtConfigMinAngle = new System.Windows.Forms.TextBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.tabPage2 = new System.Windows.Forms.TabPage();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.txtZwork_Read = new System.Windows.Forms.TextBox();
+ this.txtZstart_Read = new System.Windows.Forms.TextBox();
+ this.btnZwork = new System.Windows.Forms.Button();
+ this.btnZstart = new System.Windows.Forms.Button();
+ this.txtZwork = new System.Windows.Forms.TextBox();
+ this.txtZstart = new System.Windows.Forms.TextBox();
+ this.label8 = new System.Windows.Forms.Label();
+ this.label7 = new System.Windows.Forms.Label();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.txtXwork_Read = new System.Windows.Forms.TextBox();
+ this.txtXstart_Read = new System.Windows.Forms.TextBox();
+ this.btnXwork = new System.Windows.Forms.Button();
+ this.btnXstart = new System.Windows.Forms.Button();
+ this.txtXwork = new System.Windows.Forms.TextBox();
+ this.txtXstart = new System.Windows.Forms.TextBox();
+ this.label6 = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.tabControl1.SuspendLayout();
+ this.tabPage1.SuspendLayout();
+ this.tabPage2.SuspendLayout();
+ this.groupBox2.SuspendLayout();
+ this.groupBox1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // tabControl1
+ //
+ this.tabControl1.Controls.Add(this.tabPage1);
+ this.tabControl1.Controls.Add(this.tabPage2);
+ this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tabControl1.Location = new System.Drawing.Point(0, 0);
+ this.tabControl1.Name = "tabControl1";
+ this.tabControl1.SelectedIndex = 0;
+ this.tabControl1.Size = new System.Drawing.Size(257, 316);
+ this.tabControl1.TabIndex = 0;
+ //
+ // tabPage1
+ //
+ this.tabPage1.Controls.Add(this.btnSet);
+ this.tabPage1.Controls.Add(this.txtConfigPulsePerDegree);
+ this.tabPage1.Controls.Add(this.label4);
+ this.tabPage1.Controls.Add(this.txtConfigCalAngle);
+ this.tabPage1.Controls.Add(this.label3);
+ this.tabPage1.Controls.Add(this.txtConfigMaxAngle);
+ this.tabPage1.Controls.Add(this.label2);
+ this.tabPage1.Controls.Add(this.txtConfigMinAngle);
+ this.tabPage1.Controls.Add(this.label1);
+ this.tabPage1.Location = new System.Drawing.Point(4, 22);
+ this.tabPage1.Name = "tabPage1";
+ this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPage1.Size = new System.Drawing.Size(249, 290);
+ this.tabPage1.TabIndex = 0;
+ this.tabPage1.Text = "鍙傛暟";
+ this.tabPage1.UseVisualStyleBackColor = true;
+ //
+ // btnSet
+ //
+ this.btnSet.Location = new System.Drawing.Point(167, 353);
+ this.btnSet.Name = "btnSet";
+ this.btnSet.Size = new System.Drawing.Size(61, 38);
+ this.btnSet.TabIndex = 8;
+ this.btnSet.Text = "璁惧畾";
+ this.btnSet.UseVisualStyleBackColor = true;
+ this.btnSet.Click += new System.EventHandler(this.btnSet_Click);
+ //
+ // txtConfigPulsePerDegree
+ //
+ this.txtConfigPulsePerDegree.Location = new System.Drawing.Point(128, 150);
+ this.txtConfigPulsePerDegree.Name = "txtConfigPulsePerDegree";
+ this.txtConfigPulsePerDegree.Size = new System.Drawing.Size(100, 21);
+ this.txtConfigPulsePerDegree.TabIndex = 7;
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(23, 150);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(77, 12);
+ this.label4.TabIndex = 6;
+ this.label4.Text = "姣徛扮殑鑴夊啿鏁�";
+ //
+ // txtConfigCalAngle
+ //
+ this.txtConfigCalAngle.Location = new System.Drawing.Point(128, 107);
+ this.txtConfigCalAngle.Name = "txtConfigCalAngle";
+ this.txtConfigCalAngle.Size = new System.Drawing.Size(100, 21);
+ this.txtConfigCalAngle.TabIndex = 5;
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(23, 110);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(53, 12);
+ this.label3.TabIndex = 4;
+ this.label3.Text = "鏍囧畾瑙掑害";
+ //
+ // txtConfigMaxAngle
+ //
+ this.txtConfigMaxAngle.Location = new System.Drawing.Point(128, 65);
+ this.txtConfigMaxAngle.Name = "txtConfigMaxAngle";
+ this.txtConfigMaxAngle.Size = new System.Drawing.Size(100, 21);
+ this.txtConfigMaxAngle.TabIndex = 3;
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(23, 68);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(53, 12);
+ this.label2.TabIndex = 2;
+ this.label2.Text = "鏈�澶ц搴�";
+ //
+ // txtConfigMinAngle
+ //
+ this.txtConfigMinAngle.Location = new System.Drawing.Point(128, 22);
+ this.txtConfigMinAngle.Name = "txtConfigMinAngle";
+ this.txtConfigMinAngle.Size = new System.Drawing.Size(100, 21);
+ this.txtConfigMinAngle.TabIndex = 1;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(23, 25);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(53, 12);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "鏈�灏忚搴�";
+ //
+ // tabPage2
+ //
+ this.tabPage2.Controls.Add(this.groupBox2);
+ this.tabPage2.Controls.Add(this.groupBox1);
+ this.tabPage2.Location = new System.Drawing.Point(4, 22);
+ this.tabPage2.Name = "tabPage2";
+ this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPage2.Size = new System.Drawing.Size(249, 290);
+ this.tabPage2.TabIndex = 1;
+ this.tabPage2.Text = "PLC";
+ this.tabPage2.UseVisualStyleBackColor = true;
+ //
+ // groupBox2
+ //
+ this.groupBox2.Controls.Add(this.txtZwork_Read);
+ this.groupBox2.Controls.Add(this.txtZstart_Read);
+ this.groupBox2.Controls.Add(this.btnZwork);
+ this.groupBox2.Controls.Add(this.btnZstart);
+ this.groupBox2.Controls.Add(this.txtZwork);
+ this.groupBox2.Controls.Add(this.txtZstart);
+ this.groupBox2.Controls.Add(this.label8);
+ this.groupBox2.Controls.Add(this.label7);
+ this.groupBox2.Location = new System.Drawing.Point(7, 138);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(225, 138);
+ this.groupBox2.TabIndex = 17;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "Z杞�";
+ //
+ // txtZwork_Read
+ //
+ this.txtZwork_Read.Location = new System.Drawing.Point(81, 64);
+ this.txtZwork_Read.Name = "txtZwork_Read";
+ this.txtZwork_Read.ReadOnly = true;
+ this.txtZwork_Read.Size = new System.Drawing.Size(73, 21);
+ this.txtZwork_Read.TabIndex = 15;
+ this.txtZwork_Read.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
+ //
+ // txtZstart_Read
+ //
+ this.txtZstart_Read.Location = new System.Drawing.Point(81, 16);
+ this.txtZstart_Read.Name = "txtZstart_Read";
+ this.txtZstart_Read.ReadOnly = true;
+ this.txtZstart_Read.Size = new System.Drawing.Size(73, 21);
+ this.txtZstart_Read.TabIndex = 14;
+ this.txtZstart_Read.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
+ //
+ // btnZwork
+ //
+ this.btnZwork.Location = new System.Drawing.Point(160, 84);
+ this.btnZwork.Name = "btnZwork";
+ this.btnZwork.Size = new System.Drawing.Size(52, 21);
+ this.btnZwork.TabIndex = 11;
+ this.btnZwork.Text = "璁惧畾";
+ this.btnZwork.UseVisualStyleBackColor = true;
+ this.btnZwork.Click += new System.EventHandler(this.btnZwork_Click);
+ //
+ // btnZstart
+ //
+ this.btnZstart.Location = new System.Drawing.Point(160, 38);
+ this.btnZstart.Name = "btnZstart";
+ this.btnZstart.Size = new System.Drawing.Size(52, 21);
+ this.btnZstart.TabIndex = 10;
+ this.btnZstart.Text = "璁惧畾";
+ this.btnZstart.UseVisualStyleBackColor = true;
+ this.btnZstart.Click += new System.EventHandler(this.btnZstart_Click);
+ //
+ // txtZwork
+ //
+ this.txtZwork.Location = new System.Drawing.Point(81, 88);
+ this.txtZwork.Name = "txtZwork";
+ this.txtZwork.Size = new System.Drawing.Size(73, 21);
+ this.txtZwork.TabIndex = 7;
+ this.txtZwork.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
+ //
+ // txtZstart
+ //
+ this.txtZstart.Location = new System.Drawing.Point(81, 40);
+ this.txtZstart.Name = "txtZstart";
+ this.txtZstart.Size = new System.Drawing.Size(73, 21);
+ this.txtZstart.TabIndex = 6;
+ this.txtZstart.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.Location = new System.Drawing.Point(1, 66);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(71, 12);
+ this.label8.TabIndex = 3;
+ this.label8.Text = "Z杞村伐浣滀綅缃�";
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.Location = new System.Drawing.Point(1, 18);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(71, 12);
+ this.label7.TabIndex = 2;
+ this.label7.Text = "Z杞村垵濮嬩綅缃�";
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.txtXwork_Read);
+ this.groupBox1.Controls.Add(this.txtXstart_Read);
+ this.groupBox1.Controls.Add(this.btnXwork);
+ this.groupBox1.Controls.Add(this.btnXstart);
+ this.groupBox1.Controls.Add(this.txtXwork);
+ this.groupBox1.Controls.Add(this.txtXstart);
+ this.groupBox1.Controls.Add(this.label6);
+ this.groupBox1.Controls.Add(this.label5);
+ this.groupBox1.Location = new System.Drawing.Point(8, 13);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(225, 117);
+ this.groupBox1.TabIndex = 16;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "X杞�";
+ //
+ // txtXwork_Read
+ //
+ this.txtXwork_Read.Location = new System.Drawing.Point(86, 60);
+ this.txtXwork_Read.Name = "txtXwork_Read";
+ this.txtXwork_Read.ReadOnly = true;
+ this.txtXwork_Read.Size = new System.Drawing.Size(73, 21);
+ this.txtXwork_Read.TabIndex = 13;
+ this.txtXwork_Read.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
+ //
+ // txtXstart_Read
+ //
+ this.txtXstart_Read.Location = new System.Drawing.Point(86, 12);
+ this.txtXstart_Read.Name = "txtXstart_Read";
+ this.txtXstart_Read.ReadOnly = true;
+ this.txtXstart_Read.Size = new System.Drawing.Size(73, 21);
+ this.txtXstart_Read.TabIndex = 12;
+ this.txtXstart_Read.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
+ //
+ // btnXwork
+ //
+ this.btnXwork.Location = new System.Drawing.Point(165, 82);
+ this.btnXwork.Name = "btnXwork";
+ this.btnXwork.Size = new System.Drawing.Size(52, 21);
+ this.btnXwork.TabIndex = 9;
+ this.btnXwork.Text = "璁惧畾";
+ this.btnXwork.UseVisualStyleBackColor = true;
+ this.btnXwork.Click += new System.EventHandler(this.btnXwork_Click);
+ //
+ // btnXstart
+ //
+ this.btnXstart.Location = new System.Drawing.Point(165, 34);
+ this.btnXstart.Name = "btnXstart";
+ this.btnXstart.Size = new System.Drawing.Size(52, 21);
+ this.btnXstart.TabIndex = 8;
+ this.btnXstart.Text = "璁惧畾";
+ this.btnXstart.UseVisualStyleBackColor = true;
+ this.btnXstart.Click += new System.EventHandler(this.btnXstart_Click);
+ //
+ // txtXwork
+ //
+ this.txtXwork.Location = new System.Drawing.Point(86, 84);
+ this.txtXwork.Name = "txtXwork";
+ this.txtXwork.Size = new System.Drawing.Size(73, 21);
+ this.txtXwork.TabIndex = 5;
+ this.txtXwork.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
+ //
+ // txtXstart
+ //
+ this.txtXstart.Location = new System.Drawing.Point(86, 36);
+ this.txtXstart.Name = "txtXstart";
+ this.txtXstart.Size = new System.Drawing.Size(73, 21);
+ this.txtXstart.TabIndex = 4;
+ this.txtXstart.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
+ //
+ // label6
+ //
+ this.label6.AutoSize = true;
+ this.label6.Location = new System.Drawing.Point(6, 63);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(71, 12);
+ this.label6.TabIndex = 1;
+ this.label6.Text = "X杞村伐浣滀綅缃�";
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(6, 15);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(71, 12);
+ this.label5.TabIndex = 0;
+ this.label5.Text = "X杞村垵濮嬩綅缃�";
+ //
+ // frmConfig
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(257, 316);
+ this.Controls.Add(this.tabControl1);
+ this.MaximizeBox = false;
+ this.MaximumSize = new System.Drawing.Size(273, 354);
+ this.MinimizeBox = false;
+ this.MinimumSize = new System.Drawing.Size(273, 354);
+ this.Name = "frmConfig";
+ this.Text = "frmConfig";
+ this.Load += new System.EventHandler(this.frmConfig_Load);
+ this.tabControl1.ResumeLayout(false);
+ this.tabPage1.ResumeLayout(false);
+ this.tabPage1.PerformLayout();
+ this.tabPage2.ResumeLayout(false);
+ this.groupBox2.ResumeLayout(false);
+ this.groupBox2.PerformLayout();
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TabControl tabControl1;
+ private System.Windows.Forms.TabPage tabPage1;
+ private System.Windows.Forms.TabPage tabPage2;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.TextBox txtConfigMaxAngle;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.TextBox txtConfigMinAngle;
+ private System.Windows.Forms.TextBox txtConfigCalAngle;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.TextBox txtConfigPulsePerDegree;
+ private System.Windows.Forms.Button btnSet;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.TextBox txtZwork;
+ private System.Windows.Forms.TextBox txtZstart;
+ private System.Windows.Forms.TextBox txtXwork;
+ private System.Windows.Forms.TextBox txtXstart;
+ private System.Windows.Forms.Button btnZwork;
+ private System.Windows.Forms.Button btnZstart;
+ private System.Windows.Forms.Button btnXwork;
+ private System.Windows.Forms.Button btnXstart;
+ private System.Windows.Forms.TextBox txtZwork_Read;
+ private System.Windows.Forms.TextBox txtZstart_Read;
+ private System.Windows.Forms.TextBox txtXwork_Read;
+ private System.Windows.Forms.TextBox txtXstart_Read;
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.GroupBox groupBox1;
+
+ }
+}
\ No newline at end of file
diff --git a/LLMF/frmConfig.cs b/LLMF/frmConfig.cs
new file mode 100644
index 0000000..d793671
--- /dev/null
+++ b/LLMF/frmConfig.cs
@@ -0,0 +1,188 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using ToolKit.FileToolkit;
+
+namespace LLMF
+{
+ public partial class frmConfig : Form
+ {
+ OPC opc;
+ ConfigStruct config;
+ SerializeFileTool<ConfigStruct> sft = new SerializeFileTool<ConfigStruct>();
+ string configPath = Application.StartupPath + "\\Config.xml";
+
+ string leftORright;
+
+ public frmConfig(OPC opc,ConfigStruct config,string leftORright)
+ {
+ InitializeComponent();
+ this.opc = opc;
+ this.config = config;
+ this.leftORright = leftORright;
+ }
+
+ private void frmConfig_Load(object sender, EventArgs e)
+ {
+ this.txtConfigCalAngle.Text = config.calAngle.ToString();
+ this.txtConfigMaxAngle.Text = config.maxAngle.ToString();
+ this.txtConfigMinAngle.Text = config.minAngle.ToString();
+ this.txtConfigPulsePerDegree.Text = config.pulsePerDegree.ToString();
+
+ //if (this.leftORright == "Left")
+ //{
+ // object m_X_Start_left = null;
+ // opc.ReadOneItem_Wrapper(OutputTag.X_Start_left, ref m_X_Start_left);
+ // this.txtXstart_Read.Text = m_X_Start_left.ToString();
+
+ // object m_X_Work_left = null;
+ // opc.ReadOneItem_Wrapper(OutputTag.X_Work_left, ref m_X_Work_left);
+ // this.txtXwork_Read.Text = m_X_Work_left.ToString();
+
+ // object m_Z_Start_left = null;
+ // opc.ReadOneItem_Wrapper(OutputTag.Z_Start_left, ref m_Z_Start_left);
+ // this.txtZstart_Read.Text = m_Z_Start_left.ToString();
+
+ // object m_Z_Work_left = null;
+ // opc.ReadOneItem_Wrapper(OutputTag.Z_Work_left, ref m_Z_Work_left);
+ // this.txtZwork_Read.Text = m_Z_Work_left.ToString();
+ //}
+ if (this.leftORright == "Right")
+ {
+ object m_X_Start = null;
+ opc.ReadOneItem_Wrapper(OutputTag.X_Start, ref m_X_Start);
+ this.txtXstart_Read.Text = m_X_Start.ToString();
+
+ object m_X_Work = null;
+ opc.ReadOneItem_Wrapper(OutputTag.X_Work, ref m_X_Work);
+ this.txtXwork_Read.Text = m_X_Work.ToString();
+
+ object m_Z_Start = null;
+ opc.ReadOneItem_Wrapper(OutputTag.Z_Start, ref m_Z_Start);
+ this.txtZstart_Read.Text = m_Z_Start.ToString();
+
+ object m_Z_Work = null;
+ opc.ReadOneItem_Wrapper(OutputTag.Z_Work, ref m_Z_Work);
+ this.txtZwork_Read.Text = m_Z_Work.ToString();
+ }
+ }
+
+ private void btnSet_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ config.calAngle = Convert.ToDouble(txtConfigCalAngle.Text);
+ config.maxAngle = Convert.ToDouble(txtConfigMaxAngle.Text);
+ config.minAngle = Convert.ToDouble(txtConfigMinAngle.Text);
+ config.pulsePerDegree = Convert.ToInt32(txtConfigPulsePerDegree.Text);
+
+ sft.SetConfig(configPath, config);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show("鍙傛暟鏈夐棶棰橈紝璇锋鏌�");
+ }
+ }
+
+ private void btnXstart_Click(object sender, EventArgs e)
+ {
+ if (this.leftORright == "Left")
+ {
+ int tmpD = Convert.ToInt32(this.txtXstart.Text.Trim());
+ opc.Write(OutputTag.X_Start_left, tmpD);
+ System.Threading.Thread.Sleep(200);
+ object m_X_Start_left = null;
+ opc.ReadOneItem_Wrapper(OutputTag.X_Start_left, ref m_X_Start_left);
+ this.txtXstart_Read.Text = m_X_Start_left.ToString();
+ }
+ else if (this.leftORright == "Right")
+ {
+ int tmpD = Convert.ToInt32(this.txtXstart.Text.Trim());
+ opc.Write(OutputTag.X_Start, tmpD);
+ System.Threading.Thread.Sleep(200);
+ object m_X_Start = null;
+ opc.ReadOneItem_Wrapper(OutputTag.X_Start, ref m_X_Start);
+ this.txtXstart_Read.Text = m_X_Start.ToString();
+ }
+
+ this.Refresh();
+ }
+
+ private void btnXwork_Click(object sender, EventArgs e)
+ {
+ if (this.leftORright == "Left")
+ {
+ int tmpD = Convert.ToInt32(this.txtXwork.Text.Trim());
+ opc.Write(OutputTag.X_Work_left, tmpD);
+ System.Threading.Thread.Sleep(200);
+ object m_X_Work_left = null;
+ opc.ReadOneItem_Wrapper(OutputTag.X_Work_left, ref m_X_Work_left);
+ this.txtXwork_Read.Text = m_X_Work_left.ToString();
+ }
+ else if (this.leftORright == "Right")
+ {
+ int tmpD = Convert.ToInt32(this.txtXwork.Text.Trim());
+ opc.Write(OutputTag.X_Work, tmpD);
+ System.Threading.Thread.Sleep(200);
+ object m_X_Work = null;
+ opc.ReadOneItem_Wrapper(OutputTag.X_Work, ref m_X_Work);
+ this.txtXwork_Read.Text = m_X_Work.ToString();
+ }
+
+ this.Refresh();
+ }
+
+ private void btnZstart_Click(object sender, EventArgs e)
+ {
+ if (this.leftORright == "Left")
+ {
+ int tmpD = Convert.ToInt32(this.txtZstart.Text.Trim());
+ opc.Write(OutputTag.Z_Start_left, tmpD);
+ System.Threading.Thread.Sleep(200);
+ object m_Z_Start_left = null;
+ opc.ReadOneItem_Wrapper(OutputTag.Z_Start_left, ref m_Z_Start_left);
+ this.txtZstart_Read.Text = m_Z_Start_left.ToString();
+ }
+ else if (this.leftORright == "Right")
+ {
+ int tmpD = Convert.ToInt32(this.txtZstart.Text.Trim());
+ opc.Write(OutputTag.Z_Start, tmpD);
+ System.Threading.Thread.Sleep(200);
+ object m_Z_Start = null;
+ opc.ReadOneItem_Wrapper(OutputTag.Z_Start, ref m_Z_Start);
+ this.txtZstart_Read.Text = m_Z_Start.ToString();
+ }
+
+ this.Refresh();
+ }
+
+ private void btnZwork_Click(object sender, EventArgs e)
+ {
+ if (this.leftORright == "Left")
+ {
+ int tmpD = Convert.ToInt32(this.txtZwork.Text.Trim());
+ opc.Write(OutputTag.Z_Work_left, tmpD);
+ System.Threading.Thread.Sleep(200);
+ object m_Z_Work_left = null;
+ opc.ReadOneItem_Wrapper(OutputTag.Z_Work_left, ref m_Z_Work_left);
+ this.txtZwork_Read.Text = m_Z_Work_left.ToString();
+ }
+ else if (this.leftORright == "Right")
+ {
+ int tmpD = Convert.ToInt32(this.txtZwork.Text.Trim());
+ opc.Write(OutputTag.Z_Work, tmpD);
+ System.Threading.Thread.Sleep(200);
+ object m_Z_Work = null;
+ opc.ReadOneItem_Wrapper(OutputTag.Z_Work, ref m_Z_Work);
+ this.txtZwork_Read.Text = m_Z_Work.ToString();
+ }
+
+ this.Refresh();
+ }
+ }
+}
diff --git a/LLMF/frmConfig.resx b/LLMF/frmConfig.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/LLMF/frmConfig.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
\ No newline at end of file
diff --git a/LLMF/frmMain.Designer.cs b/LLMF/frmMain.Designer.cs
new file mode 100644
index 0000000..2315594
--- /dev/null
+++ b/LLMF/frmMain.Designer.cs
@@ -0,0 +1,2096 @@
+锘縩amespace LLMF
+{
+ partial class frmMain
+ {
+ /// <summary>
+ /// 蹇呴渶鐨勮璁″櫒鍙橀噺銆�
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// 娓呯悊鎵�鏈夋鍦ㄤ娇鐢ㄧ殑璧勬簮銆�
+ /// </summary>
+ /// <param name="disposing">濡傛灉搴旈噴鏀炬墭绠¤祫婧愶紝涓� true锛涘惁鍒欎负 false銆�</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows 绐椾綋璁捐鍣ㄧ敓鎴愮殑浠g爜
+
+ /// <summary>
+ /// 璁捐鍣ㄦ敮鎸佹墍闇�鐨勬柟娉� - 涓嶈
+ /// 浣跨敤浠g爜缂栬緫鍣ㄤ慨鏀规鏂规硶鐨勫唴瀹广��
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain));
+ this.statusStrip1 = new System.Windows.Forms.StatusStrip();
+ this.tsslOPC = new System.Windows.Forms.ToolStripStatusLabel();
+ this.tsllPositionlabel = new System.Windows.Forms.ToolStripStatusLabel();
+ this.tsslPosition_left = new System.Windows.Forms.ToolStripStatusLabel();
+ this.toolStripStatusLabel3 = new System.Windows.Forms.ToolStripStatusLabel();
+ this.tsslAlarm_Left = new System.Windows.Forms.ToolStripStatusLabel();
+ this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel();
+ this.tsslPosition = new System.Windows.Forms.ToolStripStatusLabel();
+ this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
+ this.tsslAlarm = new System.Windows.Forms.ToolStripStatusLabel();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+ this.toolStripMaxMin = new System.Windows.Forms.ToolStripButton();
+ this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+ this.tspBtnOpenImageFile = new System.Windows.Forms.ToolStripButton();
+ this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+ this.toolStripModeBtn = new System.Windows.Forms.ToolStripButton();
+ this.toolStripModeLabel = new System.Windows.Forms.ToolStripLabel();
+ this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
+ this.toolStripButton5 = new System.Windows.Forms.ToolStripButton();
+ this.tsplabelProductName = new System.Windows.Forms.ToolStripLabel();
+ this.tspbtnExit = new System.Windows.Forms.ToolStripButton();
+ this.tspBtnHelp = new System.Windows.Forms.ToolStripButton();
+ this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
+ this.panel2 = new System.Windows.Forms.Panel();
+ this.lblAngleDisplay = new System.Windows.Forms.Label();
+ this.viewPort = new HalconDotNet.HWindowControl();
+ this.panel3 = new System.Windows.Forms.Panel();
+ this.btnDisplay = new System.Windows.Forms.Button();
+ this.gbxTest = new System.Windows.Forms.GroupBox();
+ this.button7 = new System.Windows.Forms.Button();
+ this.button8 = new System.Windows.Forms.Button();
+ this.button9 = new System.Windows.Forms.Button();
+ this.button10 = new System.Windows.Forms.Button();
+ this.button16 = new System.Windows.Forms.Button();
+ this.button11 = new System.Windows.Forms.Button();
+ this.button12 = new System.Windows.Forms.Button();
+ this.button13 = new System.Windows.Forms.Button();
+ this.button14 = new System.Windows.Forms.Button();
+ this.btnORI = new System.Windows.Forms.Button();
+ this.ckbCameraLight = new System.Windows.Forms.CheckBox();
+ this.btnTestMove = new System.Windows.Forms.Button();
+ this.txtTestPulse = new System.Windows.Forms.TextBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.btnStopCapture = new System.Windows.Forms.Button();
+ this.btnContinueCapture = new System.Windows.Forms.Button();
+ this.gbxCalibration = new System.Windows.Forms.GroupBox();
+ this.btnCalibration = new System.Windows.Forms.Button();
+ this.txtCalAngle = new System.Windows.Forms.TextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.btnCapture = new System.Windows.Forms.Button();
+ this.groupBox4 = new System.Windows.Forms.GroupBox();
+ this.txtSN = new System.Windows.Forms.TextBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.groupBox3 = new System.Windows.Forms.GroupBox();
+ this.txtResultFinalAngle = new System.Windows.Forms.TextBox();
+ this.label5 = new System.Windows.Forms.Label();
+ this.txtResultInitAngle = new System.Windows.Forms.TextBox();
+ this.label4 = new System.Windows.Forms.Label();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.cbxTest = new System.Windows.Forms.CheckBox();
+ this.btnCanCalibration = new System.Windows.Forms.Button();
+ this.btnHalconTool = new System.Windows.Forms.Button();
+ this.btnConfig = new System.Windows.Forms.Button();
+ this.checkBox2 = new System.Windows.Forms.CheckBox();
+ this.button15 = new System.Windows.Forms.Button();
+ this.tVideo = new System.Windows.Forms.Timer(this.components);
+ this.tabControl1 = new System.Windows.Forms.TabControl();
+ this.tabPage2 = new System.Windows.Forms.TabPage();
+ this.tabPage1 = new System.Windows.Forms.TabPage();
+ this.panel4 = new System.Windows.Forms.Panel();
+ this.lblAngleDisplay_left = new System.Windows.Forms.Label();
+ this.viewPort_left = new HalconDotNet.HWindowControl();
+ this.panel5 = new System.Windows.Forms.Panel();
+ this.btnDisplay_left = new System.Windows.Forms.Button();
+ this.gbxTest_left = new System.Windows.Forms.GroupBox();
+ this.button5 = new System.Windows.Forms.Button();
+ this.button4 = new System.Windows.Forms.Button();
+ this.button3 = new System.Windows.Forms.Button();
+ this.button2 = new System.Windows.Forms.Button();
+ this.button1 = new System.Windows.Forms.Button();
+ this.btnOut = new System.Windows.Forms.Button();
+ this.btnCloseDor = new System.Windows.Forms.Button();
+ this.btnOpenDor = new System.Windows.Forms.Button();
+ this.btnORI_left = new System.Windows.Forms.Button();
+ this.ckbCameraLight_left = new System.Windows.Forms.CheckBox();
+ this.btnTestMove_left = new System.Windows.Forms.Button();
+ this.txtTestPulse_left = new System.Windows.Forms.TextBox();
+ this.label6 = new System.Windows.Forms.Label();
+ this.btnStopCapture_left = new System.Windows.Forms.Button();
+ this.btnContinueCapture_left = new System.Windows.Forms.Button();
+ this.gbxCalibration_left = new System.Windows.Forms.GroupBox();
+ this.btnCalibration_left = new System.Windows.Forms.Button();
+ this.txtCalAngle_left = new System.Windows.Forms.TextBox();
+ this.label7 = new System.Windows.Forms.Label();
+ this.btnCapture_left = new System.Windows.Forms.Button();
+ this.groupBox6 = new System.Windows.Forms.GroupBox();
+ this.txtSN_left = new System.Windows.Forms.TextBox();
+ this.label8 = new System.Windows.Forms.Label();
+ this.groupBox7 = new System.Windows.Forms.GroupBox();
+ this.txtResultFinalAngle_left = new System.Windows.Forms.TextBox();
+ this.label9 = new System.Windows.Forms.Label();
+ this.txtResultInitAngle_left = new System.Windows.Forms.TextBox();
+ this.label10 = new System.Windows.Forms.Label();
+ this.groupBox8 = new System.Windows.Forms.GroupBox();
+ this.cbxTest_left = new System.Windows.Forms.CheckBox();
+ this.btnCanCalibration_left = new System.Windows.Forms.Button();
+ this.btnHalconTool_left = new System.Windows.Forms.Button();
+ this.btnConfig_left = new System.Windows.Forms.Button();
+ this.checkBox1 = new System.Windows.Forms.CheckBox();
+ this.button6 = new System.Windows.Forms.Button();
+ this.tabPage3 = new System.Windows.Forms.TabPage();
+ this.groupBox5 = new System.Windows.Forms.GroupBox();
+ this.ckbSaveImage = new System.Windows.Forms.CheckBox();
+ this.lblForApple = new System.Windows.Forms.Label();
+ this.lblZ_ShaChe = new System.Windows.Forms.Label();
+ this.lblDingWei_SRV_ON = new System.Windows.Forms.Label();
+ this.lblZ_SRV_ON = new System.Windows.Forms.Label();
+ this.lblX_SRV_ON = new System.Windows.Forms.Label();
+ this.lblSiFuPowerOn = new System.Windows.Forms.Label();
+ this.lblHuaTaiCylider = new System.Windows.Forms.Label();
+ this.lblWuGanCylider = new System.Windows.Forms.Label();
+ this.lblZhengBianCylider = new System.Windows.Forms.Label();
+ this.lblCeBianCylider = new System.Windows.Forms.Label();
+ this.lblBuzzer = new System.Windows.Forms.Label();
+ this.lblGreen = new System.Windows.Forms.Label();
+ this.lblYellow = new System.Windows.Forms.Label();
+ this.lblRed = new System.Windows.Forms.Label();
+ this.lblWuGanCylider2 = new System.Windows.Forms.Label();
+ this.lblCameraLighto = new System.Windows.Forms.Label();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.lblWuGanHou = new System.Windows.Forms.Label();
+ this.lblWuGanQian = new System.Windows.Forms.Label();
+ this.lblCeBianHou = new System.Windows.Forms.Label();
+ this.lblCeBianQian = new System.Windows.Forms.Label();
+ this.lblOpenJieJin = new System.Windows.Forms.Label();
+ this.lblSafeCurtain = new System.Windows.Forms.Label();
+ this.lblE_Stop = new System.Windows.Forms.Label();
+ this.lblReset = new System.Windows.Forms.Label();
+ this.lblStart2 = new System.Windows.Forms.Label();
+ this.lblStart1 = new System.Windows.Forms.Label();
+ this.lblDingWei_Alarm = new System.Windows.Forms.Label();
+ this.lblDingWei_JinDian = new System.Windows.Forms.Label();
+ this.lblDingWei_CCW = new System.Windows.Forms.Label();
+ this.lblDingWei_CW = new System.Windows.Forms.Label();
+ this.lblZ_CCW = new System.Windows.Forms.Label();
+ this.lblZ_CW = new System.Windows.Forms.Label();
+ this.lblX_CCW = new System.Windows.Forms.Label();
+ this.lblX_CW = new System.Windows.Forms.Label();
+ this.lblZ_Alarm = new System.Windows.Forms.Label();
+ this.lblX_Alarm = new System.Windows.Forms.Label();
+ this.lblZ_JinDian = new System.Windows.Forms.Label();
+ this.lblX_JinDian = new System.Windows.Forms.Label();
+ this.tVideo_left = new System.Windows.Forms.Timer(this.components);
+ this.cboSize = new System.Windows.Forms.ComboBox();
+ this.label11 = new System.Windows.Forms.Label();
+ this.cboSize_Left = new System.Windows.Forms.ComboBox();
+ this.label12 = new System.Windows.Forms.Label();
+ this.statusStrip1.SuspendLayout();
+ this.panel1.SuspendLayout();
+ this.toolStrip1.SuspendLayout();
+ this.panel2.SuspendLayout();
+ this.panel3.SuspendLayout();
+ this.gbxTest.SuspendLayout();
+ this.gbxCalibration.SuspendLayout();
+ this.groupBox4.SuspendLayout();
+ this.groupBox3.SuspendLayout();
+ this.groupBox2.SuspendLayout();
+ this.tabControl1.SuspendLayout();
+ this.tabPage2.SuspendLayout();
+ this.tabPage1.SuspendLayout();
+ this.panel4.SuspendLayout();
+ this.panel5.SuspendLayout();
+ this.gbxTest_left.SuspendLayout();
+ this.gbxCalibration_left.SuspendLayout();
+ this.groupBox6.SuspendLayout();
+ this.groupBox7.SuspendLayout();
+ this.groupBox8.SuspendLayout();
+ this.tabPage3.SuspendLayout();
+ this.groupBox5.SuspendLayout();
+ this.groupBox1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // statusStrip1
+ //
+ this.statusStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
+ this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.tsslOPC,
+ this.tsllPositionlabel,
+ this.tsslPosition_left,
+ this.toolStripStatusLabel3,
+ this.tsslAlarm_Left,
+ this.toolStripStatusLabel2,
+ this.tsslPosition,
+ this.toolStripStatusLabel1,
+ this.tsslAlarm});
+ this.statusStrip1.Location = new System.Drawing.Point(0, 747);
+ this.statusStrip1.Name = "statusStrip1";
+ this.statusStrip1.Size = new System.Drawing.Size(1081, 22);
+ this.statusStrip1.TabIndex = 0;
+ this.statusStrip1.Text = "statusStrip1";
+ //
+ // tsslOPC
+ //
+ this.tsslOPC.Name = "tsslOPC";
+ this.tsslOPC.Size = new System.Drawing.Size(33, 17);
+ this.tsslOPC.Text = "OPC";
+ //
+ // tsllPositionlabel
+ //
+ this.tsllPositionlabel.Name = "tsllPositionlabel";
+ this.tsllPositionlabel.Size = new System.Drawing.Size(56, 17);
+ this.tsllPositionlabel.Text = "宸﹁剦鍐诧細";
+ //
+ // tsslPosition_left
+ //
+ this.tsslPosition_left.Name = "tsslPosition_left";
+ this.tsslPosition_left.Size = new System.Drawing.Size(15, 17);
+ this.tsslPosition_left.Text = "0";
+ //
+ // toolStripStatusLabel3
+ //
+ this.toolStripStatusLabel3.Name = "toolStripStatusLabel3";
+ this.toolStripStatusLabel3.Size = new System.Drawing.Size(56, 17);
+ this.toolStripStatusLabel3.Text = "宸︽姤璀︼細";
+ //
+ // tsslAlarm_Left
+ //
+ this.tsslAlarm_Left.ForeColor = System.Drawing.Color.Red;
+ this.tsslAlarm_Left.Name = "tsslAlarm_Left";
+ this.tsslAlarm_Left.Size = new System.Drawing.Size(20, 17);
+ this.tsslAlarm_Left.Text = "鏃�";
+ //
+ // toolStripStatusLabel2
+ //
+ this.toolStripStatusLabel2.Name = "toolStripStatusLabel2";
+ this.toolStripStatusLabel2.Size = new System.Drawing.Size(56, 17);
+ this.toolStripStatusLabel2.Text = "鍙宠剦鍐诧細";
+ //
+ // tsslPosition
+ //
+ this.tsslPosition.Name = "tsslPosition";
+ this.tsslPosition.Size = new System.Drawing.Size(15, 17);
+ this.tsslPosition.Text = "0";
+ //
+ // toolStripStatusLabel1
+ //
+ this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
+ this.toolStripStatusLabel1.Size = new System.Drawing.Size(56, 17);
+ this.toolStripStatusLabel1.Text = "鍙虫姤璀︼細";
+ //
+ // tsslAlarm
+ //
+ this.tsslAlarm.ForeColor = System.Drawing.Color.Red;
+ this.tsslAlarm.Name = "tsslAlarm";
+ this.tsslAlarm.Size = new System.Drawing.Size(20, 17);
+ this.tsslAlarm.Text = "鏃�";
+ //
+ // panel1
+ //
+ this.panel1.Controls.Add(this.toolStrip1);
+ this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panel1.Location = new System.Drawing.Point(0, 0);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(1081, 72);
+ this.panel1.TabIndex = 1;
+ //
+ // toolStrip1
+ //
+ this.toolStrip1.AutoSize = false;
+ this.toolStrip1.BackColor = System.Drawing.Color.LightSlateGray;
+ this.toolStrip1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.toolStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
+ this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.toolStripMaxMin,
+ this.toolStripSeparator1,
+ this.tspBtnOpenImageFile,
+ this.toolStripSeparator2,
+ this.toolStripModeBtn,
+ this.toolStripModeLabel,
+ this.toolStripSeparator3,
+ this.toolStripButton5,
+ this.tsplabelProductName,
+ this.tspbtnExit,
+ this.tspBtnHelp,
+ this.toolStripSeparator6});
+ this.toolStrip1.Location = new System.Drawing.Point(0, 0);
+ this.toolStrip1.Name = "toolStrip1";
+ this.toolStrip1.Size = new System.Drawing.Size(1081, 72);
+ this.toolStrip1.TabIndex = 11;
+ this.toolStrip1.Text = "toolStrip1";
+ //
+ // toolStripMaxMin
+ //
+ this.toolStripMaxMin.AutoSize = false;
+ this.toolStripMaxMin.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.toolStripMaxMin.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMaxMin.Image")));
+ this.toolStripMaxMin.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.toolStripMaxMin.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.toolStripMaxMin.Name = "toolStripMaxMin";
+ this.toolStripMaxMin.Size = new System.Drawing.Size(65, 65);
+ this.toolStripMaxMin.Text = "涓荤晫闈�";
+ //
+ // toolStripSeparator1
+ //
+ this.toolStripSeparator1.Name = "toolStripSeparator1";
+ this.toolStripSeparator1.Size = new System.Drawing.Size(6, 72);
+ //
+ // tspBtnOpenImageFile
+ //
+ this.tspBtnOpenImageFile.AutoSize = false;
+ this.tspBtnOpenImageFile.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.tspBtnOpenImageFile.Image = ((System.Drawing.Image)(resources.GetObject("tspBtnOpenImageFile.Image")));
+ this.tspBtnOpenImageFile.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.tspBtnOpenImageFile.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.tspBtnOpenImageFile.Name = "tspBtnOpenImageFile";
+ this.tspBtnOpenImageFile.Size = new System.Drawing.Size(65, 65);
+ this.tspBtnOpenImageFile.Text = "鍥剧墖鏌ョ湅";
+ //
+ // toolStripSeparator2
+ //
+ this.toolStripSeparator2.Name = "toolStripSeparator2";
+ this.toolStripSeparator2.Size = new System.Drawing.Size(6, 72);
+ //
+ // toolStripModeBtn
+ //
+ this.toolStripModeBtn.AutoSize = false;
+ this.toolStripModeBtn.BackColor = System.Drawing.Color.SlateGray;
+ this.toolStripModeBtn.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.toolStripModeBtn.ForeColor = System.Drawing.Color.Transparent;
+ this.toolStripModeBtn.Image = ((System.Drawing.Image)(resources.GetObject("toolStripModeBtn.Image")));
+ this.toolStripModeBtn.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.toolStripModeBtn.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.toolStripModeBtn.Name = "toolStripModeBtn";
+ this.toolStripModeBtn.Size = new System.Drawing.Size(65, 65);
+ this.toolStripModeBtn.Text = "杩愯";
+ //
+ // toolStripModeLabel
+ //
+ this.toolStripModeLabel.AutoSize = false;
+ this.toolStripModeLabel.Font = new System.Drawing.Font("寰蒋闆呴粦", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.toolStripModeLabel.Name = "toolStripModeLabel";
+ this.toolStripModeLabel.Size = new System.Drawing.Size(100, 62);
+ this.toolStripModeLabel.Text = "Online";
+ //
+ // toolStripSeparator3
+ //
+ this.toolStripSeparator3.Name = "toolStripSeparator3";
+ this.toolStripSeparator3.Size = new System.Drawing.Size(6, 72);
+ //
+ // toolStripButton5
+ //
+ this.toolStripButton5.AutoSize = false;
+ this.toolStripButton5.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.toolStripButton5.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton5.Image")));
+ this.toolStripButton5.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.toolStripButton5.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.toolStripButton5.Name = "toolStripButton5";
+ this.toolStripButton5.Size = new System.Drawing.Size(75, 65);
+ this.toolStripButton5.Text = "浜у搧鍚�";
+ //
+ // tsplabelProductName
+ //
+ this.tsplabelProductName.AutoSize = false;
+ this.tsplabelProductName.Font = new System.Drawing.Font("Verdana", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.tsplabelProductName.ForeColor = System.Drawing.Color.Yellow;
+ this.tsplabelProductName.Name = "tsplabelProductName";
+ this.tsplabelProductName.Size = new System.Drawing.Size(350, 62);
+ this.tsplabelProductName.Text = "Gamma Test";
+ this.tsplabelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // tspbtnExit
+ //
+ this.tspbtnExit.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.tspbtnExit.AutoSize = false;
+ this.tspbtnExit.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.tspbtnExit.Image = ((System.Drawing.Image)(resources.GetObject("tspbtnExit.Image")));
+ this.tspbtnExit.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.tspbtnExit.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.tspbtnExit.Name = "tspbtnExit";
+ this.tspbtnExit.Size = new System.Drawing.Size(75, 65);
+ this.tspbtnExit.Text = "閫�鍑�";
+ this.tspbtnExit.Click += new System.EventHandler(this.tspbtnExit_Click);
+ //
+ // tspBtnHelp
+ //
+ this.tspBtnHelp.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.tspBtnHelp.AutoSize = false;
+ this.tspBtnHelp.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.tspBtnHelp.Image = ((System.Drawing.Image)(resources.GetObject("tspBtnHelp.Image")));
+ this.tspBtnHelp.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.tspBtnHelp.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.tspBtnHelp.Name = "tspBtnHelp";
+ this.tspBtnHelp.Size = new System.Drawing.Size(75, 65);
+ this.tspBtnHelp.Text = "甯姪";
+ //
+ // toolStripSeparator6
+ //
+ this.toolStripSeparator6.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.toolStripSeparator6.Name = "toolStripSeparator6";
+ this.toolStripSeparator6.Size = new System.Drawing.Size(6, 72);
+ //
+ // panel2
+ //
+ this.panel2.Controls.Add(this.lblAngleDisplay);
+ this.panel2.Controls.Add(this.viewPort);
+ this.panel2.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.panel2.Location = new System.Drawing.Point(3, 3);
+ this.panel2.Name = "panel2";
+ this.panel2.Size = new System.Drawing.Size(792, 643);
+ this.panel2.TabIndex = 2;
+ //
+ // lblAngleDisplay
+ //
+ this.lblAngleDisplay.Location = new System.Drawing.Point(666, 9);
+ this.lblAngleDisplay.Name = "lblAngleDisplay";
+ this.lblAngleDisplay.Size = new System.Drawing.Size(47, 18);
+ this.lblAngleDisplay.TabIndex = 1;
+ this.lblAngleDisplay.Text = "-";
+ this.lblAngleDisplay.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // viewPort
+ //
+ this.viewPort.BackColor = System.Drawing.Color.Black;
+ this.viewPort.BorderColor = System.Drawing.Color.Black;
+ this.viewPort.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.viewPort.ImagePart = new System.Drawing.Rectangle(0, 0, 640, 480);
+ this.viewPort.Location = new System.Drawing.Point(0, 0);
+ this.viewPort.Name = "viewPort";
+ this.viewPort.Size = new System.Drawing.Size(792, 643);
+ this.viewPort.TabIndex = 0;
+ this.viewPort.WindowSize = new System.Drawing.Size(792, 643);
+ //
+ // panel3
+ //
+ this.panel3.Controls.Add(this.btnDisplay);
+ this.panel3.Controls.Add(this.gbxTest);
+ this.panel3.Controls.Add(this.gbxCalibration);
+ this.panel3.Controls.Add(this.groupBox4);
+ this.panel3.Controls.Add(this.groupBox3);
+ this.panel3.Controls.Add(this.groupBox2);
+ this.panel3.Controls.Add(this.checkBox2);
+ this.panel3.Controls.Add(this.button15);
+ this.panel3.Dock = System.Windows.Forms.DockStyle.Right;
+ this.panel3.Location = new System.Drawing.Point(795, 3);
+ this.panel3.Name = "panel3";
+ this.panel3.Size = new System.Drawing.Size(275, 643);
+ this.panel3.TabIndex = 3;
+ //
+ // btnDisplay
+ //
+ this.btnDisplay.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.btnDisplay.Font = new System.Drawing.Font("瀹嬩綋", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.btnDisplay.Location = new System.Drawing.Point(0, 590);
+ this.btnDisplay.Name = "btnDisplay";
+ this.btnDisplay.Size = new System.Drawing.Size(275, 53);
+ this.btnDisplay.TabIndex = 0;
+ this.btnDisplay.Text = "鏄剧ず";
+ this.btnDisplay.UseVisualStyleBackColor = true;
+ //
+ // gbxTest
+ //
+ this.gbxTest.Controls.Add(this.button7);
+ this.gbxTest.Controls.Add(this.button8);
+ this.gbxTest.Controls.Add(this.button9);
+ this.gbxTest.Controls.Add(this.button10);
+ this.gbxTest.Controls.Add(this.button16);
+ this.gbxTest.Controls.Add(this.button11);
+ this.gbxTest.Controls.Add(this.button12);
+ this.gbxTest.Controls.Add(this.button13);
+ this.gbxTest.Controls.Add(this.button14);
+ this.gbxTest.Controls.Add(this.btnORI);
+ this.gbxTest.Controls.Add(this.ckbCameraLight);
+ this.gbxTest.Controls.Add(this.btnTestMove);
+ this.gbxTest.Controls.Add(this.txtTestPulse);
+ this.gbxTest.Controls.Add(this.label3);
+ this.gbxTest.Controls.Add(this.btnStopCapture);
+ this.gbxTest.Controls.Add(this.btnContinueCapture);
+ this.gbxTest.Dock = System.Windows.Forms.DockStyle.Top;
+ this.gbxTest.Enabled = false;
+ this.gbxTest.Location = new System.Drawing.Point(0, 291);
+ this.gbxTest.Name = "gbxTest";
+ this.gbxTest.Size = new System.Drawing.Size(275, 205);
+ this.gbxTest.TabIndex = 6;
+ this.gbxTest.TabStop = false;
+ this.gbxTest.Text = "娴嬭瘯";
+ //
+ // button7
+ //
+ this.button7.Location = new System.Drawing.Point(176, 90);
+ this.button7.Name = "button7";
+ this.button7.Size = new System.Drawing.Size(73, 32);
+ this.button7.TabIndex = 22;
+ this.button7.Text = "姘旂几鏉惧紑";
+ this.button7.UseVisualStyleBackColor = true;
+ this.button7.Click += new System.EventHandler(this.button7_Click);
+ //
+ // button8
+ //
+ this.button8.Location = new System.Drawing.Point(96, 90);
+ this.button8.Name = "button8";
+ this.button8.Size = new System.Drawing.Size(73, 32);
+ this.button8.TabIndex = 21;
+ this.button8.Text = "姘旂几澶圭揣";
+ this.button8.UseVisualStyleBackColor = true;
+ this.button8.Click += new System.EventHandler(this.button8_Click);
+ //
+ // button9
+ //
+ this.button9.Location = new System.Drawing.Point(17, 163);
+ this.button9.Name = "button9";
+ this.button9.Size = new System.Drawing.Size(73, 32);
+ this.button9.TabIndex = 20;
+ this.button9.Text = "閫佹枡";
+ this.button9.UseVisualStyleBackColor = true;
+ this.button9.Click += new System.EventHandler(this.button9_Click);
+ //
+ // button10
+ //
+ this.button10.Location = new System.Drawing.Point(17, 90);
+ this.button10.Name = "button10";
+ this.button10.Size = new System.Drawing.Size(73, 32);
+ this.button10.TabIndex = 19;
+ this.button10.Text = "鎵嬪姩鍏佽";
+ this.button10.UseVisualStyleBackColor = true;
+ this.button10.Click += new System.EventHandler(this.button10_Click);
+ //
+ // button16
+ //
+ this.button16.Location = new System.Drawing.Point(176, 163);
+ this.button16.Name = "button16";
+ this.button16.Size = new System.Drawing.Size(73, 32);
+ this.button16.TabIndex = 18;
+ this.button16.Text = "婊戝彴姘旂几鏉�";
+ this.button16.UseVisualStyleBackColor = true;
+ this.button16.Visible = false;
+ this.button16.Click += new System.EventHandler(this.button11_Click);
+ //
+ // button11
+ //
+ this.button11.Location = new System.Drawing.Point(176, 126);
+ this.button11.Name = "button11";
+ this.button11.Size = new System.Drawing.Size(73, 32);
+ this.button11.TabIndex = 18;
+ this.button11.Text = "婊戝彴姘旂几绱�";
+ this.button11.UseVisualStyleBackColor = true;
+ this.button11.Click += new System.EventHandler(this.button11_Click);
+ //
+ // button12
+ //
+ this.button12.Location = new System.Drawing.Point(96, 163);
+ this.button12.Name = "button12";
+ this.button12.Size = new System.Drawing.Size(73, 32);
+ this.button12.TabIndex = 17;
+ this.button12.Text = "鍑烘枡";
+ this.button12.UseVisualStyleBackColor = true;
+ this.button12.Click += new System.EventHandler(this.button12_Click);
+ //
+ // button13
+ //
+ this.button13.Location = new System.Drawing.Point(17, 126);
+ this.button13.Name = "button13";
+ this.button13.Size = new System.Drawing.Size(73, 32);
+ this.button13.TabIndex = 16;
+ this.button13.Text = "鍏抽棬";
+ this.button13.UseVisualStyleBackColor = true;
+ this.button13.Click += new System.EventHandler(this.button13_Click);
+ //
+ // button14
+ //
+ this.button14.Location = new System.Drawing.Point(96, 126);
+ this.button14.Name = "button14";
+ this.button14.Size = new System.Drawing.Size(73, 32);
+ this.button14.TabIndex = 15;
+ this.button14.Text = "寮�闂�";
+ this.button14.UseVisualStyleBackColor = true;
+ this.button14.Click += new System.EventHandler(this.button14_Click);
+ //
+ // btnORI
+ //
+ this.btnORI.Location = new System.Drawing.Point(200, 61);
+ this.btnORI.Name = "btnORI";
+ this.btnORI.Size = new System.Drawing.Size(50, 23);
+ this.btnORI.TabIndex = 6;
+ this.btnORI.Text = "鍥炲師鐐�";
+ this.btnORI.UseVisualStyleBackColor = true;
+ this.btnORI.Click += new System.EventHandler(this.btnORI_Click);
+ //
+ // ckbCameraLight
+ //
+ this.ckbCameraLight.Appearance = System.Windows.Forms.Appearance.Button;
+ this.ckbCameraLight.Location = new System.Drawing.Point(177, 20);
+ this.ckbCameraLight.Name = "ckbCameraLight";
+ this.ckbCameraLight.Size = new System.Drawing.Size(74, 32);
+ this.ckbCameraLight.TabIndex = 5;
+ this.ckbCameraLight.Text = "鍏夋簮寮�/鍏�";
+ this.ckbCameraLight.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.ckbCameraLight.UseVisualStyleBackColor = true;
+ this.ckbCameraLight.CheckedChanged += new System.EventHandler(this.ckbCameraLight_CheckedChanged);
+ //
+ // btnTestMove
+ //
+ this.btnTestMove.Location = new System.Drawing.Point(142, 61);
+ this.btnTestMove.Name = "btnTestMove";
+ this.btnTestMove.Size = new System.Drawing.Size(54, 23);
+ this.btnTestMove.TabIndex = 4;
+ this.btnTestMove.Text = "绉诲姩";
+ this.btnTestMove.UseVisualStyleBackColor = true;
+ this.btnTestMove.Click += new System.EventHandler(this.btnTestMove_Click);
+ //
+ // txtTestPulse
+ //
+ this.txtTestPulse.Location = new System.Drawing.Point(74, 63);
+ this.txtTestPulse.Name = "txtTestPulse";
+ this.txtTestPulse.Size = new System.Drawing.Size(63, 21);
+ this.txtTestPulse.TabIndex = 3;
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(15, 66);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(53, 12);
+ this.label3.TabIndex = 2;
+ this.label3.Text = "绉诲姩鑴夊啿";
+ //
+ // btnStopCapture
+ //
+ this.btnStopCapture.Location = new System.Drawing.Point(96, 20);
+ this.btnStopCapture.Name = "btnStopCapture";
+ this.btnStopCapture.Size = new System.Drawing.Size(75, 32);
+ this.btnStopCapture.TabIndex = 1;
+ this.btnStopCapture.Text = "鍋滄鎷嶇収";
+ this.btnStopCapture.UseVisualStyleBackColor = true;
+ this.btnStopCapture.Click += new System.EventHandler(this.btnStopCapture_Click);
+ //
+ // btnContinueCapture
+ //
+ this.btnContinueCapture.Location = new System.Drawing.Point(16, 20);
+ this.btnContinueCapture.Name = "btnContinueCapture";
+ this.btnContinueCapture.Size = new System.Drawing.Size(73, 32);
+ this.btnContinueCapture.TabIndex = 0;
+ this.btnContinueCapture.Text = "杩炵画鎷嶇収";
+ this.btnContinueCapture.UseVisualStyleBackColor = true;
+ this.btnContinueCapture.Click += new System.EventHandler(this.btnContinueCapture_Click);
+ //
+ // gbxCalibration
+ //
+ this.gbxCalibration.Controls.Add(this.btnCalibration);
+ this.gbxCalibration.Controls.Add(this.txtCalAngle);
+ this.gbxCalibration.Controls.Add(this.label2);
+ this.gbxCalibration.Controls.Add(this.btnCapture);
+ this.gbxCalibration.Dock = System.Windows.Forms.DockStyle.Top;
+ this.gbxCalibration.Enabled = false;
+ this.gbxCalibration.Location = new System.Drawing.Point(0, 200);
+ this.gbxCalibration.Name = "gbxCalibration";
+ this.gbxCalibration.Size = new System.Drawing.Size(275, 91);
+ this.gbxCalibration.TabIndex = 5;
+ this.gbxCalibration.TabStop = false;
+ this.gbxCalibration.Text = "鏍囧畾";
+ //
+ // btnCalibration
+ //
+ this.btnCalibration.Enabled = false;
+ this.btnCalibration.Location = new System.Drawing.Point(144, 47);
+ this.btnCalibration.Name = "btnCalibration";
+ this.btnCalibration.Size = new System.Drawing.Size(109, 36);
+ this.btnCalibration.TabIndex = 3;
+ this.btnCalibration.Text = "鏍囧畾";
+ this.btnCalibration.UseVisualStyleBackColor = true;
+ this.btnCalibration.Click += new System.EventHandler(this.btnCalibration_Click);
+ //
+ // txtCalAngle
+ //
+ this.txtCalAngle.Location = new System.Drawing.Point(106, 20);
+ this.txtCalAngle.Name = "txtCalAngle";
+ this.txtCalAngle.Size = new System.Drawing.Size(147, 21);
+ this.txtCalAngle.TabIndex = 2;
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(19, 23);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(71, 12);
+ this.label2.TabIndex = 1;
+ this.label2.Text = "鏍囧畾鍧楄搴�:";
+ this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // btnCapture
+ //
+ this.btnCapture.Location = new System.Drawing.Point(17, 47);
+ this.btnCapture.Name = "btnCapture";
+ this.btnCapture.Size = new System.Drawing.Size(107, 36);
+ this.btnCapture.TabIndex = 0;
+ this.btnCapture.Text = "閲囧浘";
+ this.btnCapture.UseVisualStyleBackColor = true;
+ this.btnCapture.Click += new System.EventHandler(this.btnCapture_Click);
+ //
+ // groupBox4
+ //
+ this.groupBox4.Controls.Add(this.cboSize);
+ this.groupBox4.Controls.Add(this.label11);
+ this.groupBox4.Controls.Add(this.txtSN);
+ this.groupBox4.Controls.Add(this.label1);
+ this.groupBox4.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupBox4.Location = new System.Drawing.Point(0, 124);
+ this.groupBox4.Name = "groupBox4";
+ this.groupBox4.Size = new System.Drawing.Size(275, 76);
+ this.groupBox4.TabIndex = 4;
+ this.groupBox4.TabStop = false;
+ //
+ // txtSN
+ //
+ this.txtSN.Location = new System.Drawing.Point(39, 47);
+ this.txtSN.Name = "txtSN";
+ this.txtSN.Size = new System.Drawing.Size(214, 21);
+ this.txtSN.TabIndex = 1;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(14, 50);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(17, 12);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "SN";
+ //
+ // groupBox3
+ //
+ this.groupBox3.Controls.Add(this.txtResultFinalAngle);
+ this.groupBox3.Controls.Add(this.label5);
+ this.groupBox3.Controls.Add(this.txtResultInitAngle);
+ this.groupBox3.Controls.Add(this.label4);
+ this.groupBox3.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupBox3.Location = new System.Drawing.Point(0, 77);
+ this.groupBox3.Name = "groupBox3";
+ this.groupBox3.Size = new System.Drawing.Size(275, 47);
+ this.groupBox3.TabIndex = 3;
+ this.groupBox3.TabStop = false;
+ this.groupBox3.Text = "缁撴灉";
+ //
+ // txtResultFinalAngle
+ //
+ this.txtResultFinalAngle.Location = new System.Drawing.Point(191, 17);
+ this.txtResultFinalAngle.Name = "txtResultFinalAngle";
+ this.txtResultFinalAngle.ReadOnly = true;
+ this.txtResultFinalAngle.Size = new System.Drawing.Size(62, 21);
+ this.txtResultFinalAngle.TabIndex = 3;
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(135, 20);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(53, 12);
+ this.label5.TabIndex = 2;
+ this.label5.Text = "鏈�缁堣搴�";
+ //
+ // txtResultInitAngle
+ //
+ this.txtResultInitAngle.Location = new System.Drawing.Point(62, 17);
+ this.txtResultInitAngle.Name = "txtResultInitAngle";
+ this.txtResultInitAngle.ReadOnly = true;
+ this.txtResultInitAngle.Size = new System.Drawing.Size(62, 21);
+ this.txtResultInitAngle.TabIndex = 1;
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(6, 20);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(53, 12);
+ this.label4.TabIndex = 0;
+ this.label4.Text = "鍒濆瑙掑害";
+ //
+ // groupBox2
+ //
+ this.groupBox2.Controls.Add(this.cbxTest);
+ this.groupBox2.Controls.Add(this.btnCanCalibration);
+ this.groupBox2.Controls.Add(this.btnHalconTool);
+ this.groupBox2.Controls.Add(this.btnConfig);
+ this.groupBox2.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupBox2.Location = new System.Drawing.Point(0, 0);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(275, 77);
+ this.groupBox2.TabIndex = 2;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "閰嶇疆";
+ //
+ // cbxTest
+ //
+ this.cbxTest.Appearance = System.Windows.Forms.Appearance.Button;
+ this.cbxTest.Location = new System.Drawing.Point(198, 20);
+ this.cbxTest.Name = "cbxTest";
+ this.cbxTest.Size = new System.Drawing.Size(55, 46);
+ this.cbxTest.TabIndex = 3;
+ this.cbxTest.Text = "娴嬭瘯";
+ this.cbxTest.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.cbxTest.UseVisualStyleBackColor = true;
+ this.cbxTest.CheckedChanged += new System.EventHandler(this.cbxTest_CheckedChanged);
+ //
+ // btnCanCalibration
+ //
+ this.btnCanCalibration.Location = new System.Drawing.Point(137, 20);
+ this.btnCanCalibration.Name = "btnCanCalibration";
+ this.btnCanCalibration.Size = new System.Drawing.Size(55, 46);
+ this.btnCanCalibration.TabIndex = 2;
+ this.btnCanCalibration.Text = "鏍囧畾";
+ this.btnCanCalibration.UseVisualStyleBackColor = true;
+ this.btnCanCalibration.Click += new System.EventHandler(this.btnCanCalibration_Click);
+ //
+ // btnHalconTool
+ //
+ this.btnHalconTool.Location = new System.Drawing.Point(76, 20);
+ this.btnHalconTool.Name = "btnHalconTool";
+ this.btnHalconTool.Size = new System.Drawing.Size(55, 46);
+ this.btnHalconTool.TabIndex = 1;
+ this.btnHalconTool.Text = "鍥惧儚閰嶇疆";
+ this.btnHalconTool.UseVisualStyleBackColor = true;
+ this.btnHalconTool.Click += new System.EventHandler(this.btnHalconTool_Click);
+ //
+ // btnConfig
+ //
+ this.btnConfig.Location = new System.Drawing.Point(17, 20);
+ this.btnConfig.Name = "btnConfig";
+ this.btnConfig.Size = new System.Drawing.Size(55, 46);
+ this.btnConfig.TabIndex = 0;
+ this.btnConfig.Text = "鍙傛暟閰嶇疆";
+ this.btnConfig.UseVisualStyleBackColor = true;
+ this.btnConfig.Click += new System.EventHandler(this.btnConfig_Click);
+ //
+ // checkBox2
+ //
+ this.checkBox2.AutoSize = true;
+ this.checkBox2.Location = new System.Drawing.Point(20, 556);
+ this.checkBox2.Name = "checkBox2";
+ this.checkBox2.Size = new System.Drawing.Size(96, 16);
+ this.checkBox2.TabIndex = 24;
+ this.checkBox2.Text = "鍚敤鎵嬪姩瀹氫綅";
+ this.checkBox2.UseVisualStyleBackColor = true;
+ this.checkBox2.CheckedChanged += new System.EventHandler(this.checkBox2_CheckedChanged);
+ //
+ // button15
+ //
+ this.button15.Enabled = false;
+ this.button15.Location = new System.Drawing.Point(143, 544);
+ this.button15.Name = "button15";
+ this.button15.Size = new System.Drawing.Size(105, 36);
+ this.button15.TabIndex = 23;
+ this.button15.Text = "鎵嬪姩瀹氫綅";
+ this.button15.UseVisualStyleBackColor = true;
+ this.button15.Click += new System.EventHandler(this.button15_Click);
+ //
+ // tVideo
+ //
+ this.tVideo.Interval = 250;
+ this.tVideo.Tick += new System.EventHandler(this.tVideo_Tick);
+ //
+ // tabControl1
+ //
+ this.tabControl1.Controls.Add(this.tabPage2);
+ this.tabControl1.Controls.Add(this.tabPage1);
+ this.tabControl1.Controls.Add(this.tabPage3);
+ this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tabControl1.Location = new System.Drawing.Point(0, 72);
+ this.tabControl1.Name = "tabControl1";
+ this.tabControl1.SelectedIndex = 0;
+ this.tabControl1.Size = new System.Drawing.Size(1081, 675);
+ this.tabControl1.TabIndex = 4;
+ //
+ // tabPage2
+ //
+ this.tabPage2.Controls.Add(this.panel2);
+ this.tabPage2.Controls.Add(this.panel3);
+ this.tabPage2.Location = new System.Drawing.Point(4, 22);
+ this.tabPage2.Name = "tabPage2";
+ this.tabPage2.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3);
+ this.tabPage2.Size = new System.Drawing.Size(1073, 649);
+ this.tabPage2.TabIndex = 1;
+ this.tabPage2.Text = "涓诲伐浣�";
+ this.tabPage2.UseVisualStyleBackColor = true;
+ //
+ // tabPage1
+ //
+ this.tabPage1.Controls.Add(this.panel4);
+ this.tabPage1.Controls.Add(this.panel5);
+ this.tabPage1.Location = new System.Drawing.Point(4, 22);
+ this.tabPage1.Name = "tabPage1";
+ this.tabPage1.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3);
+ this.tabPage1.Size = new System.Drawing.Size(1073, 649);
+ this.tabPage1.TabIndex = 0;
+ this.tabPage1.Text = "宸﹀伐浣�";
+ this.tabPage1.UseVisualStyleBackColor = true;
+ //
+ // panel4
+ //
+ this.panel4.Controls.Add(this.lblAngleDisplay_left);
+ this.panel4.Controls.Add(this.viewPort_left);
+ this.panel4.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.panel4.Location = new System.Drawing.Point(3, 3);
+ this.panel4.Name = "panel4";
+ this.panel4.Size = new System.Drawing.Size(792, 643);
+ this.panel4.TabIndex = 0;
+ //
+ // lblAngleDisplay_left
+ //
+ this.lblAngleDisplay_left.Location = new System.Drawing.Point(666, 9);
+ this.lblAngleDisplay_left.Name = "lblAngleDisplay_left";
+ this.lblAngleDisplay_left.Size = new System.Drawing.Size(47, 18);
+ this.lblAngleDisplay_left.TabIndex = 2;
+ this.lblAngleDisplay_left.Text = "-";
+ this.lblAngleDisplay_left.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // viewPort_left
+ //
+ this.viewPort_left.BackColor = System.Drawing.Color.Black;
+ this.viewPort_left.BorderColor = System.Drawing.Color.Black;
+ this.viewPort_left.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.viewPort_left.ImagePart = new System.Drawing.Rectangle(0, 0, 640, 480);
+ this.viewPort_left.Location = new System.Drawing.Point(0, 0);
+ this.viewPort_left.Name = "viewPort_left";
+ this.viewPort_left.Size = new System.Drawing.Size(792, 643);
+ this.viewPort_left.TabIndex = 1;
+ this.viewPort_left.WindowSize = new System.Drawing.Size(792, 643);
+ //
+ // panel5
+ //
+ this.panel5.Controls.Add(this.btnDisplay_left);
+ this.panel5.Controls.Add(this.gbxTest_left);
+ this.panel5.Controls.Add(this.gbxCalibration_left);
+ this.panel5.Controls.Add(this.groupBox6);
+ this.panel5.Controls.Add(this.groupBox7);
+ this.panel5.Controls.Add(this.groupBox8);
+ this.panel5.Controls.Add(this.checkBox1);
+ this.panel5.Controls.Add(this.button6);
+ this.panel5.Dock = System.Windows.Forms.DockStyle.Right;
+ this.panel5.Location = new System.Drawing.Point(795, 3);
+ this.panel5.Name = "panel5";
+ this.panel5.Size = new System.Drawing.Size(275, 643);
+ this.panel5.TabIndex = 1;
+ //
+ // btnDisplay_left
+ //
+ this.btnDisplay_left.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.btnDisplay_left.Font = new System.Drawing.Font("瀹嬩綋", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.btnDisplay_left.Location = new System.Drawing.Point(0, 587);
+ this.btnDisplay_left.Name = "btnDisplay_left";
+ this.btnDisplay_left.Size = new System.Drawing.Size(275, 56);
+ this.btnDisplay_left.TabIndex = 7;
+ this.btnDisplay_left.Text = "鏄剧ず";
+ this.btnDisplay_left.UseVisualStyleBackColor = true;
+ //
+ // gbxTest_left
+ //
+ this.gbxTest_left.Controls.Add(this.button5);
+ this.gbxTest_left.Controls.Add(this.button4);
+ this.gbxTest_left.Controls.Add(this.button3);
+ this.gbxTest_left.Controls.Add(this.button2);
+ this.gbxTest_left.Controls.Add(this.button1);
+ this.gbxTest_left.Controls.Add(this.btnOut);
+ this.gbxTest_left.Controls.Add(this.btnCloseDor);
+ this.gbxTest_left.Controls.Add(this.btnOpenDor);
+ this.gbxTest_left.Controls.Add(this.btnORI_left);
+ this.gbxTest_left.Controls.Add(this.ckbCameraLight_left);
+ this.gbxTest_left.Controls.Add(this.btnTestMove_left);
+ this.gbxTest_left.Controls.Add(this.txtTestPulse_left);
+ this.gbxTest_left.Controls.Add(this.label6);
+ this.gbxTest_left.Controls.Add(this.btnStopCapture_left);
+ this.gbxTest_left.Controls.Add(this.btnContinueCapture_left);
+ this.gbxTest_left.Dock = System.Windows.Forms.DockStyle.Top;
+ this.gbxTest_left.Enabled = false;
+ this.gbxTest_left.Location = new System.Drawing.Point(0, 284);
+ this.gbxTest_left.Name = "gbxTest_left";
+ this.gbxTest_left.Size = new System.Drawing.Size(275, 202);
+ this.gbxTest_left.TabIndex = 12;
+ this.gbxTest_left.TabStop = false;
+ this.gbxTest_left.Text = "娴嬭瘯";
+ //
+ // button5
+ //
+ this.button5.Location = new System.Drawing.Point(177, 90);
+ this.button5.Name = "button5";
+ this.button5.Size = new System.Drawing.Size(73, 32);
+ this.button5.TabIndex = 14;
+ this.button5.Text = "姘旂几鏉惧紑";
+ this.button5.UseVisualStyleBackColor = true;
+ this.button5.Click += new System.EventHandler(this.button5_Click);
+ //
+ // button4
+ //
+ this.button4.Location = new System.Drawing.Point(101, 90);
+ this.button4.Name = "button4";
+ this.button4.Size = new System.Drawing.Size(73, 32);
+ this.button4.TabIndex = 13;
+ this.button4.Text = "姘旂几澶圭揣";
+ this.button4.UseVisualStyleBackColor = true;
+ this.button4.Click += new System.EventHandler(this.button4_Click);
+ //
+ // button3
+ //
+ this.button3.Location = new System.Drawing.Point(25, 163);
+ this.button3.Name = "button3";
+ this.button3.Size = new System.Drawing.Size(108, 32);
+ this.button3.TabIndex = 12;
+ this.button3.Text = "閫佹枡";
+ this.button3.UseVisualStyleBackColor = true;
+ this.button3.Click += new System.EventHandler(this.button3_Click);
+ //
+ // button2
+ //
+ this.button2.Location = new System.Drawing.Point(25, 90);
+ this.button2.Name = "button2";
+ this.button2.Size = new System.Drawing.Size(73, 32);
+ this.button2.TabIndex = 11;
+ this.button2.Text = "鎵嬪姩鍏佽";
+ this.button2.UseVisualStyleBackColor = true;
+ this.button2.Click += new System.EventHandler(this.button2_Click);
+ //
+ // button1
+ //
+ this.button1.Location = new System.Drawing.Point(178, 126);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(73, 32);
+ this.button1.TabIndex = 10;
+ this.button1.Text = "婊戝彴姘旂几";
+ this.button1.UseVisualStyleBackColor = true;
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
+ // btnOut
+ //
+ this.btnOut.Location = new System.Drawing.Point(146, 163);
+ this.btnOut.Name = "btnOut";
+ this.btnOut.Size = new System.Drawing.Size(104, 32);
+ this.btnOut.TabIndex = 9;
+ this.btnOut.Text = "鍑烘枡";
+ this.btnOut.UseVisualStyleBackColor = true;
+ this.btnOut.Click += new System.EventHandler(this.btnOut_Click);
+ //
+ // btnCloseDor
+ //
+ this.btnCloseDor.Location = new System.Drawing.Point(25, 126);
+ this.btnCloseDor.Name = "btnCloseDor";
+ this.btnCloseDor.Size = new System.Drawing.Size(73, 32);
+ this.btnCloseDor.TabIndex = 8;
+ this.btnCloseDor.Text = "鍏抽棬";
+ this.btnCloseDor.UseVisualStyleBackColor = true;
+ this.btnCloseDor.Click += new System.EventHandler(this.btnCloseDor_Click);
+ //
+ // btnOpenDor
+ //
+ this.btnOpenDor.Location = new System.Drawing.Point(101, 126);
+ this.btnOpenDor.Name = "btnOpenDor";
+ this.btnOpenDor.Size = new System.Drawing.Size(73, 32);
+ this.btnOpenDor.TabIndex = 7;
+ this.btnOpenDor.Text = "寮�闂�";
+ this.btnOpenDor.UseVisualStyleBackColor = true;
+ this.btnOpenDor.Click += new System.EventHandler(this.btnOpenDor_Click);
+ //
+ // btnORI_left
+ //
+ this.btnORI_left.Location = new System.Drawing.Point(200, 62);
+ this.btnORI_left.Name = "btnORI_left";
+ this.btnORI_left.Size = new System.Drawing.Size(50, 23);
+ this.btnORI_left.TabIndex = 6;
+ this.btnORI_left.Text = "鍥炲師鐐�";
+ this.btnORI_left.UseVisualStyleBackColor = true;
+ this.btnORI_left.Click += new System.EventHandler(this.btnORI_left_Click);
+ //
+ // ckbCameraLight_left
+ //
+ this.ckbCameraLight_left.Appearance = System.Windows.Forms.Appearance.Button;
+ this.ckbCameraLight_left.Location = new System.Drawing.Point(178, 20);
+ this.ckbCameraLight_left.Name = "ckbCameraLight_left";
+ this.ckbCameraLight_left.Size = new System.Drawing.Size(73, 32);
+ this.ckbCameraLight_left.TabIndex = 5;
+ this.ckbCameraLight_left.Text = "鍏夋簮寮�/鍏�";
+ this.ckbCameraLight_left.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.ckbCameraLight_left.UseVisualStyleBackColor = true;
+ this.ckbCameraLight_left.CheckedChanged += new System.EventHandler(this.ckbCameraLight_left_CheckedChanged);
+ //
+ // btnTestMove_left
+ //
+ this.btnTestMove_left.Location = new System.Drawing.Point(146, 62);
+ this.btnTestMove_left.Name = "btnTestMove_left";
+ this.btnTestMove_left.Size = new System.Drawing.Size(49, 23);
+ this.btnTestMove_left.TabIndex = 4;
+ this.btnTestMove_left.Text = "绉诲姩";
+ this.btnTestMove_left.UseVisualStyleBackColor = true;
+ this.btnTestMove_left.Click += new System.EventHandler(this.btnTestMove_left_Click);
+ //
+ // txtTestPulse_left
+ //
+ this.txtTestPulse_left.Location = new System.Drawing.Point(77, 63);
+ this.txtTestPulse_left.Name = "txtTestPulse_left";
+ this.txtTestPulse_left.Size = new System.Drawing.Size(63, 21);
+ this.txtTestPulse_left.TabIndex = 3;
+ //
+ // label6
+ //
+ this.label6.AutoSize = true;
+ this.label6.Location = new System.Drawing.Point(22, 67);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(53, 12);
+ this.label6.TabIndex = 2;
+ this.label6.Text = "绉诲姩鑴夊啿";
+ //
+ // btnStopCapture_left
+ //
+ this.btnStopCapture_left.Location = new System.Drawing.Point(99, 20);
+ this.btnStopCapture_left.Name = "btnStopCapture_left";
+ this.btnStopCapture_left.Size = new System.Drawing.Size(75, 32);
+ this.btnStopCapture_left.TabIndex = 1;
+ this.btnStopCapture_left.Text = "鍋滄鎷嶇収";
+ this.btnStopCapture_left.UseVisualStyleBackColor = true;
+ this.btnStopCapture_left.Click += new System.EventHandler(this.btnStopCapture_left_Click);
+ //
+ // btnContinueCapture_left
+ //
+ this.btnContinueCapture_left.Location = new System.Drawing.Point(22, 20);
+ this.btnContinueCapture_left.Name = "btnContinueCapture_left";
+ this.btnContinueCapture_left.Size = new System.Drawing.Size(73, 32);
+ this.btnContinueCapture_left.TabIndex = 0;
+ this.btnContinueCapture_left.Text = "杩炵画鎷嶇収";
+ this.btnContinueCapture_left.UseVisualStyleBackColor = true;
+ this.btnContinueCapture_left.Click += new System.EventHandler(this.btnContinueCapture_left_Click);
+ //
+ // gbxCalibration_left
+ //
+ this.gbxCalibration_left.Controls.Add(this.btnCalibration_left);
+ this.gbxCalibration_left.Controls.Add(this.txtCalAngle_left);
+ this.gbxCalibration_left.Controls.Add(this.label7);
+ this.gbxCalibration_left.Controls.Add(this.btnCapture_left);
+ this.gbxCalibration_left.Dock = System.Windows.Forms.DockStyle.Top;
+ this.gbxCalibration_left.Enabled = false;
+ this.gbxCalibration_left.Location = new System.Drawing.Point(0, 191);
+ this.gbxCalibration_left.Name = "gbxCalibration_left";
+ this.gbxCalibration_left.Size = new System.Drawing.Size(275, 93);
+ this.gbxCalibration_left.TabIndex = 11;
+ this.gbxCalibration_left.TabStop = false;
+ this.gbxCalibration_left.Text = "鏍囧畾";
+ //
+ // btnCalibration_left
+ //
+ this.btnCalibration_left.Enabled = false;
+ this.btnCalibration_left.Location = new System.Drawing.Point(144, 48);
+ this.btnCalibration_left.Name = "btnCalibration_left";
+ this.btnCalibration_left.Size = new System.Drawing.Size(109, 36);
+ this.btnCalibration_left.TabIndex = 3;
+ this.btnCalibration_left.Text = "鏍囧畾";
+ this.btnCalibration_left.UseVisualStyleBackColor = true;
+ this.btnCalibration_left.Click += new System.EventHandler(this.btnCalibration_left_Click);
+ //
+ // txtCalAngle_left
+ //
+ this.txtCalAngle_left.Location = new System.Drawing.Point(104, 20);
+ this.txtCalAngle_left.Name = "txtCalAngle_left";
+ this.txtCalAngle_left.Size = new System.Drawing.Size(147, 21);
+ this.txtCalAngle_left.TabIndex = 2;
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.Location = new System.Drawing.Point(19, 23);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(71, 12);
+ this.label7.TabIndex = 1;
+ this.label7.Text = "鏍囧畾鍧楄搴�:";
+ this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // btnCapture_left
+ //
+ this.btnCapture_left.Location = new System.Drawing.Point(21, 48);
+ this.btnCapture_left.Name = "btnCapture_left";
+ this.btnCapture_left.Size = new System.Drawing.Size(112, 36);
+ this.btnCapture_left.TabIndex = 0;
+ this.btnCapture_left.Text = "閲囧浘";
+ this.btnCapture_left.UseVisualStyleBackColor = true;
+ this.btnCapture_left.Click += new System.EventHandler(this.btnCapture_left_Click);
+ //
+ // groupBox6
+ //
+ this.groupBox6.Controls.Add(this.cboSize_Left);
+ this.groupBox6.Controls.Add(this.label12);
+ this.groupBox6.Controls.Add(this.txtSN_left);
+ this.groupBox6.Controls.Add(this.label8);
+ this.groupBox6.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupBox6.Location = new System.Drawing.Point(0, 112);
+ this.groupBox6.Name = "groupBox6";
+ this.groupBox6.Size = new System.Drawing.Size(275, 79);
+ this.groupBox6.TabIndex = 10;
+ this.groupBox6.TabStop = false;
+ //
+ // txtSN_left
+ //
+ this.txtSN_left.Location = new System.Drawing.Point(42, 47);
+ this.txtSN_left.Name = "txtSN_left";
+ this.txtSN_left.Size = new System.Drawing.Size(214, 21);
+ this.txtSN_left.TabIndex = 1;
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.Location = new System.Drawing.Point(17, 50);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(17, 12);
+ this.label8.TabIndex = 0;
+ this.label8.Text = "SN";
+ //
+ // groupBox7
+ //
+ this.groupBox7.Controls.Add(this.txtResultFinalAngle_left);
+ this.groupBox7.Controls.Add(this.label9);
+ this.groupBox7.Controls.Add(this.txtResultInitAngle_left);
+ this.groupBox7.Controls.Add(this.label10);
+ this.groupBox7.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupBox7.Location = new System.Drawing.Point(0, 65);
+ this.groupBox7.Name = "groupBox7";
+ this.groupBox7.Size = new System.Drawing.Size(275, 47);
+ this.groupBox7.TabIndex = 9;
+ this.groupBox7.TabStop = false;
+ this.groupBox7.Text = "缁撴灉";
+ //
+ // txtResultFinalAngle_left
+ //
+ this.txtResultFinalAngle_left.Location = new System.Drawing.Point(194, 16);
+ this.txtResultFinalAngle_left.Name = "txtResultFinalAngle_left";
+ this.txtResultFinalAngle_left.ReadOnly = true;
+ this.txtResultFinalAngle_left.Size = new System.Drawing.Size(62, 21);
+ this.txtResultFinalAngle_left.TabIndex = 3;
+ //
+ // label9
+ //
+ this.label9.AutoSize = true;
+ this.label9.Location = new System.Drawing.Point(138, 19);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(53, 12);
+ this.label9.TabIndex = 2;
+ this.label9.Text = "鏈�缁堣搴�";
+ //
+ // txtResultInitAngle_left
+ //
+ this.txtResultInitAngle_left.Location = new System.Drawing.Point(71, 16);
+ this.txtResultInitAngle_left.Name = "txtResultInitAngle_left";
+ this.txtResultInitAngle_left.ReadOnly = true;
+ this.txtResultInitAngle_left.Size = new System.Drawing.Size(62, 21);
+ this.txtResultInitAngle_left.TabIndex = 1;
+ //
+ // label10
+ //
+ this.label10.AutoSize = true;
+ this.label10.Location = new System.Drawing.Point(15, 19);
+ this.label10.Name = "label10";
+ this.label10.Size = new System.Drawing.Size(53, 12);
+ this.label10.TabIndex = 0;
+ this.label10.Text = "鍒濆瑙掑害";
+ //
+ // groupBox8
+ //
+ this.groupBox8.Controls.Add(this.cbxTest_left);
+ this.groupBox8.Controls.Add(this.btnCanCalibration_left);
+ this.groupBox8.Controls.Add(this.btnHalconTool_left);
+ this.groupBox8.Controls.Add(this.btnConfig_left);
+ this.groupBox8.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupBox8.Location = new System.Drawing.Point(0, 0);
+ this.groupBox8.Name = "groupBox8";
+ this.groupBox8.Size = new System.Drawing.Size(275, 65);
+ this.groupBox8.TabIndex = 8;
+ this.groupBox8.TabStop = false;
+ this.groupBox8.Text = "閰嶇疆";
+ //
+ // cbxTest_left
+ //
+ this.cbxTest_left.Appearance = System.Windows.Forms.Appearance.Button;
+ this.cbxTest_left.Location = new System.Drawing.Point(201, 13);
+ this.cbxTest_left.Name = "cbxTest_left";
+ this.cbxTest_left.Size = new System.Drawing.Size(55, 46);
+ this.cbxTest_left.TabIndex = 3;
+ this.cbxTest_left.Text = "娴嬭瘯";
+ this.cbxTest_left.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.cbxTest_left.UseVisualStyleBackColor = true;
+ this.cbxTest_left.CheckedChanged += new System.EventHandler(this.cbxTest_left_CheckedChanged);
+ //
+ // btnCanCalibration_left
+ //
+ this.btnCanCalibration_left.Location = new System.Drawing.Point(140, 13);
+ this.btnCanCalibration_left.Name = "btnCanCalibration_left";
+ this.btnCanCalibration_left.Size = new System.Drawing.Size(55, 46);
+ this.btnCanCalibration_left.TabIndex = 2;
+ this.btnCanCalibration_left.Text = "鏍囧畾";
+ this.btnCanCalibration_left.UseVisualStyleBackColor = true;
+ this.btnCanCalibration_left.Click += new System.EventHandler(this.btnCanCalibration_left_Click);
+ //
+ // btnHalconTool_left
+ //
+ this.btnHalconTool_left.Location = new System.Drawing.Point(79, 13);
+ this.btnHalconTool_left.Name = "btnHalconTool_left";
+ this.btnHalconTool_left.Size = new System.Drawing.Size(55, 46);
+ this.btnHalconTool_left.TabIndex = 1;
+ this.btnHalconTool_left.Text = "鍥惧儚閰嶇疆";
+ this.btnHalconTool_left.UseVisualStyleBackColor = true;
+ this.btnHalconTool_left.Click += new System.EventHandler(this.btnHalconTool_left_Click);
+ //
+ // btnConfig_left
+ //
+ this.btnConfig_left.Location = new System.Drawing.Point(20, 13);
+ this.btnConfig_left.Name = "btnConfig_left";
+ this.btnConfig_left.Size = new System.Drawing.Size(55, 46);
+ this.btnConfig_left.TabIndex = 0;
+ this.btnConfig_left.Text = "鍙傛暟閰嶇疆";
+ this.btnConfig_left.UseVisualStyleBackColor = true;
+ this.btnConfig_left.Click += new System.EventHandler(this.btnConfig_left_Click);
+ //
+ // checkBox1
+ //
+ this.checkBox1.AutoSize = true;
+ this.checkBox1.Location = new System.Drawing.Point(26, 535);
+ this.checkBox1.Name = "checkBox1";
+ this.checkBox1.Size = new System.Drawing.Size(96, 16);
+ this.checkBox1.TabIndex = 16;
+ this.checkBox1.Text = "鍚敤鎵嬪姩瀹氫綅";
+ this.checkBox1.UseVisualStyleBackColor = true;
+ this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
+ //
+ // button6
+ //
+ this.button6.Enabled = false;
+ this.button6.Location = new System.Drawing.Point(147, 524);
+ this.button6.Name = "button6";
+ this.button6.Size = new System.Drawing.Size(104, 36);
+ this.button6.TabIndex = 15;
+ this.button6.Text = "鎵嬪姩瀹氫綅";
+ this.button6.UseVisualStyleBackColor = true;
+ this.button6.Click += new System.EventHandler(this.button6_Click);
+ //
+ // tabPage3
+ //
+ this.tabPage3.Controls.Add(this.groupBox5);
+ this.tabPage3.Controls.Add(this.groupBox1);
+ this.tabPage3.Location = new System.Drawing.Point(4, 22);
+ this.tabPage3.Name = "tabPage3";
+ this.tabPage3.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3);
+ this.tabPage3.Size = new System.Drawing.Size(1000, 568);
+ this.tabPage3.TabIndex = 2;
+ this.tabPage3.Text = "I/O";
+ this.tabPage3.UseVisualStyleBackColor = true;
+ //
+ // groupBox5
+ //
+ this.groupBox5.Controls.Add(this.ckbSaveImage);
+ this.groupBox5.Controls.Add(this.lblForApple);
+ this.groupBox5.Controls.Add(this.lblZ_ShaChe);
+ this.groupBox5.Controls.Add(this.lblDingWei_SRV_ON);
+ this.groupBox5.Controls.Add(this.lblZ_SRV_ON);
+ this.groupBox5.Controls.Add(this.lblX_SRV_ON);
+ this.groupBox5.Controls.Add(this.lblSiFuPowerOn);
+ this.groupBox5.Controls.Add(this.lblHuaTaiCylider);
+ this.groupBox5.Controls.Add(this.lblWuGanCylider);
+ this.groupBox5.Controls.Add(this.lblZhengBianCylider);
+ this.groupBox5.Controls.Add(this.lblCeBianCylider);
+ this.groupBox5.Controls.Add(this.lblBuzzer);
+ this.groupBox5.Controls.Add(this.lblGreen);
+ this.groupBox5.Controls.Add(this.lblYellow);
+ this.groupBox5.Controls.Add(this.lblRed);
+ this.groupBox5.Controls.Add(this.lblWuGanCylider2);
+ this.groupBox5.Controls.Add(this.lblCameraLighto);
+ this.groupBox5.Font = new System.Drawing.Font("瀹嬩綋", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.groupBox5.Location = new System.Drawing.Point(521, 7);
+ this.groupBox5.Name = "groupBox5";
+ this.groupBox5.Size = new System.Drawing.Size(473, 558);
+ this.groupBox5.TabIndex = 1;
+ this.groupBox5.TabStop = false;
+ this.groupBox5.Text = "Output";
+ //
+ // ckbSaveImage
+ //
+ this.ckbSaveImage.AutoSize = true;
+ this.ckbSaveImage.Checked = true;
+ this.ckbSaveImage.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.ckbSaveImage.Location = new System.Drawing.Point(45, 389);
+ this.ckbSaveImage.Name = "ckbSaveImage";
+ this.ckbSaveImage.Size = new System.Drawing.Size(108, 20);
+ this.ckbSaveImage.TabIndex = 38;
+ this.ckbSaveImage.Text = "saveImage";
+ this.ckbSaveImage.UseVisualStyleBackColor = true;
+ this.ckbSaveImage.CheckedChanged += new System.EventHandler(this.ckbSaveImage_CheckedChanged);
+ //
+ // lblForApple
+ //
+ this.lblForApple.AutoSize = true;
+ this.lblForApple.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblForApple.Location = new System.Drawing.Point(242, 225);
+ this.lblForApple.Name = "lblForApple";
+ this.lblForApple.Size = new System.Drawing.Size(138, 19);
+ this.lblForApple.TabIndex = 35;
+ this.lblForApple.Text = "缁橝PPLE102.05";
+ //
+ // lblZ_ShaChe
+ //
+ this.lblZ_ShaChe.AutoSize = true;
+ this.lblZ_ShaChe.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblZ_ShaChe.Location = new System.Drawing.Point(242, 187);
+ this.lblZ_ShaChe.Name = "lblZ_ShaChe";
+ this.lblZ_ShaChe.Size = new System.Drawing.Size(136, 19);
+ this.lblZ_ShaChe.TabIndex = 34;
+ this.lblZ_ShaChe.Text = "Z杞村埞杞�102.04";
+ //
+ // lblDingWei_SRV_ON
+ //
+ this.lblDingWei_SRV_ON.AutoSize = true;
+ this.lblDingWei_SRV_ON.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblDingWei_SRV_ON.Location = new System.Drawing.Point(242, 149);
+ this.lblDingWei_SRV_ON.Name = "lblDingWei_SRV_ON";
+ this.lblDingWei_SRV_ON.Size = new System.Drawing.Size(186, 19);
+ this.lblDingWei_SRV_ON.TabIndex = 33;
+ this.lblDingWei_SRV_ON.Text = "瀹氫綅杞碨RV-ON102.03";
+ //
+ // lblZ_SRV_ON
+ //
+ this.lblZ_SRV_ON.AutoSize = true;
+ this.lblZ_SRV_ON.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblZ_SRV_ON.Location = new System.Drawing.Point(242, 111);
+ this.lblZ_SRV_ON.Name = "lblZ_SRV_ON";
+ this.lblZ_SRV_ON.Size = new System.Drawing.Size(158, 19);
+ this.lblZ_SRV_ON.TabIndex = 32;
+ this.lblZ_SRV_ON.Text = "Z杞碨RV-ON102.02";
+ //
+ // lblX_SRV_ON
+ //
+ this.lblX_SRV_ON.AutoSize = true;
+ this.lblX_SRV_ON.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblX_SRV_ON.Location = new System.Drawing.Point(242, 73);
+ this.lblX_SRV_ON.Name = "lblX_SRV_ON";
+ this.lblX_SRV_ON.Size = new System.Drawing.Size(158, 19);
+ this.lblX_SRV_ON.TabIndex = 31;
+ this.lblX_SRV_ON.Text = "X杞碨RV-ON102.01";
+ //
+ // lblSiFuPowerOn
+ //
+ this.lblSiFuPowerOn.AutoSize = true;
+ this.lblSiFuPowerOn.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblSiFuPowerOn.Location = new System.Drawing.Point(242, 35);
+ this.lblSiFuPowerOn.Name = "lblSiFuPowerOn";
+ this.lblSiFuPowerOn.Size = new System.Drawing.Size(145, 19);
+ this.lblSiFuPowerOn.TabIndex = 30;
+ this.lblSiFuPowerOn.Text = "浼烘湇涓婄數102.00";
+ //
+ // lblHuaTaiCylider
+ //
+ this.lblHuaTaiCylider.AutoSize = true;
+ this.lblHuaTaiCylider.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblHuaTaiCylider.Location = new System.Drawing.Point(41, 300);
+ this.lblHuaTaiCylider.Name = "lblHuaTaiCylider";
+ this.lblHuaTaiCylider.Size = new System.Drawing.Size(145, 19);
+ this.lblHuaTaiCylider.TabIndex = 29;
+ this.lblHuaTaiCylider.Text = "婊戝彴姘旂几101.07";
+ //
+ // lblWuGanCylider
+ //
+ this.lblWuGanCylider.AutoSize = true;
+ this.lblWuGanCylider.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblWuGanCylider.Location = new System.Drawing.Point(41, 262);
+ this.lblWuGanCylider.Name = "lblWuGanCylider";
+ this.lblWuGanCylider.Size = new System.Drawing.Size(145, 19);
+ this.lblWuGanCylider.TabIndex = 28;
+ this.lblWuGanCylider.Text = "鏃犳潌姘旂几101.06";
+ //
+ // lblZhengBianCylider
+ //
+ this.lblZhengBianCylider.AutoSize = true;
+ this.lblZhengBianCylider.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblZhengBianCylider.Location = new System.Drawing.Point(41, 224);
+ this.lblZhengBianCylider.Name = "lblZhengBianCylider";
+ this.lblZhengBianCylider.Size = new System.Drawing.Size(145, 19);
+ this.lblZhengBianCylider.TabIndex = 27;
+ this.lblZhengBianCylider.Text = "姝h竟姘旂几101.05";
+ //
+ // lblCeBianCylider
+ //
+ this.lblCeBianCylider.AutoSize = true;
+ this.lblCeBianCylider.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblCeBianCylider.Location = new System.Drawing.Point(41, 186);
+ this.lblCeBianCylider.Name = "lblCeBianCylider";
+ this.lblCeBianCylider.Size = new System.Drawing.Size(145, 19);
+ this.lblCeBianCylider.TabIndex = 26;
+ this.lblCeBianCylider.Text = "渚ц竟姘旂几101.04";
+ //
+ // lblBuzzer
+ //
+ this.lblBuzzer.AutoSize = true;
+ this.lblBuzzer.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblBuzzer.Location = new System.Drawing.Point(41, 149);
+ this.lblBuzzer.Name = "lblBuzzer";
+ this.lblBuzzer.Size = new System.Drawing.Size(107, 19);
+ this.lblBuzzer.TabIndex = 25;
+ this.lblBuzzer.Text = "铚傞福101.03";
+ //
+ // lblGreen
+ //
+ this.lblGreen.AutoSize = true;
+ this.lblGreen.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblGreen.Location = new System.Drawing.Point(41, 111);
+ this.lblGreen.Name = "lblGreen";
+ this.lblGreen.Size = new System.Drawing.Size(107, 19);
+ this.lblGreen.TabIndex = 24;
+ this.lblGreen.Text = "缁跨伅101.02";
+ //
+ // lblYellow
+ //
+ this.lblYellow.AutoSize = true;
+ this.lblYellow.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblYellow.Location = new System.Drawing.Point(41, 73);
+ this.lblYellow.Name = "lblYellow";
+ this.lblYellow.Size = new System.Drawing.Size(107, 19);
+ this.lblYellow.TabIndex = 23;
+ this.lblYellow.Text = "榛勭伅101.01";
+ //
+ // lblRed
+ //
+ this.lblRed.AutoSize = true;
+ this.lblRed.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblRed.Location = new System.Drawing.Point(41, 35);
+ this.lblRed.Name = "lblRed";
+ this.lblRed.Size = new System.Drawing.Size(107, 19);
+ this.lblRed.TabIndex = 22;
+ this.lblRed.Text = "绾㈢伅101.00";
+ //
+ // lblWuGanCylider2
+ //
+ this.lblWuGanCylider2.AutoSize = true;
+ this.lblWuGanCylider2.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblWuGanCylider2.Location = new System.Drawing.Point(242, 301);
+ this.lblWuGanCylider2.Name = "lblWuGanCylider2";
+ this.lblWuGanCylider2.Size = new System.Drawing.Size(184, 19);
+ this.lblWuGanCylider2.TabIndex = 37;
+ this.lblWuGanCylider2.Text = "鏃犳潌姘旂几浣�2 102.07";
+ //
+ // lblCameraLighto
+ //
+ this.lblCameraLighto.AutoSize = true;
+ this.lblCameraLighto.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblCameraLighto.Location = new System.Drawing.Point(242, 263);
+ this.lblCameraLighto.Name = "lblCameraLighto";
+ this.lblCameraLighto.Size = new System.Drawing.Size(145, 19);
+ this.lblCameraLighto.TabIndex = 36;
+ this.lblCameraLighto.Text = "鐩告満鍏夋簮102.06";
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.lblWuGanHou);
+ this.groupBox1.Controls.Add(this.lblWuGanQian);
+ this.groupBox1.Controls.Add(this.lblCeBianHou);
+ this.groupBox1.Controls.Add(this.lblCeBianQian);
+ this.groupBox1.Controls.Add(this.lblOpenJieJin);
+ this.groupBox1.Controls.Add(this.lblSafeCurtain);
+ this.groupBox1.Controls.Add(this.lblE_Stop);
+ this.groupBox1.Controls.Add(this.lblReset);
+ this.groupBox1.Controls.Add(this.lblStart2);
+ this.groupBox1.Controls.Add(this.lblStart1);
+ this.groupBox1.Controls.Add(this.lblDingWei_Alarm);
+ this.groupBox1.Controls.Add(this.lblDingWei_JinDian);
+ this.groupBox1.Controls.Add(this.lblDingWei_CCW);
+ this.groupBox1.Controls.Add(this.lblDingWei_CW);
+ this.groupBox1.Controls.Add(this.lblZ_CCW);
+ this.groupBox1.Controls.Add(this.lblZ_CW);
+ this.groupBox1.Controls.Add(this.lblX_CCW);
+ this.groupBox1.Controls.Add(this.lblX_CW);
+ this.groupBox1.Controls.Add(this.lblZ_Alarm);
+ this.groupBox1.Controls.Add(this.lblX_Alarm);
+ this.groupBox1.Controls.Add(this.lblZ_JinDian);
+ this.groupBox1.Controls.Add(this.lblX_JinDian);
+ this.groupBox1.Font = new System.Drawing.Font("瀹嬩綋", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.groupBox1.Location = new System.Drawing.Point(8, 6);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(506, 559);
+ this.groupBox1.TabIndex = 0;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Input";
+ //
+ // lblWuGanHou
+ //
+ this.lblWuGanHou.AutoSize = true;
+ this.lblWuGanHou.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblWuGanHou.Location = new System.Drawing.Point(328, 334);
+ this.lblWuGanHou.Name = "lblWuGanHou";
+ this.lblWuGanHou.Size = new System.Drawing.Size(163, 19);
+ this.lblWuGanHou.TabIndex = 21;
+ this.lblWuGanHou.Text = "鏃犳潌姘旂几鍚庨檺2.05";
+ //
+ // lblWuGanQian
+ //
+ this.lblWuGanQian.AutoSize = true;
+ this.lblWuGanQian.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblWuGanQian.Location = new System.Drawing.Point(328, 301);
+ this.lblWuGanQian.Name = "lblWuGanQian";
+ this.lblWuGanQian.Size = new System.Drawing.Size(163, 19);
+ this.lblWuGanQian.TabIndex = 20;
+ this.lblWuGanQian.Text = "鏃犳潌姘旂几鍓嶉檺2.04";
+ //
+ // lblCeBianHou
+ //
+ this.lblCeBianHou.AutoSize = true;
+ this.lblCeBianHou.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblCeBianHou.Location = new System.Drawing.Point(328, 268);
+ this.lblCeBianHou.Name = "lblCeBianHou";
+ this.lblCeBianHou.Size = new System.Drawing.Size(163, 19);
+ this.lblCeBianHou.TabIndex = 19;
+ this.lblCeBianHou.Text = "渚ц竟姘旂几鍚庨檺2.01";
+ //
+ // lblCeBianQian
+ //
+ this.lblCeBianQian.AutoSize = true;
+ this.lblCeBianQian.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblCeBianQian.Location = new System.Drawing.Point(328, 234);
+ this.lblCeBianQian.Name = "lblCeBianQian";
+ this.lblCeBianQian.Size = new System.Drawing.Size(163, 19);
+ this.lblCeBianQian.TabIndex = 18;
+ this.lblCeBianQian.Text = "渚ц竟姘旂几鍓嶉檺2.00";
+ //
+ // lblOpenJieJin
+ //
+ this.lblOpenJieJin.AutoSize = true;
+ this.lblOpenJieJin.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblOpenJieJin.Location = new System.Drawing.Point(328, 201);
+ this.lblOpenJieJin.Name = "lblOpenJieJin";
+ this.lblOpenJieJin.Size = new System.Drawing.Size(163, 19);
+ this.lblOpenJieJin.TabIndex = 17;
+ this.lblOpenJieJin.Text = "鎵撳紑鎺ヨ繎寮�鍏�1.11";
+ //
+ // lblSafeCurtain
+ //
+ this.lblSafeCurtain.AutoSize = true;
+ this.lblSafeCurtain.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblSafeCurtain.Location = new System.Drawing.Point(328, 168);
+ this.lblSafeCurtain.Name = "lblSafeCurtain";
+ this.lblSafeCurtain.Size = new System.Drawing.Size(125, 19);
+ this.lblSafeCurtain.TabIndex = 16;
+ this.lblSafeCurtain.Text = "瀹夊叏鍏夊箷1.10";
+ //
+ // lblE_Stop
+ //
+ this.lblE_Stop.AutoSize = true;
+ this.lblE_Stop.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblE_Stop.Location = new System.Drawing.Point(328, 135);
+ this.lblE_Stop.Name = "lblE_Stop";
+ this.lblE_Stop.Size = new System.Drawing.Size(87, 19);
+ this.lblE_Stop.TabIndex = 15;
+ this.lblE_Stop.Text = "鎬ュ仠1.09";
+ //
+ // lblReset
+ //
+ this.lblReset.AutoSize = true;
+ this.lblReset.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblReset.Location = new System.Drawing.Point(328, 102);
+ this.lblReset.Name = "lblReset";
+ this.lblReset.Size = new System.Drawing.Size(87, 19);
+ this.lblReset.TabIndex = 14;
+ this.lblReset.Text = "澶嶄綅1.08";
+ //
+ // lblStart2
+ //
+ this.lblStart2.AutoSize = true;
+ this.lblStart2.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblStart2.Location = new System.Drawing.Point(328, 68);
+ this.lblStart2.Name = "lblStart2";
+ this.lblStart2.Size = new System.Drawing.Size(107, 19);
+ this.lblStart2.TabIndex = 13;
+ this.lblStart2.Text = "鍚姩2 1.07";
+ //
+ // lblStart1
+ //
+ this.lblStart1.AutoSize = true;
+ this.lblStart1.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblStart1.Location = new System.Drawing.Point(328, 35);
+ this.lblStart1.Name = "lblStart1";
+ this.lblStart1.Size = new System.Drawing.Size(107, 19);
+ this.lblStart1.TabIndex = 12;
+ this.lblStart1.Text = "鍚姩1 1.06";
+ //
+ // lblDingWei_Alarm
+ //
+ this.lblDingWei_Alarm.AutoSize = true;
+ this.lblDingWei_Alarm.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblDingWei_Alarm.Location = new System.Drawing.Point(52, 336);
+ this.lblDingWei_Alarm.Name = "lblDingWei_Alarm";
+ this.lblDingWei_Alarm.Size = new System.Drawing.Size(156, 19);
+ this.lblDingWei_Alarm.TabIndex = 11;
+ this.lblDingWei_Alarm.Text = "瀹氫綅杞碅larm1.02";
+ //
+ // lblDingWei_JinDian
+ //
+ this.lblDingWei_JinDian.AutoSize = true;
+ this.lblDingWei_JinDian.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblDingWei_JinDian.Location = new System.Drawing.Point(52, 253);
+ this.lblDingWei_JinDian.Name = "lblDingWei_JinDian";
+ this.lblDingWei_JinDian.Size = new System.Drawing.Size(144, 19);
+ this.lblDingWei_JinDian.TabIndex = 10;
+ this.lblDingWei_JinDian.Text = "瀹氫綅杞磋繎鐐�1.01";
+ //
+ // lblDingWei_CCW
+ //
+ this.lblDingWei_CCW.AutoSize = true;
+ this.lblDingWei_CCW.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblDingWei_CCW.Location = new System.Drawing.Point(52, 308);
+ this.lblDingWei_CCW.Name = "lblDingWei_CCW";
+ this.lblDingWei_CCW.Size = new System.Drawing.Size(136, 19);
+ this.lblDingWei_CCW.TabIndex = 9;
+ this.lblDingWei_CCW.Text = "瀹氫綅杞碈CW0.11";
+ //
+ // lblDingWei_CW
+ //
+ this.lblDingWei_CW.AutoSize = true;
+ this.lblDingWei_CW.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblDingWei_CW.Location = new System.Drawing.Point(52, 281);
+ this.lblDingWei_CW.Name = "lblDingWei_CW";
+ this.lblDingWei_CW.Size = new System.Drawing.Size(126, 19);
+ this.lblDingWei_CW.TabIndex = 8;
+ this.lblDingWei_CW.Text = "瀹氫綅杞碈W0.10";
+ //
+ // lblZ_CCW
+ //
+ this.lblZ_CCW.AutoSize = true;
+ this.lblZ_CCW.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblZ_CCW.Location = new System.Drawing.Point(52, 198);
+ this.lblZ_CCW.Name = "lblZ_CCW";
+ this.lblZ_CCW.Size = new System.Drawing.Size(108, 19);
+ this.lblZ_CCW.TabIndex = 7;
+ this.lblZ_CCW.Text = "Z杞碈CW0.09";
+ //
+ // lblZ_CW
+ //
+ this.lblZ_CW.AutoSize = true;
+ this.lblZ_CW.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblZ_CW.Location = new System.Drawing.Point(52, 170);
+ this.lblZ_CW.Name = "lblZ_CW";
+ this.lblZ_CW.Size = new System.Drawing.Size(98, 19);
+ this.lblZ_CW.TabIndex = 6;
+ this.lblZ_CW.Text = "Z杞碈W0.08";
+ //
+ // lblX_CCW
+ //
+ this.lblX_CCW.AutoSize = true;
+ this.lblX_CCW.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblX_CCW.Location = new System.Drawing.Point(52, 87);
+ this.lblX_CCW.Name = "lblX_CCW";
+ this.lblX_CCW.Size = new System.Drawing.Size(108, 19);
+ this.lblX_CCW.TabIndex = 5;
+ this.lblX_CCW.Text = "X杞碈CW0.07";
+ //
+ // lblX_CW
+ //
+ this.lblX_CW.AutoSize = true;
+ this.lblX_CW.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblX_CW.Location = new System.Drawing.Point(52, 59);
+ this.lblX_CW.Name = "lblX_CW";
+ this.lblX_CW.Size = new System.Drawing.Size(98, 19);
+ this.lblX_CW.TabIndex = 4;
+ this.lblX_CW.Text = "X杞碈W0.06";
+ //
+ // lblZ_Alarm
+ //
+ this.lblZ_Alarm.AutoSize = true;
+ this.lblZ_Alarm.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblZ_Alarm.Location = new System.Drawing.Point(52, 225);
+ this.lblZ_Alarm.Name = "lblZ_Alarm";
+ this.lblZ_Alarm.Size = new System.Drawing.Size(128, 19);
+ this.lblZ_Alarm.TabIndex = 3;
+ this.lblZ_Alarm.Text = "Z杞碅larm0.05";
+ //
+ // lblX_Alarm
+ //
+ this.lblX_Alarm.AutoSize = true;
+ this.lblX_Alarm.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblX_Alarm.Location = new System.Drawing.Point(52, 114);
+ this.lblX_Alarm.Name = "lblX_Alarm";
+ this.lblX_Alarm.Size = new System.Drawing.Size(128, 19);
+ this.lblX_Alarm.TabIndex = 2;
+ this.lblX_Alarm.Text = "X杞碅larm0.04";
+ //
+ // lblZ_JinDian
+ //
+ this.lblZ_JinDian.AutoSize = true;
+ this.lblZ_JinDian.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblZ_JinDian.Location = new System.Drawing.Point(52, 142);
+ this.lblZ_JinDian.Name = "lblZ_JinDian";
+ this.lblZ_JinDian.Size = new System.Drawing.Size(116, 19);
+ this.lblZ_JinDian.TabIndex = 1;
+ this.lblZ_JinDian.Text = "Z杞磋繎鐐�0.03";
+ //
+ // lblX_JinDian
+ //
+ this.lblX_JinDian.AutoSize = true;
+ this.lblX_JinDian.Font = new System.Drawing.Font("瀹嬩綋", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.lblX_JinDian.Location = new System.Drawing.Point(52, 31);
+ this.lblX_JinDian.Name = "lblX_JinDian";
+ this.lblX_JinDian.Size = new System.Drawing.Size(116, 19);
+ this.lblX_JinDian.TabIndex = 0;
+ this.lblX_JinDian.Text = "X杞磋繎鐐�0.01";
+ //
+ // tVideo_left
+ //
+ this.tVideo_left.Interval = 250;
+ this.tVideo_left.Tick += new System.EventHandler(this.tVideo_left_Tick);
+ //
+ // cboSize
+ //
+ this.cboSize.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cboSize.FormattingEnabled = true;
+ this.cboSize.Location = new System.Drawing.Point(39, 19);
+ this.cboSize.Margin = new System.Windows.Forms.Padding(2);
+ this.cboSize.Name = "cboSize";
+ this.cboSize.Size = new System.Drawing.Size(215, 20);
+ this.cboSize.TabIndex = 5;
+ this.cboSize.SelectionChangeCommitted += new System.EventHandler(this.cboSize_SelectionChangeCommitted);
+ //
+ // label11
+ //
+ this.label11.AutoSize = true;
+ this.label11.Location = new System.Drawing.Point(5, 21);
+ this.label11.Name = "label11";
+ this.label11.Size = new System.Drawing.Size(29, 12);
+ this.label11.TabIndex = 4;
+ this.label11.Text = "灏哄";
+ //
+ // cboSize_Left
+ //
+ this.cboSize_Left.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cboSize_Left.FormattingEnabled = true;
+ this.cboSize_Left.Location = new System.Drawing.Point(41, 19);
+ this.cboSize_Left.Margin = new System.Windows.Forms.Padding(2);
+ this.cboSize_Left.Name = "cboSize_Left";
+ this.cboSize_Left.Size = new System.Drawing.Size(215, 20);
+ this.cboSize_Left.TabIndex = 7;
+ this.cboSize_Left.SelectionChangeCommitted += new System.EventHandler(this.cboSize_Left_SelectionChangeCommitted);
+ //
+ // label12
+ //
+ this.label12.AutoSize = true;
+ this.label12.Location = new System.Drawing.Point(7, 21);
+ this.label12.Name = "label12";
+ this.label12.Size = new System.Drawing.Size(29, 12);
+ this.label12.TabIndex = 6;
+ this.label12.Text = "灏哄";
+ //
+ // frmMain
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(1081, 769);
+ this.Controls.Add(this.tabControl1);
+ this.Controls.Add(this.panel1);
+ this.Controls.Add(this.statusStrip1);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.KeyPreview = true;
+ this.Name = "frmMain";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "LLMF";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmMain_FormClosing);
+ this.Load += new System.EventHandler(this.frmMain_Load);
+ this.statusStrip1.ResumeLayout(false);
+ this.statusStrip1.PerformLayout();
+ this.panel1.ResumeLayout(false);
+ this.toolStrip1.ResumeLayout(false);
+ this.toolStrip1.PerformLayout();
+ this.panel2.ResumeLayout(false);
+ this.panel3.ResumeLayout(false);
+ this.panel3.PerformLayout();
+ this.gbxTest.ResumeLayout(false);
+ this.gbxTest.PerformLayout();
+ this.gbxCalibration.ResumeLayout(false);
+ this.gbxCalibration.PerformLayout();
+ this.groupBox4.ResumeLayout(false);
+ this.groupBox4.PerformLayout();
+ this.groupBox3.ResumeLayout(false);
+ this.groupBox3.PerformLayout();
+ this.groupBox2.ResumeLayout(false);
+ this.tabControl1.ResumeLayout(false);
+ this.tabPage2.ResumeLayout(false);
+ this.tabPage1.ResumeLayout(false);
+ this.panel4.ResumeLayout(false);
+ this.panel5.ResumeLayout(false);
+ this.panel5.PerformLayout();
+ this.gbxTest_left.ResumeLayout(false);
+ this.gbxTest_left.PerformLayout();
+ this.gbxCalibration_left.ResumeLayout(false);
+ this.gbxCalibration_left.PerformLayout();
+ this.groupBox6.ResumeLayout(false);
+ this.groupBox6.PerformLayout();
+ this.groupBox7.ResumeLayout(false);
+ this.groupBox7.PerformLayout();
+ this.groupBox8.ResumeLayout(false);
+ this.tabPage3.ResumeLayout(false);
+ this.groupBox5.ResumeLayout(false);
+ this.groupBox5.PerformLayout();
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.StatusStrip statusStrip1;
+ private System.Windows.Forms.ToolStripStatusLabel tsslOPC;
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.Panel panel2;
+ private System.Windows.Forms.Panel panel3;
+ private HalconDotNet.HWindowControl viewPort;
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.Button btnDisplay;
+ private System.Windows.Forms.Button btnHalconTool;
+ private System.Windows.Forms.Button btnConfig;
+ private System.Windows.Forms.GroupBox groupBox3;
+ private System.Windows.Forms.GroupBox groupBox4;
+ private System.Windows.Forms.TextBox txtSN;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label lblAngleDisplay;
+ private System.Windows.Forms.GroupBox gbxCalibration;
+ private System.Windows.Forms.Button btnCapture;
+ private System.Windows.Forms.Button btnCalibration;
+ private System.Windows.Forms.TextBox txtCalAngle;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Button btnCanCalibration;
+ private System.Windows.Forms.Timer tVideo;
+ private System.Windows.Forms.GroupBox gbxTest;
+ private System.Windows.Forms.Button btnStopCapture;
+ private System.Windows.Forms.Button btnContinueCapture;
+ private System.Windows.Forms.Button btnTestMove;
+ private System.Windows.Forms.TextBox txtTestPulse;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.CheckBox cbxTest;
+ private System.Windows.Forms.TextBox txtResultFinalAngle;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.TextBox txtResultInitAngle;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.CheckBox ckbCameraLight;
+ private System.Windows.Forms.Button btnORI;
+ private System.Windows.Forms.ToolStripStatusLabel tsllPositionlabel;
+ private System.Windows.Forms.ToolStripStatusLabel tsslPosition_left;
+ private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
+ private System.Windows.Forms.ToolStripStatusLabel tsslAlarm;
+ private System.Windows.Forms.TabControl tabControl1;
+ private System.Windows.Forms.TabPage tabPage1;
+ private System.Windows.Forms.TabPage tabPage2;
+ private System.Windows.Forms.Panel panel5;
+ private System.Windows.Forms.Panel panel4;
+ private System.Windows.Forms.Label lblAngleDisplay_left;
+ private HalconDotNet.HWindowControl viewPort_left;
+ private System.Windows.Forms.GroupBox gbxTest_left;
+ private System.Windows.Forms.Button btnORI_left;
+ private System.Windows.Forms.CheckBox ckbCameraLight_left;
+ private System.Windows.Forms.Button btnTestMove_left;
+ private System.Windows.Forms.TextBox txtTestPulse_left;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Button btnStopCapture_left;
+ private System.Windows.Forms.Button btnContinueCapture_left;
+ private System.Windows.Forms.GroupBox gbxCalibration_left;
+ private System.Windows.Forms.Button btnCalibration_left;
+ private System.Windows.Forms.TextBox txtCalAngle_left;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.Button btnCapture_left;
+ private System.Windows.Forms.GroupBox groupBox6;
+ private System.Windows.Forms.TextBox txtSN_left;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.GroupBox groupBox7;
+ private System.Windows.Forms.TextBox txtResultFinalAngle_left;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.TextBox txtResultInitAngle_left;
+ private System.Windows.Forms.Label label10;
+ private System.Windows.Forms.GroupBox groupBox8;
+ private System.Windows.Forms.CheckBox cbxTest_left;
+ private System.Windows.Forms.Button btnCanCalibration_left;
+ private System.Windows.Forms.Button btnHalconTool_left;
+ private System.Windows.Forms.Button btnConfig_left;
+ private System.Windows.Forms.Button btnDisplay_left;
+ private System.Windows.Forms.Timer tVideo_left;
+ private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel2;
+ private System.Windows.Forms.ToolStripStatusLabel tsslPosition;
+ private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.Button btnOut;
+ private System.Windows.Forms.Button btnCloseDor;
+ private System.Windows.Forms.Button btnOpenDor;
+ private System.Windows.Forms.Button button6;
+ private System.Windows.Forms.Button button5;
+ private System.Windows.Forms.Button button4;
+ private System.Windows.Forms.Button button3;
+ private System.Windows.Forms.Button button2;
+ private System.Windows.Forms.Button button7;
+ private System.Windows.Forms.Button button8;
+ private System.Windows.Forms.Button button9;
+ private System.Windows.Forms.Button button10;
+ private System.Windows.Forms.Button button11;
+ private System.Windows.Forms.Button button12;
+ private System.Windows.Forms.Button button13;
+ private System.Windows.Forms.Button button14;
+ private System.Windows.Forms.Button button15;
+ private System.Windows.Forms.CheckBox checkBox1;
+ private System.Windows.Forms.CheckBox checkBox2;
+ private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel3;
+ private System.Windows.Forms.ToolStripStatusLabel tsslAlarm_Left;
+ private System.Windows.Forms.Button button16;
+ private System.Windows.Forms.ToolStrip toolStrip1;
+ private System.Windows.Forms.ToolStripButton toolStripMaxMin;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+ private System.Windows.Forms.ToolStripButton tspBtnOpenImageFile;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+ private System.Windows.Forms.ToolStripButton toolStripModeBtn;
+ private System.Windows.Forms.ToolStripLabel toolStripModeLabel;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
+ private System.Windows.Forms.ToolStripButton toolStripButton5;
+ private System.Windows.Forms.ToolStripLabel tsplabelProductName;
+ private System.Windows.Forms.ToolStripButton tspbtnExit;
+ private System.Windows.Forms.ToolStripButton tspBtnHelp;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator6;
+ private System.Windows.Forms.TabPage tabPage3;
+ private System.Windows.Forms.GroupBox groupBox5;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.Label lblZ_Alarm;
+ private System.Windows.Forms.Label lblX_Alarm;
+ private System.Windows.Forms.Label lblZ_JinDian;
+ private System.Windows.Forms.Label lblX_JinDian;
+ private System.Windows.Forms.Label lblWuGanCylider2;
+ private System.Windows.Forms.Label lblCameraLighto;
+ private System.Windows.Forms.Label lblForApple;
+ private System.Windows.Forms.Label lblZ_ShaChe;
+ private System.Windows.Forms.Label lblDingWei_SRV_ON;
+ private System.Windows.Forms.Label lblZ_SRV_ON;
+ private System.Windows.Forms.Label lblX_SRV_ON;
+ private System.Windows.Forms.Label lblSiFuPowerOn;
+ private System.Windows.Forms.Label lblHuaTaiCylider;
+ private System.Windows.Forms.Label lblWuGanCylider;
+ private System.Windows.Forms.Label lblZhengBianCylider;
+ private System.Windows.Forms.Label lblCeBianCylider;
+ private System.Windows.Forms.Label lblBuzzer;
+ private System.Windows.Forms.Label lblGreen;
+ private System.Windows.Forms.Label lblYellow;
+ private System.Windows.Forms.Label lblRed;
+ private System.Windows.Forms.Label lblWuGanHou;
+ private System.Windows.Forms.Label lblWuGanQian;
+ private System.Windows.Forms.Label lblCeBianHou;
+ private System.Windows.Forms.Label lblCeBianQian;
+ private System.Windows.Forms.Label lblOpenJieJin;
+ private System.Windows.Forms.Label lblSafeCurtain;
+ private System.Windows.Forms.Label lblE_Stop;
+ private System.Windows.Forms.Label lblReset;
+ private System.Windows.Forms.Label lblStart2;
+ private System.Windows.Forms.Label lblStart1;
+ private System.Windows.Forms.Label lblDingWei_Alarm;
+ private System.Windows.Forms.Label lblDingWei_JinDian;
+ private System.Windows.Forms.Label lblDingWei_CCW;
+ private System.Windows.Forms.Label lblDingWei_CW;
+ private System.Windows.Forms.Label lblZ_CCW;
+ private System.Windows.Forms.Label lblZ_CW;
+ private System.Windows.Forms.Label lblX_CCW;
+ private System.Windows.Forms.Label lblX_CW;
+ private System.Windows.Forms.CheckBox ckbSaveImage;
+ private System.Windows.Forms.ComboBox cboSize;
+ private System.Windows.Forms.Label label11;
+ private System.Windows.Forms.ComboBox cboSize_Left;
+ private System.Windows.Forms.Label label12;
+ }
+}
+
diff --git a/LLMF/frmMain.cs b/LLMF/frmMain.cs
new file mode 100644
index 0000000..312b598
--- /dev/null
+++ b/LLMF/frmMain.cs
@@ -0,0 +1,2202 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Windows.Forms;
+using System.IO;
+using System.Threading;
+using HalconDotNet;
+using HalconTools;
+using PointGreyAndHalcon;
+using System.Diagnostics;
+using SuperDog;
+using Microsoft.Win32;
+
+namespace LLMF
+{
+ public partial class frmMain : Form
+ {
+ #region 瀹氫箟
+
+ //private LogHelper log = LogHelper.GetInstance();
+
+ string configPath = Application.StartupPath + "\\Config.xml";
+ ConfigStruct config;
+ ToolKit.FileToolkit.SerializeFileTool<ConfigStruct> sft = new ToolKit.FileToolkit.SerializeFileTool<ConfigStruct>();
+
+ OPC opc;
+
+ string camConfigPath = Application.StartupPath + "\\camConfig.xml";
+ PointGreyAndHalcon.PointGreyAndHalcon cam;
+ PointGreyAndHalcon.PointGreyAndHalcon cam_left;
+
+ HalconTool ht = new HalconTool();
+ HalconTool ht_left = new HalconTool();
+
+ RunStatus runStatus = RunStatus.Normal;
+ RunStatus runStatus_left = RunStatus.Normal;
+
+ double initAngle = 0;
+ double finalAngle = 0;
+ double initAngle_left = 0;
+ double finalAngle_left = 0;
+ bool booltemAngle = false;
+ Stopwatch sw = new Stopwatch();
+
+ HTuple ImageHeight = new HTuple();
+ HTuple ImageWidth = new HTuple();
+
+ bool isLeftCameraOpen = false;
+ bool isRightCameraOpen = false;
+ bool isDoorOpen = false;
+ //bool isCylinderLoosen = false;
+ //bool isCylinder2Loosen = false;
+ bool isUUTOut = false;
+ bool isRealyOK = false;
+
+ #endregion
+ WelcomeUser m_WelcomeForm = new WelcomeUser(); //娆㈣繋鐣岄潰
+ public frmMain()
+ {
+ InitializeComponent();
+ }
+
+ private void frmMain_Load(object sender, EventArgs e)
+ {
+ m_WelcomeForm.Show(); //鏄剧ず娆㈣繋鐣岄潰
+ // m_WelcomeForm.ProgressBar1.Value = 0; //娆㈣繋鐣岄潰杩涘害鏉�
+ Application.DoEvents(); //澶勭悊鎵�鏈夌殑褰撳墠鍦ㄦ秷鎭槦鍒椾腑鐨刉indows娑堟伅銆�
+
+ Log.WriteLog("App main form loading");
+
+ initConfig();
+ if (config.leftUsed)
+ {
+ Log.WriteLog("App main form load leftUsed");
+ tabPage2.Parent = null;
+ initCam_Left();
+ initHalconTool_Left();
+ tabControl1.TabPages[0].Select();
+ }
+
+ if (config.rightUsed)
+ {
+ Log.WriteLog("App main form load rightUsed");
+ tabPage1.Parent = null;
+ initCam_Right();
+ initHalconTool();
+ tabControl1.TabPages[0].Select();
+ }
+ initOPC();
+
+ m_WelcomeForm.Close();//
+ m_WelcomeForm = null; //娓呯┖鍐呭瓨
+ }
+
+
+ /// <summary>
+ /// 寤虹珛Tag涓嶤ontrol涔嬮棿鐨勮仈绯�
+ /// </summary>
+
+ private void MapTagToControl()
+ {
+ Log.WriteLog("MapTagToControl Enter");
+
+ opc.itemReadDict[InputTag.X_JinDian].control = lblX_JinDian;
+ opc.itemReadDict[InputTag.Z_JinDian].control =lblZ_JinDian;
+ opc.itemReadDict[InputTag.X_Alarm].control =lblX_Alarm;
+ opc.itemReadDict[InputTag.Z_Alarm].control = lblZ_Alarm;
+ opc.itemReadDict[InputTag.X_CW].control = lblX_CW;
+ opc.itemReadDict[InputTag.X_CCW].control = lblX_CCW;
+ opc.itemReadDict[InputTag.Z_CW].control = lblZ_CW;
+ opc.itemReadDict[InputTag.Z_CCW].control =lblZ_CCW;
+ opc.itemReadDict[InputTag.DingWei_CW].control = lblDingWei_CW;
+ opc.itemReadDict[InputTag.DingWei_CCW].control = lblDingWei_CCW;
+ opc.itemReadDict[InputTag.DingWei_JinDian].control = lblDingWei_JinDian;
+ opc.itemReadDict[InputTag.DingWei_Alarm].control = lblDingWei_Alarm;
+
+ opc.itemReadDict[InputTag.Start1].control = lblStart1;
+ opc.itemReadDict[InputTag.Start2].control = lblStart2;
+ opc.itemReadDict[InputTag.Reset].control = lblReset;
+ opc.itemReadDict[InputTag.E_Stop].control = lblE_Stop;
+ opc.itemReadDict[InputTag.SafeCurtain].control = lblSafeCurtain;
+ opc.itemReadDict[InputTag.OpenJieJin].control = lblOpenJieJin;
+ opc.itemReadDict[InputTag.CeBianQian].control =lblCeBianQian;
+ opc.itemReadDict[InputTag.CeBianHou].control = lblCeBianHou;
+ opc.itemReadDict[InputTag.WuGanQian].control = lblWuGanQian;
+ opc.itemReadDict[InputTag.WuGanHou].control = lblWuGanHou;
+
+
+ //OutPut I/O鐣岄潰鏄剧ず
+
+ opc.itemWriteDict[OutputTag.CeBianCylider].control = lblCeBianCylider;
+ opc.itemWriteDict[OutputTag.ZhengBianCylider].control = lblZhengBianCylider;
+ opc.itemWriteDict[OutputTag.WuGanCylider].control = lblWuGanCylider;
+ opc.itemWriteDict[OutputTag.HuaTaiCylider].control = lblHuaTaiCylider;
+ opc.itemWriteDict[OutputTag.SiFuPowerOn].control = lblSiFuPowerOn;
+ opc.itemWriteDict[OutputTag.X_SRV_ON].control = lblX_SRV_ON;
+ opc.itemWriteDict[OutputTag.Z_SRV_ON].control = lblZ_SRV_ON;
+ opc.itemWriteDict[OutputTag.DingWei_SRV_ON].control = lblDingWei_SRV_ON;
+ opc.itemWriteDict[OutputTag.Red].control = lblRed;
+ opc.itemWriteDict[OutputTag.Yellow].control = lblYellow;
+ opc.itemWriteDict[OutputTag.Green].control = lblGreen;
+ opc.itemWriteDict[OutputTag.Buzzer].control = lblBuzzer;
+ opc.itemWriteDict[OutputTag.Z_ShaChe].control = lblZ_ShaChe;
+ opc.itemWriteDict[OutputTag.ForApple].control = lblForApple;
+ opc.itemWriteDict[OutputTag.CameraLighto].control = lblCameraLighto;
+ opc.itemWriteDict[OutputTag.WuGanCylider2].control = lblWuGanCylider2;
+
+ Log.WriteLog("MapTagToControl Leave");
+ }
+
+
+ #region 鍒濆鍖�
+ /// <summary>
+ /// 鍔犺浇閰嶇疆鏂囦欢
+ /// </summary>
+ private void initConfig()
+ {
+ Log.WriteLog("InitConfig configpath: " + configPath);
+
+ if (File.Exists(configPath))
+ {
+ config = sft.GetConfig(configPath);
+ }
+ else
+ {
+ config = new ConfigStruct();
+
+ config.angleOffset = 0;
+ config.opcConfig.itmHandleClient = 1234;
+ config.opcConfig.serverIP = "127.0.0.1";
+ config.opcConfig.serverName = "KEPware.KEPServerEx.V4";
+ config.opcConfig.groupProperty.defaultGroupDeadband = 0;
+ config.opcConfig.groupProperty.defaultGroupIsActive = true;
+ config.opcConfig.groupProperty.isActive = true;
+ config.opcConfig.groupProperty.isSubscribed = true;
+ config.opcConfig.groupProperty.updateRate = 300;
+ config.title = "LLMF V1.1";
+ config.cams = new CamerasConfig();
+ config.cams.SerialNumber = new uint[1];
+ config.cams.SerialNumber[0] = 11111111;
+ config.password = "1";
+ config.minAngle = 119;
+ config.maxAngle = 121;
+ config.pulsePerDegree = 500;
+ config.calAngle = 120;
+ config.saveImage = true;
+ sft.SetConfig(configPath, config);
+ }
+ this.tsplabelProductName.Text = config.title;
+ this.txtCalAngle.Text = config.calAngle.ToString();
+ this.txtCalAngle_left.Text = config.calAngle.ToString();
+ this.ckbSaveImage.Checked = config.saveImage;
+
+ List<string> list = new List<string>();
+ list.Add("inch13");
+ list.Add("inch15");
+ list.Add("inch16");
+ if (config.leftUsed)
+ {
+ cboSize_Left.DataSource = list;
+ cboSize_Left.SelectedIndex = config.selectedSizeIndex;
+ }
+ if (config.rightUsed)
+ {
+ cboSize.DataSource = list;
+ cboSize.SelectedIndex = config.selectedSizeIndex;
+ }
+ }
+
+ /// <summary>
+ /// 鍔犺浇鐩告満
+ /// </summary>
+ private void initCam_Right()
+ {
+ Log.WriteLog("initCam_Right Enter");
+
+ cam = new PointGreyAndHalcon.PointGreyAndHalcon();
+ isRightCameraOpen = cam.OpenCamera(config.cams.SerialNumber[1]);
+ cam.GrabImageDone += new GrabImageDoneDelegate(cam_GrabImageDone);
+
+ Log.WriteLog("initCam_Right Leave");
+ }
+
+
+ /// <summary>
+ /// 鍔犺浇HalconTool
+ /// </summary>
+ private void initHalconTool()
+ {
+ Log.WriteLog("initHalconTool Enter");
+
+ ht.LoadJobs();
+ ht.resultCreater.ListenEvent += new EventHandler<HalconTools.ListenEventArgs>(resultCreater_ListenEvent);
+
+ Log.WriteLog("initHalconTool Leave");
+ }
+
+
+
+ /// <summary>
+ /// 鍔犺浇OPC
+ /// </summary>
+ private void initOPC()
+ {
+ Log.WriteLog("initOPC Enter");
+
+ ConnectToOpc();
+ UpdateOPC();
+ MapTagToControl();
+ opc.listenEventCreater.ListenEvent += new EventHandler<EventTool.ListenEventArgs>(listenEventCreater_ListenEvent);
+ opc.listenEventCreater.ListenEvent += new EventHandler<EventTool.ListenEventArgs>(listenOutTageEventCreater_ListenEvent);
+
+ Log.WriteLog("initOPC Leave");
+ }
+
+ #endregion
+
+ #region 鍚勭浜嬩欢
+
+ void cam_GrabImageDone(string recData, HImage recImage)
+ {
+ Log.WriteLog("cam_GrabImageDone Enter");
+
+ Log.WriteLog("cam_GrabImageDone recData: " + runStatus.ToString());
+
+ lock (GetMutexLock_Right())
+ {
+ Log.WriteLog("cam_GrabImageDone lock GetMutexLock_Right enter");
+
+ this.BeginInvoke(new MethodInvoker(delegate
+ {
+ Log.WriteLog("cam_GrabImageDone ui thread proccess begin");
+
+ switch (recData)
+ {
+ case "GrabSuccess":
+ //cam.image = recImage;
+ Log.WriteLog("cam_GrabImageDone GrabSuccess begin");
+
+ Log.WriteLog("cam_GrabImageDone GrabSuccess updateImage");
+
+ cam.UpdateImage(viewPort);
+
+ Log.WriteLog("cam_GrabImageDone GrabSuccess save image file");
+ if (runStatus != RunStatus.continueCapture)
+ {
+ #region 淇濆瓨鍥剧墖
+ string FolderPath = "D:\\Image\\" + DateTime.Now.ToString("yyyyMMdd");
+ string fileName = txtSN.Text.Trim() + "-" + DateTime.Now.ToString("HHmmssffff");
+
+ if (!Directory.Exists(FolderPath)) Directory.CreateDirectory(FolderPath);
+ cam.SaveImage(FolderPath, fileName);
+ #endregion
+ }
+
+ ht.JobImage.Dispose();
+ Log.WriteLog("cam_GrabImageDone GrabSuccess getimage info");
+
+ ht.JobImage = recImage.CopyImage();
+ HOperatorSet.GetImageSize(ht.JobImage, out ImageWidth, out ImageHeight);
+ ht.JobResults.Clear();
+
+ Log.WriteLog("cam_GrabImageDone GrabSuccess run JobLLMF");
+ ht.Run("JobLLMF");
+
+ Log.WriteLog("cam_GrabImageDone GrabSuccess end");
+ break;
+
+ case "GrabFail":
+ Log.WriteLog("cam_GrabImageDone GrabFail");
+ break;
+ }
+
+ recImage.Dispose();
+
+ Log.WriteLog("cam_GrabImageDone ui thread proccess end");
+ }));
+ GC.Collect();//c#鍥炴敹绯荤粺
+ }
+
+ Log.WriteLog("cam_GrabImageDone Leave");
+ }
+
+ void cam_left_GrabImageDone(string recData, HImage recImage)
+ {
+ Log.WriteLog("cam_left_GrabImageDone Enter");
+
+ Log.WriteLog("cam_left_GrabImageDone recData: " + runStatus.ToString());
+
+ lock (GetMutexLock_Left())
+ {
+ Log.WriteLog("cam_left_GrabImageDone lock GetMutexLock_Left enter");
+
+ this.BeginInvoke(new MethodInvoker(delegate
+ {
+ Log.WriteLog("cam_left_GrabImageDone ui thread proccess begin");
+
+ switch (recData)
+ {
+ case "GrabSuccess":
+ //cam_left.image = recImage.CopyImage();
+ Log.WriteLog("cam_left_GrabImageDone GrabSuccess begin");
+
+ Log.WriteLog("cam_left_GrabImageDone GrabSuccess updateImage");
+
+ cam_left.UpdateImage(viewPort_left);
+
+ Log.WriteLog("cam_left_GrabImageDone GrabSuccess save image file");
+ if (runStatus_left != RunStatus.continueCapture)
+ {
+ #region 淇濆瓨鍥剧墖
+ string FolderPath = "D:\\Image\\" + DateTime.Now.ToString("yyyyMMdd") + "-left";
+ string fileName = txtSN.Text.Trim() + "-" + DateTime.Now.ToString("HHmmssffff");
+
+ if (!Directory.Exists(FolderPath)) Directory.CreateDirectory(FolderPath);
+ cam_left.SaveImage(FolderPath, fileName);
+ #endregion
+ }
+
+ ht_left.JobImage.Dispose();
+
+ Log.WriteLog("cam_left_GrabImageDone GrabSuccess getimage info");
+ ht_left.JobImage = recImage.CopyImage();
+ HOperatorSet.GetImageSize(ht_left.JobImage, out ImageWidth, out ImageHeight);
+ ht_left.JobResults.Clear();
+
+ Log.WriteLog("cam_left_GrabImageDone GrabSuccess run JobLLMF");
+ ht_left.Run("JobLLMF");
+
+ Log.WriteLog("cam_left_GrabImageDone GrabSuccess end");
+ break;
+
+ case "GrabFail":
+ Log.WriteLog("cam_left_GrabImageDone GrabFail");
+ break;
+ }
+
+ recImage.Dispose();
+
+ Log.WriteLog("cam_left_GrabImageDone ui thread proccess end");
+ }));
+
+ GC.Collect();
+ }
+
+ Log.WriteLog("cam_left_GrabImageDone Leave");
+ }
+
+ void resultCreater_ListenEvent(object sender, HalconTools.ListenEventArgs e)
+ {
+ Log.WriteLog("resultCreater_ListenEvent Enter");
+
+ this.BeginInvoke(new MethodInvoker(delegate
+ {
+ Log.WriteLog("resultCreater_ListenEvent UI, data:" + e.IData.Data.ToString()+ ", runStatus:" + runStatus);
+
+ string s = e.IData.Data.ToString();
+ if (!s.Equals("JobLLMF_Done"))
+ {
+ if (runStatus == RunStatus.firstCapture || runStatus == RunStatus.adjustMent)
+ {
+ Log.WriteLog("resultCreater_ListenEvent UI, opc write OutputTag.CaptureFail_Right true begin");
+
+ opc.Write(OutputTag.CaptureFail_Right, true);
+
+ Log.WriteLog("resultCreater_ListenEvent UI, opc write OutputTag.CaptureFail_Right true end");
+ return;
+ }
+ }
+
+ Log.WriteLog("resultCreater_ListenEvent UI, jobresults count: " + ht.JobResults.Count.ToString());
+
+ JobResult r = new JobResult();
+
+ if (ht.JobResults.Count > 0)
+ {
+ r = ht.JobResults[0].results[0];
+
+ string logstr = (null == r.fitLineResult) ? "null" : "exists";
+ Log.WriteLog("resultCreater_ListenEvent UI, jobresults count r.fitLineResult:" + logstr);
+ if (r.fitLineResult == null)
+ {
+ ShowDisplayAngle("-");
+ return;
+ }
+ }
+ else
+ {
+ ShowDisplayAngle("-");
+ return;
+ }
+
+ Log.WriteLog("resultCreater_ListenEvent UI, DrawLine");
+
+ DrawLine(viewPort, r.fitLineResult);
+
+ double tmpAngle = 180 - ht.AngleLine2HorizontialAxis(r.fitLineResult) + config.angleOffset;
+
+ Log.WriteLog("resultCreater_ListenEvent UI, ShowDisplayAngle angle: " + tmpAngle.ToString());
+
+ ShowDisplayAngle(tmpAngle.ToString("0.00"));
+ if(booltemAngle==true)
+ {
+ Log.WriteLog("Camera Get The Alignment tmpAangle"+tmpAngle.ToString());
+
+ }
+
+
+ if (runStatus == RunStatus.calibration) //鏍囧畾
+ {
+ this.btnCalibration.Enabled = true;
+ return;
+ }
+
+ if (runStatus == RunStatus.continueCapture) //杩炵画鎷嶇収
+ {
+ return;
+ }
+
+ if (runStatus == RunStatus.firstCapture || runStatus == RunStatus.adjustMent)
+ {
+ if (runStatus == RunStatus.firstCapture)
+ {
+ initAngle = tmpAngle; //璁板綍鍒濆瑙掑害
+
+
+ //Janhans 澧炲姞鐣岄潰瑙掑害log璁拌浇鐨凢lage 鍙橀噺 booltemAngle
+ booltemAngle = true;
+ Log.WriteLog("Camera Get The InitAngle "+initAngle.ToString());
+ }
+ if (tmpAngle >= config.minAngle && tmpAngle <= config.maxAngle)
+ {
+ string str;
+
+ finalAngle = tmpAngle;
+ sw.Stop();
+ Log.WriteLog("Camera Get The FinalAngle" + finalAngle);
+
+ str=sw.ElapsedMilliseconds.ToString();
+ Log.WriteLog("Aangle_Alignment_Time"+str+"ms");
+ sw.Restart();
+ Log.WriteLog("resultCreater_ListenEvent UI, opc write OutputTag.Move_OK true begin");
+ opc.Write(OutputTag.Move_OK, true);
+ Log.WriteLog("resultCreater_ListenEvent UI, opc write OutputTag.Move_OK true end");
+
+ Log.WriteLog("-------瑙掑害璋冩暣瀹屾垚锛岀户鐢靛櫒涓婄數锛� PC缁欏嚭淇″彿鑷矼acmin-----");
+ Log.WriteLog("--------Relay turn on------");
+ isRealyOK = true;
+ Log.WriteLog("RunEnd Enter");
+ txtResultInitAngle.Text = initAngle.ToString("0.00");
+ txtResultFinalAngle.Text = finalAngle.ToString("0.00");
+ booltemAngle = false;//鐣岄潰瑙掑害log璁拌浇鐨凢lage 鍙橀噺 booltemAngle
+
+
+ //RunEnd();
+ //Log.WriteLog("resultCreater_ListenEvent UI, RunEnd");
+
+ return;
+ }
+
+ //鍛婅瘔PLC璧板灏�
+ int tmpDis = (int)(((config.maxAngle + config.minAngle) / 2 - tmpAngle) * config.pulsePerDegree);
+
+ Log.WriteLog("resultCreater_ListenEvent UI, opc write OutputTag.Move_Distance: " + tmpDis.ToString());
+
+ opc.Write(OutputTag.Move_Distance, tmpDis);
+
+ Log.WriteLog("resultCreater_ListenEvent UI, opc write OutputTag.Move begin");
+
+ Thread.Sleep(100);
+ opc.Write(OutputTag.Move, true);
+
+ Log.WriteLog("resultCreater_ListenEvent UI, opc write OutputTag.Move end");
+ }
+ }));
+
+ Log.WriteLog("resultCreater_ListenEvent Leave");
+ }
+
+ void resultCreater_left_ListenEvent(object sender, HalconTools.ListenEventArgs e)
+ {
+ Log.WriteLog("resultCreater_left_ListenEvent Enter");
+
+ this.BeginInvoke(new MethodInvoker(delegate
+ {
+ Log.WriteLog("resultCreater_left_ListenEvent UI, data:"+ e.IData.Data.ToString() + " runStatus: " + runStatus);
+
+ string s = e.IData.Data.ToString();
+ if (!s.Equals("JobLLMF_Done"))
+ {
+ if (runStatus_left == RunStatus.firstCapture || runStatus_left == RunStatus.adjustMent)
+ {
+ Log.WriteLog("resultCreater_left_ListenEvent UI, opc write OutputTag.CaptureFail_left true begin");
+
+ opc.Write(OutputTag.CaptureFail_left, true);
+
+ Log.WriteLog("resultCreater_left_ListenEvent UI, opc write OutputTag.CaptureFail_left true end");
+ return;
+ }
+ }
+
+ JobResult r = new JobResult();
+
+ Log.WriteLog("resultCreater_left_ListenEvent UI, jobresults count:" + ht_left.JobResults.Count.ToString());
+
+ if (ht_left.JobResults.Count > 0)
+ {
+ r = ht_left.JobResults[0].results[0];
+ string logstr = (null == r.fitLineResult) ? "null" : "exists";
+
+ Log.WriteLog("resultCreater_left_ListenEvent UI, jobresults count r.fitLineResult: " + logstr);
+ if (r.fitLineResult == null)
+ {
+ ShowDisplayAngle_left("-");
+ return;
+ }
+ }
+ else
+ {
+ ShowDisplayAngle_left("-");
+ return;
+ }
+
+ Log.WriteLog("resultCreater_left_ListenEvent UI, DrawLine");
+
+ DrawLine(viewPort_left, r.fitLineResult);
+
+ double tmpAngle = 180 - ht_left.AngleLine2HorizontialAxis(r.fitLineResult) + config.angleOffset_Left;
+
+ Log.WriteLog("resultCreater_left_ListenEvent UI, ShowDisplayAngle angle: " + tmpAngle.ToString());
+
+ ShowDisplayAngle_left(tmpAngle.ToString("0.00"));
+
+ if (runStatus_left == RunStatus.calibration) //鏍囧畾
+ {
+ this.btnCalibration_left.Enabled = true;
+ return;
+ }
+
+ if (runStatus_left == RunStatus.continueCapture) //杩炵画鎷嶇収
+ {
+ return;
+ }
+
+ if (runStatus_left == RunStatus.firstCapture || runStatus_left == RunStatus.adjustMent)
+ {
+ if (runStatus_left == RunStatus.firstCapture)
+ {
+ initAngle_left = tmpAngle; //璁板綍鍒濆瑙掑害
+ }
+ if (tmpAngle >= config.minAngle && tmpAngle <= config.maxAngle)
+ {
+
+ finalAngle_left = tmpAngle;
+
+ Log.WriteLog("resultCreater_left_ListenEvent UI, opc write OutputTag.Move_OK_left true begin");
+
+ opc.Write(OutputTag.Move_OK_left, true);
+ Log.WriteLog("-------瑙掑害璋冩暣瀹屾垚锛孭C缁欏嚭缁х數鍣ㄤ俊鍙疯嚦Macmin-----");
+ Log.WriteLog("--------Relay turn on------");
+
+ Log.WriteLog("resultCreater_left_ListenEvent UI, opc write OutputTag.Move_OK_left true end");
+
+ RunEnd_Left();
+
+ Log.WriteLog("resultCreater_left_ListenEvent UI, RunEnd_Left");
+
+ return;
+ }
+
+ //鍛婅瘔PLC璧板灏�
+ int tmpDis = (int)(((config.maxAngle + config.minAngle) / 2 - tmpAngle) * config.pulsePerDegree_Left);
+
+ Log.WriteLog("resultCreater_left_ListenEvent UI, opc write OutputTag.Move_Distance_left:" + tmpDis.ToString());
+
+ opc.Write(OutputTag.Move_Distance_left, tmpDis);
+
+ Log.WriteLog("resultCreater_left_ListenEvent UI, opc write OutputTag.Move_Distance_left begin");
+
+ Thread.Sleep(100);
+ opc.Write(OutputTag.Move_left, true);
+
+ Log.WriteLog("resultCreater_left_ListenEvent UI, opc write OutputTag.Move_left end");
+ }
+ }));
+
+ Log.WriteLog("resultCreater_left_ListenEvent Leave");
+ }
+
+ void listenEventCreater_ListenEvent(object sender, EventTool.ListenEventArgs e)
+ {
+ // Log.WriteLog("listenEventCreater_ListenEvent Enter");
+
+ this.BeginInvoke(new MethodInvoker(delegate
+ {
+ OPC.Item item = (OPC.Item)e.IData.Data;
+
+ string logstr = (null == item.value) ? "null" : item.value.ToString();
+ Log.WriteLog("listenEventCreater_ListenEvent item.name:" + item.name + " item.value: " + logstr);
+
+ switch (item.name)
+ {
+ case InputTag.Capture:
+ if ((bool)item.value)
+ {
+ if (!Effective())
+ {
+ break;
+ }
+ if (runStatus == RunStatus.Normal)
+ {
+ runStatus = RunStatus.firstCapture;
+ }
+ else if (runStatus == RunStatus.firstCapture)
+ {
+ runStatus = RunStatus.adjustMent;
+ }
+
+ Log.WriteLog("listenEventCreater_ListenEvent InputTag.Capture cam.GrabImage begin");
+ cam.GrabImage("");
+ Log.WriteLog("listenEventCreater_ListenEvent InputTag.Capture cam.GrabImage end");
+ }
+ break;
+
+ case InputTag.Position:
+ Log.WriteLog("listenEventCreater_ListenEvent InputTag.Position");
+
+ tsslPosition.Text = ((int)item.value).ToString();
+ break;
+
+ case InputTag.Start:
+ if ((bool)item.value)
+ {
+ Log.WriteLog("listenEventCreater_ListenEvent InputTag.Start StopRightCamera begin");
+ Log.WriteLog("------鍙屾墜鍚姩瀹屾垚锛屼骇鍝侀�佹枡寮�濮嬶紝鐩告満鍑嗗鎷嶇収----");
+ //鍙屾墜鍚姩锛屼骇鍝侀�佹枡寮�濮�
+ sw.Start();
+
+ StopRightCamera();
+
+ Log.WriteLog("listenEventCreater_ListenEvent InputTag.Start opc write OutputTag.Start");
+
+ opc.Write(OutputTag.Start, false);
+
+ Log.WriteLog("listenEventCreater_ListenEvent InputTag.Start initTest");
+
+ initTest();
+
+ Log.WriteLog("listenEventCreater_ListenEvent InputTag.Start ShowDisplay");
+
+ ShowDisplay("寮�濮嬫娴�", Color.Blue, Color.Lime);
+ }
+ break;
+
+ case InputTag.Capture_left:
+ if ((bool)item.value)
+ {
+ if (!Effective())
+ {
+ break;
+ }
+ if (runStatus_left == RunStatus.Normal)
+ {
+ runStatus_left = RunStatus.firstCapture;
+ }
+ else if (runStatus_left == RunStatus.firstCapture)
+ {
+ runStatus_left = RunStatus.adjustMent;
+ }
+
+ Log.WriteLog("listenEventCreater_ListenEvent InputTag.Capture_left cam_left.GrabImage begin");
+
+ cam_left.GrabImage("");
+
+ Log.WriteLog("listenEventCreater_ListenEvent InputTag.Capture_left cam_left.GrabImage end");
+ }
+ break;
+
+ case InputTag.Position_left:
+ Log.WriteLog("listenEventCreater_ListenEvent InputTag.Position_left");
+ tsslPosition_left.Text = ((int)item.value).ToString();
+ break;
+
+ case InputTag.Start_left:
+ if ((bool)item.value)
+ {
+ Log.WriteLog("listenEventCreater_ListenEvent InputTag.Start_left StopLeftCamera begin");
+ Log.WriteLog("------鍙屾墜鍚姩瀹屾垚锛屼骇鍝侀�佹枡寮�濮嬶紝鐩告満鍑嗗鎷嶇収----");
+ StopLeftCamera();
+
+ Log.WriteLog("listenEventCreater_ListenEvent InputTag.Start_left opc write OutputTag.Start_left");
+
+ opc.Write(OutputTag.Start_left, false);
+
+ Log.WriteLog("listenEventCreater_ListenEvent InputTag.Start_left initTest_Left");
+
+ initTest_Left();
+
+ Log.WriteLog("listenEventCreater_ListenEvent InputTag.Start_left ShowDisplay_left");
+
+ ShowDisplay_left("寮�濮嬫娴�", Color.Blue, Color.Lime);
+ }
+ break;
+
+ case InputTag.Alarm:
+ Log.WriteLog("listenEventCreater_ListenEvent InputTag.Alarm");
+ AlarmDisplay((int)item.value, this.tsslAlarm);
+ break;
+
+ case InputTag.Alarm_left:
+ Log.WriteLog("listenEventCreater_ListenEvent InputTag.Alarm_left");
+ AlarmDisplay((int)item.value, this.tsslAlarm_Left);
+ break;
+
+ }
+ }));
+
+ // Log.WriteLog("listenEventCreater_ListenEvent Leave");
+ }
+ void listenOutTageEventCreater_ListenEvent(object sender, EventTool.ListenEventArgs e)
+ {
+ // Log.WriteLog("listenEventCreater_ListenEvent Enter");
+
+ this.BeginInvoke(new MethodInvoker(delegate
+ {
+ OPC.Item item = (OPC.Item)e.IData.Data;
+
+ string logstr = (null == item.value) ? "null" : item.value.ToString();
+ Log.WriteLog("listenEventCreater_ListenEvent item.name:" + item.name + " item.value: " + logstr);
+
+ switch (item.name)
+ {
+ case OutputTag.ForApple:
+ if (config.rightUsed == true)
+ {
+ btnDisplay.Text = (bool)item.value ? "缁х數鍣ㄤ笂鐢靛苟淇濇寔" : "缁х數鍣ㄦ柇鐢�";
+
+
+ }
+ else
+ {
+ btnDisplay_left.Text = (bool)item.value ? "缁х數鍣ㄤ笂鐢靛苟淇濇寔" : "缁х數鍣ㄦ柇鐢�";
+
+
+ }
+
+ if ((bool)item.value && isRealyOK)
+ {
+ //Log.WriteLog("--------瑙掑害璋冩暣瀹屾垚锛岀户鐢靛櫒涓婄數------");
+
+
+ }
+ else if (!((bool)item.value) && isRealyOK)
+ {
+ Log.WriteLog("--------浜у搧妫�娴嬪畬鎴�,OP澶嶄綅鎿嶄綔锛岀户鐢靛櫒鏂數------");
+ Log.WriteLog("--------Relay turn off------");
+ isRealyOK = false;
+ Log.WriteLog("--------浜у搧妫�娴嬬粨鏉�------");
+ Thread.Sleep(3000);
+ Log.WriteLog("resultCreater_ListenEvent UI, opc write OutputTag.Move_OK true end");
+ RunEnd();
+ Log.WriteLog("resultCreater_ListenEvent UI, RunEnd");
+ }
+
+ break;
+
+ }
+ }));
+
+ // Log.WriteLog("listenEventCreater_ListenEvent Leave");
+ }
+
+ #endregion
+
+ #region OPC鎿嶄綔
+
+ /// <summary>
+ /// 杩炴帴鍒癘PC Server
+ /// 淇濇寔姝ゅ墠鐨勬墜鍔�/鑷姩妯″紡
+ /// </summary>
+ private void ConnectToOpc()
+ {
+ Log.WriteLog("ConnectToOpc Enter");
+
+ opc = new OPC(config.opcConfig);
+ if (opc.Connect())
+ {
+ Log.WriteLog("ConnectToOpc connect succeed");
+
+ tsslOPC.Text = "OPC Connection Succeed !";
+ // 杩涜濡備笅鎿嶄綔
+ opc.CreateGroup(); // 鍒涘缓Group
+ //PlcRunMode(RunMode.Manual);
+ }
+ else
+ {
+ Log.WriteLog("ConnectToOpc connect fail");
+
+ tsslOPC.Text = "OPC Connection Failed !";
+
+ /* 杩炴帴涓嶄笂鏃剁殑寮傚父澶勭悊 */
+ }
+
+ Log.WriteLog("ConnectToOpc Leave");
+ }
+
+ /// <summary>
+ /// 閬嶅巻OPC鎵�鏈夌偣浣嶏紝寰楀埌鍊�
+ /// </summary>
+ private void UpdateOPC()
+ {
+ Log.WriteLog("UpdateOPC Enter");
+ Thread.Sleep(5000);
+
+ foreach (KeyValuePair<string, OPC.Item> item in opc.itemReadDict)
+ {
+ object status = new Object();
+ opc.ReadOneItem_Wrapper(item.Key, ref status);
+ string logstr = (null == item.Value) ? "null" : item.Value.ToString();
+ Log.WriteLog("UpdateOPC itemReadDict key: " + item.Key + " value:" + logstr);
+
+ switch (item.Key)
+ {
+ case InputTag.Capture :
+ break;
+
+ case InputTag.Position:
+ tsslPosition.Text = ((int)item.Value.value).ToString();
+ break;
+
+ case InputTag.Position_left:
+ tsslPosition_left.Text = ((int)item.Value.value).ToString();
+ break;
+
+ case InputTag.Alarm:
+ //AlarmDisplay((int)item.Value.value);
+ AlarmDisplay((int)item.Value.value, this.tsslAlarm);
+ break;
+ case InputTag.Alarm_left:
+ AlarmDisplay((int)item.Value.value, this.tsslAlarm_Left);
+ break;
+ }
+ }
+
+ foreach (KeyValuePair<string, OPC.Item> item in opc.itemWriteDict)
+ {
+ object status = new Object();
+ opc.ReadOneItem_Wrapper(item.Key, ref status);
+ string logstr =(null == item.Value) ? "null" : item.Value.ToString();
+ Log.WriteLog("UpdateOPC itemWriteDict key: " + item.Key + " value:" + logstr);
+ switch (item.Key)
+ {
+ case OutputTag.Move:
+ break;
+
+ case OutputTag.CameraLight:
+ ckbCameraLight.Checked = (bool)item.Value.value;
+ ckbCameraLight.Text = ckbCameraLight.Checked ? "鍏夋簮鍏�" : "鍏夋簮寮�";
+ break;
+
+ case OutputTag.CameraLight_left:
+ ckbCameraLight_left.Checked = (bool)item.Value.value;
+ ckbCameraLight_left.Text = ckbCameraLight_left.Checked ? "鍏夋簮鍏�" : "鍏夋簮寮�";
+ break;
+
+ //case OutputTag.ForApple:
+ // if (config.rightUsed == true )
+ // {
+ // btnDisplay.Text = (bool)item.Value.value ? "缁х數鍣ㄤ笂鐢�" : "缁х數鍣ㄦ柇鐢�";
+
+
+ // }
+ // else
+ // {
+ // btnDisplay_left.Text = (bool)item.Value.value ? "缁х數鍣ㄤ笂鐢�" : "缁х數鍣ㄦ柇鐢�";
+
+ // }
+
+ // if ((bool)item.Value.value && isRealyOK)
+ // {
+ // Log.WriteLog("--------瑙掑害璋冩暣瀹屾垚锛岀户鐢靛櫒涓婄數------");
+ // }
+ // if (!((bool)item.Value.value) && isRealyOK)
+ // {
+ // Log.WriteLog("--------浜у搧妫�娴嬪畬鎴�,OP澶嶄綅鎿嶄綔锛岀户鐢靛櫒鏂數------");
+ // }
+ // isRealyOK = false;
+ // break;
+ }
+ }
+
+ Log.WriteLog("UpdateOPC Leave");
+ }
+
+ #endregion
+
+ #region 鍚勭鏂规硶
+
+ /// <summary>
+ /// 鍒濆鍖栨柊鐨勬娴�
+ /// </summary>
+ private void initTest()
+ {
+ runStatus = RunStatus.Normal;
+
+ txtResultInitAngle.Text = "";
+ txtResultFinalAngle.Text = "";
+ }
+
+ /// <summary>
+ /// 宸﹀垵濮嬪寲鏂扮殑妫�娴�
+ /// </summary>
+ private void initTest_Left()
+ {
+ runStatus_left = RunStatus.Normal;
+
+ txtResultInitAngle.Text = "";
+ txtResultFinalAngle.Text = "";
+ }
+
+ /// <summary>
+ /// 鎶ヨ淇℃伅
+ /// </summary>
+ /// <param name="k">缂栧彿</param>
+ private void AlarmDisplay(int k)
+ {
+ tsslAlarm.ForeColor = (k == 0) ? Color.Black : Color.Red;
+
+ switch (k)
+ {
+ case 0:
+ tsslAlarm.Text = "鏃犳姤璀︼紒";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 1:
+ tsslAlarm.Text = "璋冩暣浼烘湇鐢垫満椹卞姩鍣ㄦ姤璀�";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 3:
+ tsslAlarm.Text = "璋冩暣浼烘湇鑴夊啿寮傚父";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 5:
+ tsslAlarm.Text = "鐩告満鎶撳彇瑙掑害澶辫触";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 11:
+ tsslAlarm.Text = "閫佹枡浼烘湇鐢垫満椹卞姩鍣ㄦ姤璀�";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 12:
+ tsslAlarm.Text = "闂ㄤ己鏈嶇數鏈洪┍鍔ㄥ櫒鎶ヨ";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 13:
+ tsslAlarm.Text = "閫佹枡浼烘湇鑴夊啿寮傚父";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 14:
+ tsslAlarm.Text = "闂ㄤ己鏈嶈剦鍐插紓甯�";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 20:
+ tsslAlarm.Text = "浜у搧鍒濆瑙掑害鏈埌浣�";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 21:
+ tsslAlarm.Text = "渚ц竟姘旂几澶圭揣鏈埌浣�";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 22:
+ tsslAlarm.Text = "姝h竟姘旂几澶圭揣鏈埌浣�";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 23:
+ tsslAlarm.Text = "鏃犳潌姘旂几鎺ㄩ�佹湭鍒颁綅";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 24:
+ tsslAlarm.Text = "婊戝彴姘旂几閫�浣嶆湭鍒颁綅";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 26:
+ tsslAlarm.Text = "鏃犳潌姘旂几鍥炲垵濮嬩綅鏈埌浣�";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 27:
+ tsslAlarm.Text = "渚ц竟姘旂几鍥炲垵濮嬩綅鏈埌浣�";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 28:
+ tsslAlarm.Text = "姝h竟姘旂几鍥炲垵濮嬩綅鏈埌浣�";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 29:
+ tsslAlarm.Text = "婊戝彴姘旂几鍥炲垵濮嬩綅鏈埌浣�";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 30:
+ tsslAlarm.Text = "鍏夊箷瑙﹀彂鎶ヨ锛岃纭鏃犲紓甯哥姸鎬佸苟澶嶄綅";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 31:
+ tsslAlarm.Text = "鏃犳潌姘旂几鍥炲師鐐规湭鍒颁綅";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 32:
+ tsslAlarm.Text = "渚ц竟姘旂几鍥炲師鐐规湭鍒颁綅";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 33:
+ tsslAlarm.Text = "姝h竟姘旂几鍥炲師鐐规湭鍒颁綅";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 34:
+ tsslAlarm.Text = "婊戝彴姘旂几鍥炲師鐐规湭鍒颁綅";
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 35:
+ tsslAlarm.Text = "璋冩暣浼烘湇瑙﹀彂鏋侀檺浣嶏紝璇锋鏌ヤ骇鍝佹墦寮�鐨勫垵濮嬭搴�";
+ sw.Stop();
+ sw.Reset();
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 36:
+ tsslAlarm.Text = "瀹氫綅鐩告満鍏夋簮鏈墦寮�锛岃妫�鏌ョ浉鏈哄厜婧愮姸鎬佸苟鎬ュ仠澶嶄綅";
+ sw.Stop();
+ sw.Reset();
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 37:
+ tsslAlarm.Text = "鐩告満鏈媿鐓э紝璇烽噸鍚▼搴忔垨妫�鏌LC鐘舵��";
+ sw.Stop();
+ sw.Reset();
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+
+ case 38:
+ tsslAlarm.Text = "鍒濆鍖栨湭瀹屾垚锛岃鎬ュ仠澶嶄綅骞舵鏌ョ▼搴忓伐浣滅姸鎬�";
+ sw.Reset();
+ Log.WriteLog(tsslAlarm.Text.ToString());
+ break;
+ }
+ }
+
+ /// <summary>
+ /// 鎶ヨ淇℃伅
+ /// </summary>
+ /// <param name="k">缂栧彿</param>
+ private void AlarmDisplay(int k, ToolStripStatusLabel alarm)
+ {
+ alarm.ForeColor = (k == 0) ? Color.Black : Color.Red;
+
+ switch (k)
+ {
+ case 0:
+ alarm.Text = "鏃犳姤璀︼紒";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 1:
+ alarm.Text = "璋冩暣浼烘湇鐢垫満椹卞姩鍣ㄦ姤璀�";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 3:
+ alarm.Text = "璋冩暣浼烘湇鑴夊啿寮傚父";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 5:
+ alarm.Text = "鐩告満鎶撳彇瑙掑害澶辫触锛岃妫�鏌ヤ骇鍝丩CD杈规鏄惁璐存湁寮傜墿";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 7:
+ alarm.Text = "浜у搧鍒濆瑙掑害杩囧ぇ锛岃鎬ュ仠澶嶄綅鍚庨噸鏂版墦寮�浜у搧鍐嶆娴嬮噺";
+ Log.WriteLog(alarm.Text.ToString());
+ if (alarm.Name.Contains("_Left"))
+ {
+ SaveinitAngle_Left();
+ }
+ else
+ {
+ SaveinitAngle_Right();
+ }
+ break;
+
+ case 10:
+ alarm.Text = "鎬ュ仠涓�,璇峰浣嶏紒";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 11:
+ alarm.Text = "閫佹枡浼烘湇鐢垫満椹卞姩鍣ㄦ姤璀�";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 12:
+ alarm.Text = "闂ㄤ己鏈嶇數鏈洪┍鍔ㄥ櫒鎶ヨ";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 13:
+ alarm.Text = "閫佹枡浼烘湇鑴夊啿寮傚父";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 14:
+ alarm.Text = "闂ㄤ己鏈嶈剦鍐插紓甯�";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 20:
+ alarm.Text = "浜у搧鍒濆瑙掑害鏈埌浣�";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 21:
+ alarm.Text = "渚ц竟姘旂几澶圭揣鏈埌浣�";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 22:
+ alarm.Text = "姝h竟姘旂几澶圭揣鏈埌浣�";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 23:
+ alarm.Text = "鏃犳潌姘旂几鎺ㄩ�佹湭鍒颁綅";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 24:
+ alarm.Text = "婊戝彴姘旂几閫�浣嶆湭鍒颁綅";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 26:
+ alarm.Text = "鏃犳潌姘旂几鍥炲垵濮嬩綅鏈埌浣�";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 27:
+ alarm.Text = "渚ц竟姘旂几鍥炲垵濮嬩綅鏈埌浣�";
+ break;
+
+ case 28:
+ alarm.Text = "姝h竟姘旂几鍥炲垵濮嬩綅鏈埌浣�";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 29:
+ alarm.Text = "婊戝彴姘旂几鍥炲垵濮嬩綅鏈埌浣�";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 30:
+ alarm.Text = "鍏夊箷瑙﹀彂鎶ヨ锛岃纭鏃犲紓甯哥姸鎬佸苟澶嶄綅";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 31:
+ alarm.Text = "鏃犳潌姘旂几鍥炲師鐐规湭鍒颁綅";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 32:
+ alarm.Text = "渚ц竟姘旂几鍥炲師鐐规湭鍒颁綅";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 33:
+ alarm.Text = "姝h竟姘旂几鍥炲師鐐规湭鍒颁綅";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 34:
+ alarm.Text = "婊戝彴姘旂几鍥炲師鐐规湭鍒颁綅";
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 35:
+ alarm.Text = "璋冩暣浼烘湇瑙﹀彂鏋侀檺浣嶏紝璇锋鏌ヤ骇鍝佹墦寮�鐨勫垵濮嬭搴�";
+ sw.Stop();
+ sw.Reset();
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 36:
+ alarm.Text = "瀹氫綅鐩告満鍏夋簮鏈墦寮�锛岃妫�鏌ョ浉鏈哄厜婧愮姸鎬佸苟鎬ュ仠澶嶄綅";
+ sw.Stop();
+ sw.Reset();
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 37:
+ alarm.Text = "鐩告満鏈媿鐓э紝璇烽噸鍚▼搴忔垨妫�鏌LC鐘舵��";
+ sw.Stop();
+ sw.Reset();
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+
+ case 38:
+ alarm.Text = "鍒濆鍖栨湭瀹屾垚锛岃鎬ュ仠澶嶄綅骞舵鏌ョ▼搴忓伐浣滅姸鎬�";
+ sw.Stop();
+ sw.Reset();
+ Log.WriteLog(alarm.Text.ToString());
+ break;
+ }
+ }
+
+
+ /// <summary>
+ /// 鎸夐挳鏄剧ず
+ /// </summary>
+ /// <param name="s">鍐呭</param>
+ /// <param name="foreColor">鏂囧瓧棰滆壊</param>
+ /// <param name="backgroudColor">鑳屾櫙鑹�</param>
+ private void ShowDisplay(string s, Color foreColor, Color backColor)
+ {
+ btnDisplay.Text = s;
+ btnDisplay.ForeColor = foreColor;
+ btnDisplay.BackColor = backColor;
+ }
+
+ /// <summary>
+ /// 宸︽寜閽樉绀�
+ /// </summary>
+ /// <param name="s">鍐呭</param>
+ /// <param name="foreColor">鏂囧瓧棰滆壊</param>
+ /// <param name="backgroudColor">鑳屾櫙鑹�</param>
+ private void ShowDisplay_left(string s, Color foreColor, Color backColor)
+ {
+ btnDisplay_left.Text = s;
+ btnDisplay_left.ForeColor = foreColor;
+ btnDisplay_left.BackColor = backColor;
+ }
+
+ /// <summary>
+ /// 鍐嶆帶浠朵笂鐢荤洿绾�
+ /// </summary>
+ /// <param name="viewport"></param>
+ /// <param name="line"></param>
+ private void DrawLine(HWindowControl viewport, FitLineResult line)
+ {
+ HOperatorSet.SetColor(viewport.HalconWindow, "green");
+ HOperatorSet.SetLineWidth(viewport.HalconWindow, 2);
+ HOperatorSet.SetPart(viewport.HalconWindow, 0, 0, ImageHeight - 1, ImageWidth - 1);
+ HOperatorSet.DispLine(viewport.HalconWindow, line.mRowStart, line.mColumnStart, line.mRowEnd, line.mColumnEnd);
+ }
+
+ /// <summary>
+ /// 淇濆瓨鏁版嵁
+ /// </summary>
+ private void SaveResult()
+ {
+ Log.WriteLog("SaveResult Enter");
+
+ string filePath = "D:\\Data\\" + DateTime.Now.ToString("yyyyMMdd");
+ if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath);
+
+ filePath += "\\result.csv";
+ string tmpS = "";
+ if (!File.Exists(filePath))
+ {
+ tmpS = "SN,time,initAngle,finalAngle,\r\n";
+ File.AppendAllText(filePath, tmpS);
+ }
+
+ tmpS = txtSN.Text.Trim() + "," + DateTime.Now.ToString("HH:mm:ss") + "," + initAngle.ToString() + "," + finalAngle.ToString() + ",\r\n";
+ File.AppendAllText(filePath, tmpS);
+
+ Log.WriteLog("SaveResult Leave");
+ }
+
+ /// <summary>
+ /// 鍙冲垵濮嬭搴︿繚瀛樻暟鎹�
+ /// </summary>
+ private void SaveinitAngle_Right()
+ {
+ Log.WriteLog("SaveinitAngle_Right Enter");
+
+ string filePath = "D:\\Data\\" + DateTime.Now.ToString("yyyyMMdd");
+ if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath);
+
+ filePath += "\\result.csv";
+ string tmpS = "";
+ if (!File.Exists(filePath))
+ {
+ tmpS = "SN,time,initAngle,finalAngle,\r\n";
+ File.AppendAllText(filePath, tmpS);
+ }
+
+ tmpS = txtSN.Text.Trim() + "," + DateTime.Now.ToString("HH:mm:ss") + "," + initAngle.ToString() + "," + "" + ",\r\n";
+ File.AppendAllText(filePath, tmpS);
+
+ Log.WriteLog("SaveinitAngle_Right Leave");
+ }
+
+
+ /// <summary>
+ /// 宸︿繚瀛樻暟鎹�
+ /// </summary>
+ private void SaveResult_Left()
+ {
+ Log.WriteLog("SaveResult_Left Enter");
+
+ string filePath = "D:\\Data\\" + DateTime.Now.ToString("yyyyMMdd") + "-Left";
+ if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath);
+
+ filePath += "\\result.csv";
+ string tmpS = "";
+ if (!File.Exists(filePath))
+ {
+ tmpS = "SN,time,initAngle,finalAngle,\r\n";
+ File.AppendAllText(filePath, tmpS);
+ }
+
+ tmpS = txtSN.Text.Trim() + "," + DateTime.Now.ToString("HH:mm:ss") + "," + initAngle_left.ToString() + "," + finalAngle_left.ToString() + ",\r\n";
+ File.AppendAllText(filePath, tmpS);
+
+ Log.WriteLog("SaveResult_Left Leave");
+ }
+
+ /// <summary>
+ /// 宸﹀垵濮嬭搴︿繚瀛樻暟鎹�
+ /// </summary>
+ private void SaveinitAngle_Left()
+ {
+ Log.WriteLog("SaveinitAngle_Left Enter");
+
+ string filePath = "D:\\Data\\" + DateTime.Now.ToString("yyyyMMdd") + "-Left";
+ if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath);
+
+ filePath += "\\result.csv";
+ string tmpS = "";
+ if (!File.Exists(filePath))
+ {
+ tmpS = "SN,time,initAngle,finalAngle,\r\n";
+ File.AppendAllText(filePath, tmpS);
+ }
+
+ tmpS = txtSN.Text.Trim() + "," + DateTime.Now.ToString("HH:mm:ss") + "," + initAngle_left.ToString() + "," + "" + ",\r\n";
+ File.AppendAllText(filePath, tmpS);
+
+ Log.WriteLog("SaveinitAngle_Left Leave");
+ }
+
+ /// <summary>
+ /// 杩愮畻缁撴潫鎿嶄綔
+ /// </summary>
+ private void RunEnd()
+ {
+ Log.WriteLog("RunEnd Enter");
+
+ runStatus = RunStatus.Normal;
+ SaveResult();
+ txtResultInitAngle.Text = initAngle.ToString("0.00");
+ txtResultFinalAngle.Text = finalAngle.ToString("0.00");
+ ShowDisplay("瑙嗚妫�娴嬪畬鎴�", Color.Blue, Color.Lime);
+
+ Log.WriteLog("RunEnd Leave");
+ }
+
+ /// <summary>
+ /// 宸﹁繍绠楃粨鏉熸搷浣�
+ /// </summary>
+ private void RunEnd_Left()
+ {
+ Log.WriteLog("RunEnd_Left Enter");
+
+ runStatus_left = RunStatus.Normal;
+ SaveResult_Left();
+ txtResultInitAngle.Text = initAngle_left.ToString("0.00");
+ txtResultFinalAngle.Text = finalAngle_left.ToString("0.00");
+ ShowDisplay("瑙嗚妫�娴嬪畬鎴�", Color.Blue, Color.Lime);
+
+ Log.WriteLog("RunEnd_Left Leave");
+ }
+
+ /// <summary>
+ /// 鏄剧ず瑙掑害
+ /// </summary>
+ /// <param name="s">瑙掑害</param>
+ private void ShowDisplayAngle(string s)
+ {
+ this.lblAngleDisplay.Text = s;
+ }
+
+ /// <summary>
+ /// 鏄剧ず宸﹁搴�
+ /// </summary>
+ /// <param name="s">瑙掑害</param>
+ private void ShowDisplayAngle_left(string s)
+ {
+ this.lblAngleDisplay_left.Text = s;
+ }
+
+ #endregion
+
+ #region 鎺т欢浜嬩欢
+
+ private void btnHalconTool_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnHalconTool_Click Enter");
+
+ frmPassword frmp = new frmPassword(config.password);
+ frmp.ShowDialog();
+
+ if (frmp.isOK)
+ {
+ HalconTools.frmMain main = new HalconTools.frmMain();
+ main.ShowDialog();
+
+ if (config.rightUsed) ht.LoadJobs();
+ if (config.leftUsed) ht_left.LoadJobs();
+ }
+
+ Log.WriteLog("btnHalconTool_Click Leave");
+ }
+
+ private void btnHalconTool_left_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnHalconTool_left_Click Enter");
+
+ frmPassword frmp = new frmPassword(config.password);
+ frmp.ShowDialog();
+
+ if (frmp.isOK)
+ {
+ HalconTools.frmMain main = new HalconTools.frmMain();
+ main.ShowDialog();
+
+ if (config.rightUsed) ht.LoadJobs();
+ if (config.leftUsed) ht_left.LoadJobs();
+ }
+
+ Log.WriteLog("btnHalconTool_left_Click Leave");
+ }
+
+ private void btnCapture_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnCapture_Click Enter");
+
+ runStatus = RunStatus.calibration;
+
+ cam.GrabImage("");
+
+ Log.WriteLog("btnCapture_Click Leave");
+ }
+
+ private void btnCapture_left_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnCapture_left_Click Enter");
+
+ runStatus_left = RunStatus.calibration;
+
+ cam_left.GrabImage("");
+
+ Log.WriteLog("btnCapture_left_Click Leave");
+ }
+
+ private void btnCalibration_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnCalibration_Click Enter");
+
+ double calAngle, nowAngle;
+
+ try
+ {
+ calAngle = Convert.ToDouble(txtCalAngle.Text);
+ nowAngle = Convert.ToDouble(lblAngleDisplay.Text);
+ }
+ catch (Exception ex)
+ {
+ Log.WriteLog("btnCalibration_Click Exception Leave");
+
+ MessageBox.Show("瑙掑害妫�娴嬮敊璇垨鏍囧畾瑙掑害杈撳叆閿欒锛�");
+ return;
+ }
+
+ config.angleOffset = calAngle - (nowAngle - config.angleOffset);
+ sft.SetConfig(configPath, config);
+ MessageBox.Show("鏍囧畾鎴愬姛");
+
+ runStatus = RunStatus.Normal;
+ btnCalibration.Enabled = false;
+ gbxCalibration.Enabled = false;
+
+
+ Log.WriteLog("btnCalibration_Click Leave");
+ }
+
+ private void btnCalibration_left_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("Error: btnCalibration_left_Click Enter");
+
+ double calAngle, nowAngle;
+
+ try
+ {
+ calAngle = Convert.ToDouble(txtCalAngle_left.Text);
+ nowAngle = Convert.ToDouble(lblAngleDisplay_left.Text);
+ }
+ catch (Exception ex)
+ {
+ Log.WriteLog("Error: btnCalibration_left_Click Exception Leave");
+
+ MessageBox.Show("瑙掑害妫�娴嬮敊璇垨鏍囧畾瑙掑害杈撳叆閿欒锛�");
+ return;
+ }
+
+ config.angleOffset_Left = calAngle - (nowAngle - config.angleOffset_Left);
+ sft.SetConfig(configPath, config);
+ MessageBox.Show("鏍囧畾鎴愬姛");
+
+ runStatus_left = RunStatus.Normal;
+ btnCalibration_left.Enabled = false;
+ gbxCalibration_left.Enabled = false;
+
+ Log.WriteLog("btnCalibration_left_Click Leave");
+ }
+
+ private void btnCanCalibration_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnCanCalibration_Click Enter");
+
+ if (gbxCalibration.Enabled == false)
+ {
+ frmPassword frmp = new frmPassword(config.password);
+ frmp.ShowDialog();
+
+ if (frmp.isOK) gbxCalibration.Enabled = true;
+ }
+ else
+ {
+ gbxCalibration.Enabled = false;
+ }
+
+ Log.WriteLog("btnCanCalibration_Click Leave");
+ }
+
+ private void btnCanCalibration_left_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnCanCalibration_left_Click Enter");
+
+ if (gbxCalibration_left.Enabled == false)
+ {
+ frmPassword frmp = new frmPassword(config.password);
+ frmp.ShowDialog();
+
+ if (frmp.isOK) gbxCalibration_left.Enabled = true;
+ }
+ else
+ {
+ gbxCalibration_left.Enabled = false;
+ }
+
+ Log.WriteLog("btnCanCalibration_left_Click Leave");
+ }
+
+ private void tVideo_Tick(object sender, EventArgs e)
+ {
+ Log.WriteLog("tVideo_Tick Enter");
+
+ cam.GrabImage("");
+
+ Log.WriteLog("tVideo_Tick Leave");
+ }
+
+ private void tVideo_left_Tick(object sender, EventArgs e)
+ {
+ Log.WriteLog("tVideo_left_Tick Enter");
+
+ cam_left.GrabImage("");
+
+ Log.WriteLog("tVideo_left_Tick Leave");
+ }
+
+ private void btnContinueCapture_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnContinueCapture_Click Enter");
+
+ runStatus = RunStatus.continueCapture;
+ tVideo.Enabled = true;
+ this.btnContinueCapture.Enabled = false;
+ this.btnStopCapture.Enabled = true;
+
+ Log.WriteLog("btnContinueCapture_Click Leave");
+ }
+
+ private void btnContinueCapture_left_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnContinueCapture_left_Click Enter");
+
+ runStatus_left = RunStatus.continueCapture;
+ tVideo_left.Enabled = true;
+ this.btnContinueCapture_left.Enabled = false;
+ this.btnStopCapture_left.Enabled = true;
+
+ Log.WriteLog("btnContinueCapture_left_Click Leave");
+ }
+
+ private void btnStopCapture_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnStopCapture_Click Enter");
+
+ StopRightCamera();
+
+ Log.WriteLog("btnStopCapture_Click Leave");
+ }
+
+ private void StopRightCamera()
+ {
+ Log.WriteLog("StopRightCamera Enter");
+
+ tVideo.Enabled = false;
+ runStatus = RunStatus.Normal;
+ this.btnContinueCapture.Enabled = true;
+ this.btnStopCapture.Enabled = false;
+
+ Log.WriteLog("StopRightCamera Leave");
+ }
+
+ private void btnStopCapture_left_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnStopCapture_left_Click Enter");
+
+ StopLeftCamera();
+
+ Log.WriteLog("btnStopCapture_left_Click Leave");
+ }
+
+ private void StopLeftCamera()
+ {
+ Log.WriteLog("StopLeftCamera Enter");
+
+ tVideo_left.Enabled = false;
+ runStatus_left = RunStatus.Normal;
+ this.btnContinueCapture_left.Enabled = true;
+ this.btnStopCapture_left.Enabled = false;
+
+ Log.WriteLog("StopLeftCamera Leave");
+ }
+
+ private void btnTestMove_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnTestMove_Click Enter");
+
+ int tmpD = Convert.ToInt32(txtTestPulse.Text);
+ opc.Write(OutputTag.Move_Distance, tmpD);
+ Thread.Sleep(100);
+ opc.Write(OutputTag.Move_Test, true);
+
+ Log.WriteLog("btnTestMove_Click Leave");
+ }
+
+ private void btnTestMove_left_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnTestMove_left_Click Enter");
+
+ int tmpD = Convert.ToInt32(txtTestPulse_left.Text);
+ opc.Write(OutputTag.Move_Distance_left, tmpD);
+ Thread.Sleep(100);
+ opc.Write(OutputTag.Move_Test_left, true);
+
+ Log.WriteLog("btnTestMove_left_Click Leave");
+ }
+
+ private void cbxTest_CheckedChanged(object sender, EventArgs e)
+ {
+ Log.WriteLog("cbxTest_CheckedChanged Enter");
+
+ if (cbxTest.Checked)
+ {
+ Log.WriteLog("cbxTest_CheckedChanged cbxTest.Checked = true");
+
+ frmPassword frmp = new frmPassword(config.password);
+ frmp.ShowDialog();
+
+ if (frmp.isOK)
+ {
+ gbxTest.Enabled = cbxTest.Checked;
+ runStatus = RunStatus.testMent;
+ }
+ }
+ else
+ {
+ Log.WriteLog("cbxTest_CheckedChanged cbxTest.Checked = false");
+
+ gbxTest.Enabled = cbxTest.Checked;
+ tVideo.Enabled = false;
+ runStatus = RunStatus.Normal;
+ }
+
+ Log.WriteLog("cbxTest_CheckedChanged Leave");
+ }
+
+ private void cbxTest_left_CheckedChanged(object sender, EventArgs e)
+ {
+ Log.WriteLog("cbxTest_left_CheckedChanged Enter");
+
+ if (cbxTest_left.Checked)
+ {
+ Log.WriteLog("cbxTest_CheckedChanged cbxTest_left.Checked = true");
+
+ frmPassword frmp = new frmPassword(config.password);
+ frmp.ShowDialog();
+
+ if (frmp.isOK)
+ {
+ gbxTest_left.Enabled = cbxTest_left.Checked;
+ runStatus_left = RunStatus.testMent;
+ }
+ }
+ else
+ {
+ Log.WriteLog("cbxTest_left_CheckedChanged cbxTest_left.Checked = false");
+
+ gbxTest_left.Enabled = cbxTest_left.Checked;
+ tVideo_left.Enabled = false;
+ runStatus_left = RunStatus.Normal;
+ }
+
+ Log.WriteLog("cbxTest_left_CheckedChanged Leave");
+ }
+
+ private void btnConfig_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnConfig_Click Enter");
+
+ frmPassword frmp = new frmPassword(config.password);
+ frmp.ShowDialog();
+
+ if (frmp.isOK)
+ {
+ frmConfig tmpCon = new frmConfig(opc, config,"Right");
+ tmpCon.ShowDialog();
+ }
+
+ Log.WriteLog("btnConfig_Click Leave");
+ }
+
+ private void btnConfig_left_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnConfig_left_Click Enter");
+
+ frmPassword frmp = new frmPassword(config.password);
+ frmp.ShowDialog();
+
+ if (frmp.isOK)
+ {
+ frmConfig tmpCon = new frmConfig(opc, config,"Left");
+ tmpCon.ShowDialog();
+ }
+
+ Log.WriteLog("btnConfig_left_Click Leave");
+ }
+
+ private void ckbCameraLight_CheckedChanged(object sender, EventArgs e)
+ {
+ Log.WriteLog("ckbCameraLight_CheckedChanged Enter");
+
+ opc.Write(OutputTag.CameraLight, ckbCameraLight.Checked);
+ ckbCameraLight.Text = ckbCameraLight.Checked ? "鍏夋簮鍏�" : "鍏夋簮寮�";
+
+ Log.WriteLog("ckbCameraLight_CheckedChanged Leave");
+ }
+
+ private void ckbCameraLight_left_CheckedChanged(object sender, EventArgs e)
+ {
+ Log.WriteLog("ckbCameraLight_left_CheckedChanged Enter");
+
+ opc.Write(OutputTag.CameraLight_left, ckbCameraLight_left.Checked);
+ ckbCameraLight_left.Text = ckbCameraLight_left.Checked ? "鍏夋簮鍏�" : "鍏夋簮寮�";
+
+ Log.WriteLog("ckbCameraLight_left_CheckedChanged Leave");
+ }
+
+ private void btnORI_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnORI_Click Enter");
+ opc.Write(OutputTag.ORI, true);
+ Log.WriteLog("btnORI_Click Leave");
+ }
+
+ private void btnORI_left_Click(object sender, EventArgs e)
+ {
+ Log.WriteLog("btnORI_left_Click Enter");
+
+ opc.Write(OutputTag.ORI_left, true);
+
+ Log.WriteLog("btnORI_left_Click Leave");
+ }
+
+ #endregion
+
+ private static System.Threading.Mutex _mutex_Right;
+
+ private System.Threading.Mutex GetMutexLock_Right()
+ {
+ System.Threading.Interlocked.CompareExchange(ref _mutex_Right, new System.Threading.Mutex(), null);
+ return _mutex_Right;
+ }
+
+ private static System.Threading.Mutex _mutex_Left;
+
+ private System.Threading.Mutex GetMutexLock_Left()
+ {
+ System.Threading.Interlocked.CompareExchange(ref _mutex_Left, new System.Threading.Mutex(), null);
+ return _mutex_Left;
+ }
+
+ #region 宸�
+
+ private void button2_Click(object sender, EventArgs e)
+ {
+ opc.Write(OutputTag.Manual_left, true);
+ }
+
+ private void button4_Click(object sender, EventArgs e)
+ {
+ opc.Write(OutputTag.qigangjiajin_left, true);
+ }
+
+ private void button5_Click(object sender, EventArgs e)
+ {
+ opc.Write(OutputTag.qigangsongkai_left, true);
+ }
+
+ private void btnCloseDor_Click(object sender, EventArgs e)
+ {
+ opc.Write(OutputTag.guanmen_left, true);
+ }
+
+ private void btnOpenDor_Click(object sender, EventArgs e)
+ {
+ opc.Write(OutputTag.kaimen_left, true);
+ }
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ opc.Write(OutputTag.huataiqigang_left, true);
+ }
+
+ private void button3_Click(object sender, EventArgs e)
+ {
+ opc.Write(OutputTag.songliao_left, true);
+ }
+
+ private void btnOut_Click(object sender, EventArgs e)
+ {
+ opc.Write(OutputTag.chuliao_left, true);
+ }
+
+ private void button6_Click(object sender, EventArgs e)
+ {
+ if (runStatus_left == RunStatus.Normal)
+ {
+ if (MessageBox.Show("纭畾杩涜鎵嬪姩瀹氫綅锛�", "绯荤粺鎻愮ず", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ opc.Write(OutputTag.shoudongdingwei_left, true);
+ }
+ }
+ else
+ {
+ MessageBox.Show("娴嬭瘯鐘舵�佷笅鏃犳硶鎵嬪姩瀹氫綅锛�", "绯荤粺鎻愮ず", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+
+ private void checkBox1_CheckedChanged(object sender, EventArgs e)
+ {
+ if (checkBox1.Checked)
+ {
+ if ((runStatus_left == RunStatus.Normal))
+ {
+ button6.Enabled = true;
+ }
+ else
+ {
+ checkBox1.Checked = false;
+ button6.Enabled = false;
+ MessageBox.Show("娴嬭瘯鐘舵�佷笅鏃犳硶鎵嬪姩瀹氫綅锛�", "绯荤粺鎻愮ず", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+ else
+ {
+ button6.Enabled = false;
+ }
+ }
+
+ #endregion
+
+ #region 鍙�
+
+ private void button10_Click(object sender, EventArgs e)
+ {
+ opc.Write(OutputTag.Manual, true);
+ }
+
+ private void button8_Click(object sender, EventArgs e)
+ {
+ opc.Write(OutputTag.qigangjiajin, true);
+ }
+
+ private void button7_Click(object sender, EventArgs e)
+ {
+ opc.Write(OutputTag.qigangsongkai, true);
+ }
+
+ private void button13_Click(object sender, EventArgs e)
+ {
+ opc.Write(OutputTag.guanmen, true);
+ //if (isUUTOut == false)
+ //{
+ // opc.Write(OutputTag.guanmen, true);
+ // isDoorOpen = false;
+ //}
+ //else
+ //{
+ // MessageBox.Show("璇峰厛閫佹枡锛�");
+ //}
+ }
+
+ private void button14_Click(object sender, EventArgs e)
+ {
+ opc.Write(OutputTag.kaimen, true);
+ //isDoorOpen = true;
+ }
+
+ private void button11_Click(object sender, EventArgs e)
+ {
+ opc.Write(OutputTag.huataiqigang, true);
+ }
+
+ private void button9_Click(object sender, EventArgs e)
+ {
+ opc.Write(OutputTag.songliao, true);
+ //if (isDoorOpen == true)
+ //{
+ // opc.Write(OutputTag.songliao, true);
+ // isUUTOut = false;
+ //}
+ //else
+ //{
+ // MessageBox.Show("璇峰厛寮�闂紒");
+ //}
+ }
+
+ private void button12_Click(object sender, EventArgs e)
+ {
+ opc.Write(OutputTag.chuliao, true);
+ //isUUTOut = true;
+ }
+
+ private void button15_Click(object sender, EventArgs e)
+ {
+ if (runStatus == RunStatus.Normal)
+ {
+ if (MessageBox.Show("纭畾杩涜鎵嬪姩瀹氫綅锛�", "绯荤粺鎻愮ず", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ opc.Write(OutputTag.shoudongdingwei, true);
+ }
+ }
+ else
+ {
+ MessageBox.Show("娴嬭瘯鐘舵�佷笅鏃犳硶鎵嬪姩瀹氫綅锛�", "绯荤粺鎻愮ず", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+
+ private void checkBox2_CheckedChanged(object sender, EventArgs e)
+ {
+ if (checkBox2.Checked)
+ {
+ if ((runStatus == RunStatus.Normal))
+ {
+ button15.Enabled = true;
+ }
+ else
+ {
+ checkBox2.Checked = false;
+ button15.Enabled = false;
+ MessageBox.Show("娴嬭瘯鐘舵�佷笅鏃犳硶鎵嬪姩瀹氫綅锛�", "绯荤粺鎻愮ず", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+ else
+ {
+ button15.Enabled = false;
+ }
+ }
+
+ #endregion
+
+ private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ if (MessageBox.Show("纭畾閫�鍑虹▼搴忥紵", "绯荤粺鎻愮ず", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ e.Cancel = false;
+
+ if (isRightCameraOpen == true)
+ {
+ cam.CloseCamera();
+ }
+
+ if (isLeftCameraOpen == true)
+ {
+ cam_left.CloseCamera();
+ }
+ }
+ else
+ {
+ e.Cancel = true;
+ }
+ }
+
+ #region 宸︾浉鏈虹浉鍏�
+ /// <summary>
+ /// 鍔犺浇宸︾浉鏈�
+ /// </summary>
+ private void initCam_Left()
+ {
+ Log.WriteLog("initCam_Left Enter");
+
+ cam_left = new PointGreyAndHalcon.PointGreyAndHalcon();
+ isLeftCameraOpen = cam_left.OpenCamera(config.cams.SerialNumber[0]);
+ cam_left.GrabImageDone += new GrabImageDoneDelegate(cam_left_GrabImageDone);
+
+ Log.WriteLog("initCam_Left Leave");
+ }
+
+ /// <summary>
+ /// 鍔犺浇HalconTool_Left
+ /// </summary>
+ private void initHalconTool_Left()
+ {
+ Log.WriteLog("initHalconTool_Left Enter");
+
+ ht_left.LoadJobs();
+ ht_left.resultCreater.ListenEvent += new EventHandler<HalconTools.ListenEventArgs>(resultCreater_left_ListenEvent);
+
+ Log.WriteLog("initHalconTool_Left Leave");
+ }
+ #endregion
+
+ private void tspbtnExit_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+
+ private void ckbSaveImage_CheckedChanged(object sender, EventArgs e)
+ {
+
+ if (ckbSaveImage.Checked)
+ {
+ config.saveImage=true;
+ sft.SetConfig(configPath, config);
+
+ }
+ else
+ {
+ config.saveImage = false;
+ sft.SetConfig(configPath, config);
+ }
+ }
+
+ public bool Effective()
+ {
+ string defaultScope = "<dogscope />";
+ DogFeature feature = new DogFeature(1);
+ using (var dog = new Dog(feature))
+ {
+ string vendorcodes = "tn+2bpxTE0MhQDarbNvbJEPpez6LfT6oB2DjZLKQMs0H2ap3YfmDIzYaLqDsZliOKL677L28ZbDhxwdP3Mq2xIbi/5zkXQ7ybvG9HLKaYXN3ql8yY5XJ1WHn7ISI+m7M9t1SzzQaUwnW/NV2VUslx/PdI5hZ1VVwsIaus042E5u8QGCSPJcDOXBeGIJeJSezvM+scip87hDujXsrubV0n+xCAdrTAs/WU5O1JwpgYNArqrFCpYSV4nO5ZveQRcPchUuED+gaNpHfsKZYAtW/43ud3IYcnTg6HuQPo+9fRu8iDpi18+j8USasj6M8EY9g7x3YjwO1DHCPpNEWB3IrHA0rhWG+c2emcCc3q8r8Qx8yHBCAUdZV7F8CTar/co5NbVv3FNObKULZxqrESWkPhoIKBtuCutspoGkTBHger+2A5qtfEMy6ZHt6MRvmgmiIO23AQGQ3yXKHXkq6HsDtrl1P+8coQTFnqopDOGaPi6C+Pb7qIqCJx+IBnWnjuZEfawKMcR+1hB9m1rSfhY+UQ0crh8jYr5a+tOAbSU9tPw3ZmKLQYbm6m8gLAHIv+EOq1rRfH5XxhUUbL4Lv4mrTFcmWl1Ibnaiz7140PqVqaquI8h8Mj4tL/5u/f1iJTKvnUywmPUDZXAecu6FmwDeQpvGJwa+q1Fgn3WXqBitT/lnEox7pp8deMpT/ol0wpcmlU40Cq5XsvnLmbGdK/qcXYBa+ZYhLYnXpzTe4XUDbatIFKfNVwZsSgXaMPpRLghEMQupv/H9uJ2vtlRYjt0ysoFDgzb3W0qr3bK7T55a8bhiptfh/dq7Q5hHZUolRprjXTbcUlmyhjzrH+bAz+BdmwiHJInx/najqyflknUUuOdO8IrMFAh0zWiICkijghbvWUwjg/DTpLKRO2e6hTaWtvCHTBHfBRV0/0EVW0kMmdx/huL1k1BBo11Fv/X7feCskl0m5rot1ubw/T/shAAvVBg==";
+ var status = dog.Login(vendorcodes, defaultScope);
+ if (status != DogStatus.StatusOk)
+ {
+ if (status == DogStatus.TimeError)
+ {
+ if (config.leftUsed)
+ {
+ btnDisplay_left.Text = "绂佹绡℃敼鏃堕棿";
+ }
+ else
+ {
+ btnDisplay.Text = "绂佹绡℃敼鏃堕棿";
+ }
+ return false;
+ }
+ else
+ {
+ if (config.leftUsed)
+ {
+ btnDisplay_left.Text = "璇锋彃鍏ユ湁鏁堢殑鍔犲瘑鐙�";
+ }
+ else
+ {
+ btnDisplay.Text = "璇锋彃鍏ユ湁鏁堢殑鍔犲瘑鐙�";
+ }
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ private void cboSize_Left_SelectionChangeCommitted(object sender, EventArgs e)
+ {
+ config.selectedSizeIndex = cboSize_Left.SelectedIndex;
+ sft.SetConfig(configPath, config);
+ long value = config.inch13;
+ if (cboSize_Left.SelectedValue.ToString() == "inch15")
+ {
+ value = config.inch15;
+ }
+ if (cboSize_Left.SelectedValue.ToString() == "inch16")
+ {
+ value = config.inch16;
+ }
+ opc.Write(OutputTag.X_Work, value);
+ }
+
+ private void cboSize_SelectionChangeCommitted(object sender, EventArgs e)
+ {
+ config.selectedSizeIndex = cboSize.SelectedIndex;
+ sft.SetConfig(configPath, config);
+ long value = config.inch13;
+ if (cboSize.SelectedValue.ToString() == "inch15")
+ {
+ value = config.inch15;
+ }
+ if (cboSize.SelectedValue.ToString() == "inch16")
+ {
+ value = config.inch16;
+ }
+ opc.Write(OutputTag.X_Work, value);
+ }
+ }
+}
diff --git a/LLMF/frmMain.resx b/LLMF/frmMain.resx
new file mode 100644
index 0000000..3c5b33d
--- /dev/null
+++ b/LLMF/frmMain.resx
@@ -0,0 +1,1172 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>108, 17</value>
+ </metadata>
+ <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>522, 17</value>
+ </metadata>
+ <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>522, 17</value>
+ </metadata>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="toolStripMaxMin.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ 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
+</value>
+ </data>
+ <data name="tspBtnOpenImageFile.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ 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
+ /7l3Gc+W/werhrvJ2KRvqAAAAABJRU5ErkJggg==
+</value>
+ </data>
+ <data name="toolStripModeBtn.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ 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
+</value>
+ </data>
+ <data name="toolStripButton5.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ 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
+ eQHGy/8C/mbEfvypzZ8AAAAASUVORK5CYII=
+</value>
+ </data>
+ <data name="tspbtnExit.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ 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
+</value>
+ </data>
+ <data name="tspBtnHelp.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ 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
+</value>
+ </data>
+ <metadata name="tVideo.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <metadata name="tVideo_left.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>229, 17</value>
+ </metadata>
+ <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>25</value>
+ </metadata>
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ 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
+ s//asmb/0K9j/8SdTf+7jjv/toUt/7SBJv+zfyP/s38j/7OAJf+2hCz/u445/8WfUv/Rsm//2sB//9vA
+ fP/avXT/1a9X/8GaSvSlnImgm52kYaWlpla7u7sixcXGAQAAAAAAAAAAeHRyM7q9vPurytD/hNbr/1LU
+ +f9Sv93/Rsrx/62MUf+ydxT/rnQS/650Ef+vdRP/r3YU/692Ff+vdxX/r3YU/692E/+udRL/r3UU/7J9
+ IP/Bl0j/1rp7/+DKjP/cwnz/0q1W/8GTNfq1qZR5r7G3J7a2tyLFxcUGAAAAAAAAAACRiIJHXrbP/0Sj
+ vP9onKn/dZSb/2y80v9Y5P//nK2d/7N0EP+xeRj/sXgZ/7B5Gf+weRn/sHkZ/7B5GP+weRj/sHkY/7B5
+ Gf+weRn/sHgV/650Ef+xeh3/xJ5U/93Gi//exoH/zqZN/76QO+q8t7EpvsDEBsPDxAIAAAAAAAAAAMrE
+ sHYgy/7/Ac7//wvL//8guuX/dbrN/4Pq//+i4PL/t4xF/7N8G/+0fiH/tH8h/7R/If+0fyH/tH8h/7R/
+ If+0fyH/tH8h/7R/If+0fyH/tH8h/7N9H/+weRf/uos3/9e8fv/cwnr/xpg3/72aWYkAAAAAAAAAAAAA
+ AAAAAAAAsMKvvSzU//8t0f//LdH//yXU//9evtn/quHx/7r1//+9pXn/tX8g/7mGK/+4hiv/uIYr/7iG
+ K/+5hiz/uYct/7qHLf+6hy3/uYYt/7eFK/+3hCr/t4Uq/7iFK/+1gCT/uIcw/9S4dv/Wtmb/wZEy7cSo
+ cxUAAAAAAAAAAMirciy/nUv6d9ju/1Pc//9Y2///Vtv//1rU9v+t093/1vv//7WWYP+kbxD/p3Ub/6V0
+ Gf+kchf/pHEX/6ZzGf+odhz/p3Ub/6x6If+zgin/vY02/76POP+7jDX/vIw1/7uMNv+6ijH/vI88/9W3
+ cv/MpEj/wZpJZAAAAAAAAAAAxaFbdsOPLP/DsYH/j+f+/4Lk//+E5f//fuj//5/b8v/a7/v/p4A9/5dj
+ Av+cag3/m2oN/5xsEP+ebhP/nGwR/5dlCv+WZAb/lmQE/5hmCf+gbhX/tYYy/8KXRf+/lEH/v5NB/7+T
+ Qf++kT3/xJ1R/9CtW//CmD+zAAAAAAAAAADBmEi1w5lK/8aXRP/MzbX/sfX//7Ls/P/A29H/ysmY/9zL
+ j/+thj//yJ80/9SwRP/SrUH/1LFI/9W0Tf/VtE7/0bBR/8ilSf+ziTD/oXAS/5lnBv+WZAn/r4Ev/saf
+ Uv/DnE3/w5tO/8ObTv/Cmkz/yqZa/8SZP+LDoF4Nyb6oDcSeVOPIo1z/x6FX/8ynY//W0LH/3MV3/+C4
+ R//fuEH/48JU/9G1df/OqD3/4sJU/+DBVv/gwVX/4MBV/+DBVv/iw1j/48Vd/+THZf/WuF7/tYwx/6Bu
+ C/+VYgb+uI5A28qmXv/IpFv/yKNb/8ejWv/JpV7/xptC/sixhSrKuZkpy6lm/cyraP/Mq2n/y6pm/8ul
+ YP/Xtl72379P/96/Vf/fvlH/5M2C/8ahRf/dukv/4MBX/+HCWP/hwln/4cJb/+HDXf/hxGD/4cVk/+TI
+ af/ly3P/xJ9E/59tCP+ZZg66yKVgsM6tav/Mq2n/zKto/82sav/Jo1X/xa+DOc+3i1DQsnb/0LJ1/9Cy
+ df/Qsnb/z7Bwz9bAjzPhxmzk4MFZ/+DCXf/mzXT/07Zu/8mgL/7bu1ig4dOlZt3QqGrez6KD382SreHL
+ f+HjyXD/5Mlw/+XLdv/o0ID/xaBB/5llAvi5kkpj1Ld86tCydv/Qs3X/0bN3/86vbP/EroNN1LuHedW6
+ g//VuoP/1LqE/9W6hP/SuINtAAAAAOLZvU/ixWP/4sZq/+PHa//n0pD/upAp/r2SJEUAAAAAAAAAAAAA
+ AAAAAAAA3tvUEOHVtFTk1KHE6dSL/+jSif/p04z/rIAf/6Z4HmbWvIWG1bqE/9S6g//VuoP/1LmA/8y6
+ l1bZwZCo2cGQ/9nBkP/ZwZD/2cCP/8q3lDwAAAAAAAAAAOPUo47kynH/5Mt5/+rVj//Wu27/t4kQwryQ
+ GgEAAAAAAAAAAAAAAAAAAAAAAAAAANLAkA/Rt3fD5tGO/+/dov/MrWH/pHMMgdW7giraw5T/2cGQ/9nB
+ kf/ZwY//1cq2SNzInancyJ3/3Mec/93Jn//ZwpD/zrR6RQAAAAAAAAAA4eDeB+TSmcfn0IX/59GM/+rY
+ n//FnjH/wZgfSAAAAAAAAAAAAAAAAKZ3Egu6jBJ/soIK0pBaAPjOsm//8eS1/93Fh/+zhA+Y07qCFdzH
+ n/XcyJ3/3Mid/9zHm//d0LtG4M2oqeDOqP/gzqf/4dCs/9nCjf/PtXdYAAAAAAAAAAAAAAAA493PJOnV
+ muvp1Zf/7d2p/97FfP/Dmh3Cz6osAwAAAACJVQABl2cNpqFzG/+idR7/r4c5/97Jkv/y5Lz/49Wu98eq
+ TjTKq2go28Wb++HPqv/gzqj/4M6o/+DOqEzj07Km49Oy/+PTsv/l1rf/28ST/8ylSJ0AAAAAAAAAAAAA
+ AAAAAAAA5N3MSuvbqPvr26n/7+K6/9GwRv/OpyNYAAAAAKaGVgfPuIfk69yz/+zetP/168j/8ufD+vXq
+ yNfn5d1QAAAAAMKbT3vex5r/5NW2/+PTsv/j07L/49OyRObZu3fm2bz/5tm8/+jbv//gzaj/y6E+69fB
+ hhUAAAAAAAAAAAAAAAAAAAAA59/Kb+7ftf/w5ML/6def/82mItLWtUIG4+LaAu7p26fy5sT/9evP/861
+ gf+jdy3lxah4GwAAAADOvqIGw5hD1+TTsv/n2r7/5tm7/+bZu/bm2Lok6dzCOurdxP7p3cT/6t7G/+fa
+ wP/Lo0j/17hgkwAAAAAAAAAAAAAAAAAAAAAAAAAA6uLNjfDkw//z6tL/3sRq/9OrG2oAAAAA4OLpHPDn
+ 0OL37tf/18OZ/5JeBf+FTQCEAAAAAMaZPWbJoVD/6uDJ/+rexf/q3cT/6t3Ey+ncwwXs4ckJ7OLM2ezi
+ zP/s4sz/7uXU/9CwbP/Trkf+28iVYwAAAAAAAAAAAAAAAAAAAAAAAAAA7ObWqPTr0//y6Mv/2blA69q4
+ LRoAAAAA5uXoSfXs1/z69ef/1byE/6RzC+iygSFdwY8j79m/i//v59b/7OLM/+zizP/s4ct7AAAAAAAA
+ AADv5dJx7+bT/+/m0//x6dn/49Kw/82mRv/fw3D/3MyfawAAAAAAAAAAAAAAAAAAAADl498J8Orbs/jx
+ 5P/s3aj/2rcsoQAAAAAAAAAA7erjpfny5P/17dn/w5su/8OYM//Gn0n/6+DJ//Dn1v/v5tL/7+bT6u7k
+ 0BkAAAAAAAAAAPDo1gzx6djW8enZ//Hp2f/07eH/2L6E/9e2XP/lzYX/4dKml93WwRMAAAAAAAAAAAAA
+ AADt6NwH8/Dss/r27//o1IT/4cA4RQAAAADg3+BK+fTo//nz5f/IpDn/r4Ad/97Kov/17+P/8enY//Hp
+ 2f/x6dd9AAAAAAAAAAAAAAAAAAAAAPPr3ET07d799Oze//Tu4P/y693/2L18/97DdP/p1pr/6tyu3O7h
+ vW7e2MgaAAAAAOPIUgPdyo0D9O/kvf778//fyXzGx6pYB8Oqdnz8+PL/+/bn/7+WKP/Krnb/+PPp//Tt
+ 3v/07d7/9OzdwvPr2wgAAAAAAAAAAAAAAAAAAAAAAAAAAPXv4mz27+L/9fDi//fy5v/07d//3MWN/97F
+ f//t3ar/8uW9//Ppyez17NG+6NF018uhGbK3iyPc4tO3//Pu5f+vgyLHwZ5R9f78+v/48+b/17+B//Tt
+ 3//28eX/9fDi//Xv4uP17+AkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPfx5W348uf/+PLm//n0
+ 6f/48+n/49Ot/9rBg//n1qT/9OnG//nx1v/79N//8+fE/9vFk//WwZj//fv4/+LUuv/p3cn//fv2//j0
+ 7P/49O3/+fPp//fy5v/48ubi9/HkMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPnz
+ 6VT59Orv+fTq//r16//8+PL/8ura/+PSrv/i0ab/6dmy//DkxP/17NL/+vTl//v38P/69u///vz5//37
+ 9v/59e3/+fXq//r06v/59Or/+fTqvPnz6CUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAPr16yr69u2y+/bt//v27P/8+PD//fr0//jz6P/z69r/7eHK/+zhyP/x6NP/9e/g//r1
+ 7P/69u3/+vbt//r27P/69u3/+/bt6/r27Hb69eoFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD89+5F/Pjvp/z47+z8+O///fnw//768v/++/T//vv0//76
+ 8//9+fH//Pjv//z47//8+O///Pjv2/z474H89+4iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/fnwHP358Fj9+fGM/frxrv36
+ 8bP9+fGy/fnxsv358bP9+fGn/fnxe/358D79+fANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP//////AAB/4AAAH+AAAAfgAAAP4AAAD+AAAAfgAAADwAAAA8AAAAPAAAABgAAAAYAA
+ AAGAAAABggMAQYcH8EEHA/ghB4PgIQfBwGED4cDhg/DBwYHw4MGB+HCDwPwwA8A+OAPgHxgH8AAAD/gA
+ AB/8AAA//gAA//+AAf//8B//
+</value>
+ </data>
+</root>
\ No newline at end of file
diff --git a/LLMF/frmPassword.Designer.cs b/LLMF/frmPassword.Designer.cs
new file mode 100644
index 0000000..3dafd82
--- /dev/null
+++ b/LLMF/frmPassword.Designer.cs
@@ -0,0 +1,89 @@
+锘縩amespace LLMF
+{
+ partial class frmPassword
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.label1 = new System.Windows.Forms.Label();
+ this.txtPassword = new System.Windows.Forms.TextBox();
+ this.button1 = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Font = new System.Drawing.Font("瀹嬩綋", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label1.Location = new System.Drawing.Point(21, 30);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(54, 21);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "瀵嗙爜";
+ //
+ // txtPassword
+ //
+ this.txtPassword.Font = new System.Drawing.Font("瀹嬩綋", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.txtPassword.Location = new System.Drawing.Point(108, 27);
+ this.txtPassword.Name = "txtPassword";
+ this.txtPassword.PasswordChar = '*';
+ this.txtPassword.Size = new System.Drawing.Size(298, 31);
+ this.txtPassword.TabIndex = 1;
+ this.txtPassword.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtPassword_KeyPress);
+ //
+ // button1
+ //
+ this.button1.Font = new System.Drawing.Font("瀹嬩綋", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.button1.Location = new System.Drawing.Point(108, 79);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(106, 42);
+ this.button1.TabIndex = 2;
+ this.button1.Text = "纭畾";
+ this.button1.UseVisualStyleBackColor = true;
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
+ // frmPassword
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(449, 133);
+ this.Controls.Add(this.button1);
+ this.Controls.Add(this.txtPassword);
+ this.Controls.Add(this.label1);
+ this.Name = "frmPassword";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "frmPassword";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.TextBox txtPassword;
+ private System.Windows.Forms.Button button1;
+ }
+}
\ No newline at end of file
diff --git a/LLMF/frmPassword.cs b/LLMF/frmPassword.cs
new file mode 100644
index 0000000..04790e8
--- /dev/null
+++ b/LLMF/frmPassword.cs
@@ -0,0 +1,59 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace LLMF
+{
+ public partial class frmPassword : Form
+ {
+ string password;
+
+ public bool isOK1 = false;
+ public bool isOK
+ {
+ get { return isOK1; }
+ }
+
+ public frmPassword(string password)
+ {
+ InitializeComponent();
+ this.password = password;
+ }
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ if (txtPassword.Text.Equals(this.password))
+ {
+ isOK1 = true;
+ this.Close();
+ }
+ else
+ {
+ MessageBox.Show("瀵嗙爜閿欒锛侊紒");
+ this.txtPassword.Text = "";
+ }
+ }
+
+ private void txtPassword_KeyPress(object sender, KeyPressEventArgs e)
+ {
+ if (e.KeyChar == 13)
+ {
+ if (txtPassword.Text.Equals(this.password))
+ {
+ isOK1 = true;
+ this.Close();
+ }
+ else
+ {
+ MessageBox.Show("瀵嗙爜閿欒锛侊紒");
+ this.txtPassword.Text = "";
+ }
+ }
+ }
+ }
+}
diff --git a/LLMF/frmPassword.resx b/LLMF/frmPassword.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/LLMF/frmPassword.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
\ No newline at end of file
diff --git a/LLMF/ico.ico b/LLMF/ico.ico
new file mode 100644
index 0000000..6dce7f5
--- /dev/null
+++ b/LLMF/ico.ico
Binary files differ
diff --git a/Lib/FlyCapture/FlyCapture2Managed.dll b/Lib/FlyCapture/FlyCapture2Managed.dll
new file mode 100644
index 0000000..0e7611e
--- /dev/null
+++ b/Lib/FlyCapture/FlyCapture2Managed.dll
Binary files differ
diff --git a/Lib/FlyCapture/FlyCapture2Managed_v100.dll b/Lib/FlyCapture/FlyCapture2Managed_v100.dll
new file mode 100644
index 0000000..b49074c
--- /dev/null
+++ b/Lib/FlyCapture/FlyCapture2Managed_v100.dll
Binary files differ
diff --git a/Lib/SuperDog/api_dsp_windows.dll b/Lib/SuperDog/api_dsp_windows.dll
new file mode 100644
index 0000000..f46e26a
--- /dev/null
+++ b/Lib/SuperDog/api_dsp_windows.dll
Binary files differ
diff --git a/Lib/SuperDog/api_dsp_windows_x64.dll b/Lib/SuperDog/api_dsp_windows_x64.dll
new file mode 100644
index 0000000..76e03e7
--- /dev/null
+++ b/Lib/SuperDog/api_dsp_windows_x64.dll
Binary files differ
diff --git a/Lib/SuperDog/dog_net_windows.dll b/Lib/SuperDog/dog_net_windows.dll
new file mode 100644
index 0000000..cf37120
--- /dev/null
+++ b/Lib/SuperDog/dog_net_windows.dll
Binary files differ
diff --git a/Lib/SuperDog/dog_windows_3153818.dll b/Lib/SuperDog/dog_windows_3153818.dll
new file mode 100644
index 0000000..e66f083
--- /dev/null
+++ b/Lib/SuperDog/dog_windows_3153818.dll
Binary files differ
diff --git a/Lib/SuperDog/dog_windows_x64_3153818.dll b/Lib/SuperDog/dog_windows_x64_3153818.dll
new file mode 100644
index 0000000..798884d
--- /dev/null
+++ b/Lib/SuperDog/dog_windows_x64_3153818.dll
Binary files differ
diff --git a/Lib/halcon/halcondotnet.dll b/Lib/halcon/halcondotnet.dll
new file mode 100644
index 0000000..59510d9
--- /dev/null
+++ b/Lib/halcon/halcondotnet.dll
Binary files differ
diff --git a/PointGreyAndHalcon/PointGreyAndHalcon.sln b/PointGreyAndHalcon/PointGreyAndHalcon.sln
new file mode 100644
index 0000000..7486ed6
--- /dev/null
+++ b/PointGreyAndHalcon/PointGreyAndHalcon.sln
@@ -0,0 +1,20 @@
+锘�
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PointGreyAndHalcon", "PointGreyAndHalcon\PointGreyAndHalcon.csproj", "{91B96D0B-F745-4850-9166-63A07917AC04}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {91B96D0B-F745-4850-9166-63A07917AC04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {91B96D0B-F745-4850-9166-63A07917AC04}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {91B96D0B-F745-4850-9166-63A07917AC04}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {91B96D0B-F745-4850-9166-63A07917AC04}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/PointGreyAndHalcon/PointGreyAndHalcon/PointGreyAndHalcon.cs b/PointGreyAndHalcon/PointGreyAndHalcon/PointGreyAndHalcon.cs
new file mode 100644
index 0000000..6c511e8
--- /dev/null
+++ b/PointGreyAndHalcon/PointGreyAndHalcon/PointGreyAndHalcon.cs
@@ -0,0 +1,343 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing;
+using System.Drawing.Imaging;
+using HalconDotNet;
+using FlyCapture2Managed;
+
+namespace PointGreyAndHalcon
+{
+ public delegate void GrabImageDoneDelegate(string recData,HImage recImage);
+
+ public class PointGreyAndHalcon
+ {
+ #region 瀹氫箟
+ ManagedBusManager busMgr = new ManagedBusManager();
+ //CameraInfo[] camInfos = ManagedBusManager.DiscoverGigECameras();
+ int camNum;
+ ManagedPGRGuid guid;
+ ManagedGigECamera cam;
+
+ public HImage image = new HImage();
+ public event GrabImageDoneDelegate GrabImageDone;
+ public string SerialNo;
+
+ HImage tmpImage = new HImage();
+ bool isCameraOpen = false;
+ //bool isRightCameraOpen = false;
+ #endregion
+
+ public PointGreyAndHalcon()
+ {
+ //camNum = camInfos.Length;
+ }
+
+ /// <summary>
+ /// 鎵撳紑鐩告満
+ /// </summary>
+ /// <param name="index">缂栧彿</param>
+ public void OpenCamera(int index)
+ {
+ try
+ {
+ guid = busMgr.GetCameraFromIndex((uint)index);
+ cam = new ManagedGigECamera();
+ cam.Connect(guid);
+ cam.StartCapture();
+ isCameraOpen = true;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show("鐩告満" + index.ToString() + "鎵撳紑澶辫触");
+
+ }
+ }
+
+ /// <summary>
+ /// 鎵撳紑鐩告満
+ /// </summary>
+ /// <param name="serialnumber">搴忓垪鍙�</param>
+ public bool OpenCamera(uint serialnumber)
+ {
+ try
+ {
+ guid = busMgr.GetCameraFromSerialNumber(serialnumber);
+ cam = new ManagedGigECamera();
+ cam.Connect(guid);
+
+ cam.WriteRegister(0x610,0x00000000);//鎺у埗鐩告満涓婄數
+ System.Threading.Thread.Sleep(100);
+ cam.WriteRegister(0x610, 0x80000000);//鎺у埗鐩告満涓嬬數
+
+ cam.StartCapture();
+ return true;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show("鐩告満" + serialnumber.ToString() + "鎵撳紑澶辫触");
+ return false;
+ }
+ }
+
+ ///// <summary>
+ ///// 鎵撳紑鐩告満
+ ///// </summary>
+ ///// <param name="serialnumber">搴忓垪鍙�</param>
+ //public void OpenCamera_test(uint serialnumber)
+ //{
+ // try
+ // {
+ // guid = busMgr.GetCameraFromSerialNumber(serialnumber);
+ // cam = new ManagedGigECamera();
+ // cam.Connect(guid);
+ // cam.StartCapture(Test);
+ // }
+ // catch (Exception ex)
+ // {
+ // MessageBox.Show("鐩告満" + serialnumber.ToString() + "鎵撳紑澶辫触");
+ // }
+ //}
+
+ private void Test(ManagedImage image)
+ {
+ lock (GetMutexLock())
+ {
+ SerialNo = "";
+ try
+ {
+ //ManagedImage rawImage = new ManagedImage();
+
+ // Retrieve an image
+ //cam.RetrieveBuffer(rawImage);
+
+ // Create a converted image
+ ManagedImage convertedImage = new ManagedImage();
+
+ // Convert the raw image
+ image.Convert(FlyCapture2Managed.PixelFormat.PixelFormatMono8, convertedImage);
+
+ //converterImage to HImage
+ Bitmap tmpBmp = convertedImage.bitmap;
+ BitmapData tmpBitmapData = tmpBmp.LockBits(new Rectangle(0, 0, tmpBmp.Width, tmpBmp.Height), ImageLockMode.ReadOnly,
+ System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
+
+ tmpImage.GenImage1("byte", tmpBmp.Width, tmpBmp.Height, tmpBitmapData.Scan0);
+
+ if (GrabImageDone != null)
+ {
+ GrabImageDone("GrabSuccess", tmpImage);
+ }
+
+ tmpBmp.UnlockBits(tmpBitmapData);
+ image.Dispose();
+ convertedImage.Dispose();
+ tmpBmp.Dispose();
+ }
+ catch (Exception ex)
+ {
+ if (GrabImageDone != null)
+ {
+ GrabImageDone("GrabFail", tmpImage);
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// 鍏抽棴鐩告満
+ /// </summary>
+ public void CloseCamera()
+ {
+ cam.StopCapture();
+ }
+
+ /// <summary>
+ /// 閲囧浘
+ /// </summary>
+ public void GrabImage(string sn)
+ {
+ lock (GetMutexLock())
+ {
+ SerialNo = sn;
+ try
+ {
+ ManagedImage rawImage = new ManagedImage();
+
+ // Retrieve an image
+ cam.RetrieveBuffer(rawImage);
+
+ // Create a converted image
+ ManagedImage convertedImage = new ManagedImage();
+
+ // Convert the raw image
+ rawImage.Convert(FlyCapture2Managed.PixelFormat.PixelFormatMono8, convertedImage);
+
+ //converterImage to HImage
+ Bitmap tmpBmp = convertedImage.bitmap;
+ BitmapData tmpBitmapData = tmpBmp.LockBits(new Rectangle(0, 0, tmpBmp.Width, tmpBmp.Height), ImageLockMode.ReadOnly,
+ System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
+
+ tmpImage.GenImage1("byte", tmpBmp.Width, tmpBmp.Height, tmpBitmapData.Scan0);
+ image.Dispose();
+ image = tmpImage.CopyImage();
+ if (GrabImageDone != null)
+ {
+ GrabImageDone("GrabSuccess", tmpImage);
+ }
+
+ tmpBmp.UnlockBits(tmpBitmapData);
+ rawImage.Dispose();
+ convertedImage.Dispose();
+ tmpBmp.Dispose();
+ }
+ catch (Exception ex)
+ {
+ if (GrabImageDone != null)
+ {
+ GrabImageDone("GrabFail", tmpImage);
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// 閲囧僵鑹插浘
+ /// </summary>
+ public void GrabColorImage(string sn)
+ {
+ SerialNo = sn;
+ try
+ {
+ ManagedImage rawImage = new ManagedImage();
+
+ // Retrieve an image
+ cam.RetrieveBuffer(rawImage);
+
+ // Create a converted image
+ ManagedImage convertedImage = new ManagedImage();
+
+ // Convert the raw image
+ rawImage.Convert(FlyCapture2Managed.PixelFormat.PixelFormatBgr, convertedImage);
+
+ //converterImage to HImage
+ Bitmap tmpBmp = convertedImage.bitmap;
+ Rectangle rect = new Rectangle(0, 0, tmpBmp.Width, tmpBmp.Height);
+ BitmapData tmpBitmapData = tmpBmp.LockBits(rect, ImageLockMode.ReadOnly,
+ System.Drawing.Imaging.PixelFormat.Format24bppRgb);
+
+ #region 灏哛GB鍒嗙寮�鏉�
+ //鍒涘缓鏂扮殑褰╄壊鐨刡itmap
+ Bitmap redBitmap = new Bitmap(tmpBmp.Width, tmpBmp.Height);
+ Bitmap greenBitmap = new Bitmap(tmpBmp.Width, tmpBmp.Height);
+ Bitmap blueBitmap = new Bitmap(tmpBmp.Width, tmpBmp.Height);
+ //鍒涘缓鏂扮殑褰╄壊鐨勬暟鎹鍣�
+ BitmapData redBmData = redBitmap.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
+ BitmapData greenBmData = greenBitmap.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
+ BitmapData blueBmData = blueBitmap.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
+ //灏咮itmap瀵硅薄鐨勪俊鎭瓨鏀惧埌byte鏁扮粍涓�
+ int tmp_bytes = tmpBitmapData.Stride * tmpBmp.Height;
+ int red_bytes = redBmData.Stride * tmpBmp.Height;
+ int green_bytes = greenBmData.Stride * tmpBmp.Height;
+ int blue_bytes = blueBmData.Stride * tmpBmp.Height;
+ byte[] tmpValues = new byte[tmp_bytes];
+ byte[] redValues = new byte[red_bytes];
+ byte[] greenValues = new byte[green_bytes];
+ byte[] blueValues = new byte[blue_bytes];
+ //澶嶅埗GRB淇℃伅鍒癰yte鏁扮粍
+ System.Runtime.InteropServices.Marshal.Copy(tmpBitmapData.Scan0, tmpValues, 0, tmp_bytes);
+ System.Runtime.InteropServices.Marshal.Copy(redBmData.Scan0, redValues, 0, red_bytes);
+ System.Runtime.InteropServices.Marshal.Copy(greenBmData.Scan0, greenValues, 0, green_bytes);
+ System.Runtime.InteropServices.Marshal.Copy(blueBmData.Scan0, blueValues, 0, blue_bytes);
+
+ //灏嗗僵鑹蹭俊鎭垎鍒瓨鍌ㄥ埌RGB鏁扮粍涓�
+ for (int i = 0; i < tmpBmp.Height; i++)
+ {
+ for (int j = 0; j < tmpBmp.Width; j++)
+ {
+ int k = 3 * j;
+ redValues[i * redBmData.Stride + j] = tmpValues[i * tmpBitmapData.Stride + k + 2];
+ greenValues[i * blueBmData.Stride + j] = tmpValues[i * tmpBitmapData.Stride + k + 1];
+ blueValues[i * greenBmData.Stride + j] = tmpValues[i * tmpBitmapData.Stride + k];
+ }
+ }
+
+ //鍐嶅皢鏁扮粍淇℃伅澶嶅埗鍒癛GB
+ System.Runtime.InteropServices.Marshal.Copy(redValues, 0, redBmData.Scan0, red_bytes);
+ System.Runtime.InteropServices.Marshal.Copy(greenValues, 0, greenBmData.Scan0, green_bytes);
+ System.Runtime.InteropServices.Marshal.Copy(blueValues, 0, blueBmData.Scan0, blue_bytes);
+
+ #endregion
+
+ tmpImage.GenImage3("byte", tmpBmp.Width, tmpBmp.Height, redBmData.Scan0, greenBmData.Scan0, blueBmData.Scan0);
+
+ if (GrabImageDone != null)
+ {
+ GrabImageDone("GrabSuccess", tmpImage);
+ }
+
+ tmpBmp.UnlockBits(tmpBitmapData);
+ redBitmap.UnlockBits(redBmData);
+ greenBitmap.UnlockBits(greenBmData);
+ blueBitmap.UnlockBits(blueBmData);
+ rawImage.Dispose();
+ convertedImage.Dispose();
+ tmpBmp.Dispose();
+ redBitmap.Dispose();
+ greenBitmap.Dispose();
+ blueBitmap.Dispose();
+ }
+ catch (Exception ex)
+ {
+ if (GrabImageDone != null)
+ {
+ GrabImageDone("GrabFail", tmpImage);
+ }
+ }
+ }
+
+ /// <summary>
+ /// 灏嗗浘鐗囨樉绀哄埌鍥剧浉妗嗕腑
+ /// </summary>
+ public void UpdateImage(HWindowControl viewPort)
+ {
+ HWndCtrl viewController = new HWndCtrl(viewPort);
+ ROIController roiController = new ROIController();
+ viewController.resetAll();
+ viewController.useROIController(roiController);
+ viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
+
+ viewController.addIconicVar(image);
+ viewController.repaint();
+ //image.Dispose();
+ }
+
+ /// <summary>
+ /// 淇濆瓨鍥剧墖
+ /// </summary>
+ /// <param name="filePath"></param>
+ /// <param name="fileName"></param>
+ public void SaveImage(string filePath, string fileName)
+ {
+ image.WriteImage("tiff", 0, filePath + "\\" + fileName);
+ }
+
+ public void SetExposure(float exposure)
+ {
+ CameraProperty cp = cam.GetProperty(PropertyType.Shutter);
+ cp.absValue = exposure;
+ cp.autoManualMode = false;
+ cam.SetProperty(cp);
+ }
+
+ private static System.Threading.Mutex _mutex;
+
+ private System.Threading.Mutex GetMutexLock()
+ {
+ System.Threading.Interlocked.CompareExchange(ref _mutex, new System.Threading.Mutex(), null);
+ return _mutex;
+ }
+ }
+}
diff --git a/PointGreyAndHalcon/PointGreyAndHalcon/PointGreyAndHalcon.csproj b/PointGreyAndHalcon/PointGreyAndHalcon/PointGreyAndHalcon.csproj
new file mode 100644
index 0000000..0eb3fd0
--- /dev/null
+++ b/PointGreyAndHalcon/PointGreyAndHalcon/PointGreyAndHalcon.csproj
@@ -0,0 +1,88 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>9.0.21022</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{91B96D0B-F745-4850-9166-63A07917AC04}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>PointGreyAndHalcon</RootNamespace>
+ <AssemblyName>PointGreyAndHalcon</AssemblyName>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <FileUpgradeFlags>
+ </FileUpgradeFlags>
+ <UpgradeBackupLocation>
+ </UpgradeBackupLocation>
+ <OldToolsVersion>3.5</OldToolsVersion>
+ <TargetFrameworkProfile />
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <Prefer32Bit>false</Prefer32Bit>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <Prefer32Bit>false</Prefer32Bit>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="FlyCapture2Managed_v100, Version=2.8.3.1, Culture=neutral, PublicKeyToken=76c6583b4a4585f4, processorArchitecture=x86">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\..\Lib\FlyCapture\FlyCapture2Managed_v100.dll</HintPath>
+ </Reference>
+ <Reference Include="halcondotnet, Version=11.0.1.0, Culture=neutral, PublicKeyToken=4973bed59ddbf2b8, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\..\Lib\halcon\halcondotnet.dll</HintPath>
+ </Reference>
+ <Reference Include="System" />
+ <Reference Include="System.Core">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Windows.Forms" />
+ <Reference Include="System.Xml.Linq">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Data.DataSetExtensions">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Data" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="PointGreyAndHalcon.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="ViewROI\FunctionPlot.cs" />
+ <Compile Include="ViewROI\GraphicsContext.cs" />
+ <Compile Include="ViewROI\HObjectEntry.cs" />
+ <Compile Include="ViewROI\HWndCtrl.cs" />
+ <Compile Include="ViewROI\ROI.cs" />
+ <Compile Include="ViewROI\ROICircle.cs" />
+ <Compile Include="ViewROI\ROICircularArc.cs" />
+ <Compile Include="ViewROI\ROIController.cs" />
+ <Compile Include="ViewROI\ROILine.cs" />
+ <Compile Include="ViewROI\ROIRectangle1.cs" />
+ <Compile Include="ViewROI\ROIRectangle2.cs" />
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project>
\ No newline at end of file
diff --git a/PointGreyAndHalcon/PointGreyAndHalcon/Properties/AssemblyInfo.cs b/PointGreyAndHalcon/PointGreyAndHalcon/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..7c1e288
--- /dev/null
+++ b/PointGreyAndHalcon/PointGreyAndHalcon/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+锘縰sing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 鏈夊叧绋嬪簭闆嗙殑甯歌淇℃伅閫氳繃涓嬪垪灞炴�ч泦
+// 鎺у埗銆傛洿鏀硅繖浜涘睘鎬у�煎彲淇敼
+// 涓庣▼搴忛泦鍏宠仈鐨勪俊鎭��
+[assembly: AssemblyTitle("PointGreyAndHalcon")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("PointGreyAndHalcon")]
+[assembly: AssemblyCopyright("Copyright 漏 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 灏� ComVisible 璁剧疆涓� false 浣挎绋嬪簭闆嗕腑鐨勭被鍨�
+// 瀵� COM 缁勪欢涓嶅彲瑙併�傚鏋滈渶瑕佷粠 COM 璁块棶姝ょ▼搴忛泦涓殑绫诲瀷锛�
+// 鍒欏皢璇ョ被鍨嬩笂鐨� ComVisible 灞炴�ц缃负 true銆�
+[assembly: ComVisible(false)]
+
+// 濡傛灉姝ら」鐩悜 COM 鍏紑锛屽垯涓嬪垪 GUID 鐢ㄤ簬绫诲瀷搴撶殑 ID
+[assembly: Guid("3248628a-aa47-4c76-88bb-67758aae0ff2")]
+
+// 绋嬪簭闆嗙殑鐗堟湰淇℃伅鐢变笅闈㈠洓涓�肩粍鎴�:
+//
+// 涓荤増鏈�
+// 娆$増鏈�
+// 鍐呴儴鐗堟湰鍙�
+// 淇鍙�
+//
+// 鍙互鎸囧畾鎵�鏈夎繖浜涘�硷紝涔熷彲浠ヤ娇鐢ㄢ�滃唴閮ㄧ増鏈彿鈥濆拰鈥滀慨璁㈠彿鈥濈殑榛樿鍊硷紝
+// 鏂规硶鏄寜濡備笅鎵�绀轰娇鐢ㄢ��*鈥�:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/FunctionPlot.cs b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/FunctionPlot.cs
new file mode 100644
index 0000000..8651214
--- /dev/null
+++ b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/FunctionPlot.cs
@@ -0,0 +1,562 @@
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+using HalconDotNet;
+
+
+namespace PointGreyAndHalcon
+{
+ /// <summary>
+ /// This class allows you to print a function into a Windows.Forms.Control.
+ /// The function must be supplied as an array of either double, float or
+ /// int values. When initializing the class you must provide the control that
+ /// actually draws the function plot. During the initialization you
+ /// can also decide whether the mouse event is used to return the (x,y)
+ /// coordinates of the plotted function. The scaling
+ /// of the x-y axis is performed automatically and depent on the length
+ /// of the function as well as the settings for the y-axis scaling:
+ /// * AXIS_RANGE_FIXED
+ /// * AXIS_RANGE_INCREASING
+ /// * AXIS_RANGE_ADAPTING
+ ///
+ /// Constraints of the function plot class:
+ /// So far only functions containing a positive range of y-values can
+ /// be plotted correctly. Also only a positive and ascending x-range
+ /// can be plotted. The origin of the coordinate system is set to
+ /// be in the lower left corner of the control. Another definition
+ /// of the origin and hence the direction of the coordinate axis
+ /// is not implemented yet.
+ /// </summary>
+ public class FunctionPlot
+ {
+ // panels for display
+ private Graphics gPanel, backBuffer;
+
+ // graphical settings
+ private Pen pen, penCurve, penCursor;
+ private SolidBrush brushCS, brushFuncPanel;
+ private Font drawFont;
+ private StringFormat format;
+ private Bitmap functionMap;
+
+ // dimensions of panels
+ private float panelWidth;
+ private float panelHeight;
+ private float margin;
+
+ // origin
+ private float originX;
+ private float originY;
+
+ private PointF[] points;
+ private HFunction1D func;
+
+ // axis
+ private int axisAdaption;
+ private float axisXLength;
+ private float axisYLength;
+ private float scaleX, scaleY;
+
+ public const int AXIS_RANGE_FIXED = 3;
+ public const int AXIS_RANGE_INCREASING = 4;
+ public const int AXIS_RANGE_ADAPTING = 5;
+
+ int PreX, BorderRight, BorderTop;
+
+
+ /// <summary>
+ /// Initializes a FunctionPlot instance by providing a GUI control
+ /// and a flag specifying the mouse interaction mode.
+ /// The control is used to determine the available space to draw
+ /// the axes and to plot the supplied functions. Depending on the
+ /// available space, the values of the function as well as the axis
+ /// steps are adjusted (scaled) to fit into the visible part of the
+ /// control.
+ /// </summary>
+ /// <param name="panel">
+ /// An instance of the Windows.Forms.Control to plot the
+ /// supplied functions in
+ /// </param>
+ /// <param name="useMouseHandle">
+ /// Flag that specifies whether or not mouse interaction should
+ /// be used to create a navigation bar for the plotted function
+ /// </param>
+ public FunctionPlot(Control panel, bool useMouseHandle)
+ {
+ gPanel = panel.CreateGraphics();
+
+ panelWidth = panel.Size.Width - 32;
+ panelHeight = panel.Size.Height - 22;
+
+ originX = 32;
+ originY = panel.Size.Height - 22;
+ margin = 5.0f;
+
+ BorderRight = (int)(panelWidth + originX - margin);
+ BorderTop = (int)panelHeight;
+
+ PreX = 0;
+ scaleX = scaleY = 0.0f;
+
+
+ //default setting for axis scaling
+ axisAdaption = AXIS_RANGE_ADAPTING;
+ axisXLength = 10.0f;
+ axisYLength = 10.0f;
+
+ pen = new Pen(System.Drawing.Color.DarkGray, 1);
+ penCurve = new Pen(System.Drawing.Color.Blue, 1);
+ penCursor = new Pen(System.Drawing.Color.LightSteelBlue, 1);
+ penCursor.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
+
+ brushCS = new SolidBrush(Color.Black);
+ brushFuncPanel = new SolidBrush(Color.White);
+ drawFont = new Font("Arial", 6);
+ format = new StringFormat();
+ format.Alignment = StringAlignment.Far;
+
+ functionMap = new Bitmap(panel.Size.Width, panel.Size.Height);
+ backBuffer = Graphics.FromImage(functionMap);
+ resetPlot();
+
+ panel.Paint += new System.Windows.Forms.PaintEventHandler(this.paint);
+
+ if (useMouseHandle)
+ panel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.mouseMoved);
+ }
+
+ /// <summary>
+ /// Convenience method for constructor call. For this case the
+ /// useMouseHandle flag is set to false by default.
+ /// </summary>
+ /// <param name="panel">
+ /// An instance of the Windows.Forms.Control to plot the
+ /// supplied function in.
+ /// </param>
+ public FunctionPlot(Control panel)
+ : this(panel, false)
+ {
+ }
+
+
+ /// <summary>
+ /// Changes the origin of the coordinate system to be
+ /// at the control positions x and y.
+ /// </summary>
+ /// <param name="x">
+ /// X position within the control coordinate system
+ /// </param>
+ /// <param name="y">
+ /// Y position within the control coordinate system.
+ /// </param>
+ public void setOrigin(int x, int y)
+ {
+ float tmpX;
+
+ if (x < 1 || y < 1)
+ return;
+
+ tmpX = originX;
+ originX = x;
+ originY = y;
+
+ panelWidth = panelWidth + tmpX - originX;
+ panelHeight = originY;
+ BorderRight = (int)(panelWidth + originX - margin);
+ BorderTop = (int)panelHeight;
+ }
+
+
+ /// <summary>
+ /// Sets the type of scaling for the y-axis. If the
+ /// y-axis is defined to be of fixed size, then the upper
+ /// limit has to be provided with val. Otherwise,
+ /// an 8-bit image is assumed, so the fixed size is set
+ /// to be 255.
+ /// </summary>
+ /// <param name="mode">
+ /// Class constant starting with AXIS_RANGE_*
+ /// </param>
+ /// <param name="val">
+ /// For the mode AXIS_RANGE_FIXED the value
+ /// val must be positive, otherwise
+ /// it has no meaning.
+ /// </param>
+ public void setAxisAdaption(int mode, float val)
+ {
+ switch (mode)
+ {
+ case AXIS_RANGE_FIXED:
+ axisAdaption = mode;
+ axisYLength = (val > 0) ? val : 255.0f;
+ break;
+ default:
+ axisAdaption = mode;
+ break;
+ }
+ }
+
+ public void setAxisAdaption(int mode)
+ {
+ setAxisAdaption(mode, -1.0f);
+ }
+
+
+ /// <summary>
+ /// Plots a function of double values.
+ /// </summary>
+ /// <param name="grayValues">
+ /// Y-values defined as an array of doubles
+ /// </param>
+ public void plotFunction(double[] grayValues)
+ {
+ drawFunction(new HTuple(grayValues));
+ }
+
+
+ /// <summary>
+ /// Plots a function of float values.
+ /// </summary>
+ /// <param name="grayValues">
+ /// Y-values defined as an array of floats
+ /// </param>
+ public void plotFunction(float[] grayValues)
+ {
+ drawFunction(new HTuple(grayValues));
+ }
+
+
+ /// <summary>
+ /// Plots a function of integer values.
+ /// </summary>
+ /// <param name="grayValues">
+ /// Y-values defined as an array of integers
+ /// </param>
+ public void plotFunction(int[] grayValues)
+ {
+ drawFunction(new HTuple(grayValues));
+ }
+
+
+ /// <summary>Plots a function provided as an HTuple</summary>
+ private void drawFunction(HTuple tuple)
+ {
+ HTuple val;
+ int maxY,maxX;
+ float stepOffset;
+
+ if (tuple.Length == 0)
+ {
+ resetPlot();
+ return;
+ }
+
+ val = tuple.TupleSortIndex();
+ maxX = tuple.Length - 1;
+ maxY = (int)tuple[val[val.Length - 1].I].D;
+
+ axisXLength = maxX;
+
+ switch (axisAdaption)
+ {
+ case AXIS_RANGE_ADAPTING:
+ axisYLength = maxY;
+ break;
+ case AXIS_RANGE_INCREASING:
+ axisYLength = (maxY > axisYLength) ? maxY : axisYLength;
+ break;
+ }
+
+ backBuffer.Clear(System.Drawing.Color.WhiteSmoke);
+ backBuffer.FillRectangle(brushFuncPanel, originX, 0, panelWidth, panelHeight);
+
+ stepOffset = drawXYLabels();
+ drawLineCurve(tuple, stepOffset);
+ backBuffer.Flush();
+
+ gPanel.DrawImageUnscaled(functionMap, 0, 0);
+ gPanel.Flush();
+ }
+
+
+ /// <summary>
+ /// Clears the panel and displays only the coordinate axes.
+ /// </summary>
+ public void resetPlot()
+ {
+ backBuffer.Clear(System.Drawing.Color.WhiteSmoke);
+ backBuffer.FillRectangle(brushFuncPanel, originX, 0, panelWidth, panelHeight);
+ func = null;
+ drawXYLabels();
+ backBuffer.Flush();
+ repaint();
+ }
+
+
+ /// <summary>
+ /// Puts (=flushes) the current content of the graphics object on screen
+ /// again.
+ /// </summary>
+ private void repaint()
+ {
+ gPanel.DrawImageUnscaled(functionMap, 0, 0);
+ gPanel.Flush();
+ }
+
+
+ /// <summary>Plots the points of the function.</summary>
+ private void drawLineCurve(HTuple tuple, float stepOffset)
+ {
+ int length;
+
+ if (stepOffset > 1)
+ points = scaleDispValue(tuple);
+ else
+ points = scaleDispBlockValue(tuple);
+
+ length = points.Length;
+
+ func = new HFunction1D(tuple);
+
+ for (int i = 0; i < length - 1; i++)
+ backBuffer.DrawLine(penCurve, points[i], points[i + 1]);
+
+ }
+
+
+ /// <summary>
+ /// Scales the function to the dimension of the graphics object
+ /// (provided by the control).
+ /// </summary>
+ /// <param name="tup">
+ /// Function defined as a tuple of y-values
+ /// </param>
+ /// <returns>
+ /// Array of PointF values, containing the scaled function data
+ /// </returns>
+ private PointF[] scaleDispValue(HTuple tup)
+ {
+ PointF [] pVals;
+ float xMax, yMax, yV, x, y;
+ int length;
+
+ xMax = axisXLength;
+ yMax = axisYLength;
+
+ scaleX = (xMax != 0.0f) ? ((panelWidth - margin) / xMax) : 0.0f;
+ scaleY = (yMax != 0.0f) ? ((panelHeight - margin) / yMax) : 0.0f;
+
+ length = tup.Length;
+ pVals = new PointF[length];
+
+ for (int j=0; j < length; j++)
+ {
+ yV = (float)tup[j].D;
+ x = originX + (float)j * scaleX;
+ y = panelHeight - (yV * scaleY);
+ pVals[j] = new PointF(x, y);
+ }
+
+ return pVals;
+ }
+
+
+ /// <summary>
+ /// Scales the function to the dimension of the graphics object
+ /// (provided by the control). If the stepsize for the x-axis is
+ /// 1, the points are scaled in a block shape.
+ /// </summary>
+ /// <param name="tup">
+ /// Function defined as a tuple of y-values
+ /// </param>
+ /// <returns>
+ /// Array of PointF values, containing the scaled function data
+ /// </returns>
+ private PointF[] scaleDispBlockValue(HTuple tup)
+ {
+ PointF [] pVals;
+ float xMax, yMax, yV,x,y;
+ int length, idx;
+
+ xMax = axisXLength;
+ yMax = axisYLength;
+
+ scaleX = (xMax != 0.0f) ? ((panelWidth - margin) / xMax) : 0.0f;
+ scaleY = (yMax != 0.0f) ? ((panelHeight - margin) / yMax) : 0.0f;
+
+ length = tup.Length;
+ pVals = new PointF[length * 2];
+
+ y = 0;
+ idx = 0;
+
+ for (int j=0; j < length; j++)
+ {
+ yV = (float)tup[j].D;
+ x = originX + (float)j * scaleX - (scaleX / 2.0f);
+ y = panelHeight - (yV * scaleY);
+ pVals[idx] = new PointF(x, y);
+ idx++;
+
+ x = originX + (float)j * scaleX + (scaleX / 2.0f);
+ pVals[idx] = new PointF(x, y);
+ idx++;
+ }
+
+ //trim the end points of the curve
+ idx--;
+ x = originX + (float)(length - 1) * scaleX;
+ pVals[idx] = new PointF(x, y);
+
+ idx = 0;
+ yV = (float)tup[idx].D;
+ x = originX;
+ y = panelHeight - (yV * scaleY);
+ pVals[idx] = new PointF(x, y);
+
+ return pVals;
+ }
+
+
+ /// <summary>Draws x- and y-axis and its labels.</summary>
+ /// <returns>Step size used for the x-axis</returns>
+ private float drawXYLabels()
+ {
+ float pX,pY,length, XStart,YStart;
+ float YCoord, XCoord, XEnd, YEnd, offset, offsetString, offsetStep;
+ float scale = 0.0f;
+
+ offsetString = 5;
+ XStart = originX;
+ YStart = originY;
+
+ //prepare scale data for x-axis
+ pX = axisXLength;
+ if (pX != 0.0)
+ scale = (panelWidth - margin) / pX;
+
+ if (scale > 10.0)
+ offset = 1.0f;
+ else if (scale > 2)
+ offset = 10.0f;
+ else if (scale > 0.2)
+ offset = 100.0f;
+ else
+ offset = 1000.0f;
+
+
+ /*************** draw X-Axis ***************/
+ XCoord = 0.0f;
+ YCoord = YStart;
+ XEnd = (scale * pX);
+
+ backBuffer.DrawLine(pen, XStart, YStart, XStart + panelWidth - margin, YStart);
+ backBuffer.DrawLine(pen, XStart + XCoord, YCoord, XStart + XCoord, YCoord + 6);
+ backBuffer.DrawString(0 + "", drawFont, brushCS, XStart + XCoord + 4, YCoord + 8, format);
+ backBuffer.DrawLine(pen, XStart + XEnd, YCoord, XStart + XEnd, YCoord + 6);
+ backBuffer.DrawString(((int)pX + ""), drawFont, brushCS, XStart + XEnd + 4, YCoord + 8, format);
+
+ length = (int)(pX / offset);
+ length = (offset == 10) ? length - 1 : length;
+ for (int i=1; i <= length; i++)
+ {
+ XCoord = (float)(offset * i * scale);
+
+ if ((XEnd - XCoord) < 20)
+ continue;
+
+ backBuffer.DrawLine(pen, XStart + XCoord, YCoord, XStart + XCoord, YCoord + 6);
+ backBuffer.DrawString(((int)(i * offset) + ""), drawFont, brushCS, XStart + XCoord + 5, YCoord + 8, format);
+ }
+
+ offsetStep = offset;
+
+ //prepare scale data for y-axis
+ pY = axisYLength;
+ if (pY != 0.0)
+ scale = ((panelHeight - margin) / pY);
+
+ if (scale > 10.0)
+ offset = 1.0f;
+ else if (scale > 2)
+ offset = 10.0f;
+ else if (scale > 0.8)
+ offset = 50.0f;
+ else if (scale > 0.12)
+ offset = 100.0f;
+ else
+ offset = 1000.0f;
+
+ /*************** draw Y-Axis ***************/
+ XCoord = XStart;
+ YCoord = 5.0f;
+ YEnd = YStart - (scale * pY);
+
+ backBuffer.DrawLine(pen, XStart, YStart, XStart, YStart - (panelHeight - margin));
+ backBuffer.DrawLine(pen, XCoord, YStart, XCoord - 10, YStart);
+ backBuffer.DrawString(0 + "", drawFont, brushCS, XCoord - 12, YStart - offsetString, format);
+ backBuffer.DrawLine(pen, XCoord, YEnd, XCoord - 10, YEnd);
+ backBuffer.DrawString(pY + "", drawFont, brushCS, XCoord - 12, YEnd - offsetString, format);
+
+ length = (int)(pY / offset);
+ length = (offset == 10) ? length - 1 : length;
+ for (int i=1; i <= length; i++)
+ {
+ YCoord = (YStart - ((float)offset * i * scale));
+
+ if ((YCoord - YEnd) < 10)
+ continue;
+
+ backBuffer.DrawLine(pen, XCoord, YCoord, XCoord - 10, YCoord);
+ backBuffer.DrawString(((int)(i * offset) + ""), drawFont, brushCS, XCoord - 12, YCoord - offsetString, format);
+ }
+
+ return offsetStep;
+ }
+
+
+ /// <summary>
+ /// Action call for the Mouse-Move event. For the x-coordinate
+ /// supplied by the MouseEvent, the unscaled x and y coordinates
+ /// of the plotted function are determined and displayed
+ /// on the control.
+ /// </summary>
+ private void mouseMoved(object sender, MouseEventArgs e)
+ {
+ int Xh, Xc;
+ HTuple Ytup;
+ float Yh, Yc;
+
+ Xh = e.X;
+
+ if (PreX == Xh || Xh < originX || Xh > BorderRight || func == null)
+ return;
+
+ PreX = Xh;
+
+ Xc = (int)Math.Round((Xh - originX) / scaleX);
+ Ytup = func.GetYValueFunct1d(new HTuple(Xc), "zero");
+
+ Yc = (float)Ytup[0].D;
+ Yh = panelHeight - (Yc * scaleY);
+
+ gPanel.DrawImageUnscaled(functionMap, 0, 0);
+ gPanel.DrawLine(penCursor, Xh, 0, Xh, BorderTop);
+ gPanel.DrawLine(penCursor, originX, Yh, BorderRight + margin, Yh);
+ gPanel.DrawString(("X = " + Xc), drawFont, brushCS, panelWidth - margin, 10);
+ gPanel.DrawString(("Y = " + (int)Yc), drawFont, brushCS, panelWidth - margin, 20);
+ gPanel.Flush();
+ }
+
+
+ /// <summary>
+ /// Action call for the Paint event of the control to trigger the
+ /// repainting of the function plot.
+ /// </summary>
+ private void paint(object sender, System.Windows.Forms.PaintEventArgs e)
+ {
+ repaint();
+ }
+
+ }//end of class
+}//end of namespace
diff --git a/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/GraphicsContext.cs b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/GraphicsContext.cs
new file mode 100644
index 0000000..ffce705
--- /dev/null
+++ b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/GraphicsContext.cs
@@ -0,0 +1,417 @@
+using System;
+using System.Collections;
+using HalconDotNet;
+
+
+
+namespace PointGreyAndHalcon
+{
+ public delegate void GCDelegate(string val);
+
+ /// <summary>
+ /// This class contains the graphical context of an HALCON object. The
+ /// set of graphical modes is defined by the hashlist 'graphicalSettings'.
+ /// If the list is empty, then there is no difference to the graphical
+ /// setting defined by the system by default. Otherwise, the provided
+ /// HALCON window is adjusted according to the entries of the supplied
+ /// graphical context (when calling applyContext())
+ /// </summary>
+ public class GraphicsContext
+ {
+
+ /// <summary>
+ /// Graphical mode for the output color (see dev_set_color)
+ /// </summary>
+ public const string GC_COLOR = "Color";
+
+ /// <summary>
+ /// Graphical mode for the multi-color output (see dev_set_colored)
+ /// </summary>
+ public const string GC_COLORED = "Colored";
+
+ /// <summary>
+ /// Graphical mode for the line width (see set_line_width)
+ /// </summary>
+ public const string GC_LINEWIDTH = "LineWidth";
+
+ /// <summary>
+ /// Graphical mode for the drawing (see set_draw)
+ /// </summary>
+ public const string GC_DRAWMODE = "DrawMode";
+
+ /// <summary>
+ /// Graphical mode for the drawing shape (see set_shape)
+ /// </summary>
+ public const string GC_SHAPE = "Shape";
+
+ /// <summary>
+ /// Graphical mode for the LUT (lookup table) (see set_lut)
+ /// </summary>
+ public const string GC_LUT = "Lut";
+
+ /// <summary>
+ /// Graphical mode for the painting (see set_paint)
+ /// </summary>
+ public const string GC_PAINT = "Paint";
+
+ /// <summary>
+ /// Graphical mode for the line style (see set_line_style)
+ /// </summary>
+ public const string GC_LINESTYLE = "LineStyle";
+
+ /// <summary>
+ /// Hashlist containing entries for graphical modes (defined by GC_*),
+ /// which is then linked to some HALCON object to describe its
+ /// graphical context.
+ /// </summary>
+ private Hashtable graphicalSettings;
+
+ /// <summary>
+ /// Backup of the last graphical context applied to the window.
+ /// </summary>
+ public Hashtable stateOfSettings;
+
+ private IEnumerator iterator;
+
+ /// <summary>
+ /// Option to delegate messages from the graphical context
+ /// to some observer class
+ /// </summary>
+ public GCDelegate gcNotification;
+
+
+ /// <summary>
+ /// Creates a graphical context with no initial
+ /// graphical modes
+ /// </summary>
+ public GraphicsContext()
+ {
+ graphicalSettings = new Hashtable(10, 0.2f);
+ gcNotification = new GCDelegate(dummy);
+ stateOfSettings = new Hashtable(10, 0.2f);
+ }
+
+
+ /// <summary>
+ /// Creates an instance of the graphical context with
+ /// the modes defined in the hashtable 'settings'
+ /// </summary>
+ /// <param name="settings">
+ /// List of modes, which describes the graphical context
+ /// </param>
+ public GraphicsContext(Hashtable settings)
+ {
+ graphicalSettings = settings;
+ gcNotification = new GCDelegate(dummy);
+ stateOfSettings = new Hashtable(10, 0.2f);
+ }
+
+ /// <summary>Applies graphical context to the HALCON window</summary>
+ /// <param name="window">Active HALCON window</param>
+ /// <param name="cContext">
+ /// List that contains graphical modes for window
+ /// </param>
+ public void applyContext(HWindow window, Hashtable cContext)
+ {
+ string key = "";
+ string valS = "";
+ int valI = -1;
+ HTuple valH = null;
+
+ iterator = cContext.Keys.GetEnumerator();
+
+ try
+ {
+ while (iterator.MoveNext())
+ {
+
+ key = (string)iterator.Current;
+
+ if (stateOfSettings.Contains(key) &&
+ stateOfSettings[key] == cContext[key])
+ continue;
+
+ switch (key)
+ {
+ case GC_COLOR:
+ valS = (string)cContext[key];
+ window.SetColor(valS);
+ if (stateOfSettings.Contains(GC_COLORED))
+ stateOfSettings.Remove(GC_COLORED);
+
+ break;
+ case GC_COLORED:
+ valI = (int)cContext[key];
+ window.SetColored(valI);
+
+ if (stateOfSettings.Contains(GC_COLOR))
+ stateOfSettings.Remove(GC_COLOR);
+
+ break;
+ case GC_DRAWMODE:
+ valS = (string)cContext[key];
+ window.SetDraw(valS);
+ break;
+ case GC_LINEWIDTH:
+ valI = (int)cContext[key];
+ window.SetLineWidth(valI);
+ break;
+ case GC_LUT:
+ valS = (string)cContext[key];
+ window.SetLut(valS);
+ break;
+ case GC_PAINT:
+ valS = (string)cContext[key];
+ window.SetPaint(valS);
+ break;
+ case GC_SHAPE:
+ valS = (string)cContext[key];
+ window.SetShape(valS);
+ break;
+ case GC_LINESTYLE:
+ valH = (HTuple)cContext[key];
+ window.SetLineStyle(valH);
+ break;
+ default:
+ break;
+ }
+
+
+ if (valI != -1)
+ {
+ if (stateOfSettings.Contains(key))
+ stateOfSettings[key] = valI;
+ else
+ stateOfSettings.Add(key, valI);
+
+ valI = -1;
+ }
+ else if (valS != "")
+ {
+ if (stateOfSettings.Contains(key))
+ stateOfSettings[key] = valI;
+ else
+ stateOfSettings.Add(key, valI);
+
+ valS = "";
+ }
+ else if (valH != null)
+ {
+ if (stateOfSettings.Contains(key))
+ stateOfSettings[key] = valI;
+ else
+ stateOfSettings.Add(key, valI);
+
+ valH = null;
+ }
+ }//while
+ }
+ catch (HOperatorException e)
+ {
+ gcNotification(e.Message);
+ return;
+ }
+ }
+
+
+ /// <summary>Sets a value for the graphical mode GC_COLOR</summary>
+ /// <param name="val">
+ /// A single color, e.g. "blue", "green" ...etc.
+ /// </param>
+ public void setColorAttribute(string val)
+ {
+ if (graphicalSettings.ContainsKey(GC_COLORED))
+ graphicalSettings.Remove(GC_COLORED);
+
+ addValue(GC_COLOR, val);
+ }
+
+ /// <summary>Sets a value for the graphical mode GC_COLORED</summary>
+ /// <param name="val">
+ /// The colored mode, which can be either "colored3" or "colored6"
+ /// or "colored12"
+ /// </param>
+ public void setColoredAttribute(int val)
+ {
+ if (graphicalSettings.ContainsKey(GC_COLOR))
+ graphicalSettings.Remove(GC_COLOR);
+
+ addValue(GC_COLORED, val);
+ }
+
+ /// <summary>Sets a value for the graphical mode GC_DRAWMODE</summary>
+ /// <param name="val">
+ /// One of the possible draw modes: "margin" or "fill"
+ /// </param>
+ public void setDrawModeAttribute(string val)
+ {
+ addValue(GC_DRAWMODE, val);
+ }
+
+ /// <summary>Sets a value for the graphical mode GC_LINEWIDTH</summary>
+ /// <param name="val">
+ /// The line width, which can range from 1 to 50
+ /// </param>
+ public void setLineWidthAttribute(int val)
+ {
+ addValue(GC_LINEWIDTH, val);
+ }
+
+ /// <summary>Sets a value for the graphical mode GC_LUT</summary>
+ /// <param name="val">
+ /// One of the possible modes of look up tables. For
+ /// further information on particular setups, please refer to the
+ /// Reference Manual entry of the operator set_lut.
+ /// </param>
+ public void setLutAttribute(string val)
+ {
+ addValue(GC_LUT, val);
+ }
+
+
+ /// <summary>Sets a value for the graphical mode GC_PAINT</summary>
+ /// <param name="val">
+ /// One of the possible paint modes. For further
+ /// information on particular setups, please refer refer to the
+ /// Reference Manual entry of the operator set_paint.
+ /// </param>
+ public void setPaintAttribute(string val)
+ {
+ addValue(GC_PAINT, val);
+ }
+
+
+ /// <summary>Sets a value for the graphical mode GC_SHAPE</summary>
+ /// <param name="val">
+ /// One of the possible shape modes. For further
+ /// information on particular setups, please refer refer to the
+ /// Reference Manual entry of the operator set_shape.
+ /// </param>
+ public void setShapeAttribute(string val)
+ {
+ addValue(GC_SHAPE, val);
+ }
+
+ /// <summary>Sets a value for the graphical mode GC_LINESTYLE</summary>
+ /// <param name="val">
+ /// A line style mode, which works
+ /// identical to the input for the HDevelop operator
+ /// 'set_line_style'. For particular information on this
+ /// topic, please refer to the Reference Manual entry of the operator
+ /// set_line_style.
+ /// </param>
+ public void setLineStyleAttribute(HTuple val)
+ {
+ addValue(GC_LINESTYLE, val);
+ }
+
+ /// <summary>
+ /// Adds a value to the hashlist 'graphicalSettings' for the
+ /// graphical mode described by the parameter 'key'
+ /// </summary>
+ /// <param name="key">
+ /// A graphical mode defined by the constant GC_*
+ /// </param>
+ /// <param name="val">
+ /// Defines the value as an int for this graphical
+ /// mode 'key'
+ /// </param>
+ private void addValue(string key, int val)
+ {
+ if (graphicalSettings.ContainsKey(key))
+ graphicalSettings[key] = val;
+ else
+ graphicalSettings.Add(key, val);
+ }
+
+ /// <summary>
+ /// Adds a value to the hashlist 'graphicalSettings' for the
+ /// graphical mode, described by the parameter 'key'
+ /// </summary>
+ /// <param name="key">
+ /// A graphical mode defined by the constant GC_*
+ /// </param>
+ /// <param name="val">
+ /// Defines the value as a string for this
+ /// graphical mode 'key'
+ /// </param>
+ private void addValue(string key, string val)
+ {
+ if (graphicalSettings.ContainsKey(key))
+ graphicalSettings[key] = val;
+ else
+ graphicalSettings.Add(key, val);
+ }
+
+
+ /// <summary>
+ /// Adds a value to the hashlist 'graphicalSettings' for the
+ /// graphical mode, described by the parameter 'key'
+ /// </summary>
+ /// <param name="key">
+ /// A graphical mode defined by the constant GC_*
+ /// </param>
+ /// <param name="val">
+ /// Defines the value as a HTuple for this
+ /// graphical mode 'key'
+ /// </param>
+ private void addValue(string key, HTuple val)
+ {
+ if (graphicalSettings.ContainsKey(key))
+ graphicalSettings[key] = val;
+ else
+ graphicalSettings.Add(key, val);
+ }
+
+ /// <summary>
+ /// Clears the list of graphical settings.
+ /// There will be no graphical changes made prior
+ /// before drawing objects, since there are no
+ /// graphical entries to be applied to the window.
+ /// </summary>
+ public void clear()
+ {
+ graphicalSettings.Clear();
+ }
+
+
+ /// <summary>
+ /// Returns an exact clone of this graphicsContext instance
+ /// </summary>
+ public GraphicsContext copy()
+ {
+ return new GraphicsContext((Hashtable)this.graphicalSettings.Clone());
+ }
+
+
+ /// <summary>
+ /// If the hashtable contains the key, the corresponding
+ /// hashtable value is returned
+ /// </summary>
+ /// <param name="key">
+ /// One of the graphical keys starting with GC_*
+ /// </param>
+ public object getGraphicsAttribute(string key)
+ {
+ if (graphicalSettings.ContainsKey(key))
+ return graphicalSettings[key];
+
+ return null;
+ }
+
+ /// <summary>
+ /// Returns a copy of the hashtable that carries the
+ /// entries for the current graphical context
+ /// </summary>
+ /// <returns> current graphical context </returns>
+ public Hashtable copyContextList()
+ {
+ return (Hashtable)graphicalSettings.Clone();
+ }
+
+
+ /********************************************************************/
+ public void dummy(string val) { }
+
+ }//end of class
+}//end of namespace
diff --git a/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/HObjectEntry.cs b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/HObjectEntry.cs
new file mode 100644
index 0000000..374ee94
--- /dev/null
+++ b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/HObjectEntry.cs
@@ -0,0 +1,53 @@
+using System;
+using HalconDotNet;
+using System.Collections;
+
+
+
+namespace PointGreyAndHalcon
+{
+
+ /// <summary>
+ /// This class is an auxiliary class, which is used to
+ /// link a graphical context to an HALCON object. The graphical
+ /// context is described by a hashtable, which contains a list of
+ /// graphical modes (e.g GC_COLOR, GC_LINEWIDTH and GC_PAINT)
+ /// and their corresponding values (e.g "blue", "4", "3D-plot"). These
+ /// graphical states are applied to the window before displaying the
+ /// object.
+ /// </summary>
+ public class HObjectEntry
+ {
+ /// <summary>Hashlist defining the graphical context for HObj</summary>
+ public Hashtable gContext;
+
+ /// <summary>HALCON object</summary>
+ public HObject HObj;
+
+
+
+ /// <summary>Constructor</summary>
+ /// <param name="obj">
+ /// HALCON object that is linked to the graphical context gc.
+ /// </param>
+ /// <param name="gc">
+ /// Hashlist of graphical states that are applied before the object
+ /// is displayed.
+ /// </param>
+ public HObjectEntry(HObject obj, Hashtable gc)
+ {
+ gContext = gc;
+ HObj = obj;
+ }
+
+ /// <summary>
+ /// Clears the entries of the class members Hobj and gContext
+ /// </summary>
+ public void clear()
+ {
+ gContext.Clear();
+ HObj.Dispose();
+ }
+
+ }//end of class
+}//end of namespace
diff --git a/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/HWndCtrl.cs b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/HWndCtrl.cs
new file mode 100644
index 0000000..d09c1b3
--- /dev/null
+++ b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/HWndCtrl.cs
@@ -0,0 +1,868 @@
+using System;
+using System.Collections;
+using HalconDotNet;
+
+
+
+namespace PointGreyAndHalcon
+{
+ public delegate void IconicDelegate(int val);
+ public delegate void FuncDelegate();
+
+ /// <summary>
+ /// This class works as a wrapper class for the HALCON window
+ /// HWindow. HWndCtrl is in charge of the visualization.
+ /// You can move and zoom the visible image part by using GUI component
+ /// inputs or with the mouse. The class HWndCtrl uses a graphics stack
+ /// to manage the iconic objects for the display. Each object is linked
+ /// to a graphical context, which determines how the object is to be drawn.
+ /// The context can be changed by calling changeGraphicSettings().
+ /// The graphical "modes" are defined by the class GraphicsContext and
+ /// map most of the dev_set_* operators provided in HDevelop.
+ /// </summary>
+ public class HWndCtrl
+ {
+ /// <summary>No action is performed on mouse events</summary>
+ public const int MODE_VIEW_NONE = 10;
+
+ /// <summary>Zoom is performed on mouse events</summary>
+ public const int MODE_VIEW_ZOOM = 11;
+
+ /// <summary>Move is performed on mouse events</summary>
+ public const int MODE_VIEW_MOVE = 12;
+
+ /// <summary>Magnification is performed on mouse events</summary>
+ public const int MODE_VIEW_ZOOMWINDOW = 13;
+
+
+ public const int MODE_INCLUDE_ROI = 1;
+
+ public const int MODE_EXCLUDE_ROI = 2;
+
+
+ /// <summary>
+ /// Constant describes delegate message to signal new image
+ /// </summary>
+ public const int EVENT_UPDATE_IMAGE = 31;
+ /// <summary>
+ /// Constant describes delegate message to signal error
+ /// when reading an image from file
+ /// </summary>
+ public const int ERR_READING_IMG = 32;
+ /// <summary>
+ /// Constant describes delegate message to signal error
+ /// when defining a graphical context
+ /// </summary>
+ public const int ERR_DEFINING_GC = 33;
+
+ /// <summary>
+ /// Maximum number of HALCON objects that can be put on the graphics
+ /// stack without loss. For each additional object, the first entry
+ /// is removed from the stack again.
+ /// </summary>
+ private const int MAXNUMOBJLIST = 50;
+
+
+ private int stateView;
+ private bool mousePressed = false;
+ private double startX,startY;
+
+ /// <summary>HALCON window</summary>
+ private HWindowControl viewPort;
+
+ /// <summary>
+ /// Instance of ROIController, which manages ROI interaction
+ /// </summary>
+ private ROIController roiManager;
+
+ /* dispROI is a flag to know when to add the ROI models to the
+ paint routine and whether or not to respond to mouse events for
+ ROI objects */
+ private int dispROI;
+
+
+ /* Basic parameters, like dimension of window and displayed image part */
+ private int windowWidth;
+ private int windowHeight;
+ private int imageWidth;
+ private int imageHeight;
+
+ private int[] CompRangeX;
+ private int[] CompRangeY;
+
+
+ private int prevCompX, prevCompY;
+ private double stepSizeX, stepSizeY;
+
+
+ /* Image coordinates, which describe the image part that is displayed
+ in the HALCON window */
+ private double ImgRow1, ImgCol1, ImgRow2, ImgCol2;
+
+ /// <summary>Error message when an exception is thrown</summary>
+ public string exceptionText = "";
+
+
+ /* Delegates to send notification messages to other classes */
+ /// <summary>
+ /// Delegate to add information to the HALCON window after
+ /// the paint routine has finished
+ /// </summary>
+ public FuncDelegate addInfoDelegate;
+
+ /// <summary>
+ /// Delegate to notify about failed tasks of the HWndCtrl instance
+ /// </summary>
+ public IconicDelegate NotifyIconObserver;
+
+
+ private HWindow ZoomWindow;
+ private double zoomWndFactor;
+ private double zoomAddOn;
+ private int zoomWndSize;
+
+
+ /// <summary>
+ /// List of HALCON objects to be drawn into the HALCON window.
+ /// The list shouldn't contain more than MAXNUMOBJLIST objects,
+ /// otherwise the first entry is removed from the list.
+ /// </summary>
+ private ArrayList HObjList;
+
+ /// <summary>
+ /// Instance that describes the graphical context for the
+ /// HALCON window. According on the graphical settings
+ /// attached to each HALCON object, this graphical context list
+ /// is updated constantly.
+ /// </summary>
+ private GraphicsContext mGC;
+
+
+ /// <summary>
+ /// Initializes the image dimension, mouse delegation, and the
+ /// graphical context setup of the instance.
+ /// </summary>
+ /// <param name="view"> HALCON window </param>
+ public HWndCtrl(HWindowControl view)
+ {
+ viewPort = view;
+ stateView = MODE_VIEW_NONE;
+ windowWidth = viewPort.Size.Width;
+ windowHeight = viewPort.Size.Height;
+
+ zoomWndFactor = (double)imageWidth / viewPort.Width;
+ zoomAddOn = Math.Pow(0.9, 5);
+ zoomWndSize = 150;
+
+ /*default*/
+ CompRangeX = new int[] { 0, 100 };
+ CompRangeY = new int[] { 0, 100 };
+
+ prevCompX = prevCompY = 0;
+
+ dispROI = MODE_INCLUDE_ROI;//1;
+
+ viewPort.HMouseUp += new HalconDotNet.HMouseEventHandler(this.mouseUp);
+ viewPort.HMouseDown += new HalconDotNet.HMouseEventHandler(this.mouseDown);
+ viewPort.HMouseMove += new HalconDotNet.HMouseEventHandler(this.mouseMoved);
+
+ addInfoDelegate = new FuncDelegate(dummyV);
+ NotifyIconObserver = new IconicDelegate(dummy);
+
+ // graphical stack
+ HObjList = new ArrayList(20);
+ mGC = new GraphicsContext();
+ mGC.gcNotification = new GCDelegate(exceptionGC);
+ }
+
+
+ /// <summary>
+ /// Registers an instance of an ROIController with this window
+ /// controller (and vice versa).
+ /// </summary>
+ /// <param name="rC">
+ /// Controller that manages interactive ROIs for the HALCON window
+ /// </param>
+ public void useROIController(ROIController rC)
+ {
+ roiManager = rC;
+ rC.setViewController(this);
+ }
+
+
+ /// <summary>
+ /// Read dimensions of the image to adjust own window settings
+ /// </summary>
+ /// <param name="image">HALCON image</param>
+ private void setImagePart(HImage image)
+ {
+ string s;
+ int w,h;
+
+ image.GetImagePointer1(out s, out w, out h);
+ setImagePart(0, 0, h, w);
+ }
+
+
+ /// <summary>
+ /// Adjust window settings by the values supplied for the left
+ /// upper corner and the right lower corner
+ /// </summary>
+ /// <param name="r1">y coordinate of left upper corner</param>
+ /// <param name="c1">x coordinate of left upper corner</param>
+ /// <param name="r2">y coordinate of right lower corner</param>
+ /// <param name="c2">x coordinate of right lower corner</param>
+ private void setImagePart(int r1, int c1, int r2, int c2)
+ {
+ ImgRow1 = r1;
+ ImgCol1 = c1;
+ ImgRow2 = imageHeight = r2;
+ ImgCol2 = imageWidth = c2;
+
+ System.Drawing.Rectangle rect = viewPort.ImagePart;
+ rect.X = (int)ImgCol1;
+ rect.Y = (int)ImgRow1;
+ rect.Height = (int)imageHeight;
+ rect.Width = (int)imageWidth;
+ viewPort.ImagePart = rect;
+ }
+
+
+ /// <summary>
+ /// Sets the view mode for mouse events in the HALCON window
+ /// (zoom, move, magnify or none).
+ /// </summary>
+ /// <param name="mode">One of the MODE_VIEW_* constants</param>
+ public void setViewState(int mode)
+ {
+ stateView = mode;
+
+ if (roiManager != null)
+ roiManager.resetROI();
+ }
+
+ /********************************************************************/
+ private void dummy(int val)
+ {
+ }
+
+ private void dummyV()
+ {
+ }
+
+ /*******************************************************************/
+ private void exceptionGC(string message)
+ {
+ exceptionText = message;
+ NotifyIconObserver(ERR_DEFINING_GC);
+ }
+
+ /// <summary>
+ /// Paint or don't paint the ROIs into the HALCON window by
+ /// defining the parameter to be equal to 1 or not equal to 1.
+ /// </summary>
+ public void setDispLevel(int mode)
+ {
+ dispROI = mode;
+ }
+
+ /****************************************************************************/
+ /* graphical element */
+ /****************************************************************************/
+ private void zoomImage(double x, double y, double scale)
+ {
+ double lengthC, lengthR;
+ double percentC, percentR;
+ int lenC, lenR;
+
+ percentC = (x - ImgCol1) / (ImgCol2 - ImgCol1);
+ percentR = (y - ImgRow1) / (ImgRow2 - ImgRow1);
+
+ lengthC = (ImgCol2 - ImgCol1) * scale;
+ lengthR = (ImgRow2 - ImgRow1) * scale;
+
+ ImgCol1 = x - lengthC * percentC;
+ ImgCol2 = x + lengthC * (1 - percentC);
+
+ ImgRow1 = y - lengthR * percentR;
+ ImgRow2 = y + lengthR * (1 - percentR);
+
+ lenC = (int)Math.Round(lengthC);
+ lenR = (int)Math.Round(lengthR);
+
+ System.Drawing.Rectangle rect = viewPort.ImagePart;
+ rect.X = (int)Math.Round(ImgCol1);
+ rect.Y = (int)Math.Round(ImgRow1);
+ rect.Width = (lenC > 0) ? lenC : 1;
+ rect.Height = (lenR > 0) ? lenR : 1;
+ viewPort.ImagePart = rect;
+
+ zoomWndFactor *= scale;
+ repaint();
+ }
+
+ /// <summary>
+ /// Scales the image in the HALCON window according to the
+ /// value scaleFactor
+ /// </summary>
+ public void zoomImage(double scaleFactor)
+ {
+ double midPointX, midPointY;
+
+ if (((ImgRow2 - ImgRow1) == scaleFactor * imageHeight) &&
+ ((ImgCol2 - ImgCol1) == scaleFactor * imageWidth))
+ {
+ repaint();
+ return;
+ }
+
+ ImgRow2 = ImgRow1 + imageHeight;
+ ImgCol2 = ImgCol1 + imageWidth;
+
+ midPointX = ImgCol1;
+ midPointY = ImgRow1;
+
+ zoomWndFactor = (double)imageWidth / viewPort.Width;
+ zoomImage(midPointX, midPointY, scaleFactor);
+ }
+
+
+ /// <summary>
+ /// Scales the HALCON window according to the value scale
+ /// </summary>
+ public void scaleWindow(double scale)
+ {
+ ImgRow1 = 0;
+ ImgCol1 = 0;
+
+ ImgRow2 = imageHeight;
+ ImgCol2 = imageWidth;
+
+ viewPort.Width = (int)(ImgCol2 * scale);
+ viewPort.Height = (int)(ImgRow2 * scale);
+
+ zoomWndFactor = ((double)imageWidth / viewPort.Width);
+ }
+
+ /// <summary>
+ /// Recalculates the image-window-factor, which needs to be added to
+ /// the scale factor for zooming an image. This way the zoom gets
+ /// adjusted to the window-image relation, expressed by the equation
+ /// imageWidth/viewPort.Width.
+ /// </summary>
+ public void setZoomWndFactor()
+ {
+ zoomWndFactor = ((double)imageWidth / viewPort.Width);
+ }
+
+ /// <summary>
+ /// Sets the image-window-factor to the value zoomF
+ /// </summary>
+ public void setZoomWndFactor(double zoomF)
+ {
+ zoomWndFactor = zoomF;
+ }
+
+ /*******************************************************************/
+ private void moveImage(double motionX, double motionY)
+ {
+ ImgRow1 += -motionY;
+ ImgRow2 += -motionY;
+
+ ImgCol1 += -motionX;
+ ImgCol2 += -motionX;
+
+ System.Drawing.Rectangle rect = viewPort.ImagePart;
+ rect.X = (int)Math.Round(ImgCol1);
+ rect.Y = (int)Math.Round(ImgRow1);
+ viewPort.ImagePart = rect;
+
+ repaint();
+ }
+
+
+ /// <summary>
+ /// Resets all parameters that concern the HALCON window display
+ /// setup to their initial values and clears the ROI list.
+ /// </summary>
+ public void resetAll()
+ {
+ ImgRow1 = 0;
+ ImgCol1 = 0;
+ ImgRow2 = imageHeight;
+ ImgCol2 = imageWidth;
+
+ zoomWndFactor = (double)imageWidth / viewPort.Width;
+
+ System.Drawing.Rectangle rect = viewPort.ImagePart;
+ rect.X = (int)ImgCol1;
+ rect.Y = (int)ImgRow1;
+ rect.Width = (int)imageWidth;
+ rect.Height = (int)imageHeight;
+ viewPort.ImagePart = rect;
+
+
+ if (roiManager != null)
+ roiManager.reset();
+ }
+
+ public void resetWindow()
+ {
+ ImgRow1 = 0;
+ ImgCol1 = 0;
+ ImgRow2 = imageHeight;
+ ImgCol2 = imageWidth;
+
+ zoomWndFactor = (double)imageWidth / viewPort.Width;
+
+ System.Drawing.Rectangle rect = viewPort.ImagePart;
+ rect.X = (int)ImgCol1;
+ rect.Y = (int)ImgRow1;
+ rect.Width = (int)imageWidth;
+ rect.Height = (int)imageHeight;
+ viewPort.ImagePart = rect;
+ }
+
+
+ /*************************************************************************/
+ /* Event handling for mouse */
+ /*************************************************************************/
+ private void mouseDown(object sender, HalconDotNet.HMouseEventArgs e)
+ {
+ mousePressed = true;
+ int activeROIidx = -1;
+ double scale;
+
+ if (roiManager != null && (dispROI == MODE_INCLUDE_ROI))
+ {
+ activeROIidx = roiManager.mouseDownAction(e.X, e.Y);
+ }
+
+ if (activeROIidx == -1)
+ {
+ switch (stateView)
+ {
+ case MODE_VIEW_MOVE:
+ startX = e.X;
+ startY = e.Y;
+ break;
+ case MODE_VIEW_ZOOM:
+ if (e.Button == System.Windows.Forms.MouseButtons.Left)
+ scale = 0.9;
+ else
+ scale = 1 / 0.9;
+ zoomImage(e.X, e.Y, scale);
+ break;
+ case MODE_VIEW_NONE:
+ break;
+ case MODE_VIEW_ZOOMWINDOW:
+ activateZoomWindow((int)e.X, (int)e.Y);
+ break;
+ default:
+ break;
+ }
+ }
+ //end of if
+ }
+
+ /*******************************************************************/
+ private void activateZoomWindow(int X, int Y)
+ {
+ double posX, posY;
+ int zoomZone;
+
+ if (ZoomWindow != null)
+ ZoomWindow.Dispose();
+
+ HOperatorSet.SetSystem("border_width", 10);
+ ZoomWindow = new HWindow();
+
+ posX = ((X - ImgCol1) / (ImgCol2 - ImgCol1)) * viewPort.Width;
+ posY = ((Y - ImgRow1) / (ImgRow2 - ImgRow1)) * viewPort.Height;
+
+ zoomZone = (int)((zoomWndSize / 2) * zoomWndFactor * zoomAddOn);
+ ZoomWindow.OpenWindow((int)posY - (zoomWndSize / 2), (int)posX - (zoomWndSize / 2),
+ zoomWndSize, zoomWndSize,
+ viewPort.HalconID, "visible", "");
+ ZoomWindow.SetPart(Y - zoomZone, X - zoomZone, Y + zoomZone, X + zoomZone);
+ repaint(ZoomWindow);
+ ZoomWindow.SetColor("black");
+ }
+
+ /*******************************************************************/
+ private void mouseUp(object sender, HalconDotNet.HMouseEventArgs e)
+ {
+ mousePressed = false;
+
+ if (roiManager != null
+ && (roiManager.activeROIidx != -1)
+ && (dispROI == MODE_INCLUDE_ROI))
+ {
+ roiManager.NotifyRCObserver(ROIController.EVENT_UPDATE_ROI);
+ }
+ else if (stateView == MODE_VIEW_ZOOMWINDOW)
+ {
+ ZoomWindow.Dispose();
+ }
+ }
+
+ /*******************************************************************/
+ private void mouseMoved(object sender, HalconDotNet.HMouseEventArgs e)
+ {
+ double motionX, motionY;
+ double posX, posY;
+ double zoomZone;
+
+
+ if (!mousePressed)
+ return;
+
+ if (roiManager != null && (roiManager.activeROIidx != -1) && (dispROI == MODE_INCLUDE_ROI))
+ {
+ roiManager.mouseMoveAction(e.X, e.Y);
+ }
+ else if (stateView == MODE_VIEW_MOVE)
+ {
+ motionX = ((e.X - startX));
+ motionY = ((e.Y - startY));
+
+ if (((int)motionX != 0) || ((int)motionY != 0))
+ {
+ moveImage(motionX, motionY);
+ startX = e.X - motionX;
+ startY = e.Y - motionY;
+ }
+ }
+ else if (stateView == MODE_VIEW_ZOOMWINDOW)
+ {
+ HSystem.SetSystem("flush_graphic", "false");
+ ZoomWindow.ClearWindow();
+
+
+ posX = ((e.X - ImgCol1) / (ImgCol2 - ImgCol1)) * viewPort.Width;
+ posY = ((e.Y - ImgRow1) / (ImgRow2 - ImgRow1)) * viewPort.Height;
+ zoomZone = (zoomWndSize / 2) * zoomWndFactor * zoomAddOn;
+
+ ZoomWindow.SetWindowExtents((int)posY - (zoomWndSize / 2),
+ (int)posX - (zoomWndSize / 2),
+ zoomWndSize, zoomWndSize);
+ ZoomWindow.SetPart((int)(e.Y - zoomZone), (int)(e.X - zoomZone),
+ (int)(e.Y + zoomZone), (int)(e.X + zoomZone));
+ repaint(ZoomWindow);
+
+ HSystem.SetSystem("flush_graphic", "true");
+ ZoomWindow.DispLine(-100.0, -100.0, -100.0, -100.0);
+ }
+ }
+
+ /// <summary>
+ /// To initialize the move function using a GUI component, the HWndCtrl
+ /// first needs to know the range supplied by the GUI component.
+ /// For the x direction it is specified by xRange, which is
+ /// calculated as follows: GuiComponentX.Max()-GuiComponentX.Min().
+ /// The starting value of the GUI component has to be supplied
+ /// by the parameter Init
+ /// </summary>
+ public void setGUICompRangeX(int[] xRange, int Init)
+ {
+ int cRangeX;
+
+ CompRangeX = xRange;
+ cRangeX = xRange[1] - xRange[0];
+ prevCompX = Init;
+ stepSizeX = ((double)imageWidth / cRangeX) * (imageWidth / windowWidth);
+
+ }
+
+ /// <summary>
+ /// To initialize the move function using a GUI component, the HWndCtrl
+ /// first needs to know the range supplied by the GUI component.
+ /// For the y direction it is specified by yRange, which is
+ /// calculated as follows: GuiComponentY.Max()-GuiComponentY.Min().
+ /// The starting value of the GUI component has to be supplied
+ /// by the parameter Init
+ /// </summary>
+ public void setGUICompRangeY(int[] yRange, int Init)
+ {
+ int cRangeY;
+
+ CompRangeY = yRange;
+ cRangeY = yRange[1] - yRange[0];
+ prevCompY = Init;
+ stepSizeY = ((double)imageHeight / cRangeY) * (imageHeight / windowHeight);
+ }
+
+
+ /// <summary>
+ /// Resets to the starting value of the GUI component.
+ /// </summary>
+ public void resetGUIInitValues(int xVal, int yVal)
+ {
+ prevCompX = xVal;
+ prevCompY = yVal;
+ }
+
+ /// <summary>
+ /// Moves the image by the value valX supplied by the GUI component
+ /// </summary>
+ public void moveXByGUIHandle(int valX)
+ {
+ double motionX;
+
+ motionX = (valX - prevCompX) * stepSizeX;
+
+ if (motionX == 0)
+ return;
+
+ moveImage(motionX, 0.0);
+ prevCompX = valX;
+ }
+
+
+ /// <summary>
+ /// Moves the image by the value valY supplied by the GUI component
+ /// </summary>
+ public void moveYByGUIHandle(int valY)
+ {
+ double motionY;
+
+ motionY = (valY - prevCompY) * stepSizeY;
+
+ if (motionY == 0)
+ return;
+
+ moveImage(0.0, motionY);
+ prevCompY = valY;
+ }
+
+ /// <summary>
+ /// Zooms the image by the value valF supplied by the GUI component
+ /// </summary>
+ public void zoomByGUIHandle(double valF)
+ {
+ double x, y, scale;
+ double prevScaleC;
+
+
+
+ x = (ImgCol1 + (ImgCol2 - ImgCol1) / 2);
+ y = (ImgRow1 + (ImgRow2 - ImgRow1) / 2);
+
+ prevScaleC = (double)((ImgCol2 - ImgCol1) / imageWidth);
+ scale = ((double)1.0 / prevScaleC * (100.0 / valF));
+
+ zoomImage(x, y, scale);
+ }
+
+ /// <summary>
+ /// Triggers a repaint of the HALCON window
+ /// </summary>
+ public void repaint()
+ {
+ repaint(viewPort.HalconWindow);
+ }
+
+ /// <summary>
+ /// Repaints the HALCON window 'window'
+ /// </summary>
+ public void repaint(HalconDotNet.HWindow window)
+ {
+ int count = HObjList.Count;
+ HObjectEntry entry;
+
+ HSystem.SetSystem("flush_graphic", "false");
+ window.ClearWindow();
+ mGC.stateOfSettings.Clear();
+
+ for (int i=0; i < count; i++)
+ {
+ entry = ((HObjectEntry)HObjList[i]);
+ mGC.applyContext(window, entry.gContext);
+ window.DispObj(entry.HObj);
+ }
+
+ addInfoDelegate();
+
+ if (roiManager != null && (dispROI == MODE_INCLUDE_ROI))
+ roiManager.paintData(window);
+
+ HSystem.SetSystem("flush_graphic", "true");
+
+ window.SetColor("black");
+ window.DispLine(-100.0, -100.0, -101.0, -101.0);
+ }
+
+
+
+ /********************************************************************/
+ /* GRAPHICSSTACK */
+ /********************************************************************/
+
+ /// <summary>
+ /// Adds an iconic object to the graphics stack similar to the way
+ /// it is defined for the HDevelop graphics stack.
+ /// </summary>
+ /// <param name="obj">Iconic object</param>
+ public void addIconicVar(HObject obj)
+ {
+ HObjectEntry entry;
+
+ if (obj == null)
+ return;
+
+ if (obj is HImage)
+ {
+ double r, c;
+ int h, w, area;
+ string s;
+
+ area = ((HImage)obj).GetDomain().AreaCenter(out r, out c);
+ ((HImage)obj).GetImagePointer1(out s, out w, out h);
+
+ if (area == (w * h))
+ {
+ clearList();
+
+ if ((h != imageHeight) || (w != imageWidth))
+ {
+ imageHeight = h;
+ imageWidth = w;
+ zoomWndFactor = (double)imageWidth / viewPort.Width;
+ setImagePart(0, 0, h, w);
+ }
+ }//if
+ }//if
+
+ entry = new HObjectEntry(obj, mGC.copyContextList());
+
+ HObjList.Add(entry);
+
+ if (HObjList.Count > MAXNUMOBJLIST)
+ HObjList.RemoveAt(1);
+ }
+
+
+ /// <summary>
+ /// Clears all entries from the graphics stack
+ /// </summary>
+ public void clearList()
+ {
+ HObjList.Clear();
+ }
+
+ /// <summary>
+ /// Returns the number of items on the graphics stack
+ /// </summary>
+ public int getListCount()
+ {
+ return HObjList.Count;
+ }
+
+ /// <summary>
+ /// Changes the current graphical context by setting the specified mode
+ /// (constant starting by GC_*) to the specified value.
+ /// </summary>
+ /// <param name="mode">
+ /// Constant that is provided by the class GraphicsContext
+ /// and describes the mode that has to be changed,
+ /// e.g., GraphicsContext.GC_COLOR
+ /// </param>
+ /// <param name="val">
+ /// Value, provided as a string,
+ /// the mode is to be changed to, e.g., "blue"
+ /// </param>
+ public void changeGraphicSettings(string mode, string val)
+ {
+ switch (mode)
+ {
+ case GraphicsContext.GC_COLOR:
+ mGC.setColorAttribute(val);
+ break;
+ case GraphicsContext.GC_DRAWMODE:
+ mGC.setDrawModeAttribute(val);
+ break;
+ case GraphicsContext.GC_LUT:
+ mGC.setLutAttribute(val);
+ break;
+ case GraphicsContext.GC_PAINT:
+ mGC.setPaintAttribute(val);
+ break;
+ case GraphicsContext.GC_SHAPE:
+ mGC.setShapeAttribute(val);
+ break;
+ default:
+ break;
+ }
+ }
+
+ /// <summary>
+ /// Changes the current graphical context by setting the specified mode
+ /// (constant starting by GC_*) to the specified value.
+ /// </summary>
+ /// <param name="mode">
+ /// Constant that is provided by the class GraphicsContext
+ /// and describes the mode that has to be changed,
+ /// e.g., GraphicsContext.GC_LINEWIDTH
+ /// </param>
+ /// <param name="val">
+ /// Value, provided as an integer, the mode is to be changed to,
+ /// e.g., 5
+ /// </param>
+ public void changeGraphicSettings(string mode, int val)
+ {
+ switch (mode)
+ {
+ case GraphicsContext.GC_COLORED:
+ mGC.setColoredAttribute(val);
+ break;
+ case GraphicsContext.GC_LINEWIDTH:
+ mGC.setLineWidthAttribute(val);
+ break;
+ default:
+ break;
+ }
+ }
+
+ /// <summary>
+ /// Changes the current graphical context by setting the specified mode
+ /// (constant starting by GC_*) to the specified value.
+ /// </summary>
+ /// <param name="mode">
+ /// Constant that is provided by the class GraphicsContext
+ /// and describes the mode that has to be changed,
+ /// e.g., GraphicsContext.GC_LINESTYLE
+ /// </param>
+ /// <param name="val">
+ /// Value, provided as an HTuple instance, the mode is
+ /// to be changed to, e.g., new HTuple(new int[]{2,2})
+ /// </param>
+ public void changeGraphicSettings(string mode, HTuple val)
+ {
+ switch (mode)
+ {
+ case GraphicsContext.GC_LINESTYLE:
+ mGC.setLineStyleAttribute(val);
+ break;
+ default:
+ break;
+ }
+ }
+
+ /// <summary>
+ /// Clears all entries from the graphical context list
+ /// </summary>
+ public void clearGraphicContext()
+ {
+ mGC.clear();
+ }
+
+ /// <summary>
+ /// Returns a clone of the graphical context list (hashtable)
+ /// </summary>
+ public Hashtable getGraphicContext()
+ {
+ return mGC.copyContextList();
+ }
+
+ }//end of class
+}//end of namespace
diff --git a/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROI.cs b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROI.cs
new file mode 100644
index 0000000..8d88cf6
--- /dev/null
+++ b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROI.cs
@@ -0,0 +1,161 @@
+using System;
+using HalconDotNet;
+
+
+namespace PointGreyAndHalcon
+{
+
+ /// <summary>
+ /// This class is a base class containing virtual methods for handling
+ /// ROIs. Therefore, an inheriting class needs to define/override these
+ /// methods to provide the ROIController with the necessary information on
+ /// its (= the ROIs) shape and position. The example project provides
+ /// derived ROI shapes for rectangles, lines, circles, and circular arcs.
+ /// To use other shapes you must derive a new class from the base class
+ /// ROI and implement its methods.
+ /// </summary>
+ public class ROI
+ {
+
+ // class members of inheriting ROI classes
+ protected int NumHandles;
+ protected int activeHandleIdx;
+
+ /// <summary>
+ /// Flag to define the ROI to be 'positive' or 'negative'.
+ /// </summary>
+ protected int OperatorFlag;
+
+ /// <summary>Parameter to define the line style of the ROI.</summary>
+ public HTuple flagLineStyle;
+
+ /// <summary>Constant for a positive ROI flag.</summary>
+ public const int POSITIVE_FLAG = ROIController.MODE_ROI_POS;
+
+ /// <summary>Constant for a negative ROI flag.</summary>
+ public const int NEGATIVE_FLAG = ROIController.MODE_ROI_NEG;
+
+ public const int ROI_TYPE_LINE = 10;
+ public const int ROI_TYPE_CIRCLE = 11;
+ public const int ROI_TYPE_CIRCLEARC = 12;
+ public const int ROI_TYPE_RECTANCLE1 = 13;
+ public const int ROI_TYPE_RECTANGLE2 = 14;
+
+
+ protected HTuple posOperation = new HTuple();
+ protected HTuple negOperation = new HTuple(new int[] { 2, 2 });
+
+ /// <summary>Constructor of abstract ROI class.</summary>
+ public ROI() { }
+
+ /// <summary>Creates a new ROI instance at the mouse position.</summary>
+ /// <param name="midX">
+ /// x (=column) coordinate for ROI
+ /// </param>
+ /// <param name="midY">
+ /// y (=row) coordinate for ROI
+ /// </param>
+ public virtual void createROI(double midX, double midY) { }
+
+ /// <summary>Paints the ROI into the supplied window.</summary>
+ /// <param name="window">HALCON window</param>
+ public virtual void draw(HalconDotNet.HWindow window) { }
+
+ /// <summary>
+ /// Returns the distance of the ROI handle being
+ /// closest to the image point(x,y)
+ /// </summary>
+ /// <param name="x">x (=column) coordinate</param>
+ /// <param name="y">y (=row) coordinate</param>
+ /// <returns>
+ /// Distance of the closest ROI handle.
+ /// </returns>
+ public virtual double distToClosestHandle(double x, double y)
+ {
+ return 0.0;
+ }
+
+ /// <summary>
+ /// Paints the active handle of the ROI object into the supplied window.
+ /// </summary>
+ /// <param name="window">HALCON window</param>
+ public virtual void displayActive(HalconDotNet.HWindow window) { }
+
+ /// <summary>
+ /// Recalculates the shape of the ROI. Translation is
+ /// performed at the active handle of the ROI object
+ /// for the image coordinate (x,y).
+ /// </summary>
+ /// <param name="x">x (=column) coordinate</param>
+ /// <param name="y">y (=row) coordinate</param>
+ public virtual void moveByHandle(double x, double y) { }
+
+ /// <summary>Gets the HALCON region described by the ROI.</summary>
+ public virtual HRegion getRegion()
+ {
+ return null;
+ }
+
+ public virtual double getDistanceFromStartPoint(double row, double col)
+ {
+ return 0.0;
+ }
+ /// <summary>
+ /// Gets the model information described by
+ /// the ROI.
+ /// </summary>
+ public virtual HTuple getModelData()
+ {
+ return null;
+ }
+
+ /// <summary>Number of handles defined for the ROI.</summary>
+ /// <returns>Number of handles</returns>
+ public int getNumHandles()
+ {
+ return NumHandles;
+ }
+
+ /// <summary>Gets the active handle of the ROI.</summary>
+ /// <returns>Index of the active handle (from the handle list)</returns>
+ public int getActHandleIdx()
+ {
+ return activeHandleIdx;
+ }
+
+ /// <summary>
+ /// Gets the sign of the ROI object, being either
+ /// 'positive' or 'negative'. This sign is used when creating a model
+ /// region for matching applications from a list of ROIs.
+ /// </summary>
+ public int getOperatorFlag()
+ {
+ return OperatorFlag;
+ }
+
+ /// <summary>
+ /// Sets the sign of a ROI object to be positive or negative.
+ /// The sign is used when creating a model region for matching
+ /// applications by summing up all positive and negative ROI models
+ /// created so far.
+ /// </summary>
+ /// <param name="flag">Sign of ROI object</param>
+ public void setOperatorFlag(int flag)
+ {
+ OperatorFlag = flag;
+
+ switch (OperatorFlag)
+ {
+ case ROI.POSITIVE_FLAG:
+ flagLineStyle = posOperation;
+ break;
+ case ROI.NEGATIVE_FLAG:
+ flagLineStyle = negOperation;
+ break;
+ default:
+ flagLineStyle = posOperation;
+ break;
+ }
+ }
+ }//end of class
+}//end of namespace
diff --git a/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROICircle.cs b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROICircle.cs
new file mode 100644
index 0000000..234aa61
--- /dev/null
+++ b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROICircle.cs
@@ -0,0 +1,155 @@
+using System;
+using HalconDotNet;
+
+namespace PointGreyAndHalcon
+{
+ /// <summary>
+ /// This class demonstrates one of the possible implementations for a
+ /// circular ROI. ROICircle inherits from the base class ROI and
+ /// implements (besides other auxiliary methods) all virtual methods
+ /// defined in ROI.cs.
+ /// </summary>
+ public class ROICircle : ROI
+ {
+
+ private double radius;
+ private double row1, col1; // first handle
+ private double midR, midC; // second handle
+
+
+ public ROICircle()
+ {
+ NumHandles = 2; // one at corner of circle + midpoint
+ activeHandleIdx = 1;
+ }
+
+
+
+ /// <summary>Creates a new ROI instance at the mouse position</summary>
+ public override void createROI(double midX, double midY)
+ {
+ midR = midY;
+ midC = midX;
+
+ radius = 100;
+
+ row1 = midR;
+ col1 = midC + radius;
+ }
+
+ /// <summary>Paints the ROI into the supplied window</summary>
+ /// <param name="window">HALCON window</param>
+ public override void draw(HalconDotNet.HWindow window)
+ {
+ window.DispCircle(midR, midC, radius);
+ window.DispRectangle2(row1, col1, 0, 5, 5);
+ window.DispRectangle2(midR, midC, 0, 5, 5);
+ }
+
+ /// <summary>
+ /// Returns the distance of the ROI handle being
+ /// closest to the image point(x,y)
+ /// </summary>
+ public override double distToClosestHandle(double x, double y)
+ {
+ double max = 10000;
+ double [] val = new double[NumHandles];
+
+ val[0] = HMisc.DistancePp(y, x, row1, col1); // border handle
+ val[1] = HMisc.DistancePp(y, x, midR, midC); // midpoint
+
+ for (int i=0; i < NumHandles; i++)
+ {
+ if (val[i] < max)
+ {
+ max = val[i];
+ activeHandleIdx = i;
+ }
+ }// end of for
+ return val[activeHandleIdx];
+ }
+
+ /// <summary>
+ /// Paints the active handle of the ROI object into the supplied window
+ /// </summary>
+ public override void displayActive(HalconDotNet.HWindow window)
+ {
+
+ switch (activeHandleIdx)
+ {
+ case 0:
+ window.DispRectangle2(row1, col1, 0, 5, 5);
+ break;
+ case 1:
+ window.DispRectangle2(midR, midC, 0, 5, 5);
+ break;
+ }
+ }
+
+ /// <summary>Gets the HALCON region described by the ROI</summary>
+ public override HRegion getRegion()
+ {
+ HRegion region = new HRegion();
+ region.GenCircle(midR, midC, radius);
+ return region;
+ }
+
+ public override double getDistanceFromStartPoint(double row, double col)
+ {
+ double sRow = midR; // assumption: we have an angle starting at 0.0
+ double sCol = midC + 1 * radius;
+
+ double angle = HMisc.AngleLl(midR, midC, sRow, sCol, midR, midC, row, col);
+
+ if (angle < 0)
+ angle += 2 * Math.PI;
+
+ return (radius * angle);
+ }
+
+ /// <summary>
+ /// Gets the model information described by
+ /// the ROI
+ /// </summary>
+ public override HTuple getModelData()
+ {
+ return new HTuple(new double[] { midR, midC, radius });
+ }
+
+ /// <summary>
+ /// Recalculates the shape of the ROI. Translation is
+ /// performed at the active handle of the ROI object
+ /// for the image coordinate (x,y)
+ /// </summary>
+ public override void moveByHandle(double newX, double newY)
+ {
+ HTuple distance;
+ double shiftX,shiftY;
+
+ switch (activeHandleIdx)
+ {
+ case 0: // handle at circle border
+
+ row1 = newY;
+ col1 = newX;
+ HOperatorSet.DistancePp(new HTuple(row1), new HTuple(col1),
+ new HTuple(midR), new HTuple(midC),
+ out distance);
+
+ radius = distance[0].D;
+ break;
+ case 1: // midpoint
+
+ shiftY = midR - newY;
+ shiftX = midC - newX;
+
+ midR = newY;
+ midC = newX;
+
+ row1 -= shiftY;
+ col1 -= shiftX;
+ break;
+ }
+ }
+ }//end of class
+}//end of namespace
diff --git a/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROICircularArc.cs b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROICircularArc.cs
new file mode 100644
index 0000000..e81f2cc
--- /dev/null
+++ b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROICircularArc.cs
@@ -0,0 +1,305 @@
+using System;
+using HalconDotNet;
+
+namespace PointGreyAndHalcon
+{
+
+ /// <summary>
+ /// This class implements an ROI shaped as a circular
+ /// arc. ROICircularArc inherits from the base class ROI and
+ /// implements (besides other auxiliary methods) all virtual methods
+ /// defined in ROI.cs.
+ /// </summary>
+ public class ROICircularArc : ROI
+ {
+ //handles
+ private double midR, midC; // 0. handle: midpoint
+ private double sizeR, sizeC; // 1. handle
+ private double startR, startC; // 2. handle
+ private double extentR, extentC; // 3. handle
+
+ //model data to specify the arc
+ private double radius;
+ private double startPhi, extentPhi; // -2*PI <= x <= 2*PI
+
+ //display attributes
+ private HXLDCont contour;
+ private HXLDCont arrowHandleXLD;
+ private string circDir;
+ private double TwoPI;
+ private double PI;
+
+
+ public ROICircularArc()
+ {
+ NumHandles = 4; // midpoint handle + three handles on the arc
+ activeHandleIdx = 0;
+ contour = new HXLDCont();
+ circDir = "";
+
+ TwoPI = 2 * Math.PI;
+ PI = Math.PI;
+
+ arrowHandleXLD = new HXLDCont();
+ arrowHandleXLD.GenEmptyObj();
+ }
+
+ /// <summary>Creates a new ROI instance at the mouse position</summary>
+ public override void createROI(double midX, double midY)
+ {
+ midR = midY;
+ midC = midX;
+
+ radius = 100;
+
+ sizeR = midR;
+ sizeC = midC - radius;
+
+ startPhi = PI * 0.25;
+ extentPhi = PI * 1.5;
+ circDir = "positive";
+
+ determineArcHandles();
+ updateArrowHandle();
+ }
+
+ /// <summary>Paints the ROI into the supplied window</summary>
+ /// <param name="window">HALCON window</param>
+ public override void draw(HalconDotNet.HWindow window)
+ {
+ contour.Dispose();
+ contour.GenCircleContourXld(midR, midC, radius, startPhi,
+ (startPhi + extentPhi), circDir, 1.0);
+ window.DispObj(contour);
+ window.DispRectangle2(sizeR, sizeC, 0, 5, 5);
+ window.DispRectangle2(midR, midC, 0, 5, 5);
+ window.DispRectangle2(startR, startC, startPhi, 10, 2);
+ window.DispObj(arrowHandleXLD);
+ }
+
+ /// <summary>
+ /// Returns the distance of the ROI handle being
+ /// closest to the image point(x,y)
+ /// </summary>
+ public override double distToClosestHandle(double x, double y)
+ {
+ double max = 10000;
+ double [] val = new double[NumHandles];
+
+ val[0] = HMisc.DistancePp(y, x, midR, midC); // midpoint
+ val[1] = HMisc.DistancePp(y, x, sizeR, sizeC); // border handle
+ val[2] = HMisc.DistancePp(y, x, startR, startC); // border handle
+ val[3] = HMisc.DistancePp(y, x, extentR, extentC); // border handle
+
+ for (int i=0; i < NumHandles; i++)
+ {
+ if (val[i] < max)
+ {
+ max = val[i];
+ activeHandleIdx = i;
+ }
+ }// end of for
+ return val[activeHandleIdx];
+ }
+
+ /// <summary>
+ /// Paints the active handle of the ROI object into the supplied window
+ /// </summary>
+ public override void displayActive(HalconDotNet.HWindow window)
+ {
+ switch (activeHandleIdx)
+ {
+ case 0:
+ window.DispRectangle2(midR, midC, 0, 5, 5);
+ break;
+ case 1:
+ window.DispRectangle2(sizeR, sizeC, 0, 5, 5);
+ break;
+ case 2:
+ window.DispRectangle2(startR, startC, startPhi, 10, 2);
+ break;
+ case 3:
+ window.DispObj(arrowHandleXLD);
+ break;
+ }
+ }
+
+ /// <summary>
+ /// Recalculates the shape of the ROI. Translation is
+ /// performed at the active handle of the ROI object
+ /// for the image coordinate (x,y)
+ /// </summary>
+ public override void moveByHandle(double newX, double newY)
+ {
+ HTuple distance;
+ double dirX, dirY, prior, next, valMax, valMin;
+
+ switch (activeHandleIdx)
+ {
+ case 0: // midpoint
+ dirY = midR - newY;
+ dirX = midC - newX;
+
+ midR = newY;
+ midC = newX;
+
+ sizeR -= dirY;
+ sizeC -= dirX;
+
+ determineArcHandles();
+ break;
+
+ case 1: // handle at circle border
+ sizeR = newY;
+ sizeC = newX;
+
+ HOperatorSet.DistancePp(new HTuple(sizeR), new HTuple(sizeC),
+ new HTuple(midR), new HTuple(midC), out distance);
+ radius = distance[0].D;
+ determineArcHandles();
+ break;
+
+ case 2: // start handle for arc
+ dirY = newY - midR;
+ dirX = newX - midC;
+
+ startPhi = Math.Atan2(-dirY, dirX);
+
+ if (startPhi < 0)
+ startPhi = PI + (startPhi + PI);
+
+ setStartHandle();
+ prior = extentPhi;
+ extentPhi = HMisc.AngleLl(midR, midC, startR, startC, midR, midC, extentR, extentC);
+
+ if (extentPhi < 0 && prior > PI * 0.8)
+ extentPhi = (PI + extentPhi) + PI;
+ else if (extentPhi > 0 && prior < -PI * 0.7)
+ extentPhi = -PI - (PI - extentPhi);
+
+ break;
+
+ case 3: // end handle for arc
+ dirY = newY - midR;
+ dirX = newX - midC;
+
+ prior = extentPhi;
+ next = Math.Atan2(-dirY, dirX);
+
+ if (next < 0)
+ next = PI + (next + PI);
+
+ if (circDir == "positive" && startPhi >= next)
+ extentPhi = (next + TwoPI) - startPhi;
+ else if (circDir == "positive" && next > startPhi)
+ extentPhi = next - startPhi;
+ else if (circDir == "negative" && startPhi >= next)
+ extentPhi = -1.0 * (startPhi - next);
+ else if (circDir == "negative" && next > startPhi)
+ extentPhi = -1.0 * (startPhi + TwoPI - next);
+
+ valMax = Math.Max(Math.Abs(prior), Math.Abs(extentPhi));
+ valMin = Math.Min(Math.Abs(prior), Math.Abs(extentPhi));
+
+ if ((valMax - valMin) >= PI)
+ extentPhi = (circDir == "positive") ? -1.0 * valMin : valMin;
+
+ setExtentHandle();
+ break;
+ }
+
+ circDir = (extentPhi < 0) ? "negative" : "positive";
+ updateArrowHandle();
+ }
+
+ /// <summary>Gets the HALCON region described by the ROI</summary>
+ public override HRegion getRegion()
+ {
+ HRegion region;
+ contour.Dispose();
+ contour.GenCircleContourXld(midR, midC, radius, startPhi, (startPhi + extentPhi), circDir, 1.0);
+ region = new HRegion(contour);
+ return region;
+ }
+
+ /// <summary>
+ /// Gets the model information described by the ROI
+ /// </summary>
+ public override HTuple getModelData()
+ {
+ return new HTuple(new double[] { midR, midC, radius, startPhi, extentPhi });
+ }
+
+ /// <summary>
+ /// Auxiliary method to determine the positions of the second and
+ /// third handle.
+ /// </summary>
+ private void determineArcHandles()
+ {
+ setStartHandle();
+ setExtentHandle();
+ }
+
+ /// <summary>
+ /// Auxiliary method to recalculate the start handle for the arc
+ /// </summary>
+ private void setStartHandle()
+ {
+ startR = midR - radius * Math.Sin(startPhi);
+ startC = midC + radius * Math.Cos(startPhi);
+ }
+
+ /// <summary>
+ /// Auxiliary method to recalculate the extent handle for the arc
+ /// </summary>
+ private void setExtentHandle()
+ {
+ extentR = midR - radius * Math.Sin(startPhi + extentPhi);
+ extentC = midC + radius * Math.Cos(startPhi + extentPhi);
+ }
+
+ /// <summary>
+ /// Auxiliary method to display an arrow at the extent arc position
+ /// </summary>
+ private void updateArrowHandle()
+ {
+ double row1, col1, row2, col2;
+ double rowP1, colP1, rowP2, colP2;
+ double length,dr,dc, halfHW, sign, angleRad;
+ double headLength = 15;
+ double headWidth = 15;
+
+ arrowHandleXLD.Dispose();
+ arrowHandleXLD.GenEmptyObj();
+
+ row2 = extentR;
+ col2 = extentC;
+ angleRad = (startPhi + extentPhi) + Math.PI * 0.5;
+
+ sign = (circDir == "negative") ? -1.0 : 1.0;
+ row1 = row2 + sign * Math.Sin(angleRad) * 20;
+ col1 = col2 - sign * Math.Cos(angleRad) * 20;
+
+ length = HMisc.DistancePp(row1, col1, row2, col2);
+ if (length == 0)
+ length = -1;
+
+ dr = (row2 - row1) / length;
+ dc = (col2 - col1) / length;
+
+ halfHW = headWidth / 2.0;
+ rowP1 = row1 + (length - headLength) * dr + halfHW * dc;
+ rowP2 = row1 + (length - headLength) * dr - halfHW * dc;
+ colP1 = col1 + (length - headLength) * dc - halfHW * dr;
+ colP2 = col1 + (length - headLength) * dc + halfHW * dr;
+
+ if (length == -1)
+ arrowHandleXLD.GenContourPolygonXld(row1, col1);
+ else
+ arrowHandleXLD.GenContourPolygonXld(new HTuple(new double[] { row1, row2, rowP1, row2, rowP2, row2 }),
+ new HTuple(new double[] { col1, col2, colP1, col2, colP2, col2 }));
+ }
+
+ }//end of class
+}//end of namespace
+
diff --git a/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROIController.cs b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROIController.cs
new file mode 100644
index 0000000..0589dda
--- /dev/null
+++ b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROIController.cs
@@ -0,0 +1,401 @@
+using System;
+using HalconDotNet;
+using System.Collections;
+
+
+
+namespace PointGreyAndHalcon
+{
+
+ public delegate void FuncROIDelegate();
+
+ /// <summary>
+ /// This class creates and manages ROI objects. It responds
+ /// to mouse device inputs using the methods mouseDownAction and
+ /// mouseMoveAction. You don't have to know this class in detail when you
+ /// build your own C# project. But you must consider a few things if
+ /// you want to use interactive ROIs in your application: There is a
+ /// quite close connection between the ROIController and the HWndCtrl
+ /// class, which means that you must 'register' the ROIController
+ /// with the HWndCtrl, so the HWndCtrl knows it has to forward user input
+ /// (like mouse events) to the ROIController class.
+ /// The visualization and manipulation of the ROI objects is done
+ /// by the ROIController.
+ /// This class provides special support for the matching
+ /// applications by calculating a model region from the list of ROIs. For
+ /// this, ROIs are added and subtracted according to their sign.
+ /// </summary>
+ public class ROIController
+ {
+
+ /// <summary>
+ /// Constant for setting the ROI mode: positive ROI sign.
+ /// </summary>
+ public const int MODE_ROI_POS = 21;
+
+ /// <summary>
+ /// Constant for setting the ROI mode: negative ROI sign.
+ /// </summary>
+ public const int MODE_ROI_NEG = 22;
+
+ /// <summary>
+ /// Constant for setting the ROI mode: no model region is computed as
+ /// the sum of all ROI objects.
+ /// </summary>
+ public const int MODE_ROI_NONE = 23;
+
+ /// <summary>Constant describing an update of the model region</summary>
+ public const int EVENT_UPDATE_ROI = 50;
+
+ public const int EVENT_CHANGED_ROI_SIGN = 51;
+
+ /// <summary>Constant describing an update of the model region</summary>
+ public const int EVENT_MOVING_ROI = 52;
+
+ public const int EVENT_DELETED_ACTROI = 53;
+
+ public const int EVENT_DELETED_ALL_ROIS = 54;
+
+ public const int EVENT_ACTIVATED_ROI = 55;
+
+ public const int EVENT_CREATED_ROI = 56;
+
+
+ private ROI roiMode;
+ private int stateROI;
+ private double currX, currY;
+
+
+ /// <summary>Index of the active ROI object</summary>
+ public int activeROIidx;
+ public int deletedIdx;
+
+ /// <summary>List containing all created ROI objects so far</summary>
+ public ArrayList ROIList;
+
+ /// <summary>
+ /// Region obtained by summing up all negative
+ /// and positive ROI objects from the ROIList
+ /// </summary>
+ public HRegion ModelROI;
+
+ private string activeCol = "green";
+ private string activeHdlCol = "red";
+ private string inactiveCol = "yellow";
+
+ /// <summary>
+ /// Reference to the HWndCtrl, the ROI Controller is registered to
+ /// </summary>
+ public HWndCtrl viewController;
+
+ /// <summary>
+ /// Delegate that notifies about changes made in the model region
+ /// </summary>
+ public IconicDelegate NotifyRCObserver;
+
+ /// <summary>Constructor</summary>
+ public ROIController()
+ {
+ stateROI = MODE_ROI_NONE;
+ ROIList = new ArrayList();
+ activeROIidx = -1;
+ ModelROI = new HRegion();
+ NotifyRCObserver = new IconicDelegate(dummyI);
+ deletedIdx = -1;
+ currX = currY = -1;
+ }
+
+ /// <summary>Registers the HWndCtrl to this ROIController instance</summary>
+ public void setViewController(HWndCtrl view)
+ {
+ viewController = view;
+ }
+
+ /// <summary>Gets the ModelROI object</summary>
+ public HRegion getModelRegion()
+ {
+ return ModelROI;
+ }
+
+ /// <summary>Gets the List of ROIs created so far</summary>
+ public ArrayList getROIList()
+ {
+ return ROIList;
+ }
+
+ /// <summary>Get the active ROI</summary>
+ public ROI getActiveROI()
+ {
+ if (activeROIidx != -1)
+ return ((ROI)ROIList[activeROIidx]);
+
+ return null;
+ }
+
+ public int getActiveROIIdx()
+ {
+ return activeROIidx;
+ }
+
+ public void setActiveROIIdx(int active)
+ {
+ activeROIidx = active;
+ }
+
+ public int getDelROIIdx()
+ {
+ return deletedIdx;
+ }
+
+ /// <summary>
+ /// To create a new ROI object the application class initializes a
+ /// 'seed' ROI instance and passes it to the ROIController.
+ /// The ROIController now responds by manipulating this new ROI
+ /// instance.
+ /// </summary>
+ /// <param name="r">
+ /// 'Seed' ROI object forwarded by the application forms class.
+ /// </param>
+ public void setROIShape(ROI r)
+ {
+ roiMode = r;
+ roiMode.setOperatorFlag(stateROI);
+ }
+
+
+ /// <summary>
+ /// Sets the sign of a ROI object to the value 'mode' (MODE_ROI_NONE,
+ /// MODE_ROI_POS,MODE_ROI_NEG)
+ /// </summary>
+ public void setROISign(int mode)
+ {
+ stateROI = mode;
+
+ if (activeROIidx != -1)
+ {
+ ((ROI)ROIList[activeROIidx]).setOperatorFlag(stateROI);
+ viewController.repaint();
+ NotifyRCObserver(ROIController.EVENT_CHANGED_ROI_SIGN);
+ }
+ }
+
+ /// <summary>
+ /// Removes the ROI object that is marked as active.
+ /// If no ROI object is active, then nothing happens.
+ /// </summary>
+ public void removeActive()
+ {
+ if (activeROIidx != -1)
+ {
+ ROIList.RemoveAt(activeROIidx);
+ deletedIdx = activeROIidx;
+ activeROIidx = -1;
+ viewController.repaint();
+ NotifyRCObserver(EVENT_DELETED_ACTROI);
+ }
+ }
+
+
+ /// <summary>
+ /// Calculates the ModelROI region for all objects contained
+ /// in ROIList, by adding and subtracting the positive and
+ /// negative ROI objects.
+ /// </summary>
+ public bool defineModelROI()
+ {
+ HRegion tmpAdd, tmpDiff, tmp;
+ double row, col;
+
+ if (stateROI == MODE_ROI_NONE)
+ return true;
+
+ tmpAdd = new HRegion();
+ tmpDiff = new HRegion();
+ tmpAdd.GenEmptyRegion();
+ tmpDiff.GenEmptyRegion();
+
+ for (int i=0; i < ROIList.Count; i++)
+ {
+ switch (((ROI)ROIList[i]).getOperatorFlag())
+ {
+ case ROI.POSITIVE_FLAG:
+ tmp = ((ROI)ROIList[i]).getRegion();
+ tmpAdd = tmp.Union2(tmpAdd);
+ break;
+ case ROI.NEGATIVE_FLAG:
+ tmp = ((ROI)ROIList[i]).getRegion();
+ tmpDiff = tmp.Union2(tmpDiff);
+ break;
+ default:
+ break;
+ }//end of switch
+ }//end of for
+
+ ModelROI = null;
+
+ if (tmpAdd.AreaCenter(out row, out col) > 0)
+ {
+ tmp = tmpAdd.Difference(tmpDiff);
+ if (tmp.AreaCenter(out row, out col) > 0)
+ ModelROI = tmp;
+ }
+
+ //in case the set of positiv and negative ROIs dissolve
+ if (ModelROI == null || ROIList.Count == 0)
+ return false;
+
+ return true;
+ }
+
+
+ /// <summary>
+ /// Clears all variables managing ROI objects
+ /// </summary>
+ public void reset()
+ {
+ ROIList.Clear();
+ activeROIidx = -1;
+ ModelROI = null;
+ roiMode = null;
+ NotifyRCObserver(EVENT_DELETED_ALL_ROIS);
+ }
+
+
+ /// <summary>
+ /// Deletes this ROI instance if a 'seed' ROI object has been passed
+ /// to the ROIController by the application class.
+ ///
+ /// </summary>
+ public void resetROI()
+ {
+ activeROIidx = -1;
+ roiMode = null;
+ }
+
+ /// <summary>Defines the colors for the ROI objects</summary>
+ /// <param name="aColor">Color for the active ROI object</param>
+ /// <param name="inaColor">Color for the inactive ROI objects</param>
+ /// <param name="aHdlColor">
+ /// Color for the active handle of the active ROI object
+ /// </param>
+ public void setDrawColor(string aColor,
+ string aHdlColor,
+ string inaColor)
+ {
+ if (aColor != "")
+ activeCol = aColor;
+ if (aHdlColor != "")
+ activeHdlCol = aHdlColor;
+ if (inaColor != "")
+ inactiveCol = inaColor;
+ }
+
+
+ /// <summary>
+ /// Paints all objects from the ROIList into the HALCON window
+ /// </summary>
+ /// <param name="window">HALCON window</param>
+ public void paintData(HalconDotNet.HWindow window)
+ {
+ window.SetDraw("margin");
+ window.SetLineWidth(1);
+
+ if (ROIList.Count > 0)
+ {
+ window.SetColor(inactiveCol);
+ window.SetDraw("margin");
+
+ for (int i=0; i < ROIList.Count; i++)
+ {
+ window.SetLineStyle(((ROI)ROIList[i]).flagLineStyle);
+ ((ROI)ROIList[i]).draw(window);
+ }
+
+ if (activeROIidx != -1)
+ {
+ window.SetColor(activeCol);
+ window.SetLineStyle(((ROI)ROIList[activeROIidx]).flagLineStyle);
+ ((ROI)ROIList[activeROIidx]).draw(window);
+
+ window.SetColor(activeHdlCol);
+ ((ROI)ROIList[activeROIidx]).displayActive(window);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Reaction of ROI objects to the 'mouse button down' event: changing
+ /// the shape of the ROI and adding it to the ROIList if it is a 'seed'
+ /// ROI.
+ /// </summary>
+ /// <param name="imgX">x coordinate of mouse event</param>
+ /// <param name="imgY">y coordinate of mouse event</param>
+ /// <returns></returns>
+ public int mouseDownAction(double imgX, double imgY)
+ {
+ int idxROI= -1;
+ double max = 10000, dist = 0;
+ double epsilon = 35.0; //maximal shortest distance to one of
+ //the handles
+
+ if (roiMode != null) //either a new ROI object is created
+ {
+ roiMode.createROI(imgX, imgY);
+ ROIList.Add(roiMode);
+ roiMode = null;
+ activeROIidx = ROIList.Count - 1;
+ viewController.repaint();
+
+ NotifyRCObserver(ROIController.EVENT_CREATED_ROI);
+ }
+ else if (ROIList.Count > 0) // ... or an existing one is manipulated
+ {
+ activeROIidx = -1;
+
+ for (int i =0; i < ROIList.Count; i++)
+ {
+ dist = ((ROI)ROIList[i]).distToClosestHandle(imgX, imgY);
+ if ((dist < max) && (dist < epsilon))
+ {
+ max = dist;
+ idxROI = i;
+ }
+ }//end of for
+
+ if (idxROI >= 0)
+ {
+ activeROIidx = idxROI;
+ NotifyRCObserver(ROIController.EVENT_ACTIVATED_ROI);
+ }
+
+ viewController.repaint();
+ }
+ return activeROIidx;
+ }
+
+ /// <summary>
+ /// Reaction of ROI objects to the 'mouse button move' event: moving
+ /// the active ROI.
+ /// </summary>
+ /// <param name="newX">x coordinate of mouse event</param>
+ /// <param name="newY">y coordinate of mouse event</param>
+ public void mouseMoveAction(double newX, double newY)
+ {
+ if ((newX == currX) && (newY == currY))
+ return;
+
+ ((ROI)ROIList[activeROIidx]).moveByHandle(newX, newY);
+ viewController.repaint();
+ currX = newX;
+ currY = newY;
+ NotifyRCObserver(ROIController.EVENT_MOVING_ROI);
+ }
+
+
+ /***********************************************************/
+ public void dummyI(int v)
+ {
+ }
+
+ }//end of class
+}//end of namespace
diff --git a/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROILine.cs b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROILine.cs
new file mode 100644
index 0000000..684680a
--- /dev/null
+++ b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROILine.cs
@@ -0,0 +1,202 @@
+using System;
+using HalconDotNet;
+
+namespace PointGreyAndHalcon
+{
+ /// <summary>
+ /// This class demonstrates one of the possible implementations for a
+ /// linear ROI. ROILine inherits from the base class ROI and
+ /// implements (besides other auxiliary methods) all virtual methods
+ /// defined in ROI.cs.
+ /// </summary>
+ public class ROILine : ROI
+ {
+
+ private double row1, col1; // first end point of line
+ private double row2, col2; // second end point of line
+ private double midR, midC; // midPoint of line
+
+ private HXLDCont arrowHandleXLD;
+
+ public ROILine()
+ {
+ NumHandles = 3; // two end points of line
+ activeHandleIdx = 2;
+ arrowHandleXLD = new HXLDCont();
+ arrowHandleXLD.GenEmptyObj();
+ }
+
+
+ /// <summary>Creates a new ROI instance at the mouse position.</summary>
+ public override void createROI(double midX, double midY)
+ {
+ midR = midY;
+ midC = midX;
+
+ row1 = midR;
+ col1 = midC - 50;
+ row2 = midR;
+ col2 = midC + 50;
+
+ updateArrowHandle();
+ }
+
+ /// <summary>Paints the ROI into the supplied window.</summary>
+ public override void draw(HalconDotNet.HWindow window)
+ {
+
+ window.DispLine(row1, col1, row2, col2);
+
+ window.DispRectangle2(row1, col1, 0, 5, 5);
+ window.DispObj(arrowHandleXLD); //window.DispRectangle2( row2, col2, 0, 5, 5);
+ window.DispRectangle2(midR, midC, 0, 5, 5);
+ }
+
+ /// <summary>
+ /// Returns the distance of the ROI handle being
+ /// closest to the image point(x,y).
+ /// </summary>
+ public override double distToClosestHandle(double x, double y)
+ {
+
+ double max = 10000;
+ double [] val = new double[NumHandles];
+
+ val[0] = HMisc.DistancePp(y, x, row1, col1); // upper left
+ val[1] = HMisc.DistancePp(y, x, row2, col2); // upper right
+ val[2] = HMisc.DistancePp(y, x, midR, midC); // midpoint
+
+ for (int i=0; i < NumHandles; i++)
+ {
+ if (val[i] < max)
+ {
+ max = val[i];
+ activeHandleIdx = i;
+ }
+ }// end of for
+
+ return val[activeHandleIdx];
+ }
+
+ /// <summary>
+ /// Paints the active handle of the ROI object into the supplied window.
+ /// </summary>
+ public override void displayActive(HalconDotNet.HWindow window)
+ {
+
+ switch (activeHandleIdx)
+ {
+ case 0:
+ window.DispRectangle2(row1, col1, 0, 5, 5);
+ break;
+ case 1:
+ window.DispObj(arrowHandleXLD); //window.DispRectangle2(row2, col2, 0, 5, 5);
+ break;
+ case 2:
+ window.DispRectangle2(midR, midC, 0, 5, 5);
+ break;
+ }
+ }
+
+ /// <summary>Gets the HALCON region described by the ROI.</summary>
+ public override HRegion getRegion()
+ {
+ HRegion region = new HRegion();
+ region.GenRegionLine(row1, col1, row2, col2);
+ return region;
+ }
+
+ public override double getDistanceFromStartPoint(double row, double col)
+ {
+ double distance = HMisc.DistancePp(row, col, row1, col1);
+ return distance;
+ }
+ /// <summary>
+ /// Gets the model information described by
+ /// the ROI.
+ /// </summary>
+ public override HTuple getModelData()
+ {
+ return new HTuple(new double[] { row1, col1, row2, col2 });
+ }
+
+ /// <summary>
+ /// Recalculates the shape of the ROI. Translation is
+ /// performed at the active handle of the ROI object
+ /// for the image coordinate (x,y).
+ /// </summary>
+ public override void moveByHandle(double newX, double newY)
+ {
+ double lenR, lenC;
+
+ switch (activeHandleIdx)
+ {
+ case 0: // first end point
+ row1 = newY;
+ col1 = newX;
+
+ midR = (row1 + row2) / 2;
+ midC = (col1 + col2) / 2;
+ break;
+ case 1: // last end point
+ row2 = newY;
+ col2 = newX;
+
+ midR = (row1 + row2) / 2;
+ midC = (col1 + col2) / 2;
+ break;
+ case 2: // midpoint
+ lenR = row1 - midR;
+ lenC = col1 - midC;
+
+ midR = newY;
+ midC = newX;
+
+ row1 = midR + lenR;
+ col1 = midC + lenC;
+ row2 = midR - lenR;
+ col2 = midC - lenC;
+ break;
+ }
+ updateArrowHandle();
+ }
+
+
+ /// <summary> Auxiliary method </summary>
+ private void updateArrowHandle()
+ {
+ double length,dr,dc, halfHW;
+ double rrow1, ccol1,rowP1, colP1, rowP2, colP2;
+
+ double headLength = 15;
+ double headWidth = 15;
+
+
+ arrowHandleXLD.Dispose();
+ arrowHandleXLD.GenEmptyObj();
+
+ rrow1 = row1 + (row2 - row1) * 0.8;
+ ccol1 = col1 + (col2 - col1) * 0.8;
+
+ length = HMisc.DistancePp(rrow1, ccol1, row2, col2);
+ if (length == 0)
+ length = -1;
+
+ dr = (row2 - rrow1) / length;
+ dc = (col2 - ccol1) / length;
+
+ halfHW = headWidth / 2.0;
+ rowP1 = rrow1 + (length - headLength) * dr + halfHW * dc;
+ rowP2 = rrow1 + (length - headLength) * dr - halfHW * dc;
+ colP1 = ccol1 + (length - headLength) * dc - halfHW * dr;
+ colP2 = ccol1 + (length - headLength) * dc + halfHW * dr;
+
+ if (length == -1)
+ arrowHandleXLD.GenContourPolygonXld(rrow1, ccol1);
+ else
+ arrowHandleXLD.GenContourPolygonXld(new HTuple(new double[] { rrow1, row2, rowP1, row2, rowP2, row2 }),
+ new HTuple(new double[] { ccol1, col2, colP1, col2, colP2, col2 }));
+ }
+
+ }//end of class
+}//end of namespace
diff --git a/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROIRectangle1.cs b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROIRectangle1.cs
new file mode 100644
index 0000000..49affed
--- /dev/null
+++ b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROIRectangle1.cs
@@ -0,0 +1,211 @@
+using System;
+using HalconDotNet;
+
+
+namespace PointGreyAndHalcon
+{
+ /// <summary>
+ /// This class demonstrates one of the possible implementations for a
+ /// (simple) rectangularly shaped ROI. ROIRectangle1 inherits
+ /// from the base class ROI and implements (besides other auxiliary
+ /// methods) all virtual methods defined in ROI.cs.
+ /// Since a simple rectangle is defined by two data points, by the upper
+ /// left corner and the lower right corner, we use four values (row1/col1)
+ /// and (row2/col2) as class members to hold these positions at
+ /// any time of the program. The four corners of the rectangle can be taken
+ /// as handles, which the user can use to manipulate the size of the ROI.
+ /// Furthermore, we define a midpoint as an additional handle, with which
+ /// the user can grab and drag the ROI. Therefore, we declare NumHandles
+ /// to be 5 and set the activeHandle to be 0, which will be the upper left
+ /// corner of our ROI.
+ /// </summary>
+ public class ROIRectangle1 : ROI
+ {
+
+ private double row1, col1; // upper left
+ private double row2, col2; // lower right
+ private double midR, midC; // midpoint
+
+
+ /// <summary>Constructor</summary>
+ public ROIRectangle1()
+ {
+
+ NumHandles = 5; // 4 corner points + midpoint
+ activeHandleIdx = 4;
+ }
+
+ /// <summary>Creates a new ROI instance at the mouse position</summary>
+ /// <param name="midX">
+ /// x (=column) coordinate for interactive ROI
+ /// </param>
+ /// <param name="midY">
+ /// y (=row) coordinate for interactive ROI
+ /// </param>
+ public override void createROI(double midX, double midY)
+ {
+ midR = midY;
+ midC = midX;
+
+ row1 = midR - 50;
+ col1 = midC - 50;
+ row2 = midR + 50;
+ col2 = midC + 50;
+ }
+
+ /// <summary>Paints the ROI into the supplied window</summary>
+ /// <param name="window">HALCON window</param>
+ public override void draw(HalconDotNet.HWindow window)
+ {
+ window.DispRectangle1(row1, col1, row2, col2);
+
+ window.DispRectangle2(row1, col1, 0, 5, 5);
+ window.DispRectangle2(row1, col2, 0, 5, 5);
+ window.DispRectangle2(row2, col2, 0, 5, 5);
+ window.DispRectangle2(row2, col1, 0, 5, 5);
+ window.DispRectangle2(midR, midC, 0, 5, 5);
+ }
+
+ /// <summary>
+ /// Returns the distance of the ROI handle being
+ /// closest to the image point(x,y)
+ /// </summary>
+ /// <param name="x">x (=column) coordinate</param>
+ /// <param name="y">y (=row) coordinate</param>
+ /// <returns>
+ /// Distance of the closest ROI handle.
+ /// </returns>
+ public override double distToClosestHandle(double x, double y)
+ {
+
+ double max = 10000;
+ double [] val = new double[NumHandles];
+
+ midR = ((row2 - row1) / 2) + row1;
+ midC = ((col2 - col1) / 2) + col1;
+
+ val[0] = HMisc.DistancePp(y, x, row1, col1); // upper left
+ val[1] = HMisc.DistancePp(y, x, row1, col2); // upper right
+ val[2] = HMisc.DistancePp(y, x, row2, col2); // lower right
+ val[3] = HMisc.DistancePp(y, x, row2, col1); // lower left
+ val[4] = HMisc.DistancePp(y, x, midR, midC); // midpoint
+
+ for (int i=0; i < NumHandles; i++)
+ {
+ if (val[i] < max)
+ {
+ max = val[i];
+ activeHandleIdx = i;
+ }
+ }// end of for
+
+ return val[activeHandleIdx];
+ }
+
+ /// <summary>
+ /// Paints the active handle of the ROI object into the supplied window
+ /// </summary>
+ /// <param name="window">HALCON window</param>
+ public override void displayActive(HalconDotNet.HWindow window)
+ {
+ switch (activeHandleIdx)
+ {
+ case 0:
+ window.DispRectangle2(row1, col1, 0, 5, 5);
+ break;
+ case 1:
+ window.DispRectangle2(row1, col2, 0, 5, 5);
+ break;
+ case 2:
+ window.DispRectangle2(row2, col2, 0, 5, 5);
+ break;
+ case 3:
+ window.DispRectangle2(row2, col1, 0, 5, 5);
+ break;
+ case 4:
+ window.DispRectangle2(midR, midC, 0, 5, 5);
+ break;
+ }
+ }
+
+ /// <summary>Gets the HALCON region described by the ROI</summary>
+ public override HRegion getRegion()
+ {
+ HRegion region = new HRegion();
+ region.GenRectangle1(row1, col1, row2, col2);
+ return region;
+ }
+
+ /// <summary>
+ /// Gets the model information described by
+ /// the interactive ROI
+ /// </summary>
+ public override HTuple getModelData()
+ {
+ return new HTuple(new double[] { row1, col1, row2, col2 });
+ }
+
+
+ /// <summary>
+ /// Recalculates the shape of the ROI instance. Translation is
+ /// performed at the active handle of the ROI object
+ /// for the image coordinate (x,y)
+ /// </summary>
+ /// <param name="newX">x mouse coordinate</param>
+ /// <param name="newY">y mouse coordinate</param>
+ public override void moveByHandle(double newX, double newY)
+ {
+ double len1, len2;
+ double tmp;
+
+ switch (activeHandleIdx)
+ {
+ case 0: // upper left
+ row1 = newY;
+ col1 = newX;
+ break;
+ case 1: // upper right
+ row1 = newY;
+ col2 = newX;
+ break;
+ case 2: // lower right
+ row2 = newY;
+ col2 = newX;
+ break;
+ case 3: // lower left
+ row2 = newY;
+ col1 = newX;
+ break;
+ case 4: // midpoint
+ len1 = ((row2 - row1) / 2);
+ len2 = ((col2 - col1) / 2);
+
+ row1 = newY - len1;
+ row2 = newY + len1;
+
+ col1 = newX - len2;
+ col2 = newX + len2;
+
+ break;
+ }
+
+ if (row2 <= row1)
+ {
+ tmp = row1;
+ row1 = row2;
+ row2 = tmp;
+ }
+
+ if (col2 <= col1)
+ {
+ tmp = col1;
+ col1 = col2;
+ col2 = tmp;
+ }
+
+ midR = ((row2 - row1) / 2) + row1;
+ midC = ((col2 - col1) / 2) + col1;
+
+ }//end of method
+ }//end of class
+}//end of namespace
diff --git a/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROIRectangle2.cs b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROIRectangle2.cs
new file mode 100644
index 0000000..932caa0
--- /dev/null
+++ b/PointGreyAndHalcon/PointGreyAndHalcon/ViewROI/ROIRectangle2.cs
@@ -0,0 +1,251 @@
+using System;
+using HalconDotNet;
+
+
+
+namespace PointGreyAndHalcon
+{
+
+ /// <summary>
+ /// This class demonstrates one of the possible implementations for a
+ /// (simple) rectangularly shaped ROI. To create this rectangle we use
+ /// a center point (midR, midC), an orientation 'phi' and the half
+ /// edge lengths 'length1' and 'length2', similar to the HALCON
+ /// operator gen_rectangle2().
+ /// The class ROIRectangle2 inherits from the base class ROI and
+ /// implements (besides other auxiliary methods) all virtual methods
+ /// defined in ROI.cs.
+ /// </summary>
+ public class ROIRectangle2 : ROI
+ {
+
+ /// <summary>Half length of the rectangle side, perpendicular to phi</summary>
+ private double length1;
+
+ /// <summary>Half length of the rectangle side, in direction of phi</summary>
+ private double length2;
+
+ /// <summary>Row coordinate of midpoint of the rectangle</summary>
+ private double midR;
+
+ /// <summary>Column coordinate of midpoint of the rectangle</summary>
+ private double midC;
+
+ /// <summary>Orientation of rectangle defined in radians.</summary>
+ private double phi;
+
+ //auxiliary variables
+ HTuple rowsInit;
+ HTuple colsInit;
+ HTuple rows;
+ HTuple cols;
+
+ HHomMat2D hom2D, tmp;
+
+ /// <summary>Constructor</summary>
+ public ROIRectangle2()
+ {
+ NumHandles = 6; // 4 corners + 1 midpoint + 1 rotationpoint
+ activeHandleIdx = 4;
+ }
+
+ /// <summary>Creates a new ROI instance at the mouse position</summary>
+ /// <param name="midX">
+ /// x (=column) coordinate for interactive ROI
+ /// </param>
+ /// <param name="midY">
+ /// y (=row) coordinate for interactive ROI
+ /// </param>
+ public override void createROI(double midX, double midY)
+ {
+ midR = midY;
+ midC = midX;
+
+ length1 = 100;
+ length2 = 50;
+
+ phi = 0.0;
+
+ rowsInit = new HTuple(new double[] {-1.0, -1.0, 1.0,
+ 1.0, 0.0, 0.0 });
+ colsInit = new HTuple(new double[] {-1.0, 1.0, 1.0,
+ -1.0, 0.0, 0.6 });
+ //order ul , ur, lr, ll, mp, arrowMidpoint
+ hom2D = new HHomMat2D();
+ tmp = new HHomMat2D();
+
+ updateHandlePos();
+ }
+
+ /// <summary>Paints the ROI into the supplied window</summary>
+ /// <param name="window">HALCON window</param>
+ public override void draw(HalconDotNet.HWindow window)
+ {
+ window.DispRectangle2(midR, midC, -phi, length1, length2);
+ for (int i =0; i < NumHandles; i++)
+ window.DispRectangle2(rows[i].D, cols[i].D, -phi, 5, 5);
+
+ window.DispArrow(midR, midC, midR + (Math.Sin(phi) * length1 * 1.2),
+ midC + (Math.Cos(phi) * length1 * 1.2), 2.0);
+
+ }
+
+ /// <summary>
+ /// Returns the distance of the ROI handle being
+ /// closest to the image point(x,y)
+ /// </summary>
+ /// <param name="x">x (=column) coordinate</param>
+ /// <param name="y">y (=row) coordinate</param>
+ /// <returns>
+ /// Distance of the closest ROI handle.
+ /// </returns>
+ public override double distToClosestHandle(double x, double y)
+ {
+ double max = 10000;
+ double [] val = new double[NumHandles];
+
+
+ for (int i=0; i < NumHandles; i++)
+ val[i] = HMisc.DistancePp(y, x, rows[i].D, cols[i].D);
+
+ for (int i=0; i < NumHandles; i++)
+ {
+ if (val[i] < max)
+ {
+ max = val[i];
+ activeHandleIdx = i;
+ }
+ }
+ return val[activeHandleIdx];
+ }
+
+ /// <summary>
+ /// Paints the active handle of the ROI object into the supplied window
+ /// </summary>
+ /// <param name="window">HALCON window</param>
+ public override void displayActive(HalconDotNet.HWindow window)
+ {
+ window.DispRectangle2(rows[activeHandleIdx].D,
+ cols[activeHandleIdx].D,
+ -phi, 5, 5);
+
+ if (activeHandleIdx == 5)
+ window.DispArrow(midR, midC,
+ midR + (Math.Sin(phi) * length1 * 1.2),
+ midC + (Math.Cos(phi) * length1 * 1.2),
+ 2.0);
+ }
+
+
+ /// <summary>Gets the HALCON region described by the ROI</summary>
+ public override HRegion getRegion()
+ {
+ HRegion region = new HRegion();
+ region.GenRectangle2(midR, midC, -phi, length1, length2);
+ return region;
+ }
+
+ /// <summary>
+ /// Gets the model information described by
+ /// the interactive ROI
+ /// </summary>
+ public override HTuple getModelData()
+ {
+ return new HTuple(new double[] { midR, midC, phi, length1, length2 });
+ }
+
+ /// <summary>
+ /// Recalculates the shape of the ROI instance. Translation is
+ /// performed at the active handle of the ROI object
+ /// for the image coordinate (x,y)
+ /// </summary>
+ /// <param name="newX">x mouse coordinate</param>
+ /// <param name="newY">y mouse coordinate</param>
+ public override void moveByHandle(double newX, double newY)
+ {
+ double vX, vY, x=0, y=0;
+
+ switch (activeHandleIdx)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ tmp = hom2D.HomMat2dInvert();
+ x = tmp.AffineTransPoint2d(newX, newY, out y);
+
+ length2 = Math.Abs(y);
+ length1 = Math.Abs(x);
+
+ checkForRange(x, y);
+ break;
+ case 4:
+ midC = newX;
+ midR = newY;
+ break;
+ case 5:
+ vY = newY - rows[4].D;
+ vX = newX - cols[4].D;
+ phi = Math.Atan2(vY, vX);
+ break;
+ }
+ updateHandlePos();
+ }//end of method
+
+
+ /// <summary>
+ /// Auxiliary method to recalculate the contour points of
+ /// the rectangle by transforming the initial row and
+ /// column coordinates (rowsInit, colsInit) by the updated
+ /// homography hom2D
+ /// </summary>
+ private void updateHandlePos()
+ {
+ hom2D.HomMat2dIdentity();
+ hom2D = hom2D.HomMat2dTranslate(midC, midR);
+ hom2D = hom2D.HomMat2dRotateLocal(phi);
+ tmp = hom2D.HomMat2dScaleLocal(length1, length2);
+ cols = tmp.AffineTransPoint2d(colsInit, rowsInit, out rows);
+ }
+
+
+ /* This auxiliary method checks the half lengths
+ * (length1, length2) using the coordinates (x,y) of the four
+ * rectangle corners (handles 0 to 3) to avoid 'bending' of
+ * the rectangular ROI at its midpoint, when it comes to a
+ * 'collapse' of the rectangle for length1=length2=0.
+ * */
+ private void checkForRange(double x, double y)
+ {
+ switch (activeHandleIdx)
+ {
+ case 0:
+ if ((x < 0) && (y < 0))
+ return;
+ if (x >= 0) length1 = 0.01;
+ if (y >= 0) length2 = 0.01;
+ break;
+ case 1:
+ if ((x > 0) && (y < 0))
+ return;
+ if (x <= 0) length1 = 0.01;
+ if (y >= 0) length2 = 0.01;
+ break;
+ case 2:
+ if ((x > 0) && (y > 0))
+ return;
+ if (x <= 0) length1 = 0.01;
+ if (y <= 0) length2 = 0.01;
+ break;
+ case 3:
+ if ((x < 0) && (y > 0))
+ return;
+ if (x >= 0) length1 = 0.01;
+ if (y <= 0) length2 = 0.01;
+ break;
+ default:
+ break;
+ }
+ }
+ }//end of class
+}//end of namespace
--
Gitblit v1.8.0