提交:初始化

This commit is contained in:
longfellowJian 2025-03-27 14:13:58 +08:00
commit 1feb3b60ee
19 changed files with 1531 additions and 0 deletions

6
App.config Normal file
View File

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

BIN
Empower3.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29609.76
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Instrument Control", "Instrument Control.csproj", "{BFBFA096-A2BE-460A-BEB4-037A20FBA03C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BFBFA096-A2BE-460A-BEB4-037A20FBA03C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BFBFA096-A2BE-460A-BEB4-037A20FBA03C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BFBFA096-A2BE-460A-BEB4-037A20FBA03C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BFBFA096-A2BE-460A-BEB4-037A20FBA03C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {1748282C-4D93-4608-A089-5DC2662DF59B}
EndGlobalSection
EndGlobal

102
Instrument Control.csproj Normal file
View File

@ -0,0 +1,102 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{BFBFA096-A2BE-460A-BEB4-037A20FBA03C}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Waters.Empower.InstrumentControl.Example</RootNamespace>
<AssemblyName>InstrumentControlExample</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<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' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<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.Core" />
<Reference Include="System.ServiceProcess" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<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="frmMain.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="frmMain.designer.cs">
<DependentUpon>frmMain.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="frmMain.resx">
<DependentUpon>frmMain.cs</DependentUpon>
</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>
<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>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<COMReference Include="MillenniumToolkit">
<Guid>{984EF3B1-C6E4-11D0-8713-0020AFEE2C2A}</Guid>
<VersionMajor>1</VersionMajor>
<VersionMinor>15</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>tlbimp</WrapperTool>
<Isolated>False</Isolated>
<EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference>
</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>

19
Program.cs Normal file
View File

@ -0,0 +1,19 @@
using System;
using System.Windows.Forms;
namespace Waters.Empower.InstrumentControl.Example
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FrmMain());
}
}
}

View File

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Instrument Control Example")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Waters Corporation")]
[assembly: AssemblyProduct("Empower Tooolkit Example Code")]
[assembly: AssemblyCopyright("Copyright ©2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("1e453e70-f33b-4725-987a-268ff82ecfdc")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

63
Properties/Resources.Designer.cs generated Normal file
View File

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

117
Properties/Resources.resx Normal file
View File

@ -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>

26
Properties/Settings.Designer.cs generated Normal file
View File

@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace Waters.Empower.InstrumentControl.Example.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.2.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;
}
}
}
}

View File

@ -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>

475
frmMain.cs Normal file
View File

@ -0,0 +1,475 @@
using MillenniumToolkit;
using System;
using System.Windows.Forms;
using System.Threading;
namespace Waters.Empower.InstrumentControl.Example
{
public partial class FrmMain
{
private Project _project = new Project();
private Instrument _instrument;
public FrmMain()
{
InitializeComponent();
}
public void FrmMain_Load(System.Object sender, System.EventArgs e)
{
// TODO values are hard coded ....
string username = "system";
string pswd = "manager";
string project = "Defaults";
string db = "empower";
// Perform the login.
try
{
LogIntoToolkit(username, pswd, db, project);
MessageBox.Show("Login Complete", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
// Info can be posted to the Empower message center also
_project.MessageCenter($"{this.Text} Login Complete");
_instrument = new Instrument();
LoadSystemsForDisplay();
LoadNodesForDisplay();
LoadSampleSetMethodsForDisplay();
}
catch (System.Runtime.InteropServices.COMException ex)
{
MessageBox.Show($"Error: {_project.TkErrorDescription(ex.ErrorCode)}");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void FrmMain_FormClosed(object sender, FormClosedEventArgs e)
{
if (_instrument != null)
{
// when the form closes disconnect from the instrument
_instrument.Disconnect();
}
}
/// <summary>
/// Log into the Empower Toolkit
/// </summary>
/// <param name="username">Empower username</param>
/// <param name="pswd">Empower password</param>
/// <param name="database">Empower database</param>
/// <param name="project">Empower project</param>
private void LogIntoToolkit(string username, string pswd, string database, string project)
{
_project = new Project();
_project.Login(database, project, username, pswd);
}
/// <summary>
/// Loads the Systems ComboBox
/// </summary>
private void LoadSystemsForDisplay()
{
cbSystem.Items.Clear();
object obj = _instrument.Systems;
if (obj is System.DBNull)
{
MessageBox.Show("There are no systems available", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
string[] systems = (string[])obj;
cbSystem.Items.AddRange(systems);
}
}
/// <summary>
/// Load the Nodes ComboBox
/// </summary>
private void LoadNodesForDisplay()
{
cbNode.Items.Clear();
// Obtain the available nodes/acq servers
object obj = _instrument.AcqServers;
if (obj is System.DBNull)
{
MessageBox.Show("There are no nodes available", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
string[] nodes = (string[])obj;
cbNode.Items.AddRange(nodes);
}
}
/// <summary>
/// Loads the sample set methods ComboBox
/// </summary>
private void LoadSampleSetMethodsForDisplay()
{
cbSampleSetMethod.Items.Clear();
SampleSetMethod ssm = new SampleSetMethod();
object obj = ssm.SampleSetMethodNames;
if (obj is System.DBNull)
{
MessageBox.Show("There are no sample set methods available", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
string[] nodes = (string[])obj;
cbSampleSetMethod.Items.AddRange(nodes);
}
}
/// <summary>
/// Connect to the selected node and system
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void BtnConnect_Click(object sender, EventArgs e)
{
try
{
string nodeName = (string)cbNode.SelectedItem;
string systemName = (string)cbSystem.SelectedItem;
_instrument.Connect(nodeName, systemName);
// while the connectionstatus says the connection is not 'Done' ...
while (_instrument.ConnectionStatus.Done == false)
{
// Sleep for 1 second
Thread.Sleep(1000);
}
// Declare and obtain a copy of the connectstatus object.
ConnectionStatus connectionStatus = _instrument.ConnectionStatus;
// If the connection status text is either
// "Successfully connected to instrument server"
// OR an empty string
// Then call connection succeeded, otherwise show the text to the user.
if (connectionStatus.Text.Equals("Successfully connected to instrument server") || connectionStatus.Text.Length == 0)
{
ConnectionSucceeded();
}
else
{
MessageBox.Show($"Instrument connection failed with error : {connectionStatus.Text}", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (System.Runtime.InteropServices.COMException ex)
{
MessageBox.Show($"Error: {_project.TkErrorDescription(ex.ErrorCode)}", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ConnectionSucceeded()
{
RefreshInstrumentStatusInformation();
}
private void RefreshInstrumentStatusInformation()
{
lbStatusInformation.Items.Clear();
// Note casting should not need to be done, but there is an error in the IDL that means the return type is incorrect
InstrumentStatus instrumentStatus = (InstrumentStatus) _instrument.Status;
// Add each piece of instrument status to the list box, replace the empty string with the correct field value
// for all of the fields below
string instrumentState = string.Format("State : {0}", instrumentStatus.SystemStateDescription);
lbStatusInformation.Items.Add(instrumentState);
string systemState = string.Format("SystemState : {0}", instrumentStatus.SystemState);
lbStatusInformation.Items.Add(systemState);
string sampleSetLineNumber = string.Format("SampleSetLineNumber : {0}", instrumentStatus.SampleSetLineNumber);
lbStatusInformation.Items.Add(sampleSetLineNumber);
string vial = string.Format("Vial : {0}", instrumentStatus.Vial);
lbStatusInformation.Items.Add(vial);
string injection = string.Format("Injection : {0}", instrumentStatus.Injection);
lbStatusInformation.Items.Add(injection);
string runTime = string.Format("Run Time : {0}", instrumentStatus.RunTime);
lbStatusInformation.Items.Add(runTime);
string totalInjectionTime = string.Format("totalInjectionTime : {0}", instrumentStatus.TotalInjectionTime);
lbStatusInformation.Items.Add(totalInjectionTime);
string sampleSetMethodName = string.Format("SampleSetMethodName : {0}", instrumentStatus.SampleSetMethodName);
lbStatusInformation.Items.Add(sampleSetMethodName);
string sampleSetMethodID = string.Format("sampleSetMethodID : {0}", instrumentStatus.SampleSetMethodID);
lbStatusInformation.Items.Add(sampleSetMethodID);
string InstrumentMethodName = string.Format("InstrumentMethodName : {0}", instrumentStatus.InstrumentMethodName);
lbStatusInformation.Items.Add(InstrumentMethodName);
string sampleSetName = string.Format("Sample Set Name : {0}", instrumentStatus.SampleSetMethodName);
lbStatusInformation.Items.Add(sampleSetName);
string methodSetID = string.Format("Method Set ID : {0}", instrumentStatus.MethodSetID);
lbStatusInformation.Items.Add(methodSetID);
string methodSetName = string.Format("Method Set ID : {0}", instrumentStatus.MethodSetName);
lbStatusInformation.Items.Add(methodSetName);
}
/// <summary>
/// Starts a run
/// </summary>
public void BtnStartRun_Click(object sender, EventArgs e)
{
try
{
string sampleSetMethodName = (string)cbSampleSetMethod.SelectedItem;
string newName = txtNewSSMName.Text;
// Start the run with the selected instrument method and output sample set method name
_instrument.Run(sampleSetMethodName, newName);
RefreshInstrumentStatusInformation();
}
catch (System.Runtime.InteropServices.COMException ex)
{
MessageBox.Show($"Error: {_project.TkErrorDescription(ex.ErrorCode)}", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
public void BtnRefreshInfo_Click(object sender, EventArgs e)
{
try
{
RefreshInstrumentStatusInformation();
}
catch (System.Runtime.InteropServices.COMException ex)
{
MessageBox.Show($"Error: {_project.TkErrorDescription(ex.ErrorCode)}", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// Pause the instrument run at the end of the current injection
/// </summary>
public void BtnPauseRun_Click(object sender, EventArgs e)
{
try
{
_instrument.Pause(float.MaxValue);
}
catch (System.Runtime.InteropServices.COMException ex)
{
MessageBox.Show($"Error: {_project.TkErrorDescription(ex.ErrorCode)}", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// Modify the next line to be run on the sampleset
/// </summary>
public void BtnModifyNextLine_Click(object sender, EventArgs e)
{
try
{
// Obtain the instrument status
InstrumentStatus instrumentStatus = (InstrumentStatus)_instrument.Status;
// If the instrument status contains 'paused' ...
if (instrumentStatus.SystemStateDescription.Contains("Paused"))
{
// Obtain the sample set method name
string sampleSetMethodName = instrumentStatus.SampleSetMethodName;
// Obtain the current vial
int vialNumber = instrumentStatus.Vial;
// Instantiate a sample set method object, set the name, and call 'fetch'
SampleSetMethod ssm = new SampleSetMethod
{
Name = sampleSetMethodName
};
ssm.Fetch();
// Obtain the sample set line at the current 'vial number'
SampleSetLine ssl = ssm.SampleSetLines.Item(vialNumber);
// Update the 'Runtime' property on this line to 1 minute
ssl.Set("Runtime", "1");
// Store the changes to the database
ssm.Store();
// Continue the run with the newly changed sample set method
_instrument.Replace(ssm.Name);
}
else
{
// If the instrument status is not paused - show an error message
MessageBox.Show("Wait for the instrument to be paused first", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (System.Runtime.InteropServices.COMException ex)
{
MessageBox.Show($"Error: {_project.TkErrorDescription(ex.ErrorCode)}", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// Add a line to the end of the sample set method, and restarts a paused run with the changes made
/// </summary>
public void BtnAddALine_Click(object sender, EventArgs e)
{
try
{
// Declare and obtain the instrument status object
InstrumentStatus instrumentStatus = (InstrumentStatus)_instrument.Status;
// If the instrument status contains 'paused'..
if (instrumentStatus.SystemStateDescription.Contains("Paused"))
{
// Obtain the sample set method name
string sampleSetMethodName = instrumentStatus.SampleSetMethodName;
// Instantiate a sample set method object, set the name and call 'fetch'
SampleSetMethod ssm = new SampleSetMethod
{
Name = sampleSetMethodName
};
ssm.Fetch();
// Obtain the lst sample set line (SampleSetLines.Count - 1)
SampleSetLine ssl = ssm.SampleSetLines.Item(ssm.SampleSetLines.Count - 1);
// Call the returnLineWithNextVialPosition with the ssl and the ssl plate layout object
ssl = ReturnLineWithNextVialPosition(ssl, ssm.PlateLayouts);
// Add the newly created sample set to the end of the current sample set lines class
ssm.SampleSetLines.Add(ssl, ssm.SampleSetLines.Count - 1, MillenniumToolkit.mtkConstants.mtkAfter);
// Store the changes to the sample set
ssm.Store();
// Restart the run using the new sample set method
_instrument.Replace(sampleSetMethodName);
}
else
{
// If the instrument status is not paused - show an error message
MessageBox.Show("Wait for the instrument to be paused first", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (System.Runtime.InteropServices.COMException ex)
{
MessageBox.Show($"Error: {_project.TkErrorDescription(ex.ErrorCode)}", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// Creates a new line, with the vial position being the one AFTER the vial position
/// of the line that is passed in.
/// </summary>
/// <param name="ssl">The model sample set line</param>
/// <param name="pl">the plate layout to use for the positions</param>
/// <returns></returns>
private SampleSetLine ReturnLineWithNextVialPosition(SampleSetLine ssl, PlateLayouts pl)
{
// Get the position of the vial for the passed in line (call get on the vial field)
string lastKnownPos = (string) (ssl.Get("vial", true));
// Create a plate position object from the plate layouts
PlatePosition platePos = pl.CreatePlatePosition();
// Move to the last possible vial of the current plate layout
platePos.SetToLastVial();
// Store the value of the last possible vial in the plate layout
string maxPossiblePos = platePos.Position;
// Move the first position in the plate position
platePos.SetToFirstVial();
// If the plate layout is not lastKnownPos or maxPossiblePos
while (!platePos.Position.Equals(lastKnownPos) && !platePos.Position.Equals(maxPossiblePos))
{
// increment the vial position by 1
platePos.IncrementVial(1);
}
// If we did not reach the last possible plate position, increment the vial position to get the next position
// -i.e Is the current position the same as the maxPossiblePos
if (!platePos.Position.Equals(maxPossiblePos))
{
// increment the position of the plate pos
platePos.IncrementVial(1);
}
// Update the vial position on the line to the new vial position
ssl.Set("Vial", platePos.Position);
// Return the now modified line
return ssl;
}
/// <summary>
/// Displays the current instrument configurations for this node
///
/// TODO this is a bit Ghetto ...
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void BtnShowInstConfig_Click(object sender, EventArgs e)
{
txtShowInstrumentConfig.Text = "";
// Loop over each inst config in the instConfigs object
foreach (InstConfig instConfig in _instrument.InstConfigs)
{
// Add a line divider
txtShowInstrumentConfig.Text = $"{txtShowInstrumentConfig.Text}\r\nNew Instrument\r\n";
// For field in the instConfig fields object
foreach (string fieldname in instConfig.Fields)
{
// create the string description which shows the fieldname and its value
string desc = $"{fieldname}:{instConfig.Get(fieldname, true)}\r\n";
txtShowInstrumentConfig.Text += desc;
}
}
}
}
}

290
frmMain.designer.cs generated Normal file
View File

@ -0,0 +1,290 @@
namespace Waters.Empower.InstrumentControl.Example
{
public partial class FrmMain : System.Windows.Forms.Form
{
//Form overrides dispose to clean up the component list.
[System.Diagnostics.DebuggerNonUserCode()]protected override void Dispose(bool disposing)
{
try
{
if (disposing && components != null)
{
components.Dispose();
}
}
finally
{
base.Dispose(disposing);
}
}
//Required by the Windows Form Designer
private System.ComponentModel.Container components = null;
//NOTE: The following procedure is required by the Windows Form Designer
//It can be modified using the Windows Form Designer.
//Do not modify it using the code editor.
[System.Diagnostics.DebuggerStepThrough()]private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain));
this.txtShowInstrumentConfig = new System.Windows.Forms.TextBox();
this.btnShowInstConfig = new System.Windows.Forms.Button();
this.txtNewSSMName = new System.Windows.Forms.TextBox();
this.btnModifyNextLine = new System.Windows.Forms.Button();
this.btnPauseRun = new System.Windows.Forms.Button();
this.btnRefreshInfo = new System.Windows.Forms.Button();
this.lbStatusInformation = new System.Windows.Forms.ListBox();
this.btnAddALine = new System.Windows.Forms.Button();
this.lblSSMNameTitle = new System.Windows.Forms.Label();
this.gbRunStatus = new System.Windows.Forms.GroupBox();
this.btnStartRun = new System.Windows.Forms.Button();
this.lblSampleSetMethod = new System.Windows.Forms.Label();
this.cbSampleSetMethod = new System.Windows.Forms.ComboBox();
this.lblNodeTitle = new System.Windows.Forms.Label();
this.lblSystemTitle = new System.Windows.Forms.Label();
this.cbSystem = new System.Windows.Forms.ComboBox();
this.cbNode = new System.Windows.Forms.ComboBox();
this.btnConnect = new System.Windows.Forms.Button();
this.gbRunStatus.SuspendLayout();
this.SuspendLayout();
//
// txtShowInstrumentConfig
//
this.txtShowInstrumentConfig.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtShowInstrumentConfig.Location = new System.Drawing.Point(40, 538);
this.txtShowInstrumentConfig.Multiline = true;
this.txtShowInstrumentConfig.Name = "txtShowInstrumentConfig";
this.txtShowInstrumentConfig.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.txtShowInstrumentConfig.Size = new System.Drawing.Size(391, 208);
this.txtShowInstrumentConfig.TabIndex = 33;
//
// btnShowInstConfig
//
this.btnShowInstConfig.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnShowInstConfig.Location = new System.Drawing.Point(462, 543);
this.btnShowInstConfig.Name = "btnShowInstConfig";
this.btnShowInstConfig.Size = new System.Drawing.Size(127, 31);
this.btnShowInstConfig.TabIndex = 32;
this.btnShowInstConfig.Text = "Show Instrument Configuration";
this.btnShowInstConfig.UseVisualStyleBackColor = true;
this.btnShowInstConfig.Click += new System.EventHandler(this.BtnShowInstConfig_Click);
//
// txtNewSSMName
//
this.txtNewSSMName.Location = new System.Drawing.Point(166, 172);
this.txtNewSSMName.Name = "txtNewSSMName";
this.txtNewSSMName.Size = new System.Drawing.Size(235, 21);
this.txtNewSSMName.TabIndex = 28;
//
// btnModifyNextLine
//
this.btnModifyNextLine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnModifyNextLine.Location = new System.Drawing.Point(462, 343);
this.btnModifyNextLine.Name = "btnModifyNextLine";
this.btnModifyNextLine.Size = new System.Drawing.Size(127, 31);
this.btnModifyNextLine.TabIndex = 27;
this.btnModifyNextLine.Text = "Modify Next line";
this.btnModifyNextLine.UseVisualStyleBackColor = true;
this.btnModifyNextLine.Click += new System.EventHandler(this.BtnModifyNextLine_Click);
//
// btnPauseRun
//
this.btnPauseRun.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnPauseRun.Location = new System.Drawing.Point(462, 306);
this.btnPauseRun.Name = "btnPauseRun";
this.btnPauseRun.Size = new System.Drawing.Size(127, 31);
this.btnPauseRun.TabIndex = 26;
this.btnPauseRun.Text = "Pause Run";
this.btnPauseRun.UseVisualStyleBackColor = true;
this.btnPauseRun.Click += new System.EventHandler(this.BtnPauseRun_Click);
//
// btnRefreshInfo
//
this.btnRefreshInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnRefreshInfo.Location = new System.Drawing.Point(462, 270);
this.btnRefreshInfo.Name = "btnRefreshInfo";
this.btnRefreshInfo.Size = new System.Drawing.Size(127, 31);
this.btnRefreshInfo.TabIndex = 30;
this.btnRefreshInfo.Text = "Refresh Status";
this.btnRefreshInfo.UseVisualStyleBackColor = true;
this.btnRefreshInfo.Click += new System.EventHandler(this.BtnRefreshInfo_Click);
//
// lbStatusInformation
//
this.lbStatusInformation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lbStatusInformation.FormattingEnabled = true;
this.lbStatusInformation.ItemHeight = 12;
this.lbStatusInformation.Location = new System.Drawing.Point(13, 21);
this.lbStatusInformation.Name = "lbStatusInformation";
this.lbStatusInformation.Size = new System.Drawing.Size(391, 232);
this.lbStatusInformation.TabIndex = 0;
//
// btnAddALine
//
this.btnAddALine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnAddALine.Location = new System.Drawing.Point(462, 380);
this.btnAddALine.Name = "btnAddALine";
this.btnAddALine.Size = new System.Drawing.Size(127, 31);
this.btnAddALine.TabIndex = 31;
this.btnAddALine.Text = "Add A Line";
this.btnAddALine.UseVisualStyleBackColor = true;
this.btnAddALine.Click += new System.EventHandler(this.BtnAddALine_Click);
//
// lblSSMNameTitle
//
this.lblSSMNameTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblSSMNameTitle.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.lblSSMNameTitle.Location = new System.Drawing.Point(24, 170);
this.lblSSMNameTitle.Name = "lblSSMNameTitle";
this.lblSSMNameTitle.Size = new System.Drawing.Size(136, 21);
this.lblSSMNameTitle.TabIndex = 29;
this.lblSSMNameTitle.Text = "New SSM Name";
this.lblSSMNameTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// gbRunStatus
//
this.gbRunStatus.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.gbRunStatus.Controls.Add(this.lbStatusInformation);
this.gbRunStatus.Location = new System.Drawing.Point(27, 252);
this.gbRunStatus.Name = "gbRunStatus";
this.gbRunStatus.Size = new System.Drawing.Size(415, 270);
this.gbRunStatus.TabIndex = 25;
this.gbRunStatus.TabStop = false;
this.gbRunStatus.Text = "Run Status";
//
// btnStartRun
//
this.btnStartRun.Location = new System.Drawing.Point(24, 206);
this.btnStartRun.Name = "btnStartRun";
this.btnStartRun.Size = new System.Drawing.Size(378, 31);
this.btnStartRun.TabIndex = 24;
this.btnStartRun.Text = "Start Run";
this.btnStartRun.UseVisualStyleBackColor = true;
this.btnStartRun.Click += new System.EventHandler(this.BtnStartRun_Click);
//
// lblSampleSetMethod
//
this.lblSampleSetMethod.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblSampleSetMethod.Location = new System.Drawing.Point(24, 121);
this.lblSampleSetMethod.Name = "lblSampleSetMethod";
this.lblSampleSetMethod.Size = new System.Drawing.Size(378, 21);
this.lblSampleSetMethod.TabIndex = 23;
this.lblSampleSetMethod.Text = "Sample Set Method";
this.lblSampleSetMethod.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// cbSampleSetMethod
//
this.cbSampleSetMethod.FormattingEnabled = true;
this.cbSampleSetMethod.Location = new System.Drawing.Point(24, 144);
this.cbSampleSetMethod.Name = "cbSampleSetMethod";
this.cbSampleSetMethod.Size = new System.Drawing.Size(375, 20);
this.cbSampleSetMethod.TabIndex = 22;
//
// lblNodeTitle
//
this.lblNodeTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblNodeTitle.Location = new System.Drawing.Point(24, 13);
this.lblNodeTitle.Name = "lblNodeTitle";
this.lblNodeTitle.Size = new System.Drawing.Size(180, 18);
this.lblNodeTitle.TabIndex = 21;
this.lblNodeTitle.Text = "Node";
this.lblNodeTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lblSystemTitle
//
this.lblSystemTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblSystemTitle.Location = new System.Drawing.Point(222, 13);
this.lblSystemTitle.Name = "lblSystemTitle";
this.lblSystemTitle.Size = new System.Drawing.Size(173, 18);
this.lblSystemTitle.TabIndex = 20;
this.lblSystemTitle.Text = "System";
this.lblSystemTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// cbSystem
//
this.cbSystem.FormattingEnabled = true;
this.cbSystem.Location = new System.Drawing.Point(222, 33);
this.cbSystem.Name = "cbSystem";
this.cbSystem.Size = new System.Drawing.Size(180, 20);
this.cbSystem.TabIndex = 19;
//
// cbNode
//
this.cbNode.FormattingEnabled = true;
this.cbNode.Location = new System.Drawing.Point(24, 33);
this.cbNode.Name = "cbNode";
this.cbNode.Size = new System.Drawing.Size(180, 20);
this.cbNode.TabIndex = 18;
//
// btnConnect
//
this.btnConnect.Location = new System.Drawing.Point(24, 66);
this.btnConnect.Name = "btnConnect";
this.btnConnect.Size = new System.Drawing.Size(378, 31);
this.btnConnect.TabIndex = 17;
this.btnConnect.Text = "Connect";
this.btnConnect.UseVisualStyleBackColor = true;
this.btnConnect.Click += new System.EventHandler(this.BtnConnect_Click);
//
// FrmMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(629, 758);
this.Controls.Add(this.txtShowInstrumentConfig);
this.Controls.Add(this.btnShowInstConfig);
this.Controls.Add(this.txtNewSSMName);
this.Controls.Add(this.btnModifyNextLine);
this.Controls.Add(this.btnPauseRun);
this.Controls.Add(this.btnRefreshInfo);
this.Controls.Add(this.btnAddALine);
this.Controls.Add(this.lblSSMNameTitle);
this.Controls.Add(this.gbRunStatus);
this.Controls.Add(this.btnStartRun);
this.Controls.Add(this.lblSampleSetMethod);
this.Controls.Add(this.cbSampleSetMethod);
this.Controls.Add(this.lblNodeTitle);
this.Controls.Add(this.lblSystemTitle);
this.Controls.Add(this.cbSystem);
this.Controls.Add(this.cbNode);
this.Controls.Add(this.btnConnect);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MinimumSize = new System.Drawing.Size(600, 797);
this.Name = "FrmMain";
this.Padding = new System.Windows.Forms.Padding(10, 9, 10, 9);
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Empower Instrument Control Example";
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FrmMain_FormClosed);
this.Load += new System.EventHandler(this.FrmMain_Load);
this.gbRunStatus.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
private System.Windows.Forms.TextBox txtShowInstrumentConfig;
private System.Windows.Forms.Button btnShowInstConfig;
private System.Windows.Forms.TextBox txtNewSSMName;
private System.Windows.Forms.Button btnModifyNextLine;
private System.Windows.Forms.Button btnPauseRun;
private System.Windows.Forms.Button btnRefreshInfo;
private System.Windows.Forms.ListBox lbStatusInformation;
private System.Windows.Forms.Button btnAddALine;
private System.Windows.Forms.Label lblSSMNameTitle;
private System.Windows.Forms.GroupBox gbRunStatus;
private System.Windows.Forms.Button btnStartRun;
private System.Windows.Forms.Label lblSampleSetMethod;
private System.Windows.Forms.ComboBox cbSampleSetMethod;
private System.Windows.Forms.Label lblNodeTitle;
private System.Windows.Forms.Label lblSystemTitle;
private System.Windows.Forms.ComboBox cbSystem;
private System.Windows.Forms.ComboBox cbNode;
private System.Windows.Forms.Button btnConnect;
}
}

347
frmMain.resx Normal file
View File

@ -0,0 +1,347 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAMAEBAAAAAACABoBQAANgAAACAgAAAAAAgAqAgAAJ4FAAAwMAAAAAAgAKglAABGDgAAKAAAABAA
AAAgAAAAAQAIAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAACswAAA5UQAAS10PAFBsAABhfgAAa3wPAFBC
KwBnaTIAdGVNAH9sTQBqZVoAa2VaAHdvUgB8dmoAgX1TAI17YQBkgwAAZYQAAGeFAABrhgEAbIcDAGiJ
AABriAAAbIkBAG6KAQBsjgAAZ4ELAHKOAwBvlAAAc5AAAHGVAABxlwAAcpcAAHWWAAB0lwAAdJkAAHWb
AAB3mQIAeJsAAHuaAgB4nwAAe5oFAH2XDwB3jyMAfIRnAISfDgCGmxEAjJ8dAICgBgCFoAoAiKQTAImi
FwCJoxgAjaMfAIGMKgCOmiUAjpYtAJCcIACNjzoAmp8xAJKgIACYpjAAmaY6AJ6sPQCMhEQAg45TAKGS
XACpml0AqqBMAKa0RQCsoFUArLNUALCyWQCXgmAAnYRhAJ+LaQCPiHcAkZtxAKCHZACjj2EAootkAKWL
ZAC9nWUAvZ1nAL6dZwC+nmYAvp9mALWaawCymG0Av51oAL+daQC9nmgAup5vAKGQfAC1m3UAvJ9zAL2f
cwCaoGsAsqdkALijZQC/pGUAuqNpALS5YgC1u2MAtrhkAL+jcgC+o3UApbZyAKq1egC9vHEAvr10AMOk
bgDEpG4AxaRuAMWkbwDBo3AAwqNwAMKkcADDpHMAx6RxAMancwDHp3MAwqd3AMSodgDFqHcAyahxAMmp
cQDApXgAx6R5AMileQDGq3sAyat5AMisfADJrX0Awr97AMO/ewDGu3wAusNgAMTAfACalowAnpmVALqp
gwCmppwAv6+VALKtnwCysZAAt72SAKmnogC/vrgAxKqCAMuvgwDLsIIAzLOGAM+2iQDPvpEA07qQAMe9
qgDLyYoA0MWOANbMnADYypoAwcakAMXIrwDdwaIA0MmpAMzAsADHyrEAyc20AMrOtwDGwroAy8a9AMzQ
ugDR1L8A4dKtAOXTtQDq1rwA6tu5ANTYxADX3McA2NbIANrU0wDb2dMA3t3TAN7c1ADs18AA7NfBAOzX
wgDs28EA7djDAOzbwgDv3sIA797DAO7ZxADs3cQA793IAPDcwwDw38QA8t/HAPHeywDz4MkA9eTIAPfi
zwDl59sA5+jcAOLg4ADk4+MA6+rqAOzr7ADv7vAA9PTyAPj2+gD+/f8A////AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBxa0zIEiaKS+YloJ7dXBTu8jDRR8q
jTYEQl5qfHh+Vr2+wGYZGg4MAgcPUFxzcVS9vrptF6G3tbbLqklXc3FUvb64hhSmzJSps5JPYHNxVL2+
uIcUos0NCEs6OGV2clm9vrluE6fOCwYJTkNjgXJZvb68aBKoz5OLkF1RRjs8Ob2+wEcQq9DR1NSRBSEk
KCS9v68/EazSjExhKxUiJjEuvcSuNRKx0woAAQMYN0RkUr3HnycWstSOLE1BQF+Ad1q9yWceG8rU1NTU
tEpcdXFUwrA0HD6ka2ycpY9YaXRwVMaJIzKgPR1ilX96hYN5fVWdMCWKni2Io5uZl4R7dW9bAAB+AgAA
ggIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgA
AAAgAAAAQAAAAAEACAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAxMxUART0wADlGBABGWAAAUV0QAFNo
AABcdAAAV2MUAGB5AABifAAAZX8AAGt5FQBGQC8AVEs6AF1UPwBgWjQAZWwjAGVaRQBvYk0AdWhNAHdp
UgCEc1UAindXAIV2WgCJd1kAinlbAJB9WgCMfGAAZYAAAGaAAABogwAAaYUAAGyIAABtigAAbosAAG+M
AABxjgAAcY8AAHKPAABxigcAcpAAAHSSAAB1lAAAdpQAAHeWAAB4lwAAeZgAAHmZAAB6mQAAepoAAHua
AAB7mwAAe5MMAH+cCwB2iBkAfoYoAIKdDACHmRcAiKMYAIyZJwCRnCgAhYQ4AI+aNACUmzUAoZ07AI2j
IQCUpysAmKg2AJqlOQCdqzsAg4JBAJuZSQCUgF4AoJZOAJejXgCkrEYAprJJAK+hUwC0oF0Aq7JVAJaD
ZACbhWEAnIllAJKCaQCSj20AnpFoAKOMZACjjmkApZBkAKOQbACpkWkArJNpAK+WawCqk20ArZVtAL2c
ZgC9nWYAvJxnALydZwCwl2sAsZhrALWeagCymG0AtZptALacbgC9nWkAvZ5pAL6eaAC+n2gAv59qALme
bwCum30AtJ1yALqecAC6pGUAv6BqAL+gawC5uWoAq6B0ALugcgC8oHAAvqFxAL2icgC+onIAuaF1AL2i
dQC8pHoAvrp0AMCgbADAoWwAwKFtAMGibwDBo28AwKJwAMCjcADBo3EAwKRwAMKkcQDCpXEAwKRzAMCk
dADCpHQAwqZ0AMKldwDEp3UAxKh2AMWqegDFqX0AyKx9AMDCdgCOjIcAlpOMAJ2blwCjnZIAvqmEAK22
hgCro5YAtqeQALW5mQC2u5wAt72eALi8nACtqqQAtbCkALmzpQC6vqEAtLOuALq2qwC/u6kAxq2DAMqu
gADDrowAzLGEAM20igDKvIwA0LiNAMu3lADSupMA1L6ZAMK+tAC9w6cAycOFAM/HkADRxZIA1sCZANnC
nQDVy5oAw8atANrGpADbzaQA3s2qAN7QqwDMz7cA4M2tAOLRsQDj0bIA5dO1AObVuADn1roA6Ne7AObb
uwDp2L0A6dm+AMjIxQDW1c0A1tbQANnZ0gDb2tQA3NvVANzc1QDq2sAA6trBAOvbwgDs3cQA7d/HAOHa
zgDg3tcA4uHZAObl2gDj4t0A5OPeAOPl3gDk5N0A6ObcAOvp3gDk4+EA5OTgAOfm4QDl5eIA5uXiAObm
4wDn5uQA5ujhAOro4QDs6+AA7eziAOjo5QDq6uUA6ejmAOrp5gDr6+cA6+roAO3s6QDv7uwA8O/sAPHx
7QD08+8A9PTuAPX18QD39vUA+Pj3APr6+QD8/PsA/Pz8AP7+/QD+/v4A1tTTyca/MzMzM0K8uXUzMzNL
ra2sqpSSkZCKhIJ0amHV0srHxcRFMzIxMH+ysTQrKzupqZOTkpKRjomEgG1rX9XSysfFxH8yMS0rO7Cr
PyEgIHB8fHx9jIyOh4OAbWxg1dLKx8XEtjIuKyUgdm9VCAYGRldXWmZoeouHhIFzbGDV0srHxcTDMSwo
IAlGUxsQAwMHFRlIVlxueYaEgHNrYNXSysfFxMNCKiEJBQcSEQ4CAgIPExVIWGZ4hYOAc2tg1dLKx8XE
w0IpH6Hq6t/a2t/g6urqpBpWY3GFhIFta2DV0srHxcTDTCgenurZ0M/R2Nnf6uqkGlZkeIWDgXNrYNXS
ysfFxMNPJR2e3tDNzdDY3unr66hRWmd5hoOAc2tg1dLKx8XEw08lCp7Zzs2ml5yjp6GhSlhnbnuIhIFt
bF/V0srHxcTDTyUKntvQz5cNEhdQUjcfNmV7i4eEgG1sX9XSysfFxMNPJQqe3NjZlw4SGVJZXkk0OU6N
iYOBc2tf1dLKx8XEw08lCp/j29yXDREVG1JXXnBHPHKJg4FzbF/V0srHxcTDQyUKn+nc4pcBDhIUGEhW
Xmh6jYmEgG1rX9XSysfFxMNCJQqg7eTilgABDQ4SFRpWZneLik1AQD9A1dLKx8XEw0ElCqDw5eHk7PL1
9/fOFlJcRzwzMzMzMzPV0srHxcTDLiUKpfLs5ufv8vX4+M8ZPScpLzMzMzMzM9XSysfFxL0uJQql9PHu
7/L09vj42AsdIyovMzMzMzMz1dLKx8XEtS4lCqX28/PLmKKns7ubCSAmLDAzMzMzMzPV0srHxcR1LiUK
pfj19ZgNERMQBgkdISgsMDMzMzg5OdXSysfFxEwuJQq0+fj4mA0RBAUGCBwgJisvOUBOc2tf1dLKx8XE
QS4lHLT6+fmYDAIDAwUFCB0iO06Hg4Bta2DV0srHxb8zLiYdtPv6+pgAAgICAwMFC0loeYeEgG1sYNXS
ysfFfzMvKB67/Pv75MvMzM3O0VRIWGd5h4OBc2xf1dLKx8VFMy8pIMD+/f39/f3+/v7+mUhYZ3mHhIBz
a1/V0srHvTMzMCsjzv////////////+cUVtoeYeEgG1rYNXSysdMMzMxLT7X9e3o3d3i5efu8Z1aZneL
h4OAbWxf1dLKvTMzMzI1rrJHHx0JNllZWVldXnB3i42Hg4BtbGDV0spFMzMzMk+8riooJD6amn5+fn5+
j4+NjomDgG1rYNXSlTMzMzNCvr5FLy5Esa+traypqZOTkpGQiYOBbWtf1bo4MzMzOLrBtzMzRbm4sbGv
raysqpSSkZCKhIBtbF/IOjMzMzO2wsFFM0W5ubixsa+trayqlJKRkIqEgnRpYgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAA
AABgAAAAAQAgAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAO3fx//77NL/7NzE/+rawf/q2b//6di9/+fW
u//p1bz/zseP/4iiGf90lwD/epsA/3ubAP95mgD/fJwC/5CkI//Bu3f/3sip/97Hp//MvYb/sLJZ/4Oe
Dv93mQD/eJoA/3qbAP+SpCb/rqxT/8q0hP/RtY3/zbOH/8yxhP/MsIL/y6+B/8mtf//GrHz/xqp5/8Wp
dv/Fpnb/xKZ0/8Klcf/ApHD/wKNv/8Chbf/AoGz/v6Br/7+gav/Ip27/u5tm/+zexf///+X//+/T//3s
0P/9687//OnM//voy///6dH/4tmf/6W5N/+Epwb/hKcA/4SnAP+EpwD/hKcB/4+tE/+9wF//59Oo/+3U
sv/o0Kb/xsJw/5OsGf99owD/gaUA/4OmAP+Sqxf/tLZP/9XAiP/hwpr/3MCR/9u+jf/avIv/2buK/9i7
iP/Xuob/1riD/9W3gf/VtYD/1LR+/9Kye//Rsnn/0bB4/9Cudv/PrXT/z61z/8+tcv/duHn/vJtn/+zd
w///8NT/7t7D/+vbwP/r2r//6tm9/+nYu//t2cL/3M+k/7C4Wf+Joxb/e5sA/3qaAP97mwD/eJkA/3ia
AP+XpjH/vrZ2/9K+mf/cwan/w7V//5CfKv91lAP/dJQA/3WVAP95lgf/k58w/7urcv/Mr4v/xq2C/8Wr
f//Eqn3/xKp8/8WrfP/Gq3v/xqp5/8SpeP/EqHf/xah1/8Smc//DpXH/w6Nv/8Kibv/BoGz/waBr/8Kh
av/PrHD/vJtm/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fWuf/p1r3/39Cr/8HAd/+VqCv/eZkA/3eY
AP95mQD/d5YA/3WVAP+AmRH/nqVI/8Gzhv/SuKP/vq2C/5idRf95kBL/booA/2yKAP9piQH/fpAa/6qe
Yf++o4H/uqJ6/7qheP+6onf/u6N2/72kd/+/pHf/wKR2/8Gldf/BpXT/wqZ0/8Gkcv/BonD/waJu/8Cg
bf+/n2v/v59q/8Cgaf/Nq2//vZ1m/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fVuf/o1br/49Kx/87G
jf+erTv/eZkA/3aXAP95mAD/dpUA/3OTAP9wjwL/hZYk/6+ncf/DrJT/t6SC/6GZYf99iiX/ZH8A/2J/
AP9gfgD/boIO/5OOSv+qlW//rZdy/66Xcf+wmHD/sppx/7adcv+5n3P/vKBz/76ic//ApXT/waV0/8Gj
cv/BonD/waNu/8Cgbf+/n2v/v59q/8Chaf/Nq2//vZ1m/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fV
uf/n1bj/5tO3/9nMoP+lsEf/eJgA/3SVAP94lgD/dJIA/3CPAP9ohwD/dYoT/5mXV/+tnH3/q5d9/6CQ
b/98gTb/XXQE/1hyAP9YcQD/YHQI/3Z7Lf+PhFT/nYlo/6CLaf+jjGj/p5Bq/62VbP+ymW7/t51v/7ug
cv+/o3L/wKRz/8Gjcf/Bo3D/waNu/8Chbf+/oGv/v6Bq/8Chaf/Nq2//vZ1m/+vdxP//7tL/7NzB/+nZ
vv/p2L3/6Ne7/+bVuf/l1Lb/6dW8/+PRsv+stFX/eJgA/3OUAP92lAD/cpAA/2yKAP9igAD/aH4I/3+D
Of+Sh2H/l4Rv/5F/aP92c0H/WmcU/01iAP9LYAD/TmIA/1lmEP90cDn/inlb/5B8Xv+UgF3/m4Zh/6KM
Zf+rk2n/splt/7iecP+9oXH/v6Jx/8CjcP/Bo3D/waJv/8Chbf+/oGv/v6Bq/8Cgaf/Nqm//vZ1m/+vd
xP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/6tW9/+bTuP+2umb/gp0Q/3WVAf9zkQD/bYsA/2J/
AP9UcQD/UGgA/1llDv9rZjj/dWVR/3BfTf9hVzv/TU4c/zdGAP8vQwD/MUQA/zVHAP9NURP/aFs6/3Nh
Rf99akv/inZU/5eCXv+jjGX/rJRp/7Oabf+6nm//vqFw/8CicP/BonD/waJv/8Cgbf+/oGv/v6Bq/8Cg
af/Nqm//vZ1m/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/6dW7/+XStf+9vXH/jKIf/3eV
AP9tjQD/bYkF/3KJF/9ziCb/coMs/3N9Of9/fVb/hnxr/4F2Z/98c2T/cm1V/2BmNv9YZCr/WWYq/1to
Kv9pbj3/fXdY/4h8Zf+Mfmb/jXxg/5F9XP+bhWD/p49m/6+Wav+3nG//vaFw/8CicP/BonD/waJv/8Cg
bf+/oGv/v6Bq/8Cgaf/Nqm//vZ1m/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/6dW7/+XS
tf+9vHL/jaEh/3WUAP9niAD/dI0U/5yoZP/BxqP/0NO3/9HRuv/Qz73/0M3B/83Kvv/Myb//y8i9/8jH
tv/Gx7L/x8mz/8nLtP/MzLj/09DA/9TRw//DvrH/pZuH/5KAYv+Uflr/pI1k/66Vaf+2m23/vJ9v/8Ci
cP/Bo3D/waNv/8Chbf+/oGv/v59q/8Cgaf/Nqm//vZ1m/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bV
uf/l1Lb/6dS6/+XStf/Cv3r/k6Ut/3aTBP9jgwD/dY0b/621hf/k4tr/+vf0//j08v/w7+j/7Ozk/+vr
4v/s7OP/7u3l//Lv6v/08ez/9vPu//j18P/49u//+/nw//j47v/d3NL/squa/5ODZf+SfVf/pI1k/66V
af+2m23/vJ9v/8CicP/BonD/waNv/8Chbf+/oWv/v59q/8Cgaf/Nqm//vZ1m/+vdxP//7tL/7NzB/+nZ
vv/p2L3/6Ne7/+bVuf/l1Lb/6NS5/+XStf/Jwob/nKo+/3iUCf9hgQD/c4oZ/6ave//a2cz/7Ovi/+fl
3v/e3db/3NvV/93c1f/f39f/4eHZ/+Pi2//l5N3/6Off/+vq4f/u7eT/8/Lo//Lx5//a2M7/s6ua/5eF
Z/+WgFn/po9l/7CXav+3nG7/vaBw/8CicP/BonD/waJv/8Chbf+/oWv/v6Bq/8Cgaf/Nqm//vZ1m/+vd
xP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/59S5/+XStf/LxIr/n6tD/3mUCv9ggAD/cogZ/6Wt
ev/W1cj/5uXe/+Hg2f/Z2NL/19bR/9jX0v/b2tP/3t7X/+Df2P/j4tv/5+be/+rp4P/u7OL/8PDn//Dv
5v/a2M3/tq6b/52La/+chF3/q5Jn/7OZbP+5nnD/vqJx/8CjcP/Bo3D/waJv/8Cgbf+/oGv/v6Bq/8Cg
af/Nqm//vZ1m/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/59S5/+XStf/LxIr/oKtE/3mU
Cv9gfwD/cYcZ/6Ssev/T0sf/4+Lb/97d2P/Z2NL/1NPO/8vKxf/Cwbv/wb+5/8bEvf/Ny8T/09HI/9bU
yv/W1sj/2NrI/9jbyf/Fya3/rKmE/6OQbP+njWf/sJds/7acbv+7n3D/vqNx/8CkcP/BpHD/waNu/8Cg
bf+/oGv/v59q/8Cgaf/Nqm//vZxm/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/59S5/+XS
tf/LxIr/oKtD/3mUCv9gfwD/cYcZ/6Ssev/S0sf/4uHb/97d2P/c29X/0dDL/7W0r/+XlIz/i4d9/5aR
hv+knpD/raaX/7Orm/+0r5j/srGQ/6yyhP+ZqGH/jJlH/5eRTv+qlGT/t5xz/7ufc/+9oXL/v6Ny/8Ck
cf/BpHD/waNu/8Chbf+/oGv/v59q/8Cgaf/Nqm//vZtm/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bV
uf/l1Lb/59S5/+XStf/LxIr/oKtD/3mUCv9ffwD/cYcZ/6Stev/T08f/4+Lc/9/e2v/g39r/0NDL/6Wk
nv90b2X/YlhJ/29kUv+CdmD/j4Fn/5mJbv+hkHH/nJFj/4uPQ/92ihz/b4kN/32MG/+dlkn/uJ9w/76i
dv/AonT/waRz/8Gkcf/BpHD/waJu/8Chbf+/n2v/v59q/8Cgaf/Nqm//vZtm/+vdxP//7tL/7NzB/+nZ
vv/p2L3/6Ne7/+bVuf/l1Lb/59S5/+XStf/LxIr/oKtD/3mUCv9ffwD/cYcZ/6Sse//T08j/5OPe/+Lh
3P/k493/09PN/6Ohmv9rZFn/VUk3/2RWQP95alD/iHdY/5SAX/+eiGX/nopf/5SKSv+GiS7/eIoU/3KM
BP+Ckxr/oJxG/7ahZv/BpHX/w6V1/8Kkcv/Bo3D/waJu/8Chbf+/oGv/v59q/8Cgaf/Nqm//vZtm/+vd
xP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/59S5/+XStf/MxIv/oatE/3mUCv9ffwD/cYcZ/6Ss
fP/U1Mr/5uXh/+Xk3//n5uD/19bR/6imn/9xal7/Wk89/2hcRv99blb/inpe/5eFZf+gjGn/p5Ft/6yU
b/+plWb/mpRK/4mSKf+AlBX/i5gk/6OeRv+4o2X/waVy/8Okc//Co3D/waJu/8Chbf+/oWv/v6Bq/8Cg
af/Nqm//vZtm/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/59S5/+XStf/LxIr/oKtE/3mU
Cv9ffwD/cYgZ/6WufP/W1sz/6Obi/+fm4f/p6OP/2djT/6imn/9vaV3/Vkw7/2NXQ/93aFL/hHVa/5B/
Yf+ahmb/ooxq/6iQbv+slW//rJdq/6uZYf+gmUv/lpo1/5acMf+poUz/vaRq/8Kkcv/Co3H/waJv/8Ch
bf+/oGv/v6Bq/8Chaf/Nqm//vZtm/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/59S5/+XS
tf/GwYL/mKc3/3eSB/9gfwD/cYgZ/6WufP/X1sz/6efk/+jn4//q6uX/2dnU/6alnv9qZFn/TkU2/1pP
Pf9sX0r/eWtS/4R0WP+OfF7/loNh/5yIZP+jjWn/rJNw/7WYdv+1m27/rJ1a/6aeTf+woVj/vqRt/8Kk
cv/DpHL/w6Jx/8Khcf/CoG//wqBu/8Ohbf/QqnP/v5tp/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bV
uf/l1Lb/6NW6/+XStf+/vnf/j6Mn/3SRAv9hgAD/cYga/6Wuff/X183/6unl/+jn5P/r6+f/2NjT/6Cf
mf9bVk3/OjIk/0Q6Kv9VSjf/YVQ+/2xdRP93Zkr/gG1P/4h1Vf+Tf13/oIpl/6mRa/+ymG7/uJ1x/72h
df/Co3f/xaV4/8ald//EpHP/v6Js/72haP+6n2T/up9i/7ugYv/Iqmj/upth/+vdxP//7tL/7NzB/+nZ
vv/p2L3/6Ne7/+bVuf/l1Lb/6dW7/+XStf+9vHL/i6Eh/3ORAP9hgAD/cYga/6awf//Y2c//6+rn/+np
5v/r6+j/2NjU/5+dmf9ZVEz/NS4j/z01Jv9LQzP/V0s5/2BUPv9rXEX/dGRK/35tUP+Jdlf/lYJe/6GL
Zf+sk2z/tppy/72gdv/Co3f/w6V3/8SldP+9o2j/saBW/6qfSv+lnUL/o50//6SeP/+yqUb/pZtB/+vd
xP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/6dW7/+XStf+8vG//iaAd/3KRAP9hgAD/cYga/6aw
gP/Y2tD/6+vo/+no5v/n5+T/3t3a/8LAvf+fnZf/jouE/5OPhv+cl47/op2R/6ehlP+tppn/sKqb/6yj
k/+YinH/jntZ/5uFYf+tknH/tZly/7KdZv+uoFn/qaFL/6GhPP+ZnzH/kp0l/42cHP+KnBf/iZwW/4qd
Fv+VqBn/j5sf/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/6dW8/+XStv+3umj/gpwS/3CQ
AP9igAD/coga/6ewgP/Z2tH/7Ovp/+ro5//k4+H/5OTh/+bl5P/q6ub/7e3p//Dv6//z8+7/9fbv//f3
8f/5+fT/9ffy/+Hh3P+vpJT/jHhZ/5R/V/+ij17/opRT/5mYP/+Rmyr/iJwV/3ycAv94mwD/epsA/3qb
AP96mwD/epsA/3ucAP+EqAD/epsA/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/6tW9/+XS
tv+wtlz/eZcE/26OAP9jgQD/cogb/6iwgP/b29L/7u3r/+zq6f/l5uP/5ubj/+rp5//v7+3/9PTw//X2
8v/4+PT/+vv2//39+f////z/+/z5/+fn4/+zqJn/i3hV/4d9QP+DiSz/fI0W/3qSDf97lwf/e5oB/3ib
AP93mwD/eZsA/3mbAP95mwD/eZsA/3qcAP+DqAD/eZsA/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bV
uf/l1Lb/6dW9/+TStP+stFX/dZUA/22OAP9jgQD/cogb/6iwgP/c3NP/8O/s/+3s6v/n6OX/6Ojl/+vq
6P/v7uz/8vHv//Pz8P/29fL/+Pjz//v69v/+/fj//Pr6/+nm5f+sqIn/d3cw/3B7Gv9uhgj/a4sA/2+R
AP90lgD/eJoA/3ubAP97mwD/e5sA/3ubAP97mwD/e5sA/3ycAP+FqAD/e5sA/+vdxP//7tL/7NzB/+nZ
vv/p2L3/6Ne7/+bVuf/m1Lf/59W6/97Pqf+osk//dpYA/22OAP9jgQD/cogb/6ixgf/d3dX/8fHu//Du
7f/q6uj/6enn/+bl4//i4uD/4+Lg/+Xl4v/p6OX/7ezo//Hv7P/08vD/9PHx/+Hf2P+dpWz/Y3cI/2F7
AP9riAD/cI4A/3STAP93lwD/epoA/3ubAP97mwD/e5sA/3ubAP97mwD/epsA/3ucAP+EqAD/epsA/+vd
xP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fVuf/o1bn/5dO0/9PJlv+hrkL/dpYA/26OAP9jgQD/cogb/6mx
gv/e3tf/8/Lw//Lx8P/w7+3/6Ojm/9LS0P+6ubb/sa+q/7e1sP/Avrj/yMS+/83Jw//RzsT/z8+//7/D
ov+Km0j/YXsA/2OAAP9tigD/cpAA/3aVAP95mAD/epoA/3ubAP97mwD/e5sA/3qbAP96mwD/epsA/3uc
AP+EqAD/epsA/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fVuf/p1rz/4dGu/8fDgv+ZqjT/dpYA/26O
AP9jgQD/cogb/6mxgv/e39j/9PTy//X08//19fP/5ubj/7q6t/+JhX7/c21i/353av+Qhnr/l458/5WT
b/+Pll7/i5hS/4WWQv9yiRv/ZoEA/2mGAP9wjQD/dJEA/3aVAP95mAD/epkA/3qbAP95mwD/d5sA/3ab
AP94mwD/fJsA/4CcBf+KqAj/f5sF/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fWuf/p1r3/39Cq/76+
c/+Spin/dpYA/2+PAP9jgQD/cogb/6myg//f4Nn/9/X0//f19f/5+ff/5eXk/66sqf9sZl3/UUY3/15R
P/9uYkj/bmk7/2ZsIf9cbwj/WXIA/113AP9jfQD/aIMA/2yIAP9wjgD/dJIA/3WVAP92mAD/d5kA/3qb
AP99mwT/gpwL/4WcEP+LnRf/kZ0h/5aeKP+iqC3/lJsm/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fW
uf/q1r//3c6m/7e7Zv+NpCD/d5YA/3CPAP9jgQD/cogb/6qzhP/h4dv/+ff2//j39//7+/n/5+fm/66s
qv9rZVz/T0Q1/1pOOf9dWi7/VV4S/1JkAv9TaQD/Vm8A/1t0AP9hewD/Z4IA/2yIAP9vjQD/c5AA/3SU
AP92lwD/eZoA/4GcC/+OnSD/nZ42/6mfSf+xn1X/tZ9a/7efXP/EqmH/tptb/+vdxP//7tL/7NzB/+nZ
vv/p2L3/6Ne7/+fWuf/r18H/2s2h/6u0Uv+FnxH/d5YA/3CPAP9jgQD/cokb/6q0hf/h4tz/+vj5//r6
+v/9/fz/6eno/7CurP9tZ2H/TEQz/0xJJv9LUxT/R1kB/0tgAP9SZwD/WG4A/1xzAP9feAD/ZH4A/2iD
AP9piQD/b44A/3uUC/+KmR//l50x/6KfQf+toVH/t6Ff/7+ga//DoHH/xKBx/8SgcP/Rqnb/wJtr/+vd
xP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fWuv/t2MP/1cqa/5ysOP96mgP/d5YA/3GQAP9jgQD/cooc/6u1
hv/i493/+vn6//v7+//+//7/6urp/62rqf9hXVP/NDMV/y00AP8xQAD/NkgA/z1QAP9DVwD/SF0A/0xj
AP9SawD/W3UA/2R9AP9uhgj/fI4W/5GWMf+onVD/uaFn/8Gjcv/Do3P/wqJw/8Ggbv/An2z/v59r/8Cg
av/NqnD/vZ1n/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fWuv/r18H/zsaO/5CmI/9zlgD/d5YA/3OQ
AP9kggD/dIsc/6y2h//k5d///Pv8//39/f//////7Ovs/7Cuq/9cXEr/KC4F/yUwAP8uOwD/NEMA/zlJ
AP8/UQD/RFcA/0ldAP9OZAD/V24A/2d6Df+Bhyz/m5JL/62aYP+5n23/wKJz/8Skdv/DpHT/wqJw/8Gh
bv+/n2v/v59q/8Cgaf/Nq2//vZ1m/+vdxP//7tL/7NzB/+nZvv/p2L3/6de8/+fWuv/i0rH/v791/4mj
F/9ylgD/d5cA/3ORAP9kggD/dYwc/624h//l5+D//fz9//7+/v/+/f3/8vHx/8vKyf+Vlon/dHhf/3R6
X/98gmH/f4di/4OKY/+Gj2T/jJZo/4+ZaP9/ik7/cXoz/3x7N/+Vh1D/q5Jo/7eacv+9n3X/v6Jy/8Gk
cf/BpHD/waJu/8Chbf+/n2v/v59q/8Chaf/Nq2//vZxm/+vdxP//7tL/7NzB/+nZvv/p2L3/6ti//+jW
vP/Uy5n/q7VS/4WgD/91mAD/eJgA/3OSAP9lgwD/d44c/7G7iv/o6eP//v3+//7+/v/8/Pv/+Pj3/+7u
7f/g4N7/2dnX/9ra1//d3dr/3t7b/+Df3P/g4d3/5ufk/+bn4/++va3/lIxu/5F/Xf+dhmH/qZFo/7KY
bf+5nnD/vqJx/8Gjcf/Bo3D/waJu/8Chbf+/oGv/v6Bq/8Chaf/Nqm//vZtm/+vdxP//7tL/7NzB/+nZ
vv/p2L3/69nB/+nWvP/HxIP/mKsz/3+eBv94mQD/eJgA/3STAP9mhQD/epEe/7a/kf/s7Oj/////////
///8/Pz//Pz8//v7+//8/Pz//Pz9//38/f/9/P7//f3///79///+/f/////////////Tz8j/oJOA/5SB
Yv+dhV//qZJn/7KZbP+5nnD/vqJx/8Gjcf/Bo3D/waJu/8Chbf+/oGv/v6Bq/8Cgaf/Nqm//vZtm/+vd
xP//7tL/7NzB/+nZvv/p2L3/7NnC/+fVuP+3vGj/hKAS/3mbAf96mQD/eZgA/3WTAP9mhwD/fJUe/7/F
nP/y8PL/////////////////////////////////////////////////////////////////////////
///Y1M7/pZiF/5aDY/+ehl7/q5No/7OZbP+6nnD/vqJx/8Gkcf/BpHD/waJu/8Chbf+/n2v/v59q/8Cg
af/Nqm//vZxm/+vdxP//7tL/7NzB/+nZvv/r2sD/6de8/9fNnf+jsUT/eJoA/3aZAP97mgD/epgA/3aU
AP9rigD/hZso/8nMqf/49fv//////////////////////////////////v7///3+///9/v7//f7///3+
///9/v/////////////Z1M7/q52J/52JZ/+jimL/r5Vq/7abbv+7n3D/v6Jx/8Gkcf/BpHD/waJu/8Ch
bf+/n2v/v59q/8Cgaf/Nqm//vZ1m/+vdxP//7tL/7NzB/+rZv//u28X/4NOt/7q+bP+OpiD/eJkA/3ia
AP97mwD/eJkA/3aWAP94kwj/maZF/9HPsf/07vL/9/X2//Ly8f/u7+z/7e7r/+vs6f/q6+f/6evn/+rq
5//r6uj/7Ovq/+zs6//t7ez/8fHx//Hw8P/UzcP/saCI/6aQa/+qkWf/s5lt/7mecP+9onL/wKRz/8Gj
cv/Bo3D/waJu/8Cgbf+/n2v/v59q/8Cgaf/Nqm//vZtm/+vdxP//7tL/7NzC/+rZv//v28j/1s2c/5yt
Of97mwj/epoA/3qbAP97mwD/d5kA/3eYAP+PoCj/uLR0/9THq//Wzbf/wsSY/625ef+js3D/orFu/5+u
av+erWr/qLF7/7q1mf/Ct6f/wren/8K4pv/DuKb/xryq/8i8qf+9rpX/sZx6/6+Xbv+ymW3/uJ5x/7yh
cv/ApHP/waR0/8Gjcv/Bo3D/waJu/8Cgbf+/n2v/v59q/8Cgaf/Nq2//vZtm/+vdxP//7tL/7t3F/+zb
w//k1rb/v8B1/4miGP9zlwD/epsA/3ubAP96mQD/eJkA/4KdDv+rr1b/08Cc/9S/of+zrG7/iJUr/22H
BP9igQD/Yn8A/2R+AP9vghL/hoo5/5+RY/+pk3T/p5Jw/6eRbv+nkW3/qZJs/6qUbP+ulm7/sppw/7ae
cv+6oHP/vaJ0/7+jc//BpHT/wqR0/8Gjcv/Bo3D/waJu/8Cgbf+/n2v/v59q/8Cgaf/Nq2//vZ1m/+vd
xP//7tL/8N7I/+zbw//NyY7/nq89/3+cB/92mAD/e5sA/3ubAP93mAD/f5wI/5qqN//EvH7/3caq/9K/
mv+hpkj/c48C/2mIAP9lhgD/aYYA/3mMFP+Wl0T/rp5t/7Wgev+1nnn/tJx1/7Occ/+zm3L/s5tx/7Sb
cP+3nnL/uqF1/72kd//ApXf/waR2/8Gldf/CpnX/wqZz/8Kkcv/Co3D/waJu/8Cgbf+/n2v/v59q/8Cg
af/Nqm//vZ1m/+vdxP//79b/793G/9/TrP+vuVr/g6AP/3qaAP96mgD/e5sA/3qaAP95mgD/j6Ui/7y7
cP/dyaf/28ek/8G6ef+SpCr/cZQA/3CSAP92lAP/iZsi/6moWf/EsYX/zLOT/8mwjv/ErYb/xKyE/8Os
gv/Dq4D/wqp//8Kpff/CqHz/wqh7/8Ooev/EqHr/xKd4/8Ondv/Dp3b/w6dz/8Klcv/Co3D/waJu/8Ch
bf+/oGv/v59q/8Cgaf/Nqm//vZxm/+zdxf//8dr/5de1/7/Bdf+SqCj/eJkA/3iZAP97mwD/eZkA/3iZ
AP+HoRX/rrRW/9fInf/q0L3/0sOU/6WuSP+BnRD/dZgA/3mZBP+PoiT/sK5d/8y6jf/WvJv/0LmS/862
jv/MtIv/y7OK/8uyiP/KsYX/ya+D/8eugf/HrX//x6x9/8eqfP/Gqnv/xql5/8Sod//EqHb/xKd0/8Kl
cv/Bo3D/waJu/8Chbf+/oGv/v59q/8Cgaf/Nqm//vZtm/+7dxf//79H/z8yO/5uuNv99nQb/epsA/3uc
AP97nQD/eZoA/3+dBP+lsUX/0seU/+TQsv/m0LX/xr9+/5CmIv91mQL/fZ0D/5GmJv+2tGH/1L+T/9vC
n//ZwJv/1b2V/9O8kv/SupD/0bmO/9C3i//Pton/zrOG/8yyhP/MsIL/zK+A/8qtf//JrXz/yax6/8eq
eP/GqXf/xql1/8Snc//DpXH/w6Nv/8Kibv/BoWz/waBr/8Khav/PrHD/vJtm/+vdw//08Kz/r8FH/4qr
C/+ApQD/hacA/4WoAP+BpgD/jKsP/7C+SP/b1JT/9+LD//jiw//i1Z7/t79V/4yrC/+Epwj/o7Ux/8fE
b//l0KH/79Ow/+vRqv/nzqP/58yh/+XLnv/kypz/4sea/+HFlv/gxJT/38KR/92/j//cvo3/3L2L/9m7
if/Yu4b/17iD/9W3gf/VtYD/1LV+/9Kze//Rsnn/0bB4/9Cudv/PrXT/z6xz/8+tcv/duHn/vJxm/+bc
vv++yWb/haER/3iZAP96mgD/e5sA/3qbAP91lwD/h6EW/8TBff/i0LD/5tK3/+PQsv+7vG//l6kw/32b
A/+Kohn/qq9N/9TAlf/ew6X/2cGc/9bAmv/VvZb/1buV/9O7kf/RupD/0beO/8+1i//OtIj/zbOG/8ux
hP/LsIH/y6+B/8mtf//Gq3z/xap5/8Wpdv/Fpnb/xKZ0/8Klcf/ApHD/wKNv/8Chbf/AoWz/v59r/7+f
av/IqG7/u51m/wAAAAAAAH0CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAB9AgAAAAAAADw5AAAAAAAAzgsAAAAAAAByWQAA
AAAAAM0NAAAAAAAAclkAAAAAAADMlAAAAAAAAHFUAAAAAAAAt7UAAAAAAABxVAAAAAAAAA4MAAAAAAAA
cVQAAAAAAACNNgAAAAAAAH5WAAAAAAAAmikAAAAAAABwUwAAAAAAAGEAAAAAAAAABAAAAAAAAAB9AgAA
AAAAACAAAAAAAAAAdAAAAAAAAABhAAAAAAAAACgAAAAAAAAAcgAAAAAAAAAuAAAAAAAAACkAAAAAAAAA
YwAAAAAAAAAqAAAAAAAAAHcAAAAAAAAAZwAAAAAAAABsAA==
</value>
</data>
</root>

View File

@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]

View File

@ -0,0 +1,14 @@
D:\Code\Instrument Control Example\obj\Debug\Instrument Control.csproj.AssemblyReference.cache
D:\Code\Instrument Control Example\obj\Debug\Instrument Control.csproj.SuggestedBindingRedirects.cache
D:\Code\Instrument Control Example\obj\Debug\Instrument Control.csproj.ResolveComReference.cache
D:\Code\Instrument Control Example\obj\Debug\Waters.Empower.InstrumentControl.Example.FrmMain.resources
D:\Code\Instrument Control Example\obj\Debug\Waters.Empower.InstrumentControl.Example.Properties.Resources.resources
D:\Code\Instrument Control Example\obj\Debug\Instrument Control.csproj.GenerateResource.cache
D:\Code\Instrument Control Example\obj\Debug\Instrument Control.csproj.CoreCompileInputs.cache
D:\gitcode\Empower\obj\Debug\Instrument Control.csproj.AssemblyReference.cache
D:\gitcode\Empower\obj\Debug\Instrument Control.csproj.SuggestedBindingRedirects.cache
D:\gitcode\Empower\obj\Debug\Instrument Control.csproj.ResolveComReference.cache
D:\gitcode\Empower\obj\Debug\Waters.Empower.InstrumentControl.Example.FrmMain.resources
D:\gitcode\Empower\obj\Debug\Waters.Empower.InstrumentControl.Example.Properties.Resources.resources
D:\gitcode\Empower\obj\Debug\Instrument Control.csproj.GenerateResource.cache
D:\gitcode\Empower\obj\Debug\Instrument Control.csproj.CoreCompileInputs.cache