初始版本-v1.0.0

This commit is contained in:
CPL 2023-10-31 13:19:29 +08:00
commit 0774acbc17
557 changed files with 297137 additions and 0 deletions

362
halftoneproject-master/.gitignore vendored Normal file
View File

@ -0,0 +1,362 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd

View File

@ -0,0 +1,346 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Runtime.InteropServices;
namespace AssistClient
{
public class API
{
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;//lpData大小
public IntPtr lpData;
}
public const int WM_COPYDATA = 0x004A;
public const int WM_CLOSE = 0x10;
//定义常数用作函数StretechBlt中正常色彩复制的光栅操作码
public const int Srccopy = 0xCC0020;
//'定义常数用作函数StretechBlt中反色复制的光栅操作码
public const int NotSrccopy = 0x330008;
//定义常数用作函数SetWindowPos中使窗口位于所有窗口最上面一层避免被其它窗口遮挡
public const int HWND_TOPMOST = -1;
public const int SWP_NOMOVE = 2;
public const int SWP_NOSIZE = 1;
public const int SWP_NOACTIVATE = 0x10;
public const int HWND_TOP = 0;
public const int HWND_NOTOPMOST = -2;
//SetStretchBltMode模式
public const int STRETCH_ANDSCANS = 1;
public const int STRETCH_DELETESCANS = 3;
public const int STRETCH_ORSCANS = 2;
public const int STRETCH_HALFTONE = 4;
//
[DllImport("User32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
public const int WS_SHOWNORMAL = 1;
[DllImport("shell32.dll")]
public static extern int ShellExecute(IntPtr hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
[DllImport("user32.dll")]
public static extern IntPtr GetActiveWindow();
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
public static extern bool IsWindow(IntPtr hwnd);
[DllImport("user32.dll")]
public static extern int GetClassName(IntPtr hwnd, StringBuilder lpClassName, int nMaxCount);
[DllImport("user32.dll")]
public static extern int DrawText(IntPtr hdc, string lpStr, int nCount, RECT lpRect, int wFormat);
public const int DT_CENTER = 0x1;
public const int DT_BOTTOM = 0x8;
public const int DT_SINGLELINE = 0x20;
public const int GWL_STYLE = -16;
public const UInt32 WS_MINIMIZEBOX = 0x20000;
public const UInt32 WS_MAXIMIZEBOX = 0x10000;
public const UInt32 WS_SYSMENU = 0x80000;
public const UInt32 WS_CAPTION = 0xC00000;
public const int GWL_EXSTYLE = -20;
public const int LWA_COLORKEY = 1;
public const int LWA_ALPHA = 2;
public const int WS_EX_LAYERED = 0x80000;
[DllImport("user32.dll")]
public static extern UInt32 GetWindowLong(IntPtr hwnd, int nIndex);
[DllImport("user32.dll")]
public static extern UInt32 SetWindowLong(IntPtr hwnd, int nIndex, UInt32 dwNewLong);
[DllImport("user32.dll")]
public static extern UInt32 SetLayeredWindowAttributes(IntPtr hwnd, int cKey, int bAlpha, int dwFlags);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool DeleteFile(string lpFileName);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CopyFile(string lpExistingFileName, string lpNewFileName, bool bFailIfExists);
//窗体拖动
public const UInt32 WM_SYSCOMMAND = 0x112;
public const UInt32 SC_MOVE = 0xF010;
public const UInt32 HTCAPTION = 0x2;
[DllImport("user32.dll")]
public static extern UInt32 ReleaseCapture();
[DllImport("user32.dll")]
public static extern UInt32 SendMessage(IntPtr hWnd, UInt32 wMsg, UInt32 wParam, IntPtr lParam);
[DllImport("user32.dll")]//函数声明,用于将窗口置于最上方
public static extern int SetWindowPos(IntPtr hwnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);
[DllImport("user32.dll")]//函数声明,用于获得整个屏幕的窗口句柄,以作为绘制的源
public static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]//函数声明,用于用于获得指定窗口一个设备环境。
public static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("gdi32.dll")]//
public static extern int SetStretchBltMode(IntPtr hdc, int nStretchMode);
[DllImport("gdi32.dll")]//函数声明,用于将屏幕任意位置的一个矩形位置复制到另一个位置并实现镜像翻转
public static extern int StretchBlt(IntPtr hdc, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, int dwRop);
[DllImport("user32.dll")]//函数声明,释放窗口的设备环境
public static extern int ReleaseDC(IntPtr hwnd, IntPtr hdc);
//最前显示4个
[DllImport("user32.dll")]
public static extern int SetActiveWindow(IntPtr hwnd);
[DllImport("user32.dll")]
public static extern int SetForegroundWindow(IntPtr hwnd);
[DllImport("user32.dll")]
public static extern int SetFocus(IntPtr hwnd);
[DllImport("user32.dll")]
public static extern int BringWindowToTop(IntPtr hwnd);
//
[DllImport("user32.dll")]
public static extern IntPtr LoadCursorFromFile(string lpFileName);
[DllImport("user32.dll")]
public static extern IntPtr SetCursor(IntPtr cursorHandle);
[DllImport("user32.dll")]
public static extern uint DestroyCursor(IntPtr cursorHandle);
public struct POINTAPI
{
public int x;
public int y;
}
[DllImport("user32.dll")]
public static extern int SetCursorPos(int x, int y);
[DllImport("user32.dll")]
public static extern int GetCursorPos(ref POINTAPI lpPoint);
[DllImport("user32.dll")]
public static extern IntPtr GetCursor();
public struct ICONINFO
{
public bool fIcon; // Specifies whether this structure defines an icon or a cursor. A value of TRUE specifies
public Int32 xHotspot; // Specifies the x-coordinate of a cursor's hot spot. If this structure defines an icon, the hot
public Int32 yHotspot; // Specifies the y-coordinate of the cursor's hot spot. If this structure defines an icon, the hot
public IntPtr hbmMask; // (HBITMAP) Specifies the icon bitmask bitmap. If this structure defines a black and white icon,
public IntPtr hbmColor; // (HBITMAP) Handle to the icon color bitmap. This member can be optional if this
}
public struct CURSORINFO
{
public Int32 cbSize;
public Int32 flags;
public Int32 hCursor;
public POINTAPI ptScreenPos;
}
[DllImport("user32.dll", EntryPoint = "GetIconInfo")]
public static extern bool GetIconInfo(IntPtr hIcon, out ICONINFO piconinfo);
[DllImport("user32.dll")]
public static extern bool GetCursorInfo(out CURSORINFO pci);
[DllImport("user32.dll")]
public static extern bool DrawIcon(IntPtr hDC, int X, int Y, IntPtr hIcon);
public const int DI_MASK = 0x0001;
public const int DI_IMAGE = 0x0002;
public const int DI_NORMAL = 0x0003;
public const int DI_COMPAT = 0x0004;
public const int DI_DEFAULTSIZE = 0x0008;
[DllImport("user32.dll")]
public static extern int DrawIconEx(IntPtr hdc, int xLeft, int yTop, IntPtr hIcon, int cxWidth, int cyWidth, int istepIfAniCur, int hbrFlickerFreeDraw, int diFlags);
[DllImport("gdi32.dll")]
public static extern int DeleteObject(IntPtr hObject);
[DllImport("user32.dll")]
public static extern IntPtr WindowFromPoint(int xPoint, int yPoint);
[DllImport("user32.dll")]
public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
[DllImport("kernel32.dll")]
public static extern IntPtr GetCurrentThreadId();
[DllImport("user32.dll")]
public static extern int AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo, bool fAttach);
[DllImport("user32.dll")]
public static extern int MoveWindow(IntPtr hwnd, int x, int y, int nWidth, int nHeight, bool bRepaint);
[DllImport("user32.dll")]
public static extern bool IsZoomed(IntPtr hwnd);//判断窗口是否为最大化
[DllImport("user32.dll")]
public static extern bool IsIconic(IntPtr hwnd);//判断窗口是否为最小化
//控制播放器
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
[DllImport("kernel32.dll")]
public static extern void Sleep(int i);
[DllImport("User32.dll", EntryPoint = "PostMessage")]
public static extern int PostMessage(
IntPtr hWnd, // handle to destination window
int Msg, // message
int wParam, // first message parameter
int lParam // second message parameter
);
public const int WM_USER = 0x0400;
public const int WMU_WLQ = WM_USER + 88;
public const int PARA_PLAY = 0x1;
public const int PARA_STOP = 0x2;
public const int PARA_FULL = 0x4;
public const int PARA_MIN = 0x8;
public const int PARA_MAX = 0x10;
public const int PARA_MOVEL = 0x20;
public const int PARA_MOVER = 0x40;
//
//播放器消息命令:
public const int PLAYER_PLAY = WM_USER + 0x0001;//播放
public const int PLAYER_BREAK = WM_USER + 0x0002;//暂停
public const int PLAYER_FULL = WM_USER + 0x0004;//全屏
public const int PLAYER_NOFULL = WM_USER + 0x0008;//退出全屏
public const int PLAYER_STOP = WM_USER + 0x0010;//停止
public const int PLAYER_EXIT = WM_USER + 0x0020;//退出
public const int PLAYER_SHOW = WM_USER + 0x0040;//显示窗体
public const int PLAYER_HIDE = WM_USER + 0x0080;//隐藏窗体
public const int PLAYER_PLAY_FULL = WM_USER + 0x0021;//播放并全屏
public const int PLAYER_BREAK_HIDE = WM_USER + 0x0022;//暂停并隐藏
//
public const int SW_HIDE = 0;
public const int SW_SHOWNORMAL = 1;
public const int SW_NORMAL = 1;
public const int SW_SHOWMINIMIZED = 2;
public const int SW_SHOWMAXIMIZED = 3;
public const int SW_MAXIMIZE = 3;
public const int SW_SHOWNOACTIVATE = 4;
public const int SW_SHOW = 5;
public const int SW_MINIMIZE = 6;
public const int SW_SHOWMINNOACTIVE = 7;
public const int SW_SHOWNA = 8;
public const int SW_RESTORE = 9;
public const int SW_SHOWDEFAULT = 10;
public const int SW_FORCEMINIMIZE = 11;
public const int SW_MAX = 11;
//自定义消息
public const int WM_MOVENEXT = WM_USER + 5;//dsd纸用、电信最初屏幕上签名版本[to副屏]
public const int WM_MOVEFIRST = WM_USER + 6;//dsd纸用、电信最初屏幕上签名版本[to主屏]
public const int WM_MOVENEXT1 = WM_USER + 7;//电信最新[切屏]到副屏
public const int WM_MOVEFIRST1 = WM_USER + 8;//电信最新[签名完成]到主屏
public const int WM_ShowSignWin = WM_USER + 10;//电信最新[打印小票]弹出半透明窗口(扩展屏)
public const int WM_HideSignWin = WM_USER + 11;//电信最新[半透明窗口左上角对号图片按钮](扩展屏)
public const int WM_ShowSignWin2 = WM_USER + 12;//电信最新[打印小票]弹出半透明窗口(主屏)
public const int WM_HideSignWin2 = WM_USER + 13;//电信最新[半透明窗口左上角对号图片按钮](主屏)
public const int WM_LookPrimaryScreen = WM_USER + 20;//电信最新[副屏监视主屏]
public const int WM_UnLookPrimaryScreen = WM_USER + 21;//电信最新[取消副屏监视主屏]
//声明读写INI文件的API函数
[DllImport("kernel32")]
public static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32")]
public static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
//
public const UInt32 MF_BYPOSITION = 0x400;
public const UInt32 MF_BYCOMMAND = 0x0;
public const UInt32 SC_CLOSE = 0xF060;
public const UInt32 SC_MAXIMIZE = 0xF030;
public const UInt32 SC_MINIMIZE = 0xF020;
public const UInt32 WS_EX_APPWINDOW = 0x40000;
[DllImport("user32.dll")]
public static extern IntPtr GetSystemMenu(IntPtr hwnd, bool bRevert);
[DllImport("user32.dll")]
public static extern int RemoveMenu(IntPtr hMenu, UInt32 nPosition, UInt32 wFlags);
[DllImport("user32.dll")]
public static extern int ModifyMenu(IntPtr hMenu, int nPosition, int wFlags, int wIDNewItem, int lpString);
[DllImport("user32.dll")]
public static extern UInt32 SetWindowText(IntPtr hwnd, string lpString);
public struct RECT
{
public RECT(int _left, int _top, int _right, int _bottom)
{
Left = _left;
Top = _top;
Right = _right;
Bottom = _bottom;
}
public int Left;
public int Top;
public int Right;
public int Bottom;
}
[DllImport("user32.dll")]
public static extern int GetWindowRect(IntPtr hwnd, out API.RECT lpRect);
[DllImport("user32.dll")]
public static extern int ClipCursor(RECT lpRect);
public const int WM_KEYDOWN = 0x100;
public const int WM_KEYUP = 0x101;
//HOT KEY
[DllImport("kernel32.dll")]
public static extern uint GlobalAddAtom(string lpHotKeyName);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool RegisterHotKey(
IntPtr hWnd, //要定义热键的窗口的句柄
uint id, //定义热键ID不能与其它ID重复
KeyModifiers fsModifiers, //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
System.Windows.Forms.Keys vk //定义热键的内容
);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool UnregisterHotKey(
IntPtr hWnd, //要取消热键的窗口的句柄
uint id //要取消热键的ID
);
//定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
[Flags()]
public enum KeyModifiers
{
None = 0,
Alt = 1,
Ctrl = 2,
Shift = 4,
WindowsKey = 8
}
//====================
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr GetParent(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true)]
public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
//标题栏厚度
public const int SM_CYCAPTION = 4;
//边框宽度
public const int SM_CYBORDER = 6;
[DllImport("user32.dll", SetLastError = true)]
public static extern int GetSystemMetrics(int nIndex);
[DllImport("kernel32.dll")]
public static extern void OutputDebugString(string lpOutputString);
}
}

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-8.0.31.0" newVersion="8.0.31.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -0,0 +1,420 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" 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>{3988AF04-DF89-4BBB-BEC9-92CDAF3BCC9D}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>AssistClient</RootNamespace>
<AssemblyName>AssistClient</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>x64</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</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>
<PropertyGroup>
<ApplicationIcon>ComputerDisplayMode.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<SignManifests>false</SignManifests>
</PropertyGroup>
<PropertyGroup>
<TargetZone>LocalIntranet</TargetZone>
</PropertyGroup>
<PropertyGroup>
<GenerateManifests>false</GenerateManifests>
</PropertyGroup>
<PropertyGroup>
<ApplicationManifest>Properties\app.manifest</ApplicationManifest>
</PropertyGroup>
<ItemGroup>
<Reference Include="AdvMotAPI, Version=2.0.8.5, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\AdvMotAPI.dll</HintPath>
</Reference>
<Reference Include="Automation.BDaq4, Version=4.0.0.0, Culture=neutral, PublicKeyToken=463f5928d60183a0, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\Automation.BDaq4.dll</HintPath>
</Reference>
<Reference Include="ControllerDllCSharp, Version=3.0.0.1, Culture=neutral, processorArchitecture=AMD64">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\ControllerDllCSharp.dll</HintPath>
</Reference>
<Reference Include="halcondotnet, Version=21.5.0.0, Culture=neutral, PublicKeyToken=4973bed59ddbf2b8, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\halcondotnet.dll</HintPath>
</Reference>
<Reference Include="hdevenginedotnet, Version=21.5.0.0, Culture=neutral, PublicKeyToken=4973bed59ddbf2b8, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\hdevenginedotnet.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ML.OnnxRuntime, Version=0.0.0.0, Culture=neutral, PublicKeyToken=f27f157f0a5b7bb6, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\Microsoft.ML.OnnxRuntime.dll</HintPath>
</Reference>
<Reference Include="MvCameraControl.Net, Version=3.4.0.1, Culture=neutral, PublicKeyToken=52fddfb3f94be800, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\MvCameraControl.Net.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\Code\packages\Newtonsoft.Json.13.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="OpenCvSharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6adad1e807fea099, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\OpenCvSharp.dll</HintPath>
</Reference>
<Reference Include="OpenCvSharp.Extensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6adad1e807fea099, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\OpenCvSharp.Extensions.dll</HintPath>
</Reference>
<Reference Include="SqlSugar, Version=5.1.4.73, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\Code\packages\SqlSugar.5.1.4.73\lib\SqlSugar.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Management" />
<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.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="Yolo5, Version=1.0.0.0, Culture=neutral, processorArchitecture=AMD64">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\Yolo5.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="API.cs" />
<Compile Include="Config.cs" />
<Compile Include="DevContainer.cs" />
<Compile Include="Device\AxisDev.cs" />
<Compile Include="Device\CodeScannerDev.cs" />
<Compile Include="Device\ForLib.cs" />
<Compile Include="Device\IFLib.cs" />
<Compile Include="Device\IOCardDev.cs" />
<Compile Include="Device\LightDev.cs" />
<Compile Include="Device\ScannerDev.cs" />
<Compile Include="Device\SizeLib.cs" />
<Compile Include="Enums.cs" />
<Compile Include="Form1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="FrmCMDProcess.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmCMDProcess.Designer.cs">
<DependentUpon>FrmCMDProcess.cs</DependentUpon>
</Compile>
<Compile Include="FrmDebug3.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmDebug3.Designer.cs">
<DependentUpon>FrmDebug3.cs</DependentUpon>
</Compile>
<Compile Include="FrmLoading.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmLoading.designer.cs">
<DependentUpon>FrmLoading.cs</DependentUpon>
</Compile>
<Compile Include="FrmLogin.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmLogin.Designer.cs">
<DependentUpon>FrmLogin.cs</DependentUpon>
</Compile>
<Compile Include="FrmMain.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmMain.Designer.cs">
<DependentUpon>FrmMain.cs</DependentUpon>
</Compile>
<Compile Include="FrmProductList.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmProductList.Designer.cs">
<DependentUpon>FrmProductList.cs</DependentUpon>
</Compile>
<Compile Include="FrmProductStep.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmProductStep.Designer.cs">
<DependentUpon>FrmProductStep.cs</DependentUpon>
</Compile>
<Compile Include="FrmPTSetting.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmPTSetting.Designer.cs">
<DependentUpon>FrmPTSetting.cs</DependentUpon>
</Compile>
<Compile Include="FrmSetParams.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmSetParams.Designer.cs">
<DependentUpon>FrmSetParams.cs</DependentUpon>
</Compile>
<Compile Include="FrmStepInfo.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmStepInfo.Designer.cs">
<DependentUpon>FrmStepInfo.cs</DependentUpon>
</Compile>
<Compile Include="FrmStepList.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmStepList.Designer.cs">
<DependentUpon>FrmStepList.cs</DependentUpon>
</Compile>
<Compile Include="FrmSysSetting.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmSysSetting.Designer.cs">
<DependentUpon>FrmSysSetting.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="UI\AxisDevProp.cs" />
<Compile Include="UI\ForProp.cs" />
<Compile Include="UI\FrmScannerShow.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="UI\FrmScannerShow.Designer.cs">
<DependentUpon>FrmScannerShow.cs</DependentUpon>
</Compile>
<Compile Include="UI\IFProp.cs" />
<Compile Include="UI\IOCardDevProp.cs" />
<Compile Include="UI\LightDevProp.cs" />
<Compile Include="UI\PropExtend\PropertyOrderAttribute.cs" />
<Compile Include="UI\PropExtend\PropertySorter.cs" />
<Compile Include="UI\ScannerDevProp.cs" />
<Compile Include="UI\SizeLibProp.cs" />
<Compile Include="UI\UIAxisDev.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UI\UIAxisDev.Designer.cs">
<DependentUpon>UIAxisDev.cs</DependentUpon>
</Compile>
<Compile Include="UI\UICodeScannerDev.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UI\UICodeScannerDev.Designer.cs">
<DependentUpon>UICodeScannerDev.cs</DependentUpon>
</Compile>
<Compile Include="UI\UIForLib.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UI\UIForLib.Designer.cs">
<DependentUpon>UIForLib.cs</DependentUpon>
</Compile>
<Compile Include="UI\UIIFLib.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UI\UIIFLib.Designer.cs">
<DependentUpon>UIIFLib.cs</DependentUpon>
</Compile>
<Compile Include="UI\UIIOCardDev.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UI\UIIOCardDev.Designer.cs">
<DependentUpon>UIIOCardDev.cs</DependentUpon>
</Compile>
<Compile Include="UI\UILightDev.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UI\UILightDev.Designer.cs">
<DependentUpon>UILightDev.cs</DependentUpon>
</Compile>
<Compile Include="UI\UIScannerDev.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UI\UIScannerDev.Designer.cs">
<DependentUpon>UIScannerDev.cs</DependentUpon>
</Compile>
<Compile Include="UI\UISizeLib.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UI\UISizeLib.Designer.cs">
<DependentUpon>UISizeLib.cs</DependentUpon>
</Compile>
<Compile Include="Utils\DBUtils.cs" />
<Compile Include="Utils\EnumData.cs" />
<Compile Include="Utils\EnumUtil.cs" />
<Compile Include="Utils\FileUtil.cs" />
<Compile Include="Utils\HttpUtil.CS" />
<Compile Include="Utils\SSerialPort.cs" />
<Compile Include="Utils\Util.cs" />
<Compile Include="Utils\WINAPI.cs" />
<Compile Include="WebApi.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmCMDProcess.resx">
<DependentUpon>FrmCMDProcess.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmDebug3.resx">
<DependentUpon>FrmDebug3.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmLoading.resx">
<DependentUpon>FrmLoading.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmLogin.resx">
<DependentUpon>FrmLogin.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmMain.resx">
<DependentUpon>FrmMain.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmProductList.resx">
<DependentUpon>FrmProductList.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmProductStep.resx">
<DependentUpon>FrmProductStep.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmPTSetting.resx">
<DependentUpon>FrmPTSetting.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmSetParams.resx">
<DependentUpon>FrmSetParams.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmStepInfo.resx">
<DependentUpon>FrmStepInfo.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmStepList.resx">
<DependentUpon>FrmStepList.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmSysSetting.resx">
<DependentUpon>FrmSysSetting.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>
<EmbeddedResource Include="UI\FrmScannerShow.resx">
<DependentUpon>FrmScannerShow.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\UIAxisDev.resx">
<DependentUpon>UIAxisDev.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\UICodeScannerDev.resx">
<DependentUpon>UICodeScannerDev.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\UIForLib.resx">
<DependentUpon>UIForLib.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\UIIFLib.resx">
<DependentUpon>UIIFLib.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\UIIOCardDev.resx">
<DependentUpon>UIIOCardDev.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\UILightDev.resx">
<DependentUpon>UILightDev.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\UIScannerDev.resx">
<DependentUpon>UIScannerDev.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\UISizeLib.resx">
<DependentUpon>UISizeLib.cs</DependentUpon>
</EmbeddedResource>
<None Include="packages.config" />
<None Include="Properties\app.manifest" />
<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>
<None Include="Resources\down.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\left.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\right.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\up.png" />
</ItemGroup>
<ItemGroup>
<Content Include="ComputerDisplayMode.ico" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Models\Models.csproj">
<Project>{47694c39-2448-4be5-80a4-70d78b59272b}</Project>
<Name>Models</Name>
</ProjectReference>
<ProjectReference Include="..\Service\Service.csproj">
<Project>{1cced98a-7af6-47f3-b9f9-a9e7dad461b4}</Project>
<Name>Service</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.8">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4.8 %28x86 和 x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -0,0 +1,248 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using AssistClient.Utils;
using Newtonsoft.Json.Linq;
namespace AssistClient
{
public class Config
{
public static Models.User loginUser;
public static Dictionary<string, string> dicDevType = new Dictionary<string, string>();
//
public static string appBasePath = "";
//跳过检测设备
public static bool SkipAxis0, SkipAxis1, SkipAxis2,SkipAxis3;
public static bool SkipLight, SkipScannerGL, SkipScannerCC, SkipSmallAxis;
//DEV
public static int[] Axis_PulseOutMode=new int[4];
public static int[] Axis_MM2PulseNum = new int[4] { 1000, 1000, 1000, 1000};//1mm对应脉冲数
public static int[] Axis_HomeMode = new int[4];
public static int[] Axis_HomeDir = new int[4];//回Home方向
//回HOME速度
public static JArray Axis_HomeVelLow = new JArray();
public static JArray Axis_HomeVelHigh = new JArray();
public static JArray Axis_HomeAcc = new JArray();
public static JArray Axis_HomeDec = new JArray();
//回JOG速度
public static JArray Axis_JogVelLow = new JArray();
public static JArray Axis_JogVelHigh = new JArray();
public static JArray Axis_JogAcc = new JArray();
public static JArray Axis_JogDec = new JArray();
public static string IOCard_DeviceNum = "PCI-1730,BID#0";
public static int Light_PortNum = 1;//COM端口号
public static string SmallAxis_ComName = "COM2";//COM端口号
public static string Scanner_GENTL_CTI = "ScannerRuntime\\Win64_x64\\MvFGProducerCXP.cti";
public static string SizeEnginePath;
public static string SizeBmp_Path, Defect_SavePath;
public static string SizeRepairTablePath;
//尺寸配置
//public static string Size_LoadPath, Size_FileName;
//
public static Dictionary<CMDName, JObject> CMDProcess;
//DB
//有些服务器防火墙有问题需要加上 min pool size=1 避免认为是恶意请求
//如果用到bulkCopy需要加 AllowLoadLocalInfile=true
//public static string dbMysqlCon = "server=localhost;Database=ProductionDB;Uid=root;Pwd=123456;";
public static string DBConStr = "server=localhost;Database=ProductionDB;Uid=root;Pwd=123456; AllowLoadLocalInfile=true";
public static string ServerIP = "";
public static int ServerPort = 18082;
//LOG
public static string LogPath;
//WEBAPI
public static string baseUrl="";
//==========位置 初始位 上料位 下料位(下料位不存在时使用上料位)
public static JObject joPTSetting = new JObject()
{
{ "initPT", null },
{ "upPT", null},
{ "downPT", null}
};
public static void LoadAllConfig()
{
InitDevDic();
LoadSysConfig();
LoadPTConfig();
DeleteFiles(Config.SizeBmp_Path, -2);
//
string lsCmdPath = appBasePath + "\\CMDProcess\\";
if(!Directory.Exists(lsCmdPath))
Directory.CreateDirectory(lsCmdPath);
string fileName;
CMDProcess = new Dictionary<CMDName, JObject>();
foreach (int item in Enum.GetValues(typeof(CMDName)))//item为key值
{
//string name = Enum.GetName(typeof(CMDName), item);//获取名称
fileName = lsCmdPath + item + ".json";
if (File.Exists(fileName))
CMDProcess.Add((CMDName)item, JObject.Parse(File.ReadAllText(fileName)));
//else
// CMDProcess.Add((CMDName)item, null);
}
}
public static void LoadSysConfig()
{
if (string.IsNullOrWhiteSpace(appBasePath))
appBasePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string configPath = appBasePath + "\\SysConfig.ini";
string lsTmp = "";
DBConStr = Util.ReadIniValue(configPath, "Server", "DBConStr");
ServerIP = Util.ReadIniValue(configPath, "Server", "ServerIP");
lsTmp = Util.ReadIniValue(configPath, "Server", "ServerPort");
if (Util.IsNumber(lsTmp)) ServerPort = Convert.ToInt32(lsTmp);
//Skip
SkipAxis0 = Util.ReadIniValue(configPath, "SKIP", "SkipAxis0") == "1";
SkipAxis1 = Util.ReadIniValue(configPath, "SKIP", "SkipAxis1") == "1";
SkipAxis2 = Util.ReadIniValue(configPath, "SKIP", "SkipAxis2") == "1";
SkipAxis3 = Util.ReadIniValue(configPath, "SKIP", "SkipAxis3") == "1";
SkipLight = Util.ReadIniValue(configPath, "SKIP", "SkipLight") == "1";
SkipScannerGL = Util.ReadIniValue(configPath, "SKIP", "SkipScannerGL") == "1";
SkipScannerCC = Util.ReadIniValue(configPath, "SKIP", "SkipScannerCC") == "1";
SkipSmallAxis = Util.ReadIniValue(configPath, "SKIP", "SkipSmallAxis") == "1";
//DEV
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis0_PulseOutMode");
if (Util.IsNumber(lsTmp)) Config.Axis_PulseOutMode[0] = Convert.ToInt32(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis1_PulseOutMode");
if (Util.IsNumber(lsTmp)) Config.Axis_PulseOutMode[1] = Convert.ToInt32(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis2_PulseOutMode");
if (Util.IsNumber(lsTmp)) Config.Axis_PulseOutMode[2] = Convert.ToInt32(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis3_PulseOutMode");
if (Util.IsNumber(lsTmp)) Config.Axis_PulseOutMode[3] = Convert.ToInt32(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis0_HomeMode");
if (Util.IsNumber(lsTmp)) Config.Axis_HomeMode[0] = Convert.ToInt32(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis1_HomeMode");
if (Util.IsNumber(lsTmp)) Config.Axis_HomeMode[1] = Convert.ToInt32(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis2_HomeMode");
if (Util.IsNumber(lsTmp)) Config.Axis_HomeMode[2] = Convert.ToInt32(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis3_HomeMode");
if (Util.IsNumber(lsTmp)) Config.Axis_HomeMode[3] = Convert.ToInt32(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis0_HomeDir");
if (Util.IsNumber(lsTmp)) Config.Axis_HomeDir[0] = Convert.ToInt32(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis1_HomeDir");
if (Util.IsNumber(lsTmp)) Config.Axis_HomeDir[1] = Convert.ToInt32(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis2_HomeDir");
if (Util.IsNumber(lsTmp)) Config.Axis_HomeDir[2] = Convert.ToInt32(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis3_HomeDir");
if (Util.IsNumber(lsTmp)) Config.Axis_HomeDir[3] = Convert.ToInt32(lsTmp);
//HOME速度
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis_HomeVelLow");
if (!string.IsNullOrWhiteSpace(lsTmp)) Axis_HomeVelLow = JArray.Parse(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis_HomeVelHigh");
if (!string.IsNullOrWhiteSpace(lsTmp)) Axis_HomeVelHigh = JArray.Parse(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis_HomeAcc");
if (!string.IsNullOrWhiteSpace(lsTmp)) Axis_HomeAcc = JArray.Parse(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis_HomeDec");
if (!string.IsNullOrWhiteSpace(lsTmp)) Axis_HomeDec = JArray.Parse(lsTmp);
//JOG速度
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis_JogVelLow");
if (!string.IsNullOrWhiteSpace(lsTmp)) Axis_JogVelLow = JArray.Parse(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis_JogVelHigh");
if (!string.IsNullOrWhiteSpace(lsTmp)) Axis_JogVelHigh = JArray.Parse(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis_JogAcc");
if (!string.IsNullOrWhiteSpace(lsTmp)) Axis_JogAcc = JArray.Parse(lsTmp);
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis_JogDec");
if (!string.IsNullOrWhiteSpace(lsTmp)) Axis_JogDec = JArray.Parse(lsTmp);
//
lsTmp = Util.ReadIniValue(configPath, "DEV", "Light_PortNum");
if (Util.IsNumber(lsTmp)) Config.Light_PortNum = Convert.ToInt32(lsTmp);
IOCard_DeviceNum = Util.ReadIniValue(configPath, "DEV", "IOCard_DeviceNum");
SizeEnginePath = Util.ReadIniValue(configPath, "DEV", "SizeEnginePath");
SizeBmp_Path = Util.ReadIniValue(configPath, "DEV", "SizeBmp_Path");
SizeRepairTablePath = Util.ReadIniValue(configPath, "DEV", "SizeRepairTablePath");
//LOG
LogPath = Util.ReadIniValue(configPath, "LOG", "LogPath");
}
public static void LoadPTConfig()
{
if (string.IsNullOrWhiteSpace(appBasePath))
appBasePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string configPath = appBasePath + "\\PTConfig.json";
string lsTmp = File.ReadAllText(configPath);
joPTSetting = JObject.Parse(lsTmp);
}
private static void InitDevDic()
{
//dicDevType.Add("CodeScanner", "扫码枪");//固定为必有开始
if (!dicDevType.ContainsKey("IOCard")) dicDevType.Add("IOCard", "I/O控制");
if (!dicDevType.ContainsKey("Axis")) dicDevType.Add("Axis", "滑台电机");
if (!dicDevType.ContainsKey("Light")) dicDevType.Add("Light", "光源");
if (!dicDevType.ContainsKey("Scanner_CC")) dicDevType.Add("Scanner_CC", "网口相机");
if (!dicDevType.ContainsKey("Size")) dicDevType.Add("Size", "尺寸测量");
if (!dicDevType.ContainsKey("For")) dicDevType.Add("For", "For循环");
if (!dicDevType.ContainsKey("If")) dicDevType.Add("If", "If条件");
}
private static void DeleteFiles(string dirPath, int days = -7)
{
if (!Directory.Exists(dirPath)) return;
string[] file_list = Directory.GetFiles(dirPath);
var delFiles = file_list.Select(file => new FileInfo(file))
.Where(f => f.CreationTime <= DateTime.Now.AddDays(days))
.Select(x => x.FullName)
.ToList();
foreach (string file in delFiles)
File.Delete(file);
}
public static string getDefectName(string defectCode)
{
defectCode= defectCode.ToLower();
switch (defectCode)
{
case "dk":
return "堵孔";
case "zw":
return "脏污";
case "xws":
return "纤维丝";
case "gsyc":
return "钢丝异常";
case "qk":
return "缺口";
case "zk":
return "针孔";
case "pp":
return "泡泡";
case "hs":
return "划伤";
case "yx":
return "压线";
case "xb":
return "斜边";
case "sx":
return "栅线";
case "ds":
return "断栅";
default:
return "未知";
}
}
}
}

View File

@ -0,0 +1,164 @@
using Newtonsoft.Json.Linq;
using AssistClient.Device;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using static AssistClient.Device.AxisDev;
namespace AssistClient
{
public class DevContainer
{
public AxisDev devAxis;//=new AxisDev();
public CodeScannerDev devCodeScanner;//= new CodeScannerDev();
public IOCardDev devIOCard;//=new IOCardDev();
public LightDev devLight;//=new LightDev();
public ScannerDev devScannerCC;// = new ScannerDev(ScannerDev.ScannerType.CC);
public SizeLib libSize;
public ForLib libFor;
public IFLib libIF;
public Action<WarningEnum, string> WarningEvent;
public Action<bool, string> StateChange;
public Action<string, string> OutDebugEvent;
public Action<int, AxisPosType, double> axisPosEvent;
public bool state = false;
private Thread t;
private IntPtr preView1, preView2;
public void start(IntPtr view1, IntPtr view2)
{
this.preView1 = view1;
this.preView2 = view2;
devCodeScanner = new CodeScannerDev();
devCodeScanner.WarningEvent = WarningEvent;
if (!devCodeScanner.start()) throw new Exception("扫码枪初始化失败!");
t = new System.Threading.Thread(run);
t.IsBackground = true;
t.Start();
}
public void stop()
{
try
{
state = false;
try { devAxis.stop(); } catch { }
try { devIOCard.stop(); } catch { }
try { devLight.stop(); } catch { }
try { devScannerCC.stop(); devScannerCC.close(); } catch { }
try { libSize.stop(); } catch { }
try { devCodeScanner.stop(); } catch { }
}
catch { }
}
private void run()
{
try
{
devAxis = new AxisDev();
devAxis.WarningEvent = WarningEvent;
devAxis.axisPosEvent = axisPosEvent;//位置POS
devIOCard = new IOCardDev();
devIOCard.WarningEvent = WarningEvent;
//devIOCard.OUTEvent = (index, data) =>
//{
// if (Config.HeightDevIOState && devAxis.IsInit && (devAxis.isMoveing(0) || devAxis.isMoveing(2)))
// {
// WarningEvent?.Invoke(WarningEnum.High, "厚度IO已打开急停请检查设备防止损坏");
// //devAxis.stopNow();
// }
//};
devLight = new LightDev();
devLight.WarningEvent = WarningEvent;
devScannerCC = new ScannerDev(ScannerDev.ScannerType.CC);
devScannerCC.WarningEvent = WarningEvent;
libSize = new SizeLib();
libSize.WarningEvent = WarningEvent;
libFor = new ForLib();
libIF = new IFLib();
//启动
if (!devAxis.start(Config.Axis_PulseOutMode)) throw new Exception("运动板卡初始化失败!");
//if (!devCodeScanner.start()) throw new Exception("扫码枪初始化失败!");
if (!devIOCard.start(Config.IOCard_DeviceNum)) throw new Exception("I/O板卡初始化失败");
if (!Config.SkipLight && !devLight.start(Config.Light_PortNum)) throw new Exception("光源设备初始化失败!");
if (!Config.SkipScannerCC && !devScannerCC.open()) throw new Exception("相机初始化失败!");
if (!Config.SkipScannerCC && !devScannerCC.start(this.preView2, Config.SizeBmp_Path)) throw new Exception("相机打开失败!");
if (!libSize.start(Config.SizeEnginePath)) throw new Exception("尺寸库初始化失败!");
//
state = true;
StateChange?.Invoke(true, "成功");
}
catch (Exception ex)
{
stop();
StateChange?.Invoke(false, ex.Message);
}
}
/// <summary>
/// I/O指令输出
/// </summary>
/// <param name="key">CMDName</param>
/// <param name="isStrobe">频闪</param>
/// <param name="recover">输出sleep下后恢复原信号</param>
/// <param name="recoverWaitTime">sleep多久后反转</param>
/// <returns></returns>
public bool io_output(CMDName key, bool isStrobe = false, bool recover = false, int recoverWaitTime = 100)
{
if (Config.CMDProcess.ContainsKey(key))
return io_output(key.ToString(),Config.CMDProcess[key], isStrobe, recover, recoverWaitTime);
return false;
}
/// <summary>
/// I/O指令输出
/// </summary>
/// <param name="processParam"></param>
/// <param name="isStrobe">频闪</param>
/// <param name="recover">输出sleep(recoverWaitTime)下,后恢复原信号</param>
/// <param name="recoverWaitTime">sleep 后反转</param>
public bool io_output(string tagName,JObject processParam, bool isStrobe = false, bool recover = false, int recoverWaitTime = 100)
{
bool result = false;
string[] OUT_OP_SHOW = processParam.Value<JArray>("OUT_OP_SHOW").ToObject<List<string>>().ToArray();
OUT_OP_SHOW = Utils.Util.IODataFormatBinaryStr(OUT_OP_SHOW, true);
for (int i = 0; i < OUT_OP_SHOW.Length; i++)
{
for (int j = 0; j < OUT_OP_SHOW[i].Length; j++)
{
int jj = OUT_OP_SHOW[i].Length - j - 1;
if (OUT_OP_SHOW[i][jj] == 'L' || OUT_OP_SHOW[i][jj] == 'H')
{
if (recover)
{
if (recoverWaitTime > 0)
{
OutDebugEvent?.Invoke(tagName, $"向I/O输出引脚{i}-{j},信号{OUT_OP_SHOW[i][jj]},输出时长:{recoverWaitTime}ms");
devIOCard.writeBitState(i, j, OUT_OP_SHOW[i][jj] == 'H', isStrobe);
Thread.Sleep(recoverWaitTime);
}
OutDebugEvent?.Invoke(tagName, $"向I/O输出引脚{i}-{j},信号{OUT_OP_SHOW[i][jj]=='L'}");
devIOCard.writeBitState(i, j, OUT_OP_SHOW[i][jj] == 'L');
}
else
{
OutDebugEvent?.Invoke(tagName, $"向I/O输出引脚{i}-{j},信号{OUT_OP_SHOW[i][jj]}");
devIOCard.writeBitState(i, j, OUT_OP_SHOW[i][jj] == 'H', isStrobe);
}
result = true;
}
}
}
return result;
}
}
}

View File

@ -0,0 +1,962 @@
using Advantech.Motion;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
namespace AssistClient.Device
{
public class AxisDev : IDisposable
{
public enum AxisStateType
{
[Description("轴状态")]
AxisState = 0,
[Description("轴运动状态")]
AxisMotionState = 1,
[Description("轴IO状态")]
AxisIOState = 2,
}
public Action<int, AxisStateType, uint> axisStateEvent;
public enum AxisPosType
{
[Description("命令位置")]
CmdPos = 0,
[Description("反馈位置")]
ActualPos = 1,
}
public Action<int, AxisPosType, double> axisPosEvent;
/// <summary> 使用
/// 轴状态(AxisState 0-14) 单一值,无需按位取
/// STA_AxDisable -- 轴被禁用,用户可打开并激活
/// STA_AxReady ---- 轴已准备就绪,等待新的命令 *
/// STA_Stopping ---- 轴停止
/// STA_AxErrorStop --- 出现错误,轴停止
/// STA_AxHoming ---- 轴正在执行返回原点运动
/// STA_AxPtpMotion ---- 轴正在执行PTP 运动
/// STA_AxContiMotion ---- 轴正在执行连续运动
/// STA_AxSyncMotion --- 轴在一个群组中群组正在执行插补运动或轴是一个从轴正在执行Ecam/E-gear/Gantry 运动。
/// STA_AX_EXT_JOG -- 轴由外部信号控制。当外部信号激活时轴将执行JOG 模式运动。
/// STA_AX_EXT_MPG --- 轴由外部信号控制。当外部信号激活时轴将执行MPG 模式运动
/// </summary>
//public Action<int, int> axisStateEvent;
/// <summary>
/// 轴运动状态 使用
/// 位 说明
/// Stop ---- 停止
/// WaitERC---- 等待ERC 完成
/// InFA ---- 处于特定速度中 = FA
/// InFL ---- 处于低速中 = FL
/// InACC ---- 加速中
/// InFH ---- 处于最大速度中 = FH
/// InDEC ---- 减速中
/// WaitINP---- 到位等待
/// </summary>
//public Action<int, int> axisMotionStateEvent;
/// <summary>
/// 轴IO状态 (Ax_Motion_IO) 使用
/// RDY---- RDY 针脚输入
/// ALM ---- 报警信号输入 *
/// LMT+ ---- 限位开关+ *
/// LMT- ---- 限位开关- *
/// ORG---- 原始开关 *
/// DIR ---- DIR 输出
/// EMG ---- 紧急信号输入
/// EZ ---- 编码器 Z 信号
/// INP ---- 到位信号输入
/// SVON ---- 伺服开启OUT6 *
/// ALRM ---- 报警复位输出状态
/// SLMT+ ---- 软件限位+
/// SLMT- ---- 软件限位-
/// CMP----- 比较信号OUT5
/// </summary>
//public Action<int, bool, bool, bool, bool> axisIOStateEvent;
public Action<WarningEnum, string> WarningEvent;
/// <summary>
/// 设备列表多张PCI板卡
/// </summary>
public List<DEV_LIST> DevList { get; private set; }
/// <summary>
/// 设备数量
/// </summary>
//private uint deviceCount = 0;
/// <summary>
/// 设备号,用于打开设备(非索引)
/// </summary>
public uint DeviceNum { get; private set; } = 0;
/// <summary>
/// 设备句柄
/// </summary>
private IntPtr m_DeviceHandle = IntPtr.Zero;
/// <summary>
/// 轴数量
/// </summary>
private uint m_ulAxisCount = 0;
private IntPtr[] m_Axishand = new IntPtr[0];
public double[] CmdPos { get; private set; } = new double[32];//轴命令位置
public double[] ActualPos { get; private set; } = new double[32];//轴实际(反馈)位置
public UInt16[] AxState { get; private set; } = new UInt16[32];//轴状态
public UInt32[] IOStatus { get; private set; } = new UInt32[32];//轴IO状态
public uint[] AxMotionState { get; private set; } = new uint[32];//轴运动状态
private uint[] AxEnableEvtArray = new uint[32];
private uint[] GpEnableEvt = new uint[32];
/// <summary>
/// 组
/// </summary>
//private IntPtr m_GpHand = IntPtr.Zero;
/// <summary>
/// 断电后设备必需复位
/// </summary>
public bool IsReset { private set; get; }=false;
public bool IsDebug = false;
/// <summary>
/// 是否打开设备成功
/// </summary>
public bool IsInit { get; private set; } = false;
Thread checkEventThread;
private System.Timers.Timer timer = new System.Timers.Timer();
/// <summary>
/// 获取设备列表
/// </summary>
/// <returns></returns>
/// <exception cref="Exception"></exception>
//public static List<DEV_LIST> getDevList()
//{
// DEV_LIST[] curAvailableDevs = new DEV_LIST[Motion.MAX_DEVICES];
// uint deviceCount = 0;
// int Result = Motion.mAcm_GetAvailableDevs(curAvailableDevs, Motion.MAX_DEVICES, ref deviceCount);
// if (Result != (int)ErrorCode.SUCCESS || curAvailableDevs.Length < 1)
// throw new Exception("Get Device Numbers Failed With Error Code: [0x" + Convert.ToString(Result, 16) + "] DevCount=" + curAvailableDevs.Length);
// return curAvailableDevs.ToList().Take((int)deviceCount).ToList();
//}
public AxisDev()
{
//初始化
DEV_LIST[] curAvailableDevs = new DEV_LIST[Motion.MAX_DEVICES];
uint deviceCount = 0;
int Result = Motion.mAcm_GetAvailableDevs(curAvailableDevs, Motion.MAX_DEVICES, ref deviceCount);
if (Result != (int)ErrorCode.SUCCESS || curAvailableDevs.Length < 1)
throw new Exception("Get Device Numbers Failed With Error Code: [0x" + Convert.ToString(Result, 16) + "] DevCount=" + curAvailableDevs.Length);
DevList = curAvailableDevs.ToList().Take((int)deviceCount).ToList();
}
public void Dispose()
{
stop();
}
/// <summary>
/// 打开设备
/// </summary>
/// <exception cref="Exception"></exception>
public bool start(int[] AxisPulseOutMode,bool debug=false)
{
if (DevList == null || DevList.Count < 1)
{
WarningEvent?.Invoke(WarningEnum.High, "Axis设备为空");
return false;
}
DeviceNum = DevList[0].DeviceNum;
return start(DevList[0].DeviceNum, AxisPulseOutMode, debug);
}
int[] AxisPulseOutMode=new int[4];
public bool start(uint DeviceNum,int[] AxisPulseOutMode, bool debug = false)
{
try
{
if (IsInit) return true;
bALM = bEMG = bLMTP = bLMTN = false;
//打开设备
uint uResult = Motion.mAcm_DevOpen(DeviceNum, ref m_DeviceHandle);
if (uResult != (int)ErrorCode.SUCCESS)
throw new Exception("Open Device Failed With Error Code: [0x" + Convert.ToString(uResult, 16) + "]");
IsDebug = debug;
IsReset = false;
//读取轴数量
uResult = Motion.mAcm_GetU32Property(m_DeviceHandle, (uint)PropertyID.FT_DevAxesCount, ref m_ulAxisCount);
if (uResult != (uint)ErrorCode.SUCCESS)
throw new Exception("Get Axis Number Failed With Error Code: [0x" + Convert.ToString(uResult, 16) + "]");
m_Axishand = new IntPtr[m_ulAxisCount];
//打开轴
for (int i = 0; i < m_ulAxisCount; i++)
{
//打开每个轴并获得每个轴句柄
uResult = Motion.mAcm_AxOpen(m_DeviceHandle, (UInt16)i, ref m_Axishand[i]);
if (uResult != (uint)ErrorCode.SUCCESS)
throw new Exception("Open Axis Failed With Error Code: [0x" + Convert.ToString(uResult, 16) + "]");
//先读取每个轴状态
this.refreshAxisState(i);
//判断与打开电源使能,1: On
if ((IOStatus[i] & (uint)Ax_Motion_IO.AX_MOTION_IO_SVON) == 0)
{
uResult = Motion.mAcm_AxSetSvOn(m_Axishand[i], 1);
if (uResult != (uint)ErrorCode.SUCCESS)
throw new Exception("Servo On Failed With Error Code: [0x" + Convert.ToString(uResult, 16) + "]");
}
}
//根据加载的文件设置设备的所有配置(需在打开每个轴 mAcm_AxSetSvOn 后设置)
string cfgPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\DevCfg\\Axis_" + DeviceNum + ".cfg";
if (File.Exists(cfgPath))
{
uResult = Motion.mAcm_DevLoadConfig(m_DeviceHandle, cfgPath);
if (uResult != (uint)ErrorCode.SUCCESS)
throw new Exception("Load Config Failed With Error Code: [0x" + Convert.ToString(uResult, 16) + "]");
}
Thread.Sleep(500);
for (int i = 0; i < m_ulAxisCount; i++)
{
//先读取每个轴状态(进行报警)
this.refreshAxisState(i);
//每个轴的初始属性(reset 命令位置和实际(反馈)位置)
//double cmdPosition = new double();
//cmdPosition = 0;
//为指定的轴设置命令位置
//Motion.mAcm_AxSetCmdPosition(m_Axishand[i], cmdPosition);
//为指定的轴设置实际(反馈)位置
//Motion.mAcm_AxSetActualPosition(m_Axishand[i], cmdPosition);
//set Axis PulseOutMode
if (!setPulseOutMode(i, (AxisPulseOutMode)AxisPulseOutMode[i]))
throw new Exception($"Axis{i} 设置脉冲模式失败!");
this.AxisPulseOutMode = AxisPulseOutMode;
//Event
AxEnableEvtArray[i] |= (uint)EventType.EVT_AX_MOTION_DONE; //运动完成(减速直至停止)
//AxEnableEvtArray[i] |= (uint)EventType.EVT_AX_VH_START; //轴加速到运行速度时
//AxEnableEvtArray[i] |= (uint)EventType.EVT_AX_VH_END;//轴运行速度结束时,开始减速
AxEnableEvtArray[i] |= (uint)EventType.EVT_AX_HOME_DONE;
AxEnableEvtArray[i] |= (uint)EventType.EVT_AX_ERROR;
//初次获取轴的运动I/O状态。
this.refreshAxisState(i);
}
uResult = Motion.mAcm_EnableMotionEvent(m_DeviceHandle, AxEnableEvtArray, GpEnableEvt, m_ulAxisCount, 3);
if (uResult != (uint)ErrorCode.SUCCESS)
throw new Exception("EnableMotionEvent Filed With Error Code[0x" + Convert.ToString(uResult, 16) + "]");
IsInit = true;
timer.Elapsed += Timer_Elapsed;
timer.Interval = 100;
timer.Start();
//用户应该创建一个新的线程来检查事件状态,例如:CheckEvtThread()函数
checkEventThread = new Thread(new ThreadStart(checkEvtThread));
checkEventThread.Start();
return true;
}
catch (Exception ex)
{
WarningEvent?.Invoke(WarningEnum.High, ex.Message);
stop();
return false;
}
}
/// <summary>
/// 关闭设备
/// </summary>
/// <exception cref="Exception"></exception>
public bool stop()
{
try
{
if (!IsInit) return false;
uint i;
for (i = 0; i < m_ulAxisCount; i++)
{
if (AxState[i] == (uint)AxisState.STA_AX_ERROR_STOP)
{
WarningEvent?.Invoke(WarningEnum.Low, i + "轴处于ErrorStop状态已重置");
//重置轴的状态。如果轴处于ErrorStop状态则调用此函数后状态将更改为Ready
Motion.mAcm_AxResetError(m_Axishand[i]);
}
// 命令轴减速停止(缓停)
Motion.mAcm_AxStopDec(m_Axishand[i]);
//sleep? 关闭电源使能,1: On
uint uResult = Motion.mAcm_AxSetSvOn(m_Axishand[i], 0);
if (uResult != (uint)ErrorCode.SUCCESS)
throw new Exception("Servo On Failed With Error Code: [0x" + Convert.ToString(uResult, 16) + "]");
}
//删除组中的所有轴并关闭组句柄
//Motion.mAcm_GpClose(ref m_GpHand);
//m_GpHand = IntPtr.Zero;
for (i = 0; i < m_ulAxisCount; i++)
{
//Close Axes
Motion.mAcm_AxClose(ref m_Axishand[i]);
}
timer.Elapsed -= Timer_Elapsed;
m_ulAxisCount = 0;
//Close Device
Motion.mAcm_DevClose(ref m_DeviceHandle);
m_DeviceHandle = IntPtr.Zero;
IsInit = false;
timer.Stop();
return true;
}
catch (Exception e)
{
return false;
}
}
/// <summary>
/// 轴事件
/// </summary>
private void checkEvtThread()
{
uint Result;
UInt32[] AxEvtStatusArray = new UInt32[32];
UInt32[] GpEvtStatusArray = new UInt32[32];
UInt32 i;
while (IsInit)
{
//如果你想获得轴或组的事件状态,你应该通过调用 Motion.mAcm_EnableMotionEvent 来启用这些事件
//AxEvtStatusArray[n]返回每个轴的中断事件状态n 表示运动设备的轴个数
//GpEnableEvtArrayy[n]:返回每个群组的中断事件状态
//AxArrayElements U32 IN AxEvtStatusArray 中元素个数
//GpArrayElements U32 IN GpEvtStatusArray 中元素个数
//Millisecond U32 IN 设定每次Check 事件时的等待时间
Result = Motion.mAcm_CheckMotionEvent(m_DeviceHandle, AxEvtStatusArray, GpEvtStatusArray, m_ulAxisCount, 0, 1000);//3,10
if (Result == (uint)ErrorCode.SUCCESS)
{
for (i = 0; i < m_ulAxisCount; i++)
{
if ((AxEvtStatusArray[i] & (uint)EventType.EVT_AX_MOTION_DONE) > 0)
{
this.refreshAxisState((int)i);//更新AXIS状态
}
if ((AxEvtStatusArray[i] & (uint)EventType.EVT_AX_VH_START) > 0)
{
this.refreshAxisState((int)i);//更新AXIS状态
}
if ((AxEvtStatusArray[i] & (uint)EventType.EVT_AX_VH_END) > 0)
{
this.refreshAxisState((int)i);//更新AXIS状态
}
if ((AxEvtStatusArray[i] & (uint)EventType.EVT_AX_HOME_DONE) > 0)
{
this.refreshAxisState((int)i);//更新AXIS状态
WarningEvent?.Invoke(WarningEnum.Normal, $"轴{i}回原点完成;当前命令位置:{CmdPos[i]},反馈位置:{ActualPos[i]}.");
//回原点后反馈位置未归0则置0 //重置后会自动重新更新状态
if (CmdPos[i] != 0) this.resetCmdPosition((int)i);
if (ActualPos[i] != 0) this.resetActualPosition((int)i);
}
if ((AxEvtStatusArray[i] & (uint)EventType.EVT_AX_ERROR) > 0)
{
this.refreshAxisState((int)i);//更新AXIS状态
}
}
//if (m_GpHand != IntPtr.Zero)
//{
// if (textBoxGpID.Text != "")
// {
// if ((GpEvtStatusArray[0] & ((uint)EventType.EVT_GP1_MOTION_DONE << Convert.ToByte(textBoxGpID.Text))) > 0)
// {
// m_GpDoneEvtCnt++;
// }
// if ((GpEvtStatusArray[1] & ((uint)EventType.EVT_GP1_VH_START << Convert.ToByte(textBoxGpID.Text))) > 0)
// {
// m_GpVHStartCnt++;
// }
// if ((GpEvtStatusArray[2] & ((uint)EventType.EVT_GP1_VH_END << Convert.ToByte(textBoxGpID.Text))) > 0)
// {
// m_GpVHEndCnt++;
// }
// }
//}
}
}
}
public bool isReady(int axisIndex = -1)
{
for (int i = 0; i < m_ulAxisCount; i++)
{
if (isSkip(axisIndex)) continue;
if (i == axisIndex || axisIndex == -1)
{
Motion.mAcm_AxGetState(m_Axishand[i], ref AxState[i]);
if (AxState[i] != (uint)AxisState.STA_AX_READY)
{
if (AxState[i] == (uint)AxisState.STA_AX_ERROR_STOP)
{
var errCode = Motion.mAcm_GetLastError(m_Axishand[i]);
if (errCode != 0)
{
StringBuilder sb = new StringBuilder(512);
if (!Motion.mAcm_GetErrorMessage(errCode, sb, 511))
sb = new StringBuilder("未知错误!");
string errStr = $"轴{i}运行错误,错误码({errCode},错误信息:{sb.ToString().Trim()})";
WarningEvent?.Invoke(WarningEnum.High, errStr);
throw new Exception(errStr);
}
else
{
throw new Exception($"轴{i}运行错误,当前状态:{((AxisState)AxState[i]).ToString()}");
}
}
return false;
}
}
}
return true;
}
public bool isError(int axisIndex = -1)
{
for (int i = 0; i < m_ulAxisCount; i++)
{
if (isSkip(axisIndex)) continue;
if (i == axisIndex || axisIndex == -1)
{
Motion.mAcm_AxGetState(m_Axishand[i], ref AxState[i]);
if (AxState[i] == (uint)AxisState.STA_AX_ERROR_STOP)
return true;
//
if ((IOStatus[i] & (uint)Ax_Motion_IO.AX_MOTION_IO_ALM) > 0
|| (IOStatus[i] & (uint)Ax_Motion_IO.AX_MOTION_IO_EMG) > 0
|| (IOStatus[i] & (uint)Ax_Motion_IO.AX_MOTION_IO_LMTP) > 0
|| (IOStatus[i] & (uint)Ax_Motion_IO.AX_MOTION_IO_LMTN) > 0)
return true;
}
}
return false;
}
/// <summary>
/// 缓停,jog时也可用
/// </summary>
public void stopDec(int axisIndex = -1)
{
for (int i = 0; i < m_ulAxisCount; i++)
{
if (i == axisIndex || axisIndex == -1)
{
Motion.mAcm_AxStopDec(m_Axishand[i]);
}
}
}
/// <summary>
/// 急停
/// </summary>
public void stopNow(int axisIndex = -1)
{
if (!IsInit) return;
for (int i = 0; i < m_ulAxisCount; i++)
{
if (i == axisIndex || axisIndex == -1)
{
Motion.mAcm_AxStopEmg(m_Axishand[i]);
}
}
}
public void resetAxisState(int axisIndex=-1)
{
if (!IsInit) return;
for (int i = 0; i < m_ulAxisCount; i++)
{
if (isSkip(axisIndex)) continue;
if (i == axisIndex || axisIndex == -1)
{
if (AxState[i] == (uint)AxisState.STA_AX_ERROR_STOP)
{
//重置轴的状态。如果轴处于ErrorStop状态则调用此函数后状态将更改为Ready
bALM = bEMG = bLMTP = bLMTN = false;
Motion.mAcm_AxResetError(m_Axishand[i]);
refreshAxisState(i);
}
// 命令轴减速停止(缓停)
Motion.mAcm_AxStopDec(m_Axishand[i]);
}
}
}
/// <summary>
/// 指定的轴设置命令位置
/// </summary>
public void resetCmdPosition(int axisIndex = -1, double position = 0)
{
if (!IsInit) return;
for (int i = 0; i < m_ulAxisCount; i++)
{
if (isSkip(axisIndex)) continue;
if (i == axisIndex || axisIndex == -1)
{
Motion.mAcm_AxSetCmdPosition(m_Axishand[i], position);
this.refreshAxisState(i);
}
}
}
/// <summary>
/// 指定的轴设置实际(反馈)位置
/// </summary>
public void resetActualPosition(int axisIndex=-1, double position = 0)
{
if (!IsInit) return;
for (int i = 0; i < m_ulAxisCount; i++)
{
if (isSkip(axisIndex)) continue;
if (i == axisIndex || axisIndex == -1)
{
Motion.mAcm_AxSetActualPosition(m_Axishand[i], position);
this.refreshAxisState(i);
}
}
}
/// <summary>
/// 获取速度 [vellow,velhigh,acc,dec,Jerk]
/// </summary>
/// <param name="axisIndex"></param>
/// <returns></returns>
public double[] getAxisVelParam(int axisIndex)
{
double[] value=new double[5];
Motion.mAcm_GetF64Property(m_Axishand[axisIndex], (uint)PropertyID.PAR_AxVelLow, ref value[0]);
Motion.mAcm_GetF64Property(m_Axishand[axisIndex], (uint)PropertyID.PAR_AxVelHigh, ref value[1]);
Motion.mAcm_GetF64Property(m_Axishand[axisIndex], (uint)PropertyID.PAR_AxAcc, ref value[2]);
Motion.mAcm_GetF64Property(m_Axishand[axisIndex], (uint)PropertyID.PAR_AxDec, ref value[3]);
Motion.mAcm_GetF64Property(m_Axishand[axisIndex], (uint)PropertyID.PAR_AxJerk, ref value[4]);//0-T/S 型曲线
return value;
}
/// <summary>
/// 速度设置 注运动的过程中可变速度加速度和减速度需使用AxChangeVelEx方法
/// </summary>
/// <param name="velLow">起始速度</param>
/// <param name="high">运行速度</param>
/// <param name="acc">加速度</param>
/// <param name="dec">减速度</param>
/// <param name="axisIndex"></param>
/// <param name="isJogOrHome">true 不行回HOME也是false</param>
public void setAxisVelParam(double velLow, double high = 0, double acc = 0, double dec = 0, int axisIndex = -1,bool isJogOrHome=false)
{
uint result;
for (int i = 0; i < m_ulAxisCount; i++)
{
if (i == axisIndex || axisIndex == -1)
{
if (!isJogOrHome)
{
if ((AxisState)AxState[i] != AxisState.STA_AX_READY)
continue;
if (velLow > 0) result = Motion.mAcm_SetF64Property(m_Axishand[i], (uint)PropertyID.PAR_AxVelLow, toPulse(velLow, Config.Axis_MM2PulseNum[i]));
if (high > 0) result = Motion.mAcm_SetF64Property(m_Axishand[i], (uint)PropertyID.PAR_AxVelHigh, toPulse(high, Config.Axis_MM2PulseNum[i]));
if (acc > 0) result = Motion.mAcm_SetF64Property(m_Axishand[i], (uint)PropertyID.PAR_AxAcc, toPulse(acc, Config.Axis_MM2PulseNum[i]));
if (dec > 0) result = Motion.mAcm_SetF64Property(m_Axishand[i], (uint)PropertyID.PAR_AxDec, toPulse(dec, Config.Axis_MM2PulseNum[i]));
result = Motion.mAcm_SetF64Property(m_Axishand[i], (uint)PropertyID.PAR_AxJerk, 0);//0-T/S 型曲线
}
else
{
if ((AxisState)AxState[i] != AxisState.STA_AX_EXT_JOG)
continue;
if (velLow > 0) result = Motion.mAcm_SetF64Property(m_Axishand[i], (uint)PropertyID.CFG_AxJogVelLow, toPulse(velLow, Config.Axis_MM2PulseNum[i]));
if (high > 0) result = Motion.mAcm_SetF64Property(m_Axishand[i], (uint)PropertyID.CFG_AxJogVelHigh, toPulse(high, Config.Axis_MM2PulseNum[i]));
if (acc > 0) result = Motion.mAcm_SetF64Property(m_Axishand[i], (uint)PropertyID.CFG_AxJogAcc, toPulse(acc, Config.Axis_MM2PulseNum[i]));
if (dec > 0) result = Motion.mAcm_SetF64Property(m_Axishand[i], (uint)PropertyID.CFG_AxJogDec, toPulse(dec, Config.Axis_MM2PulseNum[i]));
result = Motion.mAcm_SetF64Property(m_Axishand[i], (uint)PropertyID.CFG_AxJogJerk, 0);//0-T/S 型曲线
}
}
}
}
/// <summary>
/// 回HOME
/// </summary>
/// <param name="axisIndex"></param>
/// <param name="homeMode">16种回HOME模式0-15</param>
/// <param name="dir">0-正向 1-负向</param>
/// <exception cref="Exception"></exception>
public void home(int axisIndex = -1, uint homeMode = 11, uint dir = 1)
{
if (!IsInit) return;
//研华运动控制卡共提供两个函数执行回Home Acm_AxHome 和Acm_AxMoveHome
//调用Acm_AxHome 执行回Home 时通过PAR_AxVelLow、PAR_AxVelHigh、PAR_AxAcc、 PAR_AxDec、PAR_AxJerk 设置初速度,运行速度、加速度、减速度、速度曲线类型。
//调用Acm_AxMoveHome 执行回Home 时通过PAR_AxHomeVelLow、PAR_AxHomeVelHigh、 PAR_AxHomeAcc、PAR_AxHomeDec、PAR_AxHomeJerk 设置初速度,运行速度、加速度、 减速度、速度曲线类型。
uint result;
for (int i = 0; i < m_ulAxisCount; i++)
{
if (isSkip(axisIndex)) continue;
if (i == axisIndex || axisIndex == -1)
{
if ((AxisState)AxState[i] != AxisState.STA_AX_READY)
continue;
if (!setPulseOutMode(i, (AxisPulseOutMode)AxisPulseOutMode[i]))
throw new Exception($"Axis{i} 设置脉冲模式失败!");
//单独设置GO HOME 速度参数??
//
result = Motion.mAcm_AxHome(m_Axishand[i], homeMode, dir);
if (result != (uint)ErrorCode.SUCCESS)
throw new Exception("AxHome Failed With Error Code: [0x" + Convert.ToString(result, 16) + "]");
}
}
//复位
//if (axisIndex == -1 && !IsDebug && !IsReset)
// IsReset = true;
if (!IsDebug && !IsReset)
IsReset = true;
}
/// <summary>
/// 点到点运动
/// </summary>
/// <param name="axisIndex"></param>
/// <param name="pos">PPU位置方向为正负值</param>
/// <param name="moveMode"></param>
public bool move_ptp(int axisIndex, double pos, AxMoveMode moveMode)
{
if (isSkip(axisIndex)) return true;
if (!IsInit) return false;
if (isError(axisIndex)) return false;
pos = toPulse(pos, Config.Axis_MM2PulseNum[axisIndex]);
uint result;
if ((AxisState)AxState[axisIndex] != AxisState.STA_AX_READY)
return false;
if (!setPulseOutMode(axisIndex, (AxisPulseOutMode)AxisPulseOutMode[axisIndex]))
{
WarningEvent?.Invoke(WarningEnum.High, $"Axis{axisIndex} 设置脉冲模式失败!");
return false;
}
//--
if (moveMode==AxMoveMode.MODE1_Abs) //Start single axis's absolute position motion.
result = Motion.mAcm_AxMoveAbs(m_Axishand[axisIndex], pos);
else //Start single axis's relative position motion
result = Motion.mAcm_AxMoveRel(m_Axishand[axisIndex], pos);
if (result != (uint)ErrorCode.SUCCESS)
{
WarningEvent?.Invoke(WarningEnum.High, "PTP Move Failed With Error Code[0x" + Convert.ToString(result, 16) + "]");
return false;
}
return true;
}
/// <summary>
/// 判断是否正在动动
/// </summary>
/// <param name="axisIndex"></param>
/// <returns></returns>
public bool isMoveing(int axisIndex = -1)
{
if (!IsInit) return false;
for (int i = 0; i < m_ulAxisCount; i++)
{
if (i == axisIndex || axisIndex == -1)
{
AxisState state = (AxisState)AxState[i];
if (state == AxisState.STA_AX_PTP_MOT || state == AxisState.STA_AX_HOMING || state == AxisState.STA_AX_CONTI_MOT)
return true;
}
}
return false;
}
/// <summary>
/// 设置脉冲模式
/// </summary>
/// <param name="axisIndex"></param>
/// <param name="outMode"></param>
/// <returns></returns>
private bool setPulseOutMode(int axisIndex, AxisPulseOutMode outMode)
{
uint refOutMode = 0;
//先获取再判断
uint result = Motion.mAcm_GetU32Property(m_Axishand[axisIndex], (uint)PropertyID.CFG_AxPulseOutMode, ref refOutMode);// 获取输出模式
if (result != (uint)ErrorCode.SUCCESS)
{
WarningEvent?.Invoke(WarningEnum.High, $"Get Axis{axisIndex} Failed With Error Code: [0x" + Convert.ToString(result, 16) + "]");
return false;
}
if ((uint)outMode != refOutMode)
{
//设置脉冲模式
result = Motion.mAcm_SetU32Property(m_Axishand[axisIndex], (uint)PropertyID.CFG_AxPulseOutMode, (uint)outMode);
if (result != (uint)ErrorCode.SUCCESS && result != (uint)ErrorCode.PropertyIDNotSupport)//Added for Supporting PCI1245 and PCI1265
{
WarningEvent?.Invoke(WarningEnum.High, "Set Property-CFG_AxExtPulseNum Failed With Error Code[0x" + Convert.ToString(result, 16) + "]");
return false;
}
}
return true;
}
#region JOG
public void openJogMode(int axisIndex)
{
if (!IsInit) return;
if ((AxisState)AxState[axisIndex] != AxisState.STA_AX_READY)
return;
if (!setPulseOutMode(axisIndex, (AxisPulseOutMode)AxisPulseOutMode[axisIndex]))
throw new Exception($"Axis{axisIndex} 设置脉冲模式失败!");
uint result;
//启用/禁用外置硬盘模式.0: Disabled (stop command) 1: JOG Mode 2: MPG Mode
result = Motion.mAcm_AxSetExtDrive(m_Axishand[axisIndex], 0);
result = Motion.mAcm_AxSetExtDrive(m_Axishand[axisIndex], 1);
if (result != (uint)ErrorCode.SUCCESS)
throw new Exception("Start external driver Failed With Error Code[0x" + Convert.ToString(result, 16) + "]");
//设置外部驱动器的输入引脚
//0 轴 0(默认值) 仅支持 0
//1 轴 1(不支持)
//2 轴 2(不支持)
//3 轴 3(不支持)
result = Motion.mAcm_SetU32Property(m_Axishand[axisIndex], (uint)PropertyID.CFG_AxExtMasterSrc, 0);
if (result != (uint)ErrorCode.SUCCESS)
throw new Exception("Set Property-AxExtMasterSrc Failed With Error Code[0x" + Convert.ToString(result, 16) + "]");
//当启用外部驱动时。此属性允许通过数字输入通道选择驱动轴
result = Motion.mAcm_SetU32Property(m_Axishand[axisIndex], (uint)PropertyID.CFG_AxExtSelEnable, 1);
if (result != (uint)ErrorCode.SUCCESS && result != (uint)ErrorCode.PropertyIDNotSupport)//Added for Supporting PCI1245 and PCI1265
throw new Exception("Set Property-AxExtSelEnable Failed With Error Code[0x" + Convert.ToString(result, 16) + "]");
//理论脉冲数
result = Motion.mAcm_SetU32Property(m_Axishand[axisIndex], (uint)PropertyID.CFG_AxExtPulseNum, 1000);
if (result != (uint)ErrorCode.SUCCESS && result != (uint)ErrorCode.PropertyIDNotSupport)//Added for Supporting PCI1245 and PCI1265
throw new Exception("Set Property-CFG_AxExtPulseNum Failed With Error Code[0x" + Convert.ToString(result, 16) + "]");
//外部设置
//setAxisVelParam(velLow, high, acc, dec, axisIndex, true);
this.refreshAxisState(axisIndex);
}
public void closeJogMode(int axisIndex = -1)
{
if (!IsInit) return;
uint result;
for (int i = 0; i < m_ulAxisCount; i++)
{
if (i == axisIndex || axisIndex == -1)
{
if ((AxisState)AxState[i] == AxisState.STA_AX_EXT_JOG)
{
//启用/禁用外置硬盘模式.0: Disabled (stop command) 1: JOG Mode 2: MPG Mode
result = Motion.mAcm_AxSetExtDrive(m_Axishand[i], 0);
//命令轴减速停止
result = Motion.mAcm_AxStopDec(m_Axishand[i]);
this.refreshAxisState(i);
}
}
}
}
/// <summary>
/// jog运行 0正向1负向
/// </summary>
/// <param name="axisIndex"></param>
/// <param name="dic">0正向1负向</param>
public void jog(int axisIndex, ushort dic)
{
if (isSkip(axisIndex)) return;
if (isError(axisIndex)) return;
if ((AxisState)AxState[axisIndex] != AxisState.STA_AX_EXT_JOG) return;
//Jog 运动的方向0正向1负向
Motion.mAcm_AxJog(m_Axishand[axisIndex], dic);
}
#endregion
#region Private
private bool isSkip(int axisIndex)
{
if (axisIndex == 0 && Config.SkipAxis0) return true;
if (axisIndex == 1 && Config.SkipAxis1) return true;
if (axisIndex == 2 && Config.SkipAxis2) return true;
if (axisIndex == 3 && Config.SkipAxis3) return true;
return false;
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (!IsInit) return;
for (int i = 0; i < m_ulAxisCount; i++)
refreshAxisState(i);
}
private bool bALM, bEMG, bLMTP, bLMTN;
private void refreshAxisState(int axisIndex)
{
//uint result;
//获取指定轴的当前命令位置
if ((uint)ErrorCode.SUCCESS == Motion.mAcm_AxGetCmdPosition(m_Axishand[axisIndex], ref CmdPos[axisIndex]))
axisPosEvent?.Invoke(axisIndex, AxisPosType.CmdPos, tomm(CmdPos[axisIndex], Config.Axis_MM2PulseNum[axisIndex]));
//获取指定轴的当前实际(反馈)位置
if ((uint)ErrorCode.SUCCESS == Motion.mAcm_AxGetActualPosition(m_Axishand[axisIndex], ref ActualPos[axisIndex]))
axisPosEvent?.Invoke(axisIndex, AxisPosType.ActualPos, tomm(ActualPos[axisIndex], Config.Axis_MM2PulseNum[axisIndex]) );
//获取Axis的当前状态
if ((uint)ErrorCode.SUCCESS == Motion.mAcm_AxGetState(m_Axishand[axisIndex], ref AxState[axisIndex]))
axisStateEvent?.Invoke(axisIndex, AxisStateType.AxisState, AxState[axisIndex]);
//log?.Invoke(WarningEnum.Normal, $"({AxisIndex}轴)AxisState = {((AxisState)AxState[AxisIndex]).ToString()}");
//获取轴的运动I/O状态。
if ((uint)ErrorCode.SUCCESS == Motion.mAcm_AxGetMotionIO(m_Axishand[axisIndex], ref IOStatus[axisIndex]))
{
bool isStopNow = false;
if ((IOStatus[axisIndex] & (uint)Ax_Motion_IO.AX_MOTION_IO_ALM) > 0) //ALM报警状态 需IO close (流程上必需在报警清除后先复位)
{
if (!isStopNow)
{
isStopNow = true;
stopNow();//ALM报警需急停
}
if (!bALM)
{
bALM = true;
WarningEvent?.Invoke(WarningEnum.High, $"Axis{axisIndex} ALM报警!!!");
}
}
if ((IOStatus[axisIndex] & (uint)Ax_Motion_IO.AX_MOTION_IO_EMG) > 0) //EMG急停状态 需重置 state (流程上必需在报警清除后先复位)
{
if (!isStopNow)
{
isStopNow = true;
stopNow();//EMG状态需急停
}
if (!bEMG)
{
bEMG = true;
WarningEvent?.Invoke(WarningEnum.High, $"Axis{axisIndex} 触发EMG急停!!!");
}
}
//右极限 true->false (流程上必需在报警清除后先复位)
if ((IOStatus[axisIndex] & (uint)Ax_Motion_IO.AX_MOTION_IO_LMTP) > 0 && ((AxisState)AxState[axisIndex]) != AxisState.STA_AX_HOMING)
{
if (!isStopNow)
{
isStopNow = true;
stopNow();//右极限状态需急停
}
if (!bLMTP)
{
bLMTP = true;
WarningEvent?.Invoke(WarningEnum.High, $"Axis{axisIndex} 触发右极限LMTP!!!");
}
}
//左极限 true->false (流程上必需在报警清除后先复位)
if ((IOStatus[axisIndex] & (uint)Ax_Motion_IO.AX_MOTION_IO_LMTN) > 0 && ((AxisState)AxState[axisIndex]) != AxisState.STA_AX_HOMING)
{
if (!isStopNow)
{
isStopNow = true;
stopNow();//左极限状态需急停
}
if (!bLMTN)
{
bLMTN = true;
WarningEvent?.Invoke(WarningEnum.High, $"Axis{axisIndex} 触发左极限LMTN!!!");
}
}
////ORG 回原点
//if ((IOStatus[axisIndex] & (uint)Ax_Motion_IO.AX_MOTION_IO_ORG) > 0)
//{
// WarningEvent?.Invoke(WarningEnum.Normal, $"Axis{axisIndex} 触发ORG信号");
//}
////EZ 回原点
//if ((IOStatus[axisIndex] & (uint)Ax_Motion_IO.AX_MOTION_IO_EZ) > 0)
//{
// WarningEvent?.Invoke(WarningEnum.Normal, $"Axis{axisIndex} 触发EZ信号");
//}
axisStateEvent?.Invoke(axisIndex, AxisStateType.AxisIOState, IOStatus[axisIndex]);
//log?.Invoke(WarningEnum.Normal, $"({AxisIndex}轴)AxisMotionIO = {((Ax_Motion_IO)IOStatus[AxisIndex]).ToString()}");
//checkMotionIOStatus(AxisIndex, IOStatus[AxisIndex]);
}
//获取Axis的当前运动状态
if ((uint)ErrorCode.SUCCESS == Motion.mAcm_AxGetMotionStatus(m_Axishand[axisIndex], ref AxMotionState[axisIndex]))
axisStateEvent?.Invoke(axisIndex, AxisStateType.AxisMotionState, AxMotionState[axisIndex]);
//log?.Invoke(WarningEnum.Normal, $"({AxisIndex}轴)AxisMotionStatus = {AxMotionState[AxisIndex].ToString()}");
}
//private void checkMotionIOStatus(int axisIndex, uint IOStatus)
//{
// if ((IOStatus & (uint)Ax_Motion_IO.AX_MOTION_IO_ALM) > 0)//报警信号输出
// log?.Invoke(2, $"轴{axisIndex} 发出告警!!");
// bool ALM = (IOStatus & (uint)Ax_Motion_IO.AX_MOTION_IO_ALM) > 0;
// bool ORG = (IOStatus & (uint)Ax_Motion_IO.AX_MOTION_IO_ORG) > 0;//ORG
// bool EL_R = (IOStatus & (uint)Ax_Motion_IO.AX_MOTION_IO_LMTP) > 0;//右极限
// bool EL_L = (IOStatus & (uint)Ax_Motion_IO.AX_MOTION_IO_LMTN) > 0;//-EL 左
// bool SVON = (IOStatus & (uint)Ax_Motion_IO.AX_MOTION_IO_SVON) > 0;
//}
private string getErrInfo(uint errorCode)
{
StringBuilder ErrorMsg = new StringBuilder("", 100);
//Get the error message according to error code returned from API
Boolean res = Motion.mAcm_GetErrorMessage(errorCode, ErrorMsg, 100);
if (res) return ErrorMsg.ToString();
return "获取错误信息失败!";
}
/// <summary>
///
/// </summary>
/// <param name="pulseVal"></param>
/// <param name="mmPulse"></param>
/// <returns></returns>
public double tomm(double pulseVal, double pulse)
{
return (pulseVal / pulse);
}
/// <summary>
/// mm转脉冲
/// </summary>
/// <param name="mm"></param>
/// <param name="mmPulse">1mm 对应 脉冲数</param>
/// <returns></returns>
private double toPulse(double mm, double mmPulse)
{
return (mm * mmPulse);
}
public double getCmdPos_mm(int axisIndex)
{
return tomm(CmdPos[axisIndex], Config.Axis_MM2PulseNum[axisIndex]);
}
public double getActualPos_mm(int axisIndex)
{
return tomm(ActualPos[axisIndex], Config.Axis_MM2PulseNum[axisIndex]);
}
#endregion
}
}

View File

@ -0,0 +1,321 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
namespace AssistClient.Device
{
public class CodeScannerDev:IDisposable
{
#region WIN32API
//private const int WM_KEYDOWN = 0x100;//KEYDOWN       
//private const int WM_KEYUP = 0x101;//KEYUP       
//private const int WM_SYSKEYDOWN = 0x104;//SYSKEYDOWN       
//private const int WM_SYSKEYUP = 0x105;//SYSKEYUP
//private static int HookProc(int nCode, Int32 wParam, IntPtr lParam);
private int hKeyboardHook = 0;//声明键盘钩子处理的初始值
private ScanerCodes codes = new ScanerCodes();//13为键盘钩子
//定义成静态,这样不会抛出回收异常
private static HookProc hookproc;
delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]     //设置钩子
private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]     //卸载钩子
private static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] //继续下个钩子
private static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
[DllImport("user32", EntryPoint = "GetKeyNameText")]
private static extern int GetKeyNameText(int IParam, StringBuilder lpBuffer, int nSize);
[DllImport("user32", EntryPoint = "GetKeyboardState")]     //获取按键的状态
private static extern int GetKeyboardState(byte[] pbKeyState);
[DllImport("user32", EntryPoint = "ToAscii")]     //ToAscii职能的转换指定的虚拟键码和键盘状态的相应字符或字符
private static extern bool ToAscii(int VirtualKey, int ScanCode, byte[] lpKeySate, ref uint lpChar, int uFlags);
//int VirtualKey //[in] 指定虚拟关键代码进行翻译。      
//int uScanCode, // [in] 指定的硬件扫描码的关键须翻译成英文。高阶位的这个值设定的关键,如果是(不压)      
//byte[] lpbKeyState, // [in] 指针以256字节数组包含当前键盘的状态。每个元素字节的数组包含状态的一个关键。如果高阶位的字节是一套关键是下跌按下。在低比特如/果设置表明关键是对切换。在此功能只有肘位的CAPS LOCK键是相关的。在切换状态的NUM个锁和滚动锁定键被忽略。      //byte[] lpwTransKey, // [out] 指针的缓冲区收到翻译字符或字符。      //uint fuState); // [in] Specifies whether a menu is active. This parameter must be 1 if a menu is active, or 0 otherwise.
[DllImport("kernel32.dll")]     //使用WINDOWS API函数代替获取当前实例的函数,防止钩子失效
private static extern IntPtr GetModuleHandle(string name);
#endregion
public Action<WarningEnum, string> WarningEvent;
//public Action<ScanerCodes> ScanerEvent;
public Action<string> ScanerEvent;
public CodeScannerDev()
{
}
/// <summary>
/// 处理回调时需锁定
/// </summary>
public bool isLock { get; set; }
public bool start()
{
try
{
if (hKeyboardHook == 0)
{
hookproc = new HookProc(KeyboardHookProc);
//GetModuleHandle 函数 替代 Marshal.GetHINSTANCE
//防止在 framework4.0中 注册钩子不成功
IntPtr modulePtr = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
//WH_KEYBOARD_LL=13
//全局钩子 WH_KEYBOARD_LL
// hKeyboardHook = SetWindowsHookEx(13, hookproc, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
hKeyboardHook = SetWindowsHookEx(13, hookproc, modulePtr, 0);
}
return (hKeyboardHook != 0);
}
catch (Exception ex)
{
WarningEvent?.Invoke(WarningEnum.Normal,ex.Message);
return false;
}
}
public bool stop()
{
try
{
if (hKeyboardHook != 0)
{
bool retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
hookproc = null;
hKeyboardHook = 0;
return retKeyboard;
}
return true;
}
catch
{
return false;
}
}
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
try
{
EventMsg msg = (EventMsg)Marshal.PtrToStructure(lParam, typeof(EventMsg));
codes.Add(msg);
if (msg.message == 13 && msg.paramH > 0 && !string.IsNullOrWhiteSpace(codes.Result))
{
ScanerEvent?.Invoke(codes.Result);
}
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}
catch (Exception ex)
{
return 0;
}
}
public void Dispose()
{
stop();
}
public class ScanerCodes
{
private int ts = 100; // 指定输入间隔为300毫秒以内时为连续输入
private List<List<EventMsg>> _keys = new List<List<EventMsg>>();
private List<int> _keydown = new List<int>(); // 保存组合键状态
private List<string> _result = new List<string>(); // 返回结果集
private DateTime _last = DateTime.Now;
private byte[] _state = new byte[256];
private string _key = string.Empty;
private string _cur = string.Empty;
public EventMsg Event
{
get
{
if (_keys.Count == 0)
{
return new EventMsg();
}
else
{
return _keys[_keys.Count - 1][_keys[_keys.Count - 1].Count - 1];
}
}
}
public List<int> KeyDowns
{
get
{
return _keydown;
}
}
public DateTime LastInput
{
get
{
return _last;
}
}
public byte[] KeyboardState
{
get
{
return _state;
}
}
public int KeyDownCount
{
get
{
return _keydown.Count;
}
}
public string Result
{
get
{
if (_result.Count > 0)
{
return _result[_result.Count - 1].Trim();
}
else
{
return null;
}
}
}
public string CurrentKey
{
get
{
return _key;
}
}
public string CurrentChar
{
get
{
return _cur;
}
}
public bool isShift
{
get
{
return _keydown.Contains(160);
}
}
public void Add(EventMsg msg)
{
#region
// 首次按下按键
if (_keys.Count == 0)
{
_keys.Add(new List<EventMsg>());
_keys[0].Add(msg);
_result.Add(string.Empty);
}
// 未释放其他按键时按下按键
else if (_keydown.Count > 0)
{
_keys[_keys.Count - 1].Add(msg);
}
// 单位时间内按下按键
else if (((TimeSpan)(DateTime.Now - _last)).TotalMilliseconds < ts)
{
_keys[_keys.Count - 1].Add(msg);
}
// 从新记录输入内容
else
{
_keys.Add(new List<EventMsg>());
_keys[_keys.Count - 1].Add(msg);
_result.Add(string.Empty);
}
#endregion
_last = DateTime.Now;
#region
// 记录正在按下的按键
if (msg.paramH == 0 && !_keydown.Contains(msg.message))
{
_keydown.Add(msg.message);
}
// 清除已松开的按键
if (msg.paramH > 0 && _keydown.Contains(msg.message))
{
_keydown.Remove(msg.message);
}
#endregion
#region
int v = msg.message & 0xff;
int c = msg.paramL & 0xff;
StringBuilder strKeyName = new StringBuilder(500);
if (GetKeyNameText(c * 65536, strKeyName, 255) > 0)
{
_key = strKeyName.ToString().Trim(new char[] { ' ', '\0' });
GetKeyboardState(_state);
if (_key.Length == 1 && msg.paramH == 0)// && msg.paramH == 0
{
// 根据键盘状态和shift缓存判断输出字符
_cur = ShiftChar(_key, isShift, _state).ToString();
_result[_result.Count - 1] += _cur;
}
//判断是+ 强制添加+
else if (_key.Length == 5 && msg.paramH == 0 && msg.paramL == 78 && msg.message == 107)
{
// 根据键盘状态和shift缓存判断输出字符
_cur = Convert.ToChar('+').ToString();
_result[_result.Count - 1] += _cur;
}
// 备选          
else
{
_cur = string.Empty;
}
}
#endregion
}
private char ShiftChar(string k, bool isShiftDown, byte[] state)
{
bool capslock = state[0x14] == 1;
bool numlock = state[0x90] == 1;
bool scrolllock = state[0x91] == 1;
bool shiftdown = state[0xa0] == 1;
char chr = (capslock ? k.ToUpper() : k.ToLower()).ToCharArray()[0];
if (isShiftDown)
{
if (chr >= 'a' && chr <= 'z')
{
chr = (char)((int)chr - 32);
}
else if (chr >= 'A' && chr <= 'Z')
{
if (chr == 'Z')
{
string s = "";
}
chr = (char)((int)chr + 32);
}
else
{
string s = "`1234567890-=[];',./";
string u = "~!@#$%^&*()_+{}:\"<>?";
if (s.IndexOf(chr) >= 0)
{
return (u.ToCharArray())[s.IndexOf(chr)];
}
}
}
return chr;
}
}
public struct EventMsg
{
public int message;
public int paramL;
public int paramH;
public int Time;
public int hwnd;
}
}
}

View File

@ -0,0 +1,21 @@
using AssistClient.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
namespace AssistClient.Device
{
public class ForLib
{
//uuid, Num(1-n)
public Dictionary<long, int> dicData=new Dictionary<long, int>();
public void clear()
{
dicData.Clear();
}
}
}

View File

@ -0,0 +1,21 @@
using AssistClient.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
namespace AssistClient.Device
{
public class IFLib
{
//uuid, Num(1-n)
public Dictionary<long, int> dicData=new Dictionary<long, int>();
public void clear()
{
dicData.Clear();
}
}
}

View File

@ -0,0 +1,272 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing.Drawing2D;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Security.Policy;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using Advantech.Motion;
using Automation.BDaq;
using Newtonsoft.Json.Linq;
using OpenCvSharp;
namespace AssistClient.Device
{
public class IOCardDev : IDisposable
{
private Automation.BDaq.InstantDiCtrl instantDiCtrl1;
private Automation.BDaq.InstantDoCtrl instantDoCtrl;
public string DeviceNum { get; private set; }
/// <summary>
/// 读取输入端口数量
/// </summary>
public int DIPortCount { get; private set; }
/// <summary>
/// 写入输出端口数量
/// </summary>
public int DOPortCount { get; private set; }
/// <summary>
/// 读取到的输入值
/// </summary>
public byte[] DIData { get; private set; }
public byte[] DOData { get; private set; }
/// <summary>
/// Log输出
/// </summary>
public Action<WarningEnum, string> WarningEvent;
public Action<int, byte> INEvent;
public Action<int, byte> OUTEvent;
/// <summary>
/// 是否打开设备成功
/// </summary>
public bool IsInit { get; private set; } = false;
private System.Timers.Timer timer = new System.Timers.Timer();
//频闪使用
private System.Timers.Timer timerStrobe = new System.Timers.Timer();
private List<string> strobeList = new List<string>();
public IOCardDev()
{
}
public bool start(string deviceNum="")
{
try
{
instantDiCtrl1 = new Automation.BDaq.InstantDiCtrl();
instantDoCtrl = new Automation.BDaq.InstantDoCtrl();
strobeList=new List<string>();
if (deviceNum != "")
{
instantDiCtrl1.SelectedDevice = new Automation.BDaq.DeviceInformation(deviceNum);
instantDoCtrl.SelectedDevice = new DeviceInformation(deviceNum);
}
//根据加载的文件设置设备的所有配置
string cfgPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\DevCfg\\IOCard_1703.xml";
if (File.Exists(cfgPath))
{
var result = instantDiCtrl1.LoadProfile(cfgPath);//Loads a profile to initialize the device.
var result2 = instantDoCtrl.LoadProfile(cfgPath);//Loads a profile to initialize the device.
if (BioFailed(result) && BioFailed(result2))
throw new Exception("CardIO Load Config Failed With Error Code: [" + result.ToString() + "]");
}
DeviceNum = instantDiCtrl1.SelectedDevice.Description;
DIPortCount = instantDiCtrl1.Features.PortCount;
DIData = new byte[DIPortCount];
DOPortCount = instantDoCtrl.Features.PortCount;
DOData = new byte[DOPortCount];
loadDOData();
IsInit = true;
timer.Elapsed += Timer_Elapsed;
timer.Interval = 100;
timer.Start();
timerStrobe.Elapsed += timerStrobe_Elapsed;
timerStrobe.Interval = 500;
timerStrobe.Start();
return true;
}
catch (Exception ex)
{
WarningEvent?.Invoke(WarningEnum.High, ex.Message);
return false;
}
}
public void stop()
{
if (!IsInit) return;
IsInit = false;
strobeList.Clear();//闪烁状态清空
timer.Stop();
timerStrobe.Stop();
//instantDiCtrl1.Cleanup();
instantDiCtrl1.Dispose();
//instantDoCtrl.Cleanup();
instantDoCtrl.Dispose();
}
private void loadDOData(int portIndex=-1)
{
for (int i = 0; i < DOPortCount; ++i)
{
if (i == portIndex || portIndex < 0)
{
byte data;
var reuslt = instantDoCtrl.Read(i, out data);
if (reuslt != Automation.BDaq.ErrorCode.Success)
throw new Exception("加载CardIO输出状态失败");
if (DOData[i] != data)
{
DOData[i] = data;
//Config.HeightDevIOState = compareIOHeightDev();
//WarningEvent(WarningEnum.Normal, "厚度气缸状态:" + Config.HeightDevIOState.ToString());
OUTEvent?.Invoke(i, DOData[i]);
}
}
}
}
/// <summary>
/// 复位全置0
/// </summary>
/// <returns></returns>
public bool reset()
{
strobeList.Clear();//闪烁状态清空
byte[] data=new byte[DOPortCount];
for(int i = 0;i < data.Length; ++i)
data[i]=0;
var reuslt = instantDoCtrl.Write(0, data.Length, data);
if (BioFailed(reuslt))
return false;
loadDOData();
return true;
}
/// <summary>
/// 闪烁状态会清空
/// </summary>
/// <param name="startPort"></param>
/// <param name="data"></param>
/// <returns></returns>
public bool writeData(int startPort, byte[] data)
{
strobeList.Clear();//闪烁状态清空
var reuslt = instantDoCtrl.Write(startPort, data.Length, data);
if (BioFailed(reuslt))
return false;
loadDOData(data.Length == 1 ? startPort : -1);
return true;
}
/// <summary>
///
/// </summary>
/// <param name="portIndex"></param>
/// <param name="bitIndex"></param>
/// <param name="state"></param>
/// <param name="isStrobe">频闪</param>
/// <returns></returns>
public bool writeBitState(int portIndex, int bitIndex, bool state, bool isStrobe = false)
{
//byte bit = (byte)(DOData[portIndex] & (byte)(0x01<<bitIndex));
//if (bit > 0 && state) return true;
//if (bit == 0 && !state) return true;
//byte data = DOData[portIndex];
//data &= (byte)(~(0x1 << bitIndex));
//data |= (byte)((state ? 1 : 0) << bitIndex);
//var reuslt = instantDoCtrl.Write(startPort, len, data);
var reuslt = instantDoCtrl.WriteBit(portIndex, bitIndex, (byte)(state ? 1 : 0));// (byte)((state ? 1 : 0) << bitIndex));
if (BioFailed(reuslt))
return false;
loadDOData(portIndex);
string key = portIndex + "|" + bitIndex;
if (state && isStrobe)
strobeList.Add(key);
else if(strobeList.Contains(key))
strobeList.Remove(key);
return true;
}
public bool getDIBitState(int portIndex, int bitIndex)
{
byte data = 0x01;
data=(byte)(data << bitIndex);
return (DIData[portIndex] & data) > 0;
}
public bool getDOBitState(int portIndex, int bitIndex)
{
byte data = 0x01;
data = (byte)(data << bitIndex);
return (DOData[portIndex] & data) > 0;
}
private bool strobeState = true;
private void timerStrobe_Elapsed(object sender, ElapsedEventArgs e)
{
if (!IsInit) return;
string[] key;
for(int i = 0;i< strobeList.Count; i++)
{
key=strobeList[i].Split('|');
instantDoCtrl.WriteBit(Convert.ToInt16(key[0]), Convert.ToInt16(key[1]), (byte)(strobeState ? 1 : 0));
}
strobeState =!strobeState;
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (!IsInit) return;
timer.Stop();
//byte data = 0;//data is used to the API ReadBit.
//int bit = 0;//bit is used to the API ReadBit.
Automation.BDaq.ErrorCode result;
int startPort = 0;
byte[] datas = new byte[DIPortCount];
do
{
result = instantDiCtrl1.Read(startPort, DIPortCount, datas);
//errorCode = instantDiCtrl.ReadBit(startPort, bit, out data);
if (BioFailed(result))
{
//throw new Exception();
continue;
}
for (int i = 0; i < datas.Length; i++)
{
if (DIData[i] != datas[i])
{
DIData[i]= datas[i];
INEvent?.Invoke(i, DIData[i]);
}
}
Thread.Sleep(10);
} while (IsInit);
}
private static bool BioFailed(Automation.BDaq.ErrorCode err)
{
return err < Automation.BDaq.ErrorCode.Success && err >= Automation.BDaq.ErrorCode.ErrorHandleNotValid;
}
public void Dispose()
{
stop();
}
}
}

View File

@ -0,0 +1,111 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;
using Newtonsoft.Json.Linq;
using static ControllerDllCSharp.ClassLibControllerDll;
namespace AssistClient.Device
{
public class LightDev : IDisposable
{
private long portHandle;
/// <summary>
/// 光源亮度值
/// </summary>
public int DigitalValue { get; private set; }
public Action<WarningEnum, string> WarningEvent;
/// <summary>
/// 光源亮度值<通道号,亮度值0-255>
/// </summary>
public Action<int, int> DigitalEvent;
/// <summary>
/// 是否打开设备成功
/// </summary>
public bool IsInit { get; private set; } = false;
//private System.Timers.Timer timer = new System.Timers.Timer();
public LightDev()
{
}
public bool start(int comNum)
{
try
{
int result = CreateSerialPort(comNum, ref portHandle); //创建串口
if (result != SUCCESS)
throw new Exception($"打开光源设备(COM{comNum})失败: {result}");
IsInit = true;
//timer.Elapsed += Timer_Elapsed;
//timer.Interval = 100;
//timer.Enabled = true;
return true;
}
catch (Exception ex)
{
WarningEvent?.Invoke(WarningEnum.High, ex.Message);
return false;
}
}
public void stop()
{
if (!IsInit) return;
try
{
IsInit = false;
//timer.Elapsed -= Timer_Elapsed;
//timer.Stop();
int result = ReleaseSerialPort(portHandle); //断开串口
}
catch { }
}
public int getDigitalValue(int channelIndex)
{
if (!IsInit) return -1;
int value = 0;
if (GetDigitalValue(ref value, channelIndex, portHandle) != SUCCESS)
return -1;
DigitalEvent?.Invoke(channelIndex, value);
return value;
}
/// <summary>
/// 设置亮度值
/// </summary>
/// <param name="channelIndex">通道</param>
/// <param name="value">0-255</param>
/// <returns></returns>
public bool setDigitalValue(int channelIndex, int value)
{
if (!IsInit) return false;
Task.Factory.StartNew(() => {
if (SetDigitalValue(channelIndex, value, portHandle) != SUCCESS)
return;// false;
});
return true;
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (!IsInit) return;
}
public void Dispose()
{
stop();
}
}
}

View File

@ -0,0 +1,951 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;
using MvCamCtrl.NET;
using Newtonsoft.Json.Linq;
using OpenCvSharp.Dnn;
namespace AssistClient.Device
{
public class ScannerDev : IDisposable
{
private uint m_nRowStep = 0;
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWindow(IntPtr hWnd);
public enum ScannerType
{
[Description("板卡相机")]
GENTL = 0,
[Description("网口相机")]
CC = 1,
}
private ScannerType scannerType;
private string bmpSavePath;
public Action<WarningEnum, string> WarningEvent;
/// <summary>
/// 拍照回传 1-num,文件名.bmp)
/// </summary>
public Action<int, string> ScanEventPath;
//public Action<int, byte[]> ScanEvent;
public Action<int, Bitmap> ScanEvent;
/// <summary>
/// 曝光
/// </summary>
public float ExposureTime { get; private set; }
/// <summary>
/// 增益
/// </summary>
public float Gain { get; private set; }
/// <summary>
/// 帧率
/// </summary>
public float ResultingFrameRate { get; private set; }
/// <summary>
/// 图片大小
/// </summary>
public Size size { get; private set; }
/// <summary>
/// 是否连续模式
/// </summary>
public bool isContinuousMode { get; private set; }
/// <summary>
/// 是否打开设备成功
/// </summary>
public bool IsInit { get; private set; } = false;
//public string ErrInfo { get; private set; }
//private System.Timers.Timer timer = new System.Timers.Timer();
#region
private static MyCamera.cbOutputExdelegate ImageCallback;
private static MyCamera.MV_CHUNK_DATA_CONTENT stChunkInfo;// Chunk结构体信息
private MyCamera.MV_GENTL_DEV_INFO_LIST m_stGentDeviceList = new MyCamera.MV_GENTL_DEV_INFO_LIST();
private MyCamera.MV_GENTL_IF_INFO_LIST m_stIFInfoList = new MyCamera.MV_GENTL_IF_INFO_LIST();
private MyCamera.MV_CC_DEVICE_INFO_LIST m_stCCDeviceList = new MyCamera.MV_CC_DEVICE_INFO_LIST();
private MyCamera device = new MyCamera();
private bool m_bGrabbing = false;//开始采集TAG
private Thread m_hReceiveThread = null;
//显示图像控件句柄
private IntPtr previewHwnd = IntPtr.Zero;
//拍照数量
private int scanNum = 0;
#endregion
public ScannerDev(ScannerType type)
{
this.scannerType = type;
}
public bool open()
{
if (IsInit) return true;
System.GC.Collect();
int nRet;
try
{
if (this.scannerType == ScannerType.GENTL)
{
nRet = MyCamera.MV_CC_EnumInterfacesByGenTL_NET(ref m_stIFInfoList, Config.Scanner_GENTL_CTI);
if (File.Exists(Config.Scanner_GENTL_CTI))
{
if (0 != nRet || m_stIFInfoList.nInterfaceNum < 1)
{
WarningEvent?.Invoke(WarningEnum.High, $"Enumerate interfaces fail! ({nRet})");
return false;
}
}
//
MyCamera.MV_GENTL_IF_INFO stIFInfo = (MyCamera.MV_GENTL_IF_INFO)Marshal.PtrToStructure(m_stIFInfoList.pIFInfo[0], typeof(MyCamera.MV_GENTL_IF_INFO));
nRet = MyCamera.MV_CC_EnumDevicesByGenTL_NET(ref stIFInfo, ref m_stGentDeviceList);
if (0 != nRet || m_stGentDeviceList.nDeviceNum < 1)
{
WarningEvent?.Invoke(WarningEnum.High, $"Enumerate devices fail! ({nRet})");
return false;
}
// ch:获取选择的设备信息 | en:Get selected device information
MyCamera.MV_GENTL_DEV_INFO device = (MyCamera.MV_GENTL_DEV_INFO)Marshal.PtrToStructure(m_stGentDeviceList.pDeviceInfo[0], typeof(MyCamera.MV_GENTL_DEV_INFO));
// ch:打开设备 | en:Open device
if (null == this.device)
{
this.device = new MyCamera();
if (null == this.device)
{
WarningEvent?.Invoke(WarningEnum.High, $"Open device fail!");
return false;
}
}
nRet = this.device.MV_CC_CreateDeviceByGenTL_NET(ref device);
if (MyCamera.MV_OK != nRet)
{
WarningEvent?.Invoke(WarningEnum.High, $"Open device fail! ({nRet})");
return false;
}
nRet = this.device.MV_CC_OpenDevice_NET();
if (MyCamera.MV_OK != nRet)
{
this.device.MV_CC_DestroyDevice_NET();
WarningEvent?.Invoke(WarningEnum.High, $"Device open fail! ({nRet})");
return false;
}
}
else //CC
{
nRet = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref m_stCCDeviceList);
if (0 != nRet || m_stCCDeviceList.nDeviceNum < 1)
{
WarningEvent?.Invoke(WarningEnum.High, $"Enumerate devices fail! ({nRet})");
return false;
}
// ch:获取选择的设备信息
MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(m_stCCDeviceList.pDeviceInfo[0], typeof(MyCamera.MV_CC_DEVICE_INFO));
// ch:打开设备 | en:Open device
if (null == this.device)
{
this.device = new MyCamera();
if (null == this.device)
{
WarningEvent?.Invoke(WarningEnum.High, $"Open device fail!");
return false;
}
}
nRet = this.device.MV_CC_CreateDevice_NET(ref device);
if (MyCamera.MV_OK != nRet)
{
WarningEvent?.Invoke(WarningEnum.High, $"Open device fail! ({nRet})");
return false;
}
nRet = this.device.MV_CC_OpenDevice_NET();
if (MyCamera.MV_OK != nRet)
{
this.device.MV_CC_DestroyDevice_NET();
WarningEvent?.Invoke(WarningEnum.High, $"Open device fail! ({nRet})");
return false;
}
// ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
int nPacketSize = this.device.MV_CC_GetOptimalPacketSize_NET();
if (nPacketSize > 0)
{
nRet = this.device.MV_CC_SetIntValue_NET("GevSCPSPacketSize", (uint)nPacketSize);
//if (nRet != MyCamera.MV_OK)
//{
// ShowErrorMsg("Set Packet Size failed!", nRet);
//}
}
else
{
//ShowErrorMsg("Get Packet Size failed!", nPacketSize);
}
}
}
// ch:注册回调函数 | en:Register image callback //本类不使用回调,使用线程主动循环读取
//ImageCallback = new MyCamera.cbOutputExdelegate(ImageCallbackFunc);
//nRet = device.MV_CC_RegisterImageCallBackEx_NET(ImageCallback, IntPtr.Zero);
//if (MyCamera.MV_OK != nRet)
//{
// WarningEvent?.Invoke(WarningEnum.High, $"Register image callback failed! ({nRet})");
// return false;
//}
init2();
// ch:设置采集[软触发/连续]模式 | en:Set Continues Aquisition Mode
device.MV_CC_SetEnumValue_NET("AcquisitionMode", (uint)MyCamera.MV_CAM_ACQUISITION_MODE.MV_ACQ_MODE_CONTINUOUS);
setMode(false); //软触发
//
getParam();
IsInit = true;
//timer.Elapsed += Timer_Elapsed;
//timer.Interval = 100;
//timer.Enabled = true;
return true;
}
catch (Exception ex)
{
WarningEvent?.Invoke(WarningEnum.High, ex.Message);
return false;
}
}
public void close()
{
if (!IsInit) return;
try
{
IsInit = false;
// ch:取流标志位清零 | en:Reset flow flag bit
if (m_bGrabbing == true)
{
m_bGrabbing = false;
m_hReceiveThread.Join();
}
// ch:关闭设备 | en:Close Device
device.MV_CC_CloseDevice_NET();
device.MV_CC_DestroyDevice_NET();
}
catch { }
}
/// <summary>
///
/// </summary>
/// <param name="hwnd">显示图像控件句柄</param>
/// <returns></returns>
public bool start(IntPtr preview_Hwnd,string bmp_save_path)
{
if (!IsInit) return false;
if (m_bGrabbing) return true;
this.previewHwnd= preview_Hwnd;
this.bmpSavePath = bmp_save_path;
// ch:标志位置位true | en:Set position bit true
m_bGrabbing = true;
m_hReceiveThread = new Thread(ReceiveThreadProcess);
m_hReceiveThread.Start();
// ch:开始采集 | en:Start Grabbing
int nRet = device.MV_CC_StartGrabbing_NET();
if (MyCamera.MV_OK != nRet)
{
m_bGrabbing = false;
m_hReceiveThread.Join();
WarningEvent?.Invoke(WarningEnum.High, $"Start Grabbing Fail! ({nRet})");
return false;
}
return true;
}
public bool stop()
{
if (!IsInit) return false;
if (!m_bGrabbing) return true;
try
{
// ch:标志位设为false | en:Set flag bit false
m_bGrabbing = false;
m_hReceiveThread.Join();
// ch:停止采集 | en:Stop Grabbing
int nRet = device.MV_CC_StopGrabbing_NET();
if (nRet != MyCamera.MV_OK)
{
WarningEvent?.Invoke(WarningEnum.High, $"Stop Grabbing Fail! ({nRet})");
return false;
}
}
catch
{
return false;
}
return true;
}
#region private
private bool init2()
{
// ch:获取包大小 || en: Get Payload Size
MyCamera.MVCC_INTVALUE stParam = new MyCamera.MVCC_INTVALUE();
//int nRet = device.MV_CC_GetIntValue_NET("PayloadSize", ref stParam);//strKey [IN] 属性键值,如获取宽度信息则为"Width" pstValue[IN][OUT] 返回给调用者有关相机属性结构体指针
//if (MyCamera.MV_OK != nRet)
//{
// System.Windows.Forms.MessageBox.Show("Get PayloadSize Fail");
// return false;
//}
//g_nPayloadSize = stParam.nCurValue;
// ch:获取高 || en: Get Height
int nRet = device.MV_CC_GetIntValue_NET("Height", ref stParam);
if (MyCamera.MV_OK != nRet)
{
System.Windows.Forms.MessageBox.Show("Get Height Fail");
return false;
}
uint nHeight = stParam.nCurValue;
// ch:获取宽 || en: Get Width
nRet = device.MV_CC_GetIntValue_NET("Width", ref stParam);
if (MyCamera.MV_OK != nRet)
{
System.Windows.Forms.MessageBox.Show("Get Width Fail");
return false;
}
uint nWidth = stParam.nCurValue;
this.size = new Size((int)nWidth, (int)nHeight);
// ch:获取步长 || en: Get nRowStep
m_nRowStep = nWidth * nHeight;
return true;
}
/// <summary>
/// false-软触发 true-连续
/// </summary>
/// <param name="type"></param>
public void setMode(bool isContinuous)
{
if (isContinuous)
{
device.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_OFF);
}
else
{
device.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_ON);
// ch:触发源选择:0 - Line0;
// 1 - Line1;
// 2 - Line2;
// 3 - Line3;
// 4 - Counter;
// 7 - Software;
//if (cbSoftTrigger.Checked)
device.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_SOFTWARE);
//else
// m_MyCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_LINE0);
}
isContinuousMode = isContinuous;
}
public void setPreviewWin(IntPtr preview_Hwnd)
{
this.previewHwnd = preview_Hwnd;
}
public void ReceiveThreadProcess()
{
MyCamera.MV_FRAME_OUT stFrameInfo = new MyCamera.MV_FRAME_OUT();
MyCamera.MV_DISPLAY_FRAME_INFO stDisplayInfo = new MyCamera.MV_DISPLAY_FRAME_INFO();
int nRet = MyCamera.MV_OK;
while (m_bGrabbing)
{
bool isOpenWin = IsWindow(this.previewHwnd);
if ((!isContinuousMode && this.scanNum < 1) ||
(isContinuousMode && (this.previewHwnd == IntPtr.Zero || !isOpenWin)))
{
Thread.Sleep(500);
continue;
}
//
nRet = device.MV_CC_GetImageBuffer_NET(ref stFrameInfo, 1000);
if (nRet == MyCamera.MV_OK)
{
if (RemoveCustomPixelFormats(stFrameInfo.stFrameInfo.enPixelType)
|| stFrameInfo.stFrameInfo.nFrameLen == 0)
{
device.MV_CC_FreeImageBuffer_NET(ref stFrameInfo);
continue;
}
//pictureBox1显示
if (this.previewHwnd != IntPtr.Zero && isOpenWin)
{
stDisplayInfo.hWnd = this.previewHwnd;// pictureBox1.Handle;
stDisplayInfo.pData = stFrameInfo.pBufAddr;
stDisplayInfo.nDataLen = stFrameInfo.stFrameInfo.nFrameLen;
stDisplayInfo.nWidth = stFrameInfo.stFrameInfo.nWidth;
stDisplayInfo.nHeight = stFrameInfo.stFrameInfo.nHeight;
stDisplayInfo.enPixelType = stFrameInfo.stFrameInfo.enPixelType;
device.MV_CC_DisplayOneFrame_NET(ref stDisplayInfo);
}
//保存
if (this.scanNum>0)//save tag
{
MyCamera.MV_SAVE_IMG_TO_FILE_PARAM stSaveFileParam = new MyCamera.MV_SAVE_IMG_TO_FILE_PARAM();
//lock (BufForDriverLock)
{
if (scannerType == ScannerType.CC)
{
stSaveFileParam.enImageType = MyCamera.MV_SAVE_IAMGE_TYPE.MV_Image_Bmp;
stSaveFileParam.enPixelType = stFrameInfo.stFrameInfo.enPixelType;
stSaveFileParam.pData = stFrameInfo.pBufAddr;//m_BufForDriver;
stSaveFileParam.nDataLen = stFrameInfo.stFrameInfo.nFrameLen;
stSaveFileParam.nHeight = stFrameInfo.stFrameInfo.nHeight;
stSaveFileParam.nWidth = stFrameInfo.stFrameInfo.nWidth;
stSaveFileParam.iMethodValue = 2;
//Save path
//stSaveFileParam.pImagePath = this.bmpSavePath + "\\" + scannerType.ToString() + "_w" + stSaveFileParam.nWidth.ToString() + "_h" + stSaveFileParam.nHeight.ToString() + "_fn" + stFrameInfo.stFrameInfo.nFrameNum.ToString() + ".bmp";
stSaveFileParam.pImagePath = this.bmpSavePath + "\\" + scannerType.ToString() + "_"+DateTime.Now.Ticks + ".bmp";
//m_MyCamera.MV_CC_RegisterImageCallBackEx_NET(new MyCamera.cbOutputExdelegate(ImageCallBack), IntPtr.Zero);
nRet = device.MV_CC_SaveImageToFile_NET(ref stSaveFileParam);
if (MyCamera.MV_OK == nRet)
{
if (ScanEventPath != null)
ScanEventPath?.Invoke(this.scanNum--, stSaveFileParam.pImagePath);
else
ScanEvent?.Invoke(this.scanNum--, read2Bmp(stSaveFileParam.pImagePath));
}
}
else
{
//=== raw byte[]
//byte[] rawFileBuff = toRawImage(stFrameInfo);
//if (rawFileBuff != null)
// ScanEvent?.Invoke(this.scanNum--, rawFileBuff);
//=== bmp
Bitmap bmp = toBitmap(stFrameInfo.pBufAddr, stFrameInfo.stFrameInfo);
//bmp = bytes2bmp(bmp2bytes(bmp));
//string bmpPath = "d:\\" + DateTime.Now.Ticks + ".bmp";
//bmp.Save(bmpPath, ImageFormat.Bmp);
////bmp = (Bitmap)Bitmap.FromFile(bmpPath);
//bmp = read2Bmp(bmpPath);
if (bmp != null)
ScanEvent?.Invoke(this.scanNum--, bmp);
}
}
}
//free
device.MV_CC_FreeImageBuffer_NET(ref stFrameInfo);
}
else
{
Thread.Sleep(5);
}
}
}
public void AfterGigeUsbImageAcquired_Station1(MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo, IntPtr pTemp )
{
Bitmap Station1Image1 = new System.Drawing.Bitmap(pFrameInfo.nWidth, pFrameInfo.nHeight, pFrameInfo.nWidth * 1, System.Drawing.Imaging.PixelFormat.Format8bppIndexed, pTemp);
ColorPalette cp = Station1Image1.Palette;
for (int i = 0; i < 256; i++)
{
cp.Entries[i] = Color.FromArgb(i, i, i);
}
Station1Image1.Palette = cp;
}
private byte[] toRawImage(MyCamera.MV_FRAME_OUT stFrameOut)
{
MyCamera.MvGvspPixelType enType = MyCamera.MvGvspPixelType.PixelType_Gvsp_Undefined;
uint nChannelNum = 0;
if (IsColorPixelFormat(stFrameOut.stFrameInfo.enPixelType))
{
enType = MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed;
nChannelNum = 3;
}
else if (IsMonoPixelFormat(stFrameOut.stFrameInfo.enPixelType))
{
enType = MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8;
nChannelNum = 1;
}
else
return null;
//
if (enType != MyCamera.MvGvspPixelType.PixelType_Gvsp_Undefined)
{
IntPtr pBufForConvert = Marshal.AllocHGlobal((int)(stFrameOut.stFrameInfo.nWidth * stFrameOut.stFrameInfo.nHeight * nChannelNum));
MyCamera.MV_PIXEL_CONVERT_PARAM stConvertPixelParam = new MyCamera.MV_PIXEL_CONVERT_PARAM();
stConvertPixelParam.nWidth = stFrameOut.stFrameInfo.nWidth;
stConvertPixelParam.nHeight = stFrameOut.stFrameInfo.nHeight;
stConvertPixelParam.pSrcData = stFrameOut.pBufAddr;
stConvertPixelParam.nSrcDataLen = stFrameOut.stFrameInfo.nFrameLen;
stConvertPixelParam.enSrcPixelType = stFrameOut.stFrameInfo.enPixelType;
stConvertPixelParam.enDstPixelType = enType;
stConvertPixelParam.pDstBuffer = pBufForConvert;
stConvertPixelParam.nDstBufferSize = (uint)(stFrameOut.stFrameInfo.nWidth * stFrameOut.stFrameInfo.nHeight * nChannelNum);
int nRet = device.MV_CC_ConvertPixelType_NET(ref stConvertPixelParam);
if (MyCamera.MV_OK != nRet)
return null;
// ch:将图像数据保存到本地文件 | en:Save image data to local file
byte[] rawImage = new byte[stConvertPixelParam.nDstLen];
Marshal.Copy(stConvertPixelParam.pDstBuffer, rawImage, 0, (int)stConvertPixelParam.nDstLen);
if (pBufForConvert != IntPtr.Zero)
Marshal.FreeHGlobal(pBufForConvert);
//
return rawImage;
}
return null;
}
private Bitmap toBitmap(IntPtr pData, MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo)
{
int nRet = MyCamera.MV_OK;
//MyCamera device = m_pMyCamera;
//MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo = new MyCamera.MV_FRAME_OUT_INFO_EX();
//IntPtr pData = System.Runtime.InteropServices.Marshal.AllocHGlobal((int)g_nPayloadSize);
if (pData == IntPtr.Zero)
return null;
IntPtr pTemp = IntPtr.Zero;
IntPtr pImageBuffer = IntPtr.Zero;
if (IsColorPixelFormat(pFrameInfo.enPixelType)) // 彩色图像处理
{
if (pFrameInfo.enPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed)
{
pTemp = pData;
}
else
{
// 其他格式彩色图像转为RGB
nRet = getBmpPtr(device, pData, pFrameInfo.nHeight, pFrameInfo.nWidth, pFrameInfo.enPixelType, pImageBuffer, MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed);
if (MyCamera.MV_OK != nRet)
return null;
pTemp = pImageBuffer;
}
// Packed转Plane
Byte[] byteArrImageData = new Byte[m_nRowStep * 3];
unsafe
{
byte* pBufForSaveImage = (byte*)pTemp;
UInt32 nSupWidth = (pFrameInfo.nWidth + (UInt32)3) & 0xfffffffc;
for (int nRow = 0; nRow < pFrameInfo.nHeight; nRow++)
{
for (int col = 0; col < pFrameInfo.nWidth; col++)
{
byteArrImageData[nRow * nSupWidth + col] = pBufForSaveImage[nRow * pFrameInfo.nWidth * 3 + (3 * col)];
byteArrImageData[pFrameInfo.nWidth * pFrameInfo.nHeight + nRow * nSupWidth + col] = pBufForSaveImage[nRow * pFrameInfo.nWidth * 3 + (3 * col + 1)];
byteArrImageData[pFrameInfo.nWidth * pFrameInfo.nHeight * 2 + nRow * nSupWidth + col] = pBufForSaveImage[nRow * pFrameInfo.nWidth * 3 + (3 * col + 2)];
}
}
pTemp = System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(byteArrImageData, 0);
}
//
Bitmap Station1Image1 = new System.Drawing.Bitmap(pFrameInfo.nWidth, pFrameInfo.nHeight, pFrameInfo.nWidth * 3, System.Drawing.Imaging.PixelFormat.Format24bppRgb, pTemp);
//ColorPalette cp = Station1Image1.Palette;
//for (int i = 0; i < 256; i++)
//{
// cp.Entries[i] = Color.FromArgb(i, i, i);
//}
//Station1Image1.Palette = cp;
return Station1Image1;
}
else if (IsMonoPixelFormat(pFrameInfo.enPixelType)) // Mono图像处理
{
if (pFrameInfo.enPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8)
{
pTemp = pData;
}
else
{
// 其他格式Mono转为Mono8
//nRet = ConvertToMono8(device, pData, pImageBuffer, pFrameInfo.nHeight, pFrameInfo.nWidth, pFrameInfo.enPixelType);
nRet = getBmpPtr(device, pData, pFrameInfo.nHeight, pFrameInfo.nWidth, pFrameInfo.enPixelType, pImageBuffer, MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed);
if (MyCamera.MV_OK != nRet)
return null;
pTemp = pImageBuffer;
}
//
Bitmap Station1Image1 = new System.Drawing.Bitmap(pFrameInfo.nWidth, pFrameInfo.nHeight, pFrameInfo.nWidth * 1, System.Drawing.Imaging.PixelFormat.Format8bppIndexed, pTemp);
ColorPalette cp = Station1Image1.Palette;
for (int i = 0; i < 256; i++)
{
cp.Entries[i] = Color.FromArgb(i, i, i);
}
Station1Image1.Palette = cp;
return Station1Image1;
}
else
return null;
}
public Int32 getBmpPtr(MyCamera device, IntPtr pSrc, ushort nHeight, ushort nWidth, MyCamera.MvGvspPixelType nPixelType, IntPtr pDst, MyCamera.MvGvspPixelType type)
{
if (IntPtr.Zero == pSrc || IntPtr.Zero == pDst)
{
return MyCamera.MV_E_PARAMETER;
}
int nRet = MyCamera.MV_OK;
//MyCamera device = obj as MyCamera;
MyCamera.MV_PIXEL_CONVERT_PARAM stPixelConvertParam = new MyCamera.MV_PIXEL_CONVERT_PARAM();
stPixelConvertParam.pSrcData = pSrc;//源数据
if (IntPtr.Zero == stPixelConvertParam.pSrcData)
{
return -1;
}
stPixelConvertParam.nWidth = nWidth;//图像宽度
stPixelConvertParam.nHeight = nHeight;//图像厚度
stPixelConvertParam.enSrcPixelType = nPixelType;//源数据的格式
stPixelConvertParam.nSrcDataLen = (uint)(nWidth * nHeight * ((((uint)nPixelType) >> 16) & 0x00ff) >> 3);
stPixelConvertParam.nDstBufferSize = (uint)(nWidth * nHeight * ((((uint)type) >> 16) & 0x00ff) >> 3);
stPixelConvertParam.pDstBuffer = pDst;//转换后的数据
stPixelConvertParam.enDstPixelType = type;
stPixelConvertParam.nDstBufferSize = (uint)nWidth * nHeight * 3;
nRet = device.MV_CC_ConvertPixelType_NET(ref stPixelConvertParam);//格式转换
if (MyCamera.MV_OK != nRet)
{
return -1;
}
return MyCamera.MV_OK;
}
/// <summary>
/// 其他黑白格式转为Mono8
/// </summary>
/// <param name="obj"></param>
/// <param name="pInData">输出图片数据</param>
/// <param name="pOutData">输出图片数据</param>
/// <param name="nHeight">高</param>
/// <param name="nWidth">宽</param>
/// <param name="nPixelType">像素格式</param>
/// <returns></returns>
public Int32 ConvertToMono8(MyCamera device, IntPtr pInData, IntPtr pOutData, ushort nHeight, ushort nWidth, MyCamera.MvGvspPixelType nPixelType)
{
if (IntPtr.Zero == pInData || IntPtr.Zero == pOutData)
{
return MyCamera.MV_E_PARAMETER;
}
int nRet = MyCamera.MV_OK;
//MyCamera device = obj as MyCamera;
MyCamera.MV_PIXEL_CONVERT_PARAM stPixelConvertParam = new MyCamera.MV_PIXEL_CONVERT_PARAM();
stPixelConvertParam.pSrcData = pInData;//源数据
if (IntPtr.Zero == stPixelConvertParam.pSrcData)
{
return -1;
}
stPixelConvertParam.nWidth = nWidth;//图像宽度
stPixelConvertParam.nHeight = nHeight;//图像厚度
stPixelConvertParam.enSrcPixelType = nPixelType;//源数据的格式
stPixelConvertParam.nSrcDataLen = (uint)(nWidth * nHeight * ((((uint)nPixelType) >> 16) & 0x00ff) >> 3);
stPixelConvertParam.nDstBufferSize = (uint)(nWidth * nHeight * ((((uint)MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed) >> 16) & 0x00ff) >> 3);
stPixelConvertParam.pDstBuffer = pOutData;//转换后的数据
stPixelConvertParam.enDstPixelType = MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8;
stPixelConvertParam.nDstBufferSize = (uint)(nWidth * nHeight * 3);
nRet = device.MV_CC_ConvertPixelType_NET(ref stPixelConvertParam);//格式转换
if (MyCamera.MV_OK != nRet)
{
return -1;
}
return nRet;
}
/// <summary>
/// 其他彩色格式转为RGB8
/// </summary>
/// <param name="obj"></param>
/// <param name="pSrc"></param>
/// <param name="nHeight"></param>
/// <param name="nWidth"></param>
/// <param name="nPixelType"></param>
/// <param name="pDst"></param>
/// <returns></returns>
public Int32 ConvertToRGB(MyCamera device, IntPtr pSrc, ushort nHeight, ushort nWidth, MyCamera.MvGvspPixelType nPixelType, IntPtr pDst)
{
if (IntPtr.Zero == pSrc || IntPtr.Zero == pDst)
{
return MyCamera.MV_E_PARAMETER;
}
int nRet = MyCamera.MV_OK;
//MyCamera device = obj as MyCamera;
MyCamera.MV_PIXEL_CONVERT_PARAM stPixelConvertParam = new MyCamera.MV_PIXEL_CONVERT_PARAM();
stPixelConvertParam.pSrcData = pSrc;//源数据
if (IntPtr.Zero == stPixelConvertParam.pSrcData)
{
return -1;
}
stPixelConvertParam.nWidth = nWidth;//图像宽度
stPixelConvertParam.nHeight = nHeight;//图像厚度
stPixelConvertParam.enSrcPixelType = nPixelType;//源数据的格式
stPixelConvertParam.nSrcDataLen = (uint)(nWidth * nHeight * ((((uint)nPixelType) >> 16) & 0x00ff) >> 3);
stPixelConvertParam.nDstBufferSize = (uint)(nWidth * nHeight * ((((uint)MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed) >> 16) & 0x00ff) >> 3);
stPixelConvertParam.pDstBuffer = pDst;//转换后的数据
stPixelConvertParam.enDstPixelType = MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed;
stPixelConvertParam.nDstBufferSize = (uint)nWidth * nHeight * 3;
nRet = device.MV_CC_ConvertPixelType_NET(ref stPixelConvertParam);//格式转换
if (MyCamera.MV_OK != nRet)
{
return -1;
}
return MyCamera.MV_OK;
}
private static void ImageCallbackFunc(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo, IntPtr pUser)
{
//Print parse the timestamp information in the frame
Console.WriteLine("ImageCallBack: ExposureTime[" + Convert.ToString(pFrameInfo.fExposureTime)
+ "], SecondCount[" + Convert.ToString(pFrameInfo.nSecondCount)
+ "], CycleCount[" + Convert.ToString(pFrameInfo.nCycleCount)
+ "], CycleOffset[" + Convert.ToString(pFrameInfo.nCycleOffset)
+ "], FrameNum[" + Convert.ToString(pFrameInfo.nFrameNum) + "]");
int nStrSize = Marshal.SizeOf(stChunkInfo);
int nUnparsedChunkContent = (int)pFrameInfo.UnparsedChunkList.pUnparsedChunkContent;
for (int i = 0; i < pFrameInfo.nUnparsedChunkNum; i++)
{
stChunkInfo = (MyCamera.MV_CHUNK_DATA_CONTENT)Marshal.PtrToStructure((IntPtr)(nUnparsedChunkContent + i * nStrSize), typeof(MyCamera.MV_CHUNK_DATA_CONTENT));
Console.WriteLine("ChunkInfo:" + "ChunkID[0x{0:x8}],ChunkLen[" + Convert.ToString(stChunkInfo.nChunkLen) + "]", stChunkInfo.nChunkID);
}
Console.WriteLine("************************************");
}
static bool IsMonoPixelFormat(MyCamera.MvGvspPixelType enType)
{
switch (enType)
{
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12_Packed:
return true;
default:
return false;
}
}
static bool IsColorPixelFormat(MyCamera.MvGvspPixelType enType)
{
switch (enType)
{
case MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BGR8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_YUYV_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12_Packed:
return true;
default:
return false;
}
}
// ch:去除自定义的像素格式 | en:Remove custom pixel formats
private bool RemoveCustomPixelFormats(MyCamera.MvGvspPixelType enPixelFormat)
{
Int32 nResult = ((int)enPixelFormat) & (unchecked((Int32)0x80000000));
if (0x80000000 == nResult)
{
return true;
}
else
{
return false;
}
}
#endregion
public void getParam()
{
if (!IsInit) return;
MyCamera.MVCC_FLOATVALUE stParam = new MyCamera.MVCC_FLOATVALUE();
int nRet = device.MV_CC_GetFloatValue_NET("ExposureTime", ref stParam);
if (MyCamera.MV_OK == nRet)
{
ExposureTime = stParam.fCurValue;//.ToString("F1");
}
nRet = device.MV_CC_GetFloatValue_NET("Gain", ref stParam);
if (MyCamera.MV_OK == nRet)
{
Gain = stParam.fCurValue;//.ToString("F1");
}
nRet = device.MV_CC_GetFloatValue_NET("ResultingFrameRate", ref stParam);
if (MyCamera.MV_OK == nRet)
{
ResultingFrameRate = stParam.fCurValue;//.ToString("F1");
}
}
/// <summary>
///
/// </summary>
/// <param name="exposureTime">曝光</param>
/// <param name="gain">增益</param>
/// <param name="resultingFrameRate">帧率</param>
public void setParam(float exposureTime, float gain, float resultingFrameRate)
{
if (!IsInit) return;
bool change = false;
int nRet;
if (exposureTime != ExposureTime)
{
device.MV_CC_SetEnumValue_NET("ExposureAuto", 0);
nRet = device.MV_CC_SetFloatValue_NET("ExposureTime", exposureTime);
if (nRet != MyCamera.MV_OK)
{
WarningEvent?.Invoke(WarningEnum.Normal, $"Scanner Set Exposure Time Fail! ({nRet})");
}
change = true;
}
if (gain != Gain)
{
device.MV_CC_SetEnumValue_NET("GainAuto", 0);
nRet = device.MV_CC_SetFloatValue_NET("Gain", gain);
if (nRet != MyCamera.MV_OK)
{
WarningEvent?.Invoke(WarningEnum.Normal, $"Scanner Set Gain Time Fail! ({nRet})");
}
change = true;
}
if (resultingFrameRate != ResultingFrameRate)
{
nRet = device.MV_CC_SetFloatValue_NET("AcquisitionFrameRate", resultingFrameRate);
if (nRet != MyCamera.MV_OK)
{
WarningEvent?.Invoke(WarningEnum.Normal, $"Scanner Set AcquisitionFrameRate Time Fail! ({nRet})");
}
change = true;
}
//
if(change)
getParam();
}
/// <summary>
/// 软触发拍照
/// </summary>
/// <param name="num">拍照数量</param>
/// <returns></returns>
public bool scan(int num=1)
{
if (!IsInit) return false;
if (!isContinuousMode)
{
// ch:触发命令 | en:Trigger command
int nRet = device.MV_CC_SetCommandValue_NET("TriggerSoftware");
if (MyCamera.MV_OK != nRet)
{
WarningEvent?.Invoke(WarningEnum.Normal, $"Trigger Software Fail! ({nRet})");
return false;
}
}
this.scanNum= num;
return true;
}
public void Dispose()
{
stop();
}
private byte[] bmp2bytes(Bitmap bmp)
{
MemoryStream ms = new MemoryStream();
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] bytes = ms.GetBuffer(); //byte[] bytes= ms.ToArray(); 这两句都可以,至于区别么,下面有解释
ms.Close();
bmp.Dispose();
return bytes;
}
private Bitmap bytes2bmp(byte[] bytes)
{
MemoryStream ms1 = new MemoryStream(bytes);
Bitmap bm = (Bitmap)Image.FromStream(ms1);
ms1.Close();
return bm;
}
public Bitmap read2Bmp(string path)
{
MemoryStream ms = new System.IO.MemoryStream(File.ReadAllBytes(path));
Bitmap bmp = new Bitmap(ms);
ms.Close();
ms.Dispose();
//FileStream fs = new FileStream(path, FileMode.Open);
//byte[] bmpdata = new byte[fs.Length];
//fs.Read(bmpdata, 0, bmpdata.Length);
//Bitmap bmp = new Bitmap(fs);
//fs.Close();
return bmp;
}
}
}

View File

@ -0,0 +1,263 @@
using HalconDotNet;
using Microsoft.ML.OnnxRuntime;
using Microsoft.ML.OnnxRuntime.Tensors;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Yolo5;
namespace AssistClient.Device
{
public class SizeLib : IDisposable
{
public Action<WarningEnum, string> WarningEvent;
/// <summary>
/// 检测结果JSON(原图,结果)
/// </summary>
public Action<SizeTask> finishEvent;
/// <summary>
/// 是否打开设备成功
/// </summary>
public bool IsInit { get; private set; } = false;
//private System.Timers.Timer timer = new System.Timers.Timer();
//配置
HDevEngine MyEngine = new HDevEngine();
private Thread t_task;
public SizeLib()
{
}
public bool start(string enginePath)
{
try
{
IsInit = true;
taskList.Clear();
MyEngine.SetProcedurePath(enginePath);
t_task = new System.Threading.Thread(run);
t_task.IsBackground = true;
t_task.Start();
return true;
}
catch (Exception ex)
{
WarningEvent?.Invoke(WarningEnum.High, ex.Message);
return false;
}
}
public void stop()
{
if (!IsInit) return;
try
{
IsInit = false;
//timer.Elapsed -= Timer_Elapsed;
MyEngine.Dispose();
}
catch { }
}
private bool _debug = false;
public bool setDebug
{
get { return _debug; }
set
{
if (!IsInit) return;
_debug = value;
if (_debug)
MyEngine.StartDebugServer();
else
MyEngine.StopDebugServer();
}
}
private void run()
{
int taskCount;
while (IsInit)
{
lock (taskList)
{
taskCount = taskList.Count;
}
if (taskCount < 1)
{
Thread.Sleep(10);
continue;
}
////
int step = 0;
var task = pop();
try
{
if (task != null)
{
var Program1 = new HDevProcedure(task.engineName);
HDevProcedureCall ProcCall1_PI_PT = new HDevProcedureCall(Program1);
step = 1;
//
HObject image;
if (task.bmp != null)
Bitmap2HObjectBpp24(out image, task.bmp);
else
HOperatorSet.ReadImage(out image, task.file_path);
step = 2;
//设置外部函数输入
ProcCall1_PI_PT.SetInputIconicParamObject("Image_Repair", image);
ProcCall1_PI_PT.SetInputCtrlParamTuple("Index", task.index);//参数0-9
ProcCall1_PI_PT.SetInputCtrlParamTuple("PoseX", task.posX);
ProcCall1_PI_PT.SetInputCtrlParamTuple("PoseY", task.posY);
ProcCall1_PI_PT.SetInputCtrlParamTuple("PoseMarkX_Detect_1", task.MarkPointList[0]);
ProcCall1_PI_PT.SetInputCtrlParamTuple("PoseMarkY_Detect_1", task.MarkPointList[1]);
ProcCall1_PI_PT.SetInputCtrlParamTuple("PoseMarkX_Detect_2", task.MarkPointList[2]);
ProcCall1_PI_PT.SetInputCtrlParamTuple("PoseMarkY_Detect_2", task.MarkPointList[3]);
ProcCall1_PI_PT.SetInputCtrlParamTuple("PoseMarkX_Detect_3", task.MarkPointList[4]);
ProcCall1_PI_PT.SetInputCtrlParamTuple("PoseMarkY_Detect_3", task.MarkPointList[5]);
ProcCall1_PI_PT.SetInputCtrlParamTuple("PoseMarkX_Detect_4", task.MarkPointList[6]);
ProcCall1_PI_PT.SetInputCtrlParamTuple("PoseMarkY_Detect_4", task.MarkPointList[7]);
step = 3;
ProcCall1_PI_PT.Execute();//执行外部函数
step = 4;
//获取外部函数输出
step = 5;
task.isSucceed = true;
task.resultInfo = "成功";
callback(task);
}
}
catch (Exception ex)
{
WarningEvent?.Invoke(WarningEnum.Low, "SizeLib task err(" + step + "):" + ex.Message);
task.isSucceed = false;
task.resultInfo = $"(errcode:{step}):{ex.Message}";
callback(task);
}
}
}
private void callback(SizeTask task)
{
//返回成功/失败,异步调用
if (task.finishEvent != null || (task.finishEvent = finishEvent) != null)
//task.finishEvent.BeginInvoke(result, errInfo, res => task.finishEvent.EndInvoke(res), null);
System.Threading.ThreadPool.QueueUserWorkItem(waitCallback, task);
}
//异步回调
WaitCallback waitCallback = new WaitCallback(o => {
var task = (SizeTask)o;
task.finishEvent(task);
});
//=======task list
private List<SizeTask> taskList = new List<SizeTask>();
public class SizeTask
{
public int stepIndex;//库内部不用,回调时引用
public string engineName;
/// <summary>
/// 源文件
/// </summary>
public string file_path;
public double posX, posY;
public Bitmap bmp;
/// <summary>
/// 比对(index=777); 计算Mark(111/222/333/444); 尺寸(0-9); 轴偏移调整(10,20,30...)
/// </summary>
public int index; //index=8 PT1=PT2
//MARK点
public double[] MarkPointList = { 0, 0, 0, 0, 0, 0, 0, 0 };
/// <summary>
/// 完成后回调
/// </summary>
public Action<SizeTask> finishEvent;
public long createTime = DateTime.Now.Ticks;
//==结果返回
/// <summary>
/// 比对结果(index=777)
/// </summary>
public bool CompResult;
public double PT1, PT2, Shanxian, Circle_Ymm, Circle_Xmm, offsetX, offsetY;
public bool isSucceed;//转换是否成功
public string resultInfo = "";//成功或失败信息
}
public void add(SizeTask task)
{
lock (taskList)
taskList.Add(task);
}
private SizeTask pop()
{
lock (taskList)
{
if (taskList.Count < 1)
return null;
int index = 0;// taskList.FindIndex(p => { return p.isSync; });
//if (index < 0) index = 0;
var task = taskList[0];
taskList.RemoveAt(0);
return task;
}
}
public void Dispose()
{
stop();
}
/// <summary>
/// Bitmap转HObject灰度图
/// </summary>
/// <param name="bmp">Bitmap图像</param>
/// <param name="image">HObject图像</param>
private void Bitmap2HObjectBpp8(out HObject image, Bitmap bmp)
{
try
{
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData srcBmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
HOperatorSet.GenImage1(out image, "byte", bmp.Width, bmp.Height, srcBmpData.Scan0);
bmp.UnlockBits(srcBmpData);
}
catch (Exception)
{
image = null;
}
}
public void Bitmap2HObjectBpp24(out HObject image, Bitmap bmp)
{
try
{
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData srcBmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
HOperatorSet.GenImageInterleaved(out image, srcBmpData.Scan0, "bgr", bmp.Width, bmp.Height, 0, "byte", 0, 0, 0, 0, -1, 0);
bmp.UnlockBits(srcBmpData);
}
catch (Exception ex)
{
image = null;
}
}
}
}

View File

@ -0,0 +1,154 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AssistClient
{
public enum CurrentPTEnum
{
[Description("初始位")]
InitPT = 1,
[Description("上料位")]
UpPT = 2,
[Description("下料位")]
DownPT = 3,
[Description("运行中")]
Moving = 4,
[Description("打标中")] //手动中
MakeTag = 5
}
public enum CurrentStateEnum
{
= 0,
= 1,//可复位
= 2,//可复位
= 3,//解除告警->等待启动 (可复位、下料中)
= 4, //解除告警->等待复位
= 5,
= 6, //没有暂停,完成后->等待启动
= 7,//可复位、急停、下料; [暂停:位置在CurrentPTEnum.MakeTag时->打标中]
= 8,//可复位、暂停、急停、下料
}
public enum WarningEnum
{
[Description("正常")]
Normal = 0,
[Description("低(可继续)")]
Low = 1,
[Description("严重")]
High = 2
}
public enum IODirectionEnum
{
[Description("仅输入")]
= 0,
[Description("仅输出")]
= 1,
[Description("输入与输出")]
= 2,
}
//public enum PowerLevelEnum
//{
// [Description("低电平")]
// 高 = 0,
// [Description("高电平")]
// 低 = 1,
//}
public enum AxisName
{
[Description("0-Axis")]
Axis0 = 0,
[Description("1-Axis")]
Axis1 = 1,
[Description("2-Axis")]
Axis2 = 2,
[Description("3-Axis")]
Axis3 = 3,
}
/// <summary>
/// 轴脉冲模式
/// </summary>
public enum AxisPulseOutMode
{
OUT_DIR = 0x1,
OUT_DIR_OUT_NEG = 0x02,
OUT_DIR_DIR_NEG = 0x04,
OUT_DIR_ALL_NEG = 0x08,
O_CW_CCW = 0x10,
CW_CCW_ALL_NEG = 0x20,
}
/// <summary>
/// 回原点方式
/// </summary>
public enum AxitHomeMode
{
MODE1_Abs = 0,
MODE2_Lmt = 1,
MODE3_Ref = 2,
MODE4_Abs_Ref = 3,
MODE5_Abs_NegRef = 4,
MODE6_Lmt_Ref = 5,
MODE7_AbsSearch = 6,
MODE8_LmtSearch = 7,
MODE9_AbsSearch_Ref = 8,
MODE10_AbsSearch_NegRef = 9,
MODE11_LmtSearch_Ref = 10,
MODE12_AbsSearchReFind = 11,
MODE13_LmtSearchReFind = 12,
MODE14_AbsSearchReFind_Ref = 13,
MODE15_AbsSearchReFind_NegRef = 14,
MODE16_LmtSearchReFind_Ref = 15,
}
public enum AxHomeDirection
{
= 0,
= 1,
}
public enum AxMoveMode
{
MODE1_Abs = 0,
MODE2_Rel = 1,
}
public enum SmallAxCmdPos
{
0_679X = 0,
0_7X = 550,
1_0X = 4780,
1_5X = 7850,
2_0X = 10500,
2_5X = 13300,
3_0X = 15360,
3_5X = 16890,
4_0X = 18230,
4_5X = 19350,
}
public enum CMDName
{
IO默认输出 = 0,
= 10,//输入+输出
= 11,
= 12,//输入+输出
= 15,
= 16,
= 17,
= 20,
= 21,
= 22,
= 23,
= 30,
= 31,
= 35,
= 36,
}
}

View File

@ -0,0 +1,46 @@
namespace AssistClient
{
partial class Form1
{
/// <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.SuspendLayout();
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
}
}

View File

@ -0,0 +1,20 @@
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 AssistClient
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,97 @@
namespace AssistClient
{
partial class FrmCMDProcess
{
/// <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.panel1 = new System.Windows.Forms.Panel();
this.cobCMDProcess = new System.Windows.Forms.ComboBox();
this.uiIOCardDev0 = new AssistClient.UI.UIIOCardDev();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// panel1
//
this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.panel1.BackColor = System.Drawing.Color.White;
this.panel1.Controls.Add(this.cobCMDProcess);
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(932, 53);
this.panel1.TabIndex = 19;
//
// cobCMDProcess
//
this.cobCMDProcess.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cobCMDProcess.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
this.cobCMDProcess.FormattingEnabled = true;
this.cobCMDProcess.Location = new System.Drawing.Point(12, 14);
this.cobCMDProcess.Name = "cobCMDProcess";
this.cobCMDProcess.Size = new System.Drawing.Size(318, 26);
this.cobCMDProcess.TabIndex = 8;
this.cobCMDProcess.SelectedIndexChanged += new System.EventHandler(this.cobCMDProcess_SelectedIndexChanged);
//
// uiIOCardDev0
//
this.uiIOCardDev0.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.uiIOCardDev0.Location = new System.Drawing.Point(0, 59);
this.uiIOCardDev0.Name = "uiIOCardDev0";
this.uiIOCardDev0.Size = new System.Drawing.Size(932, 800);
this.uiIOCardDev0.TabIndex = 18;
//
// FrmCMDProcess
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.ActiveCaption;
this.ClientSize = new System.Drawing.Size(932, 862);
this.Controls.Add(this.panel1);
this.Controls.Add(this.uiIOCardDev0);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "FrmCMDProcess";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "系统指令设置";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmCMDProcess_FormClosing);
this.Load += new System.EventHandler(this.FrmSetParams_Load);
this.panel1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private UI.UIIOCardDev uiIOCardDev0;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.ComboBox cobCMDProcess;
}
}

View File

@ -0,0 +1,80 @@
using Newtonsoft.Json.Linq;
using AssistClient.Utils;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AssistClient
{
public partial class FrmCMDProcess : Form
{
ArrayList cmdList=new ArrayList();
private int currKey;
public FrmCMDProcess()
{
InitializeComponent();
this.uiIOCardDev0.GetParamsEvent = save;
}
private void initData()
{
cmdList = Utils.EnumUtil.GetArrayList<CMDName>();
cobCMDProcess.DisplayMember = "Value";
cobCMDProcess.ValueMember = "Key";
cobCMDProcess.DataSource = cmdList;
cobCMDProcess.SelectedIndex = 0;
}
private void FrmSetParams_Load(object sender, EventArgs e)
{
try
{
uiIOCardDev0.init();
initData();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.Close();
}
}
private void cobCMDProcess_SelectedIndexChanged(object sender, EventArgs e)
{
currKey = (int)cobCMDProcess.SelectedValue;
if (Config.CMDProcess.ContainsKey((CMDName)currKey))
this.uiIOCardDev0.setParamsData(Config.CMDProcess[(CMDName)currKey].ToString());
}
private void save(string json)
{
Config.CMDProcess[(CMDName)currKey] = JObject.Parse(json);
File.WriteAllText(Application.StartupPath + "\\CMDProcess\\" + currKey + ".json", json);
MessageBox.Show("保存成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void tsbtnClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void FrmCMDProcess_FormClosing(object sender, FormClosingEventArgs e)
{
string lsBasePath = Application.StartupPath + "\\CMDProcess\\";
foreach (DictionaryEntry item in cmdList)
{
if(!File.Exists(lsBasePath+item.Key+".json"))
{
MessageBox.Show($"[{item.Value}] 指令未设置,请先把系统指令集全部设置完成!", "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
e.Cancel = true;
return;
}
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,196 @@
namespace AssistClient
{
partial class FrmDebug3
{
/// <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(FrmDebug3));
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage7 = new System.Windows.Forms.TabPage();
this.tabPage4 = new System.Windows.Forms.TabPage();
this.tabPage9 = new System.Windows.Forms.TabPage();
this.tabPage5 = new System.Windows.Forms.TabPage();
this.tabPage11 = new System.Windows.Forms.TabPage();
this.uiAxis1 = new AssistClient.UI.UIAxisDev();
this.uiIOCard1 = new AssistClient.UI.UIIOCardDev();
this.uiScanner1 = new AssistClient.UI.UIScannerDev();
this.uiLight1 = new AssistClient.UI.UILightDev();
this.uiSizeLib1 = new AssistClient.UI.UISizeLib();
this.tabControl1.SuspendLayout();
this.tabPage7.SuspendLayout();
this.tabPage4.SuspendLayout();
this.tabPage9.SuspendLayout();
this.tabPage5.SuspendLayout();
this.tabPage11.SuspendLayout();
this.SuspendLayout();
//
// tabControl1
//
this.tabControl1.Controls.Add(this.tabPage7);
this.tabControl1.Controls.Add(this.tabPage4);
this.tabControl1.Controls.Add(this.tabPage9);
this.tabControl1.Controls.Add(this.tabPage5);
this.tabControl1.Controls.Add(this.tabPage11);
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(1292, 1053);
this.tabControl1.TabIndex = 38;
this.tabControl1.SelectedIndexChanged += new System.EventHandler(this.tabControl1_SelectedIndexChanged);
//
// tabPage7
//
this.tabPage7.Controls.Add(this.uiAxis1);
this.tabPage7.Location = new System.Drawing.Point(4, 28);
this.tabPage7.Name = "tabPage7";
this.tabPage7.Size = new System.Drawing.Size(1284, 1021);
this.tabPage7.TabIndex = 6;
this.tabPage7.Text = "滑台调试";
this.tabPage7.UseVisualStyleBackColor = true;
//
// tabPage4
//
this.tabPage4.Controls.Add(this.uiIOCard1);
this.tabPage4.Location = new System.Drawing.Point(4, 28);
this.tabPage4.Name = "tabPage4";
this.tabPage4.Size = new System.Drawing.Size(1284, 1021);
this.tabPage4.TabIndex = 3;
this.tabPage4.Text = "IO板卡";
this.tabPage4.UseVisualStyleBackColor = true;
//
// tabPage9
//
this.tabPage9.Controls.Add(this.uiScanner1);
this.tabPage9.Location = new System.Drawing.Point(4, 28);
this.tabPage9.Name = "tabPage9";
this.tabPage9.Size = new System.Drawing.Size(1284, 1021);
this.tabPage9.TabIndex = 8;
this.tabPage9.Text = "网口相机";
this.tabPage9.UseVisualStyleBackColor = true;
//
// tabPage5
//
this.tabPage5.Controls.Add(this.uiLight1);
this.tabPage5.Location = new System.Drawing.Point(4, 28);
this.tabPage5.Name = "tabPage5";
this.tabPage5.Padding = new System.Windows.Forms.Padding(3);
this.tabPage5.Size = new System.Drawing.Size(1284, 1021);
this.tabPage5.TabIndex = 4;
this.tabPage5.Text = "光源调试";
this.tabPage5.UseVisualStyleBackColor = true;
//
// tabPage11
//
this.tabPage11.Controls.Add(this.uiSizeLib1);
this.tabPage11.Location = new System.Drawing.Point(4, 28);
this.tabPage11.Name = "tabPage11";
this.tabPage11.Size = new System.Drawing.Size(1284, 1021);
this.tabPage11.TabIndex = 10;
this.tabPage11.Text = "尺寸检测";
this.tabPage11.UseVisualStyleBackColor = true;
//
// uiAxis1
//
this.uiAxis1.Dock = System.Windows.Forms.DockStyle.Fill;
this.uiAxis1.Location = new System.Drawing.Point(0, 0);
this.uiAxis1.Margin = new System.Windows.Forms.Padding(2);
this.uiAxis1.Name = "uiAxis1";
this.uiAxis1.Size = new System.Drawing.Size(1284, 1021);
this.uiAxis1.TabIndex = 1;
//
// uiIOCard1
//
this.uiIOCard1.Dock = System.Windows.Forms.DockStyle.Fill;
this.uiIOCard1.Location = new System.Drawing.Point(0, 0);
this.uiIOCard1.Margin = new System.Windows.Forms.Padding(2);
this.uiIOCard1.Name = "uiIOCard1";
this.uiIOCard1.Size = new System.Drawing.Size(1284, 1021);
this.uiIOCard1.TabIndex = 1;
//
// uiScanner1
//
this.uiScanner1.devType = AssistClient.Device.ScannerDev.ScannerType.CC;
this.uiScanner1.Dock = System.Windows.Forms.DockStyle.Fill;
this.uiScanner1.Location = new System.Drawing.Point(0, 0);
this.uiScanner1.Margin = new System.Windows.Forms.Padding(2);
this.uiScanner1.Name = "uiScanner1";
this.uiScanner1.Size = new System.Drawing.Size(1284, 1021);
this.uiScanner1.TabIndex = 1;
//
// uiLight1
//
this.uiLight1.Dock = System.Windows.Forms.DockStyle.Fill;
this.uiLight1.Location = new System.Drawing.Point(3, 3);
this.uiLight1.Margin = new System.Windows.Forms.Padding(2);
this.uiLight1.Name = "uiLight1";
this.uiLight1.Size = new System.Drawing.Size(1278, 1015);
this.uiLight1.TabIndex = 1;
//
// uiSizeLib1
//
this.uiSizeLib1.Dock = System.Windows.Forms.DockStyle.Fill;
this.uiSizeLib1.Location = new System.Drawing.Point(0, 0);
this.uiSizeLib1.Name = "uiSizeLib1";
this.uiSizeLib1.Size = new System.Drawing.Size(1284, 1021);
this.uiSizeLib1.TabIndex = 0;
//
// FrmDebug3
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1292, 1053);
this.Controls.Add(this.tabControl1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FrmDebug3";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "设备调试";
this.Load += new System.EventHandler(this.FrmDebug3_Load);
this.tabControl1.ResumeLayout(false);
this.tabPage7.ResumeLayout(false);
this.tabPage4.ResumeLayout(false);
this.tabPage9.ResumeLayout(false);
this.tabPage5.ResumeLayout(false);
this.tabPage11.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabPage7;
private UI.UIAxisDev uiAxis1;
private System.Windows.Forms.TabPage tabPage4;
private UI.UIIOCardDev uiIOCard1;
private System.Windows.Forms.TabPage tabPage9;
private UI.UIScannerDev uiScanner1;
private System.Windows.Forms.TabPage tabPage5;
private UI.UILightDev uiLight1;
private System.Windows.Forms.TabPage tabPage11;
private UI.UISizeLib uiSizeLib1;
}
}

View File

@ -0,0 +1,66 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Button;
namespace AssistClient
{
public partial class FrmDebug3 : Form
{
SynchronizationContext SyncContext = null;
public FrmDebug3( )
{
InitializeComponent();
//获取UI线程同步上下文
SyncContext = SynchronizationContext.Current;
//init();
}
private void FrmDebug3_Load(object sender, EventArgs e)
{
}
private void propertyGrid2_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
//其中包含了两个重要的属性OldValue和ChangeItem。而ChangeItem则是“PropertyDescriptorGridEntry”类型。
//一般可以通过ChangeItem的PropertyDescriptor的ComponentType查找到属性的实际类型。
//而通过ChangeItem的Label则可以查看到当前在属性编辑输入框中显示的值。
//通过ChangeItem基本可以处理所有的属性变化的处理
}
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
switch (tabControl1.SelectedTab.Text)
{
case "":
break;
}
}
private void tsbtnOpenDev_Click(object sender, EventArgs e)
{
try
{
}
catch (Exception ex)
{
}
}
private void tsbtnClose_Click(object sender, EventArgs e)
{
}
}
}

View File

@ -0,0 +1,408 @@
<?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>
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
1/0GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2JUGHtgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYe2BgGHtfdBh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHdfNBh3YEAAA
AAAAAAAAAAAAAAUe1yoFHti5Bh7Y/QYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8FHthwAAAAAAAA
AAAAAAAAAAAAAAUe2HAGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/BR7X/QYe17kFHdcsAAAAAAAA
AAAAAAAABh3XjQYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUe15cFHtgCAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABh3XLAUd2O0GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wUe2MEFHdcIBB3XBAUe12gGHdj3Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/BR7YcAAAAAAAAAAAAAAAAAAAAAAFHthwBh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y9QYd12oGHdgGBh3XjQYe2P8GHtj/Bh7Y/wYe2P8GHtj/BR7Y/wUe15kGH9gCAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAGHddABh3X8QYe2P8GHtj/Bh7Y/wYe2P8GHtj/BR7YowUd2JsGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUe2HAAAAAAAAAAAAAAAAAAAAAABR7YcAYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh3YzQYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYd
2JsFHtgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUe11AFHtf3Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8FHthwAAAAAAAAAAAAAAAAAAAAAAUe
2HAGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7X/wYe158FHdgGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHtIABh7YagYe2PsGHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/BR7YcAAA
AAAAAAAAAAAAAAAAAAAFHthwBh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/BR7Y/wUe16MGHtcGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYe
2AIFHtiBBh7Y/QYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wUe2HAAAAAAAAAAAAAAAAAAAAAABR7YcAYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUe2KcEHtgIAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAABh/ZBAYe2JcGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8FHthwAAAAAAAAAAAAAAAAAAAAAAUe2HAGHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2OcGHtgKAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGHtdKBh7X/QYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/BR7YcAAAAAAAAAAAAAAAAAAA
AAAFHthwBh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj7Bh7XPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR3YswYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUe
2HAAAAAAAAAAAAAAAAAAAAAABR7YcAYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2K0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAABR3YJgYe2PUGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8FHthwAAAAAAAAAAAAAAAAAAAAAAUe2HAGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8FHtfzBR7XHgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUe12YGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/BR7YcAAAAAAAAAAAAAAAAAAAAAAFHthwBh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUe
2GIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGHtivBh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUe2HAAAAAAAAAAAAAA
AAAAAAAABR7YcAYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8FHdivAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGHdgIBh3Y3wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8FHthwAAAAAAAAAAAAAAAAAAAAAAUe2HAGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/BR3X2wMd1wYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAABR7YGgUe2PEGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/BR7YcAAAAAAAAAAAAAAAAAAAAAAFHthwBh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUe1/EFHtcaAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUd2DAGHdj9Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUe2HAAAAAAAAAAAAAAAAAAAAAABR7YcAYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/BR3YNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFHdhGBh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8FHthwAAAAAAAA
AAAAAAAAAAAAAAUe2HAGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2EYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR7YUgYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/BR7YcAAAAAAAAAAAAAAAAAAAAAAFHthwBh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8FHtdSAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR3WAgUe1wgGHtgKBh7YCgYe2AoGHtgKBh7YCgYe
2AoGHtgKBh7YCgYd2GYGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUe2HAAAAAAAAAAAAAAAAAAAAAABR7YcAYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh3YZAYe
2AoGHtgKBh7YCgYe2AoGHtgKBh7YCgYe2AoGHtgKBh7YCAYe2QIAAAAABR7XEAYd16MFHtfzBh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8FHthwAAAAAAAAAAAAAAAAAAAAAAUe
2HAGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe1/MFHtilBR7XEAYe
15UGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/BR7YcAAA
AAAAAAAAAAAAAAAAAAAFHthwBh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wUd15MFHdfLBh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wUe2HAAAAAAAAAAAAAAAAAAAAAABR7YcAYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtfLBh3YnQYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8FHthwAAAAAAAAAAAAAAAAAAAAAAUe2HAGHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh3XmwYe2BoFHde9Bh7Y+QYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/BR7YcAAAAAAAAAAAAAAAAAAA
AAAFHthwBh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHdj3Bh3YwQUe
1xoAAAAABR3XBgYe2BIGHtgUBh7YFAYe2BQGHtgUBh7YFAYe2BQGHtgUBh7YFAUd2HIGHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUe
2HAAAAAAAAAAAAAAAAAAAAAABR7YcAYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/BR3YcgYe2BQGHtgUBh7YFAYe2BQGHtgUBh7YFAYe
2BQGHtgUBh3YEgYd2AYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAFHdhmBh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8FHthwAAAAAAAAAAAAAAAAAAAAAAUe2HAGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUd2GYAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAABR3YZgYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/BR7YcAAAAAAAAAAAAAAAAAAAAAAFHthwBh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8FHdhmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUd2GYGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUe2HAAAAAAAAAAAAAA
AAAAAAAABR7YcAYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/BR3YZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFHdhmBh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8FHthwAAAAAAAAAAAAAAAAAAAAAAUe2HAGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUd2GYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAABR3YZgYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/BR7YcAAAAAAAAAAAAAAAAAAAAAAFHthwBh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8FHdhmAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUd2GYGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUe2HAAAAAAAAAAAAAAAAAAAAAABR7YcAYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/BR3YZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFHdhmBh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8FHthwAAAAAAAA
AAAAAAAAAAAAAAUe2HAGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUd2GYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR3YZgYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/BR7YcAAAAAAAAAAAAAAAAAAAAAAFHthwBh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8FHdhmAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAUd2GYGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUe2HAAAAAAAAAAAAAAAAAAAAAABR7YcAYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/BR3YZgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFHdhmBh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtjRBh7XrQYe160GHtetBh7XrQYe
2NEGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wUd2GYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR3XagYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8FHddqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABh7YLgUd
1+EGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/BR3X4QYe2C4AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAABh7XLgUd1+EGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtjhBh3YLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAABh7XLAYe1+EGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2OEGHdcsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR7XKgUe2OMGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUd
1+EFHddeBR3YXAUd2FwFHdhcBR3YXAUd2FwFHdhcBR3YXAUd2FwFHdhcBR3YXAUd2FwFHdhcBR3YXAUd
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
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8FHteJAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUe1zIFHtfHBh3Y6wUd2McFHdcqAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR3WBgYe1xIFHtgGAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFHthYBh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7YWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR7XBgYd
2BIHHdgGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR3XHgUd1/MGHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7X8wYe1yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUc
1wIFHdi9Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUd170FH9UEAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAABh7XPAUe1/cGHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUe1/cGHtc8AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe0gAFHdedBR3X/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtebAB7SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR3XDgYd
188GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8FHtjJBh3YDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAGHtgmBR3X2QYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHdjbBR3XJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUe2BYFHte1Bh7Y/wYe2P8GHtj/Bh7Y/wYe
2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHti5Bh7XGgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR7XCAYd
12oFHtjjBh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wYe2P8GHtj/Bh7Y/wUe1+MGHddqBh7XCAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAHtIABh7YFgYd2G4FHdi9BR3Y9wYe2P8GHtj/Bh7Y/wYe2P8FHtj3BR7YuwUd
124GHtcWAB7SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBzYAgUc1w4FHtckBh3YOgYd
2DoFHtckBRzXDgUf2AIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA///////////8P//////8P/g///////gf+B//////8B/8D//////gP/wH/wfg/8A//gP8B+A/
gH//AfAH4A8A//+A4AfgBgH//8AAB+AAA///4AAH4AAH///wAAfgAA////AAB+AAH///+AAH4AA////8
AAfgAD////gAB+AAH///+AAH4AAf///4AAfgAB////AAB+AAD///8AAH4AAP///wAAfgAA////AAB+AA
D///8AAH4AAP///wAAfgAA////AAB+AAD/+AAAAH4AAAAQAAAAfgAAAAAAAAB+AAAAAAAAAH4AAAAIAA
AAfgAAAB//AAB+AAD///8AAH4AAP///wAAfgAA////AAB+AAD///8AAH4AAP///wAAfgAA////AAB+AA
D///8AAH4AAP///wAAfgAA////AAB+AAD///8AAAAAAP///wAAAAAA///+AAAAAAB///wAAAAAAD//+A
AAAAAAH//wH/////gP/+A//////Af/wH/////+A/+A//////8B/wH//////4D/A/8AAAD/wP8H/gAAAH
/g/4/+AAAAf/H///8AAAD//////wAAAP//////AAAA//////+AAAH//////4AAAf//////wAAD//////
/gAAf///////AAD////////AA/////////AP//////////////8=
</value>
</data>
</root>

View File

@ -0,0 +1,36 @@
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 AssistClient
{
public partial class FrmLoading2 : Form
{
public string data { get; set; }
public FrmLoading2()
{
InitializeComponent();
}
public FrmLoading2(string _data)
{
InitializeComponent();
this.data = _data;
}
private void FrmLoading2_Load(object sender, EventArgs e)
{
if (this.Owner != null)
{
this.Size = this.Owner.Size;
this.Location = this.Owner.Location;
}
}
}
}

View File

@ -0,0 +1,69 @@
namespace AssistClient
{
partial class FrmLoading2
{
/// <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(FrmLoading2));
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// label1
//
this.label1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(41)))), ((int)(((byte)(41)))), ((int)(((byte)(41)))));
this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
this.label1.Image = ((System.Drawing.Image)(resources.GetObject("label1.Image")));
this.label1.Location = new System.Drawing.Point(0, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(858, 574);
this.label1.TabIndex = 0;
//
// FrmLoading2
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(858, 574);
this.Controls.Add(this.label1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "FrmLoading2";
this.Opacity = 0.4D;
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "FrmLoading2";
this.Load += new System.EventHandler(this.FrmLoading2_Load);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Label label1;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,187 @@
namespace AssistClient
{
partial class FrmLogin
{
/// <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(FrmLogin));
this.btnLogin = new System.Windows.Forms.Button();
this.chkRememberPw = new System.Windows.Forms.CheckBox();
this.chkRememberUserCode = new System.Windows.Forms.CheckBox();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.txtUserPw = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.txtUserCode = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.button2 = new System.Windows.Forms.Button();
this.label3 = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// btnLogin
//
this.btnLogin.Location = new System.Drawing.Point(495, 707);
this.btnLogin.Name = "btnLogin";
this.btnLogin.Size = new System.Drawing.Size(112, 35);
this.btnLogin.TabIndex = 5;
this.btnLogin.Text = "登录";
this.btnLogin.UseVisualStyleBackColor = true;
this.btnLogin.Click += new System.EventHandler(this.btnLogin_Click);
//
// chkRememberPw
//
this.chkRememberPw.AutoSize = true;
this.chkRememberPw.Location = new System.Drawing.Point(602, 668);
this.chkRememberPw.Name = "chkRememberPw";
this.chkRememberPw.Size = new System.Drawing.Size(106, 22);
this.chkRememberPw.TabIndex = 3;
this.chkRememberPw.Text = "记住密码";
this.chkRememberPw.UseVisualStyleBackColor = true;
this.chkRememberPw.CheckedChanged += new System.EventHandler(this.chkRememberPw_CheckedChanged);
//
// chkRememberUserCode
//
this.chkRememberUserCode.AutoSize = true;
this.chkRememberUserCode.Location = new System.Drawing.Point(433, 668);
this.chkRememberUserCode.Name = "chkRememberUserCode";
this.chkRememberUserCode.Size = new System.Drawing.Size(124, 22);
this.chkRememberUserCode.TabIndex = 4;
this.chkRememberUserCode.Text = "记住用户名";
this.chkRememberUserCode.UseVisualStyleBackColor = true;
this.chkRememberUserCode.CheckedChanged += new System.EventHandler(this.chkRememberUserCode_CheckedChanged);
//
// pictureBox1
//
this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
this.pictureBox1.Location = new System.Drawing.Point(298, 437);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(539, 142);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.pictureBox1.TabIndex = 24;
this.pictureBox1.TabStop = false;
//
// txtUserPw
//
this.txtUserPw.Location = new System.Drawing.Point(433, 634);
this.txtUserPw.MaxLength = 16;
this.txtUserPw.Name = "txtUserPw";
this.txtUserPw.PasswordChar = '*';
this.txtUserPw.Size = new System.Drawing.Size(275, 28);
this.txtUserPw.TabIndex = 2;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(366, 644);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(44, 18);
this.label2.TabIndex = 27;
this.label2.Text = "密码";
//
// txtUserCode
//
this.txtUserCode.Location = new System.Drawing.Point(433, 593);
this.txtUserCode.Name = "txtUserCode";
this.txtUserCode.Size = new System.Drawing.Size(275, 28);
this.txtUserCode.TabIndex = 1;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(366, 603);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(44, 18);
this.label1.TabIndex = 25;
this.label1.Text = "帐号";
//
// button2
//
this.button2.Location = new System.Drawing.Point(720, 707);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(84, 35);
this.button2.TabIndex = 9;
this.button2.Text = "初始DB";
this.button2.UseVisualStyleBackColor = true;
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// label3
//
this.label3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(41)))), ((int)(((byte)(41)))), ((int)(((byte)(41)))));
this.label3.Dock = System.Windows.Forms.DockStyle.Fill;
this.label3.Image = ((System.Drawing.Image)(resources.GetObject("label3.Image")));
this.label3.Location = new System.Drawing.Point(0, 0);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(510, 275);
this.label3.TabIndex = 28;
//
// FrmLogin
//
this.AcceptButton = this.btnLogin;
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.GradientInactiveCaption;
this.ClientSize = new System.Drawing.Size(510, 275);
this.Controls.Add(this.label3);
this.Controls.Add(this.txtUserPw);
this.Controls.Add(this.label2);
this.Controls.Add(this.txtUserCode);
this.Controls.Add(this.label1);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.chkRememberUserCode);
this.Controls.Add(this.chkRememberPw);
this.Controls.Add(this.button2);
this.Controls.Add(this.btnLogin);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "FrmLogin";
this.ShowIcon = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "修复控制台 - v1.0";
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FrmLogin_FormClosed);
this.Load += new System.EventHandler(this.FrmLogin_Load);
this.Shown += new System.EventHandler(this.FrmLogin_Shown);
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button btnLogin;
private System.Windows.Forms.CheckBox chkRememberPw;
private System.Windows.Forms.CheckBox chkRememberUserCode;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.TextBox txtUserPw;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox txtUserCode;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Label label3;
}
}

View File

@ -0,0 +1,215 @@
using OpenCvSharp;
using OpenCvSharp.Extensions;
using AssistClient.Utils;
using Service;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace AssistClient
{
public partial class FrmLogin : Form
{
public FrmLogin()
{
InitializeComponent();
}
private void FrmLogin_Load(object sender, EventArgs e)
{
//this.txtUserCode.SelectAll();
//string configPath = Application.StartupPath + "\\Login.ini";
////DEV
//if (Util.ReadIniValue(configPath, "LOGIN", "RememberUserCode") == "1")
//{
// this.txtUserCode.Text = Util.ReadIniValue(configPath, "LOGIN", "UserCode");
// this.chkRememberUserCode.Checked = true;
// this.txtUserPw.SelectAll();
// if (Util.ReadIniValue(configPath, "LOGIN", "RememberPw") == "1")
// {
// this.txtUserPw.Text = Util.ReadIniValue(configPath, "LOGIN", "PassWord");
// this.chkRememberPw.Checked = true;
// this.btnLogin.Focus();
// }
//}
//FrmLoading2 loading = new FrmLoading2();
//loading.ShowDialog(this);
//Thread workThread = new Thread(waiting);
//workThread.IsBackground = true;
//workThread.Start(loading);
}
private void FrmLogin_Shown(object sender, EventArgs e)
{
this.txtUserCode.Text = "admin";
this.txtUserPw.Text = "";
btnLogin_Click(null, null);
}
private void waiting(Object form)
{
FrmLoading2 frmLoading = form as FrmLoading2;
btnLogin_Click(null,null);
frmLoading.Close();
}
private void FrmLogin_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
System.GC.Collect();
System.Environment.Exit(0);
}
private void btnLogin_Click(object sender, EventArgs e)
{
try
{
string szUserCode=this.txtUserCode.Text.Trim();
string szUserPw=this.txtUserPw.Text.Trim();
if (szUserCode == "")
throw new Exception("请填写用户帐号!");
if (szUserPw.Length != 32)
szUserPw = Utils.Util.GetMD5(szUserPw);
UserService service = new UserService();
var model = service.GetModel(szUserCode, szUserPw);
if (model == null)
throw new Exception("帐号或密码错误!");
if (szUserCode!="admin" && !model.State)
throw new Exception("帐号已停用!");
if (string.IsNullOrWhiteSpace(model.Password))
model.Password = "";
//
string configPath = Application.StartupPath + "\\Login.ini";
if (this.chkRememberUserCode.Checked)
{
Util.WriteIniValue(configPath, "LOGIN", "UserCode", szUserCode);
Util.WriteIniValue(configPath, "LOGIN", "RememberUserCode", "1");
Util.WriteIniValue(configPath, "LOGIN", "PassWord", this.chkRememberPw.Checked ? szUserPw : "");
Util.WriteIniValue(configPath, "LOGIN", "RememberPw", this.chkRememberPw.Checked ? "1" : "0");
}
else
{
Util.WriteIniValue(configPath, "LOGIN", "RememberUserCode", "");
Util.WriteIniValue(configPath, "LOGIN", "RememberPw", "0");
Util.WriteIniValue(configPath, "LOGIN", "PassWord", this.chkRememberPw.Checked ? szUserPw : "");
Util.WriteIniValue(configPath, "LOGIN", "RememberPw", this.chkRememberPw.Checked ? "1" : "0");
}
//
this.Hide();
Config.loginUser=model;
FrmMain frmMain = new FrmMain();
frmMain.Show();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void chkRememberUserCode_CheckedChanged(object sender, EventArgs e)
{
if(!chkRememberUserCode.Checked)
chkRememberPw.Checked = false;
}
private void chkRememberPw_CheckedChanged(object sender, EventArgs e)
{
if (chkRememberPw.Checked)
chkRememberUserCode.Checked = true;
}
private void button2_Click(object sender, EventArgs e)
{
if (MessageBox.Show($"确定初始化数据库?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
return;
try
{
Service.InitDB.initDB(this.txtUserPw.Text=="reset");
MessageBox.Show("数据库初始化成功请使用admin进行登录", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message,"失败",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
private void button3_Click(object sender, EventArgs e)
{
DateTime now = DateTime.Now;
byte[] buff = File.ReadAllBytes(Application.StartupPath + @"\bigbmp\bigbmp.bmp");
this.Text = (DateTime.Now - now).TotalMilliseconds.ToString() + " ";
now = DateTime.Now;
MemoryStream stream = new MemoryStream(buff);
List<Bitmap> listBmp = new List<Bitmap>();
using (Mat mat = BitmapConverter.ToMat(new System.Drawing.Bitmap(stream)))
{
//
int smallW = mat.Width / 23;
int smallH = mat.Height / 23;
{
for (int i = 0; i < 23; i++)
{
for (int j = 0; j < 23; j++)
{
Rect rect1 = new Rect(i * smallW, j * smallH, smallW, smallH);
using (Mat mat8U = mat[rect1])
{
listBmp.Add(BitmapConverter.ToBitmap(mat8U));
}
}
}
}
}
this.Text += (DateTime.Now - now).TotalMilliseconds.ToString();
int index = 0;
listBmp.ForEach(b => b.Save(Application.StartupPath + @"\bigbmp\" + (index++) + ".bmp", ImageFormat.Bmp));
}
public static Mat bmpToMat(Bitmap srcbit)
{
int iwidth = srcbit.Width;
int iheight = srcbit.Height;
int iByte = iwidth * iheight * 3;
byte[] result = new byte[iByte];
int step;
Rectangle rect = new Rectangle(0, 0, iwidth, iheight);
BitmapData bmpData = srcbit.LockBits(rect, ImageLockMode.ReadWrite, srcbit.PixelFormat);
IntPtr iPtr = bmpData.Scan0;
Marshal.Copy(iPtr, result, 0, iByte);
step = bmpData.Stride;
srcbit.UnlockBits(bmpData);
return new Mat(srcbit.Height, srcbit.Width, new MatType(MatType.CV_8UC3), result, step);
}
public static Mat bmpBuffToBat(byte[] buff,int height,int width)
{
var src = new Mat(height, width, MatType.CV_8UC3);
int length = height * width * 3; // or src.Height * src.Step;
Marshal.Copy(buff, 0, src.Data, length);
return src;
}
public static byte[] matToBmpBuff(string fullpath, int height, int width)
{
Mat mat = Cv2.ImRead(fullpath);//Mat默认通道顺序是Bgr和Bitmap一致
var bytes = new byte[mat.Total() * 3];//这里必须乘以通道数不然数组越界也可以用w*h*c差不多
Marshal.Copy(mat.Data, bytes, 0, bytes.Length);
return bytes;
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,610 @@
<?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="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>498, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="产品管理ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
DAAACwwBP0AiyAAAAB90RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgOLVo0ngAAAQ7SURB
VFhH1ddrbBRVFMBxWlKMEEq7bU1IJGqCxlfoi4pRPxBNMCQmiom1QGqQYpVQtLNb5CndXYmGbxqJ0Q9q
iMagW61VICEaArZbbRdol2Dw0QQ1AhbBR5QYlTL+z8zc6Z3hbndp/OKHHztz7jnnHmZ2Z9Iptm1ftpq+
VClewFmMYoMprxDGYC5sVIKVOIILsD1/4mPcb6qbiDEYRuOpaMHXUJuKEZwKxWS4pTD2CjMGFWmCR/AF
9E0+xeKadFcRn9OxGt9AzzmKZhSZeivGoKCwCVnoTdO4z5Rf3Zuaxtpj+NLLVY5hRW1vaqqp7pIAyUuQ
8YqVQTwQzjWZ596uRyEb6z2OozmcHzghIakVXIQM8pCeU6iadKqYWrl9/fgbqm/gCgaL+lIntcRd+tpk
0ecu6F/UZ/T1YHK6a4eWOAa59I16TqGoW4AeqH42/Y/XDXRfrecFikRt/3tr6wc/GKpNd40X9qUO4+Fw
rgl5dejy6tTGJxqG9zS32HZxON8/qEhEF1bEreGyTW0HKrd1bK4+uMuqz/QMUqwPIr/xJr2BQnwe3vby
1ManG4Z2r7557xtlM2OtjZG4lWGfLBapOuefSCJaRPAr2I64ZTNIpvLZjsdrP3u/lSsSHmQIy1GFauyE
fGnV+rn5hz6MNQztmTWjveXeSKc17Pd2jcB5PrgDxKPTCIziAn6EPsh+BmmsH+hurhtgkPFNxPnQ+R9c
tc6Fo5lZ09tW3B7pbO/1e7n8PWTP8ACy8VhF0rqRz1acwPggG9f0VG1bt2j+4Y+W1n3efSi8MV+u7ff8
mo1c0br8lsjW9t1+res7PEHvm/gcQ84BbJKukxjHV6Id3ztx4QzS9lbVc0/fseDYvno2lkfwssVjI6XF
y5bMiWx96k0/13USHZjh9Exa13rxCQe4XmKKFCOGH5x1EbcuckXWq5zyLU+uIS7/M7Wx9NqAmYFe9Fbr
BQ+gSDOsh9xHtdGdkFumzn9BJ8qNPfIMcNpZzDGAQs5V+NbJTUSfh1wdOZbBrjHVKLkHSDgDnHIW8wwg
yPvEa/QSEt7xEVOu7r8c4IDX6EXIJZfjrClXl2+Agm6BIO+g10gf4KgpV/e/GWCuXmRC3mQHmOvlXjJA
CUH355W0ZutFJuRNdoDZXu4ZBiiRmLMQicekqbylZPFllOmFYaxf9gCsR/CKl5uVPSWuJzR5i0IeSpth
HIR4wQMQL8cWnPHyhP9KDyevwk9aogyyCYFBOM87QEXCKiW2Ee4T1nUWq/Q8/0AhoRLyhPsdqjAwCJ/7
vbg+wLC3Ju+OdXCfK67z2I4qfS8RONGRPAfypPsLqpH8UqLo984DVwBrMf72dF9QryLnI9oY1FF8A3ZC
NdXtQDIUU97BraaeOmPQRJrhdfwG2eAfPIi7oa6SXOp3cZuph4kxOBGar8Q5+H83cPwafkZMz83PnvIv
dCSkSnb4fUMAAAAASUVORK5CYII=
</value>
</data>
<data name="流程管理ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
DAAACwwBP0AiyAAAAB90RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgOLVo0ngAAALhSURB
VFhHxdZPbExRFMfxUiqItCT1t7FigU2FzFTYSZVUhIVEJBLKSkJjEhtLkViISBrKwp+FTSWdLmyIhmAh
NCL1J6R9wxJh4W+FKON72vvGebfnzgxtWXyavHN/59w3rzPvvYp8Pv9fmcVS0tmoARfQ65yTmpUtxSwW
w0b7kQ9otXqKMYshbLDB29Cy3uoNMYshDL/lbWa5bfWGmMUQhr/zNrO8R7XVbzGLPgYuxBn8hLWp9gWz
rTkWs6gxrAUf3PByRKlsf6U1y2IWYww7pgafxwl1HHIoOSM3RR/7zKJgUJsbKJe9RdW7Xd1yrSGbm6Sy
8/AQZ+OazyzSsBMy8DuakmvPK6kdwVuXEW9cbXIyG61x62K3XouNKHDJ5hAecE17/PVYQzaayfrqYbka
KyNY3+5myZezzl9PHAhCx13DFX/tbzHrspt52l9LHPBJqgl9gvzf6/XaaDBrEQYxkMpGs/SaH9wKOdNH
uj4WmHnDzd6m635oAXahWdfHAjMPQE6gXdcTofHExvKFlRO4ruuJ0Hhi48XuBJ7oeiIkVmSjCYTqkPiy
jAaz5Ke9EXICvXrtd6grV8XiYfThK+TJJ3e9dbrhT9C7GXfwGT8gJ9DPr21GnBn6w02lhoW7LmDZFzeU
i56D3gyN23P/0BWOw/J+ZwW15XqDYsiu9HotFyUr4bn4phZCgg8UH1l5clozNHnOzJdwoyoW02NtZiF7
3+sNaZLwWq8Ycs/azEK2x+sNaZRwLeRJZQW0k9ZmFrKnvF6L7FkbN7SrBctguita5m8UQn4JSr0/tkk2
bpiGq2rRchNlv/OT3aF6fd2prtxUyRUapvdF0pTBA8ir9Ut0QB5OzxA3y/pRbEE9lmIV9mJTPE+4eide
4SOkN5PuiCbGmUJYIyRvO0Nn6I7lCsmN5QX0J/G9RuGdMNHfOXzj8Y0oFMMguV03Q96O5Tb9GE8ht9tL
yKQ7oyqrN8Qs/jv5il/FGDMc7zmuYQAAAABJRU5ErkJggg==
</value>
</data>
<data name="设备调试ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
DAAACwwBP0AiyAAAAB90RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgOLVo0ngAAAOPSURB
VFhHrZfbbw1RFMY/IsQ1QfokRCQeCK2IJ14kpMKjoBqNVG/aulUl/AUkwl8hggce+AtcE2nRlgcPEkEo
qu1pe9xK2+P7JrPHPjNreuY0PcnvzJ611/rW2mvO7JmDQqEwI06gvrIa1TWC482WTxZM43S041hVK5ru
HEdzfyMa80Jj2Ti3xYqZDtOYRhsaaplsogUtBQvOTbah8bAVm4ZptGhHfVULms3EPiqCvpWWhoVptGCL
71sJLeRraVhEg1YAd4FtncB830G0ob6CwpPxRNMwdQZ1q+I61F5wjzluM5ezRYOfwJXfPP0FdD0Gljm7
2IPqDc1omGple4+jqSTsQKEdR7f7GtKU9jhzKJezRw55GXVKWEh3D7DUze3E1vmnsX/tOdSs7cShknSQ
IzgYdVJa0nT6zHXVzQVf4iQw9wdwcyp0YqVd3cASNz9TpCEtaUqbOW7VMZebTwSoiMBM/gA9bNtlVj8j
FCsNpxdoe7lE0YnD78RsEK48kVwkDKIBmDcBDMWFYoyTryEaWz4B0pKmlSthEE95KzJIwjxL5QlZGKKx
5RMgLWlauRIG0UtRBg3EhWI8iGI0tn0CpCVNP4cjYRAZC3gUxWhs+wSUXQA/c9Q2X8SgnAK+StPP4Qi+
BoGVHK4hqwV/sesZNBhMp1NOAYPS5DjQJ2sGgBVBAd+Ai5NAjsOJkL/hcYokxDwyF0Ck5WtPsKjcCHdE
FfCQBiuoFOUUYMItuRfcqRbz4VBLw9mQjr/AeVY45hxTKOcSjEmT4w4S5FHOz8AieoQiMbh/v3MCKWQu
gFrvfW0f0yhY8fO4UIzMBVDrha/tYxoFHybX40IxMhdArWu+to9pFKPAwRIPpEwFSIO/9v2+to9pFPqU
2AsyFcD2v/F145hGwY3jEqd13/LMJGsH+nlM/b9gGvkicdq1n10YT7kU0xagGBfHY463XZWfw5Ew8Nof
5s4YTLF9Ix+BjdwwzrEQ7WCBPeRhFBfbzOQ7xnudcWe8hQwPAYm/cEUndNjlEumYA3a4uS9AJTtzm0Xl
w9W9dHMaq2jODXOlN7jBRIl4Kc97CxpijqI/LdFAL4/cFfVMCFrHFRzwHR2vgYphoJrsczaK7iW7+4Dl
vq+DRVxwnWCOAb4lRy+7kRPfWBZxx+rjyvPfwX8XoX22YBGnqD3KAp69Yi5nL3J6C2zq13PBs80mn7i3
fADW/bcV8A/Oeg45gZ9N8QAAAABJRU5ErkJggg==
</value>
</data>
<data name="tsMenuPTSetting.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMhSURBVFhHxc5NSBRhGMDx91CEEARG0CG6egq6FEFd
CoIi8OKh6BCEsChtRlFhhDVoLJHQBltofm7Luk6uH5l9qFFU9GUJRaeuQRAI3tMWnv7vTjPO7LzObgp2
+PHuzDzv/h8lIv+V8eVaCjxcHZ5dqVrk8QPiY5oNNAMPpuEytmMG/qhWQCtMdwLNwINpOEIN5lAa1yyY
7hT5m4GHK/lPldqIbxADC6Y7Hn8z8NAy9LFSzRADC6b5AH8z8HD5/kylvkNKWDDN+ukZUssscMn+UIka
yDIsmO5o+ltxzt8MLNA8+L4SByERLJTe0e+8GX/T+ZHhrNDFgXdHIGVY0LOa/u3/9nxVC5zPvt0JqYD1
V+n7/tUssPVLZn/VucybecgKHQ8vkOYsL4aFX+kq6Uy3y5n065WYx6bwAr2c0WIQV6F3vXT2XZfT/a/+
VRxefGmBLs7lxSClFrs2yM2elJzqfVmpDJQWXqCD02Vjao+Srwn9HIN4po+KTNV5z4sdG+R2V0Iaul9E
KeAalCu8QIrT5cZTxFN8dk0Sf0r8ca3IxCHv/e/UOrnT0Saxu8/9FvAOt1AD5RdeIMnp0vEk8SSfXE+I
PyY+QXyc+NgBkZG93vdfySp9boGq73i2CfpcVniBds4lMYjnEfEJ4uPEx4iPEM8Tt3ctzbSrAraj+B8n
70xHCi+Q4HTEIJ6HxB8QHyU+QnyIuE08R9w/l1BxeP9zIjUZKbxAK2erqod4HhAfJT5MPE/cJp4jniXu
n2tVZ+D+R9Gx5KNI4QVa1D4UIEUjxIeJDxG3ieeIZ4nfI+7OOOLQ9wPqboxHCi9wSQ1AivLEh4jbxHPE
s8QzxPuJuzOOOPTdkNrEaKTwAhfUZ0iRTTxHPEs8QzxNvJe4+90Rl7Eafc/ocFs+UniBs2oaUpQlniGe
Jt5HvJu4+83hxIe36XtGB637kcILNKlmiKePeA/xLuL+902q0Yvbm/U9o/0tg5HCC5xS1ZiDRGiEni3P
FyjH+dHA2aB24yekxAIa4c6VVxKJ4vyIcTqqcRmjmEU/dsA/U15JJIrx5Voyvlw7ov4AX/KIjpayQK0A
AAAASUVORK5CYII=
</value>
</data>
<data name="tsMenuCmdSetting.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMhSURBVFhHxc5NSBRhGMDx91CEEARG0CG6egq6FEFd
CoIi8OKh6BCEsChtRlFhhDVoLJHQBltofm7Luk6uH5l9qFFU9GUJRaeuQRAI3tMWnv7vTjPO7LzObgp2
+PHuzDzv/h8lIv+V8eVaCjxcHZ5dqVrk8QPiY5oNNAMPpuEytmMG/qhWQCtMdwLNwINpOEIN5lAa1yyY
7hT5m4GHK/lPldqIbxADC6Y7Hn8z8NAy9LFSzRADC6b5AH8z8HD5/kylvkNKWDDN+ukZUssscMn+UIka
yDIsmO5o+ltxzt8MLNA8+L4SByERLJTe0e+8GX/T+ZHhrNDFgXdHIGVY0LOa/u3/9nxVC5zPvt0JqYD1
V+n7/tUssPVLZn/VucybecgKHQ8vkOYsL4aFX+kq6Uy3y5n065WYx6bwAr2c0WIQV6F3vXT2XZfT/a/+
VRxefGmBLs7lxSClFrs2yM2elJzqfVmpDJQWXqCD02Vjao+Srwn9HIN4po+KTNV5z4sdG+R2V0Iaul9E
KeAalCu8QIrT5cZTxFN8dk0Sf0r8ca3IxCHv/e/UOrnT0Saxu8/9FvAOt1AD5RdeIMnp0vEk8SSfXE+I
PyY+QXyc+NgBkZG93vdfySp9boGq73i2CfpcVniBds4lMYjnEfEJ4uPEx4iPEM8Tt3ctzbSrAraj+B8n
70xHCi+Q4HTEIJ6HxB8QHyU+QnyIuE08R9w/l1BxeP9zIjUZKbxAK2erqod4HhAfJT5MPE/cJp4jniXu
n2tVZ+D+R9Gx5KNI4QVa1D4UIEUjxIeJDxG3ieeIZ4nfI+7OOOLQ9wPqboxHCi9wSQ1AivLEh4jbxHPE
s8QzxPuJuzOOOPTdkNrEaKTwAhfUZ0iRTTxHPEs8QzxNvJe4+90Rl7Eafc/ocFs+UniBs2oaUpQlniGe
Jt5HvJu4+83hxIe36XtGB637kcILNKlmiKePeA/xLuL+902q0Yvbm/U9o/0tg5HCC5xS1ZiDRGiEni3P
FyjH+dHA2aB24yekxAIa4c6VVxKJ4vyIcTqqcRmjmEU/dsA/U15JJIrx5Voyvlw7ov4AX/KIjpayQK0A
AAAASUVORK5CYII=
</value>
</data>
<data name="tsMenuSysSetting.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMhSURBVFhHxc5NSBRhGMDx91CEEARG0CG6egq6FEFd
CoIi8OKh6BCEsChtRlFhhDVoLJHQBltofm7Luk6uH5l9qFFU9GUJRaeuQRAI3tMWnv7vTjPO7LzObgp2
+PHuzDzv/h8lIv+V8eVaCjxcHZ5dqVrk8QPiY5oNNAMPpuEytmMG/qhWQCtMdwLNwINpOEIN5lAa1yyY
7hT5m4GHK/lPldqIbxADC6Y7Hn8z8NAy9LFSzRADC6b5AH8z8HD5/kylvkNKWDDN+ukZUssscMn+UIka
yDIsmO5o+ltxzt8MLNA8+L4SByERLJTe0e+8GX/T+ZHhrNDFgXdHIGVY0LOa/u3/9nxVC5zPvt0JqYD1
V+n7/tUssPVLZn/VucybecgKHQ8vkOYsL4aFX+kq6Uy3y5n065WYx6bwAr2c0WIQV6F3vXT2XZfT/a/+
VRxefGmBLs7lxSClFrs2yM2elJzqfVmpDJQWXqCD02Vjao+Srwn9HIN4po+KTNV5z4sdG+R2V0Iaul9E
KeAalCu8QIrT5cZTxFN8dk0Sf0r8ca3IxCHv/e/UOrnT0Saxu8/9FvAOt1AD5RdeIMnp0vEk8SSfXE+I
PyY+QXyc+NgBkZG93vdfySp9boGq73i2CfpcVniBds4lMYjnEfEJ4uPEx4iPEM8Tt3ctzbSrAraj+B8n
70xHCi+Q4HTEIJ6HxB8QHyU+QnyIuE08R9w/l1BxeP9zIjUZKbxAK2erqod4HhAfJT5MPE/cJp4jniXu
n2tVZ+D+R9Gx5KNI4QVa1D4UIEUjxIeJDxG3ieeIZ4nfI+7OOOLQ9wPqboxHCi9wSQ1AivLEh4jbxHPE
s8QzxPuJuzOOOPTdkNrEaKTwAhfUZ0iRTTxHPEs8QzxNvJe4+90Rl7Eafc/ocFs+UniBs2oaUpQlniGe
Jt5HvJu4+83hxIe36XtGB637kcILNKlmiKePeA/xLuL+902q0Yvbm/U9o/0tg5HCC5xS1ZiDRGiEni3P
FyjH+dHA2aB24yekxAIa4c6VVxKJ4vyIcTqqcRmjmEU/dsA/U15JJIrx5Voyvlw7ov4AX/KIjpayQK0A
AAAASUVORK5CYII=
</value>
</data>
<data name="帮助ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAT9SURBVFhHxdZdTFNnGAfwJiRLuN3VkiVeebUrk13t
isxt2dySLW5kLCZLcB8omftWo3OCKFt0k7nNydhEJ6gDaSdOrQO0Wj5G+SjjG4p8QxXaUigUCpXKf//3
Tc85bTnF6o0XP845z/O+z/Nw+pZgAPBYyR/ZJvujelInlrCoAVZ4XQvXPEUZdJVGCRFCZKc8eklvfyyu
ix7g/sqKLuZE43wSTSKbrkUMmK5XT8G8NkCWqVl3EeOZ5Cdk/2VHcW0fbP2TmPAtgHlVILiMAdcsqjrH
kXetHWJ9mJ3WK/UiMa4NsN/YbAjdX1HxOYmOE4Rzdf2YmAmAuQdaDt1H86Ab311tk3vJSynMxfbQBvi6
rMnAjSo+FxNfZbMsJoo+rIWlZZypdkDUoSBtZDyyhzbAvguNhiCDAu/3kGw+5J4DY49saTkEU+MgRD1y
03rGlT7aAHtLGwxcLK4bKERoH5uSBeJxTs+jccCFhn4Xxr3zumuExXvLOHmzB6Im1TOm9NIG2FPSYFi8
FxLXKsLllhFuFJtX65vw4XhlV+SJl45d60DHmFd3j28hiBweYlGbUhmTPdUBdp+3CRsJ2Tw4Xv+iPNmx
eu/MyEJZXCOcqOqSlGcxSCeH0Ntr7b4DUZ8cfJY91QF2nasXSgnm/0Ywv3RvFf9iEHnmduVQwT7kVnOt
Ix554kX8eGVn1D7FbCCIgxxe9KAU0VMd4MuzdUnkJX6fffBzQ6xhz5zyOeK0tXdVPs/cJnNf8cDNcdjY
vGBqHIDoQT+SNsDnRbUbCAeMjZjlZj3uuQByy+3YW2LD7cmZqJz4w5RtbOLrrZfXyFykpsFJiD5UT9oA
n56pSSXkV3XCF1iKyzu/CNfsQlRswjfPA9jG3+pfydw6EpWPNOyZhehDbtIG+Ph0dSahuMaB6YWlhI15
/fjmoh2fnamVCvl101uncPEtij5h2gAfnbJmEoqqe+VvmQiPP4Bvy5ux47RVSmSv2CP6hCWpA2SevLWF
8GtVh1yUCEvXGLafvCn9Ye3RXRNrZGoWog/5SHsD2363PEfIMTXI15SIszW9+KDgBjJ+s2CUH4XemliN
A5MQfaiVtAE+LLiRTMFtLOa465UH60Eq2oax9UQlDl9q0s3rKbPdBvsIhaQN8H7+dcFKKG8agHPGn5Ah
j083Hs++knqIHpQmeqoDpJ+oFNIJO4tr5Gc15p1b0/WOEXxyyoJck41fL5/umkjWnnGI+uSjZNIGePfn
f4QnqJ9wwdaHYQ6xlt3FVrx6yCRVtA/rrlEMcsBdZ2sgatMexmRPdYB3jpkNg26fuKaR/Gxbhl1gLK4i
axdeyCrFW0cuoW3UrbtGcepmF0RdclIyY7KnOkDq95cN/a4ZifcXCTsKLfyfwAPG4hKN9eKRjA19ePvo
FbBmiF5hTOmjDfDG4XJD3+S0xPtk6iC8l1+Buj4nGH8kBdfbIOqEfcFYZB9tgNdyTQbHxLSKz0+TnfDm
kXIUWjrQfWcKzCWkxuGUZ0TsD8tiPLaHNsDLOWWGnrveKIwlk5EgbPnhCn4yt8DaOw7mV+l0emDi695f
UotNB41yDwUolXm9+toAL2aXrlqgYO516iYo0o7+ja2/XMPOolvYXlAp7zcdKlPzYYW0Tq+mwJw2wPP7
/9RdpGA+iTaTkXyEOByUQ8/o1YnENdoAKfvOP6xnwzJoc/h+HemtjUsd4PGB4X/kMUb/ohHSSgAAAABJ
RU5ErkJggg==
</value>
</data>
<data name="关于ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJkSURBVFhHxdXdb0txHAbw/msiEi5E4oIbESEiRJAF
EaxLdkEiQRCLIt6p6ULU4nWGqbeZuwUTSSP2Zqxb161d33z9nsbzzTlnv/YXtHXxSZ6cfM/zpOdiC4nI
f2V92EzWh8204EFb10DEiBtSJ+iKJJPJEAT3NJgjjttK6gHdvnHQ8Pugcvx4cES+pXNSKv/8J+hAF3ux
4R0HDeHY27ghPYPDUiyX6wqd6MaGdxw0tN7oFxibnpNCqVxTYmhcfxWy7cYLneznHmnY19kvkC+WnDyf
tMJ2E8R+7pGGvdffCOQKJadwl/mcHrabIPZzjzTsib4WyOaLTs8+jMp+8zkB2XYTxH7ukYbd114JzM4X
GoL93CMNO6+8EMjkCg3Bfu6RhpbLCYF0Nl/Vrqsva7K9Q+znHmnYcfG5wNTcfFUtl0xJDbZ3iP3cIw3b
zvcJpGZzTtsv9PnYboLYzz3SsPXcU4EfmZwTb//mHe6Rhi1nnwhMzGSdNp/p9bHdBLGfe6Rh0+leAfzZ
dNl4qsfHdhPEfu6RBpYNpzJO6zse+thugtjPPdKwoeORwJfJGae1J+772G6C2M890rDu5AOB5Pe006rD
d3xsN0Hs5x5pWHP8nsDniWmnFQdv+dhugtjPPdKw+ki3wKfxqaqWtsdqsr1D7OceaVh56LZAYmhEPo6l
rBaHozXZ3gF0sp97pGH5gZtxQ47dfSfvRyfrCp3oxoZ3HDQsa49FDIGj3QPm//xXa9mfQAe62IsN7zho
WNLWCRFDGgTdvnHQsKg1ShEjbkidoAudlX7vOCx40GzWh81kfdg8EvoF4WXl698aVB0AAAAASUVORK5C
YII=
</value>
</data>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>663, 17</value>
</metadata>
<data name="tsbtnOpenDev.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
R/CAgH8BL2edNgDxz3QAAAAASUVORK5CYII=
</value>
</data>
<data name="tsbtnCloseDev.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="tsbtnWarning.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="tsbtnStopNow.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="tsbtnStart.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAXYSURBVFhH1ZZ7UFR1FMcpZ++9+94FWdhFfIzmmCmDgC5r
ltb4CI0mHaEUFdRFXBYQWJTSwmeoU1mKlI06KTijjU2D7wBBQyFNs2RAaxxntEZnxCabdEgbm2/n3L0k
C8uCj386M5/Zu/d3Hr/fOed3f7+g/5X0ic8bbov3FNkcnhPEWdtQz30ZfuZ3NMY6ivqTE6sjf5HFnv9T
36SdGLjjZ0R+fwcRja3ofeMfGX7mdzzGOqzLNor5o0u4wzM73J7fMMBTA1tzK8xX7sPQ+De0J+9CU/kX
NPsU6Jnf8RjrsG6/vKNgW/ahuHs4sTo8ayJfLUVEwy0Ymu5CV9MK9d7bUO/+MzCkozvWCkPzXUTU30Kf
hA2gbKxU3PZMqJYf9521B8E/3IG+7jY0e25BXfb7Q8E2+ro76E2lYV/sU3EfWHi2kSm7YTxDKzlCgT9v
gXr7I0K27IN9Rb5R3n0muF62ie8juPo3qu1NSFuuQfr0MSEf7It9RowvhjW+YKYSrrNw04SUNkGz/wak
0quQNl15MpAvzYEbCPnsIni7KuF8hbdN6Gubof3yF6hLLkP64NITRb35MrRfXYNl8kbKgidLCatIUlIv
m6MAmqxqSJ9chPhec2dWN0E/MhOa6bsgrjjvX6cbpG2XoMmsoizkNiuRvRLh8Lxsmbge4qJvICxugLj8
x84sOwvjyGwEj1kGw/OFkOYe8a8XAOHt0xSjDpbxa2EbXeBQwsvbbq1p6jYIWbUQ5n8NcemZzhR+C9PI
LISMWw3zi0UwxedDN24FRHeNf30/COmVENy1ME3dSjvCs0YJTxOgxtCm7IWwsBqqlH0QcigTBQ2+5NXB
GJuB4Bfe9TLmHZgdi2GIdUE9pQRCbl1nm/bQOPtWZVRBN/MLbsYqJTxNYJSnRUo/AhWlVVaac8A7CUrX
f2TVwDhiHsyjC32hSZji3NDFuSAmlfnatEOVetDrm2JI8w/BZs+/qoQPCgp1ZN7j9Ktm7fcqyZM4CMFV
AyGTysJkVMIQNUdOvT+4PwxRaZDs2Q9sFFRphx74nb0fkquaSpDzhxK+iwnIypQJ6gkhvYp+D0E/fCb1
QbZfuBT64SmQxnq8+oyzUvbh65MmkHnUdwJcArX7KKXnsK9yG1QS1ZwK6J9Lpj5w+RKzQM6MNiYNonMX
BGpW2Q9l0K8vGlPzVmxfAm5CXTqtdkGVfyNmxl7ohkyDYYQThhgi2gk9Bx6aDCmxGOKSeioT2XfMYgeE
BdXQz63o0IS0Dc3J5dRox/waycgTmEqB58mBdc9Oh3o0NZ6besVNdt0EboNjmJN3+m7D8Pi8sRY6hISC
+q5TRxPQDk6kMrwJbdQMiClbIeSTfvsG6w7aCcLieoSNXwe6uo1SwnuFr1Ga3OMBslAB9ZBESAnLIXpo
a1GT+dfrGiH7OLSLann1jUrYB8KHkSWxFMLS7/yvilIsFp6mCR7vcbp9SDss+7ZM2cQN6FLC+gofx/qc
Y95SdNw+jwNvZzpj9Dm1XR/HLPIl9KVV0BSdk7+Ej7TSjpAP/hJqlp+Dlc6OgBcSFr42hSVspOOzib7f
Jx4vE7zyvJMQ116AddKHVPseXk75Ahk+uQTa4gsQlpx6uE5vg2teeIp8NMP6ykc9v5S2Cc/WRuUwFjVC
XHfR90AJBG810mUbY9F5sA8KXqS47VaeInoRasIYFuN0W+25Z8Oml0G/nq5WdL8TV56X08pfNNU8Oj0J
fpZTvaoRUskVGNZdQvi0HVTv3FNhsa755EsknibYf0BhJR3Rl+APxTQiwzBgQkVwXEaLddIGWNKrYVxF
qyum69WW6zL8zO94zDphPcLjXNfNzySUk+0UIpqwErwo9h9QWEFD2IhY4nViIfEWsVIw9d9uHJTQYBk2
+1rIsNSbofbMe0xwjLPFEp36q3lgQp3K2K+EdJcQTmIyEUVYiLYsBBROESuxsoFgw0hiADGIGEwMIYYS
w9rB//k9jw8kWL8PEUroCYHwEzwo6F/CYgmHBPg+SAAAAABJRU5ErkJggg==
</value>
</data>
<data name="tsbtnPause1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AElFTkSuQmCC
</value>
</data>
<data name="tsbtnReset.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="tsbtnLog.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAANJSURBVFhHxVdLaxNRGM1STaeC2kBJBUG7FMGVuhB/QJcF
lUAzUXAhCC60Kxe2RailitharG2TsQuhgujGjdYnKoq2SS1VqhWftY/Qh6ZpHm38vOfmtkmTm8nNJNAD
B4aZ7ztn5t7vfveOTRUVJ2+X2fWbhzWP77rd7XutebqnNJcR5WTXyXvsGYtBrEgrHuXHe3cx4S67p2Nh
y6l75DjbT5XnXpLz/FuqahzkxDXu4RliEIsc5AoZC3D7NjCRZs3THqs484CcjQNU1eRXImKRg1xNNy5C
S6iqobzO2Kl5DP+20/fJ2fBOaqJCZ8MAQQNayqOxWffu1eqMSXyBTNQK+WgwTWgLGzn4fLuMaUf9I6lQ
MYQmtHOPRG3fRvaWgVJ+eSaTddEzBC/hmgKKBfMlSywleU2gMNPBi67GiKNoZEmlJDzgtWYqsGZVhv5Q
x0e68nyCXnwN0VQoTpGlBCeucQ/PECPLTSefCt3o5uZbj3VraBxm63xf2wg9HvtDqkAscmRaILzgCW8b
Wie6lywQrOkZpfnIspBWB3KQK9MEecdk3mz4jRuO+n5p0O7WYQouLAnJwoFcaMi04QlvGzYR9HFZUMuT
30LKOqAh04YnvG2a2xfkG4skaHQ6ImSs41MwItWGJ7zZFLTH+K4mCYov/xMy1gENmTY84W36AnOLhRdf
JhbjCal26gVMpmDwV1jIWEdgPCzVXp0CsyJsejguZKwDGjLtVBGaLMPq5iH6MhMVUoUDudCQaaeWYZ5G
tJ91tO+zMSGpjh9zMTrQnrsbrjYipVZ8dUTI5keCLZy7w7O055K8AYHwKjtqhHkrBrAxmG1GrltjQj4J
DO3k3zhF2UYE4vrVtxC1Pp2gg9c+SDXSuWYzAvhJKMd2vJ3Rzyp5BX2BGdpxIZAVp8qV7VjTvdXCPolc
B5LLzybo53yM7ryfpdrez1nPCyU87LrRImzTgCMZOy6pnAuskg8986g80blJuK7F+h5KBdb1WL4CPhJs
qDBfxZwTkcsPoUwr75dnAb9mrDBRsfgCsz6RScTyr+bVbuHXLB1YLji0onGge6n8nGqerkWs86ylVgz4
77nbd4SJdtp17xsUFP9CkF3ze3jGYtR/z222/zJk9iRuSyapAAAAAElFTkSuQmCC
</value>
</data>
<metadata name="colMainIndex.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="btnRight.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAH8SURBVFhHxddJSxxBGMbxjgYVCYggCIIHwUMOAQ8e
PAQ8BDwIQhD8Bq7RuC9Ro7b7/j08uiSaaNzXuG8HkSCIIIggGhfcfawSZ1DfF7uqZdqRB4aB4fdva2hm
DACvOvZFJ+d+0rqaYLSsxhstK5/N5pU4NC3HonE5Bo1Ln9CwGI36xY+oW4hC7XwkauYjUD33AVWz71E5
Gw5zJgwV06Eonw5B2d9gfJ8KQulUIEomA1A88Q7F4/74Nu6HojFfs3DUxygYeUsD7nF4EIfAIXDkD3sz
AZ698oc48oa8TBLgII5cMRLgJJ4z+IYGqOBzu23yjXePl+A5A1yAwpXfPPmzi2f3S/JJgMq//QZXZHbw
rD9MgOqZX+OCTBfP7GMCdD5wVzgj08G/9jIBqrjrzC9xQqaKZ/xmAnRw15lf4IhMBU//xQTo4q4zP8cB
mRX+pYcJsIO7zvwMe2TP4WndTIBdXJ75KXbJnsPTfjIBdvET7JBZ4ak/mAA7+DG2yVTwFC5AFz/CFpkq
ntLFBOjgh9gk08GTO5kAVfw/Nsh08SQuQAU/wD8yO3hSBxNghcs73D7WH80untjOBFjh8vbav10l4LW7
vQTnAyxwldurKs4GOImzAQKXPxocwcXo13KBy18sTuBybtf9ROCGwA2Bm568cjFDjgS81tgXnRuMWzLt
L6pAGawbAAAAAElFTkSuQmCC
</value>
</data>
<data name="btnLeft.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
DAAACwwBP0AiyAAAAB90RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgOLVo0ngAAAITSURB
VFhHxdfPSxRhHMfxRw0LCSQQhMBD4KGD4KFDh6CD4CEIQug/0LT8UZpaauWoaa2t/4dH0/JHtbVl6ra6
mz/2IBFBBIIIkj8Ss9KP3wmeZZ3v7M4zj+7o8oZlEV6f4RkHVwA41mw/9LL4m/IBITMoJFbxnBoUuEFV
DlEvBKqomy+pYYFbIwLVowI1YwK1rwTqXgvcfiNwJyBQ/zYD9e8y0BDMxN1gptH4Pks0fTiRdMAB2OwI
cRAOwtE8nm07IJ1Xnojj3seTht0Ar3DcnzhFZIoB6cZbJnKSD9DFf2Lxf4GlTke8ZfK0/QB9/MuBnPDW
qVw+QBdfw1eWE94WOmMzQANfxzeWCv4glMcHuMU38J2lij/8lM8HuME38YPlBn8UPmszQBH/hSWWW7w9
XMAHqOBbWGbp4Mb0OT7ACd/GCksX75gptBmQAjefcL+xytLFO2fO8wGpcPl43aG/cms6eFekiA9wwuXj
9Q/d89bc4o+jxXyACi7P/C/dftbc4N3RC3yAKi7P/B/dBdZU8Z7PF/kAN7g88106AGsq+JPZS3yAW1ye
+R5duzUn/OnsZT5AB5dnvmd5OeG+uRI+QBeXZy5/Iiv9jrhvvtT8VcuAQ+AqZ56I985f4QO8xJ8tXOUD
CDe/NHiC+xeu8X/LCTe/sXiBwx8ri7vxN4QLwgXhRjqv3MT7Ytf5gOPK9kPvgtgHDysvqg6h7IMAAAAA
SUVORK5CYII=
</value>
</data>
<data name="btnBack.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHmSURBVFhHxdfHSgNBHAbwtaAiggiCIHgQPHgQPHjw
IHgQPAiCCL6BLfbey9pbfAGfwKO9d43G2MvFg+BFQQSxIBGR+DkrJujOP8nsIZOFD5bNLL9vsrvDrgLA
ryEPyoxrZ/QyTzFf5irmixx15CIbw+dZGDrPxNBZBgZP0zFwmob+k1T0Haeg9zgZPUdJ6D5MRNdhAtSD
eHTa4tBhi0X7fgzarNFotUahZS8SzbsRaLaEo8kShsadULVhO0Sp3wrmC/zi8CEOhoPhqNsMIgr4duZ/
cdRuBKpcAYk4ali4AjLx6vUAvoBMvHqNKiARr1rVSF0BmXjlClFAJl6xTBSg8KOHcW3gz2YUd257d2Mc
Xr5EFKBm/gXHv4ji+vP0eNkiUYD62x344OINp87R46ULRAF31/wTdi7ucGoshZfMEwU83XAfeOGix6kx
7nDTHFHA293+jkcuTpz6zRNumiUKiDxqdtwLxRtePEMUEH3O33DrMSJ4EVVABHde81fckBHFi6aJAqK4
ds21Fe4Z1/9iBC+cIgoYwZ3L6xOufmIUL6AKGMWp5VUUL5gkCsjE8yeIAjJxuoBEnCwgEycLMFz7aJCC
s/Cv5QzXvlhk4FpcrmuH4QrDFYarvpw5i6KFK+CvkAflBco3dZcxI5gi9PAAAAAASUVORK5CYII=
</value>
</data>
<data name="btnZDown.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHmSURBVFhHxdfHSgNBHAbwtaAiggiCIHgQPHgQPHjw
IHgQPAiCCL6BLfbey9pbfAGfwKO9d43G2MvFg+BFQQSxIBGR+DkrJujOP8nsIZOFD5bNLL9vsrvDrgLA
ryEPyoxrZ/QyTzFf5irmixx15CIbw+dZGDrPxNBZBgZP0zFwmob+k1T0Haeg9zgZPUdJ6D5MRNdhAtSD
eHTa4tBhi0X7fgzarNFotUahZS8SzbsRaLaEo8kShsadULVhO0Sp3wrmC/zi8CEOhoPhqNsMIgr4duZ/
cdRuBKpcAYk4ali4AjLx6vUAvoBMvHqNKiARr1rVSF0BmXjlClFAJl6xTBSg8KOHcW3gz2YUd257d2Mc
Xr5EFKBm/gXHv4ji+vP0eNkiUYD62x344OINp87R46ULRAF31/wTdi7ucGoshZfMEwU83XAfeOGix6kx
7nDTHFHA293+jkcuTpz6zRNumiUKiDxqdtwLxRtePEMUEH3O33DrMSJ4EVVABHde81fckBHFi6aJAqK4
ds21Fe4Z1/9iBC+cIgoYwZ3L6xOufmIUL6AKGMWp5VUUL5gkCsjE8yeIAjJxuoBEnCwgEycLMFz7aJCC
s/Cv5QzXvlhk4FpcrmuH4QrDFYarvpw5i6KFK+CvkAflBco3dZcxI5gi9PAAAAAASUVORK5CYII=
</value>
</data>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>332, 17</value>
</metadata>
</root>

View File

@ -0,0 +1,630 @@
namespace AssistClient
{
partial class FrmPTSetting
{
/// <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(FrmPTSetting));
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.tsbtnSave = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
this.tsbtnClose = new System.Windows.Forms.ToolStripButton();
this.groupBox8 = new System.Windows.Forms.GroupBox();
this.panel8 = new System.Windows.Forms.Panel();
this.numAxis3_InitPT = new System.Windows.Forms.NumericUpDown();
this.numAxis1_InitPT = new System.Windows.Forms.NumericUpDown();
this.numAxis2_InitPT = new System.Windows.Forms.NumericUpDown();
this.numAxis0_InitPT = new System.Windows.Forms.NumericUpDown();
this.label15 = new System.Windows.Forms.Label();
this.label16 = new System.Windows.Forms.Label();
this.label13 = new System.Windows.Forms.Label();
this.label14 = new System.Windows.Forms.Label();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.panel1 = new System.Windows.Forms.Panel();
this.numAxis3_UpPT = new System.Windows.Forms.NumericUpDown();
this.numAxis1_UpPT = new System.Windows.Forms.NumericUpDown();
this.numAxis2_UpPT = new System.Windows.Forms.NumericUpDown();
this.numAxis0_UpPT = new System.Windows.Forms.NumericUpDown();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.panel2 = new System.Windows.Forms.Panel();
this.numAxis3_DownPT = new System.Windows.Forms.NumericUpDown();
this.numAxis1_DownPT = new System.Windows.Forms.NumericUpDown();
this.numAxis2_DownPT = new System.Windows.Forms.NumericUpDown();
this.numAxis0_DownPT = new System.Windows.Forms.NumericUpDown();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.label7 = new System.Windows.Forms.Label();
this.label8 = new System.Windows.Forms.Label();
this.toolStrip1.SuspendLayout();
this.groupBox8.SuspendLayout();
this.panel8.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.numAxis3_InitPT)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis1_InitPT)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis2_InitPT)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis0_InitPT)).BeginInit();
this.groupBox1.SuspendLayout();
this.panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.numAxis3_UpPT)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis1_UpPT)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis2_UpPT)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis0_UpPT)).BeginInit();
this.groupBox2.SuspendLayout();
this.panel2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.numAxis3_DownPT)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis1_DownPT)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis2_DownPT)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis0_DownPT)).BeginInit();
this.SuspendLayout();
//
// toolStrip1
//
this.toolStrip1.BackColor = System.Drawing.SystemColors.GradientInactiveCaption;
this.toolStrip1.ImageScalingSize = new System.Drawing.Size(32, 32);
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tsbtnSave,
this.toolStripSeparator4,
this.tsbtnClose});
this.toolStrip1.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.HorizontalStackWithOverflow;
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Padding = new System.Windows.Forms.Padding(0, 0, 3, 0);
this.toolStrip1.Size = new System.Drawing.Size(632, 65);
this.toolStrip1.TabIndex = 17;
this.toolStrip1.Text = "toolStrip1";
//
// tsbtnSave
//
this.tsbtnSave.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnSave.Image")));
this.tsbtnSave.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.tsbtnSave.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnSave.Name = "tsbtnSave";
this.tsbtnSave.Size = new System.Drawing.Size(70, 60);
this.tsbtnSave.Text = " 保存 ";
this.tsbtnSave.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbtnSave.Click += new System.EventHandler(this.tsbtnSave_Click);
//
// toolStripSeparator4
//
this.toolStripSeparator4.Name = "toolStripSeparator4";
this.toolStripSeparator4.Size = new System.Drawing.Size(6, 65);
//
// tsbtnClose
//
this.tsbtnClose.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnClose.Image")));
this.tsbtnClose.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.tsbtnClose.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnClose.Name = "tsbtnClose";
this.tsbtnClose.Size = new System.Drawing.Size(70, 60);
this.tsbtnClose.Text = " 关闭 ";
this.tsbtnClose.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbtnClose.Click += new System.EventHandler(this.tsbtnClose_Click);
//
// groupBox8
//
this.groupBox8.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.groupBox8.BackColor = System.Drawing.SystemColors.ActiveCaption;
this.groupBox8.Controls.Add(this.panel8);
this.groupBox8.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.groupBox8.Location = new System.Drawing.Point(4, 98);
this.groupBox8.Name = "groupBox8";
this.groupBox8.Size = new System.Drawing.Size(626, 112);
this.groupBox8.TabIndex = 30;
this.groupBox8.TabStop = false;
this.groupBox8.Text = "初始绝对位置mm";
//
// panel8
//
this.panel8.BackColor = System.Drawing.Color.White;
this.panel8.Controls.Add(this.numAxis3_InitPT);
this.panel8.Controls.Add(this.numAxis1_InitPT);
this.panel8.Controls.Add(this.numAxis2_InitPT);
this.panel8.Controls.Add(this.numAxis0_InitPT);
this.panel8.Controls.Add(this.label15);
this.panel8.Controls.Add(this.label16);
this.panel8.Controls.Add(this.label13);
this.panel8.Controls.Add(this.label14);
this.panel8.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel8.Location = new System.Drawing.Point(3, 24);
this.panel8.Name = "panel8";
this.panel8.Size = new System.Drawing.Size(620, 85);
this.panel8.TabIndex = 0;
//
// numAxis3_InitPT
//
this.numAxis3_InitPT.DecimalPlaces = 2;
this.numAxis3_InitPT.Location = new System.Drawing.Point(430, 46);
this.numAxis3_InitPT.Maximum = new decimal(new int[] {
9999,
0,
0,
0});
this.numAxis3_InitPT.Minimum = new decimal(new int[] {
9999,
0,
0,
-2147483648});
this.numAxis3_InitPT.Name = "numAxis3_InitPT";
this.numAxis3_InitPT.Size = new System.Drawing.Size(178, 28);
this.numAxis3_InitPT.TabIndex = 16;
//
// numAxis1_InitPT
//
this.numAxis1_InitPT.DecimalPlaces = 2;
this.numAxis1_InitPT.Location = new System.Drawing.Point(430, 10);
this.numAxis1_InitPT.Maximum = new decimal(new int[] {
9999,
0,
0,
0});
this.numAxis1_InitPT.Minimum = new decimal(new int[] {
9999,
0,
0,
-2147483648});
this.numAxis1_InitPT.Name = "numAxis1_InitPT";
this.numAxis1_InitPT.Size = new System.Drawing.Size(178, 28);
this.numAxis1_InitPT.TabIndex = 15;
//
// numAxis2_InitPT
//
this.numAxis2_InitPT.DecimalPlaces = 2;
this.numAxis2_InitPT.Location = new System.Drawing.Point(92, 46);
this.numAxis2_InitPT.Maximum = new decimal(new int[] {
9999,
0,
0,
0});
this.numAxis2_InitPT.Minimum = new decimal(new int[] {
9999,
0,
0,
-2147483648});
this.numAxis2_InitPT.Name = "numAxis2_InitPT";
this.numAxis2_InitPT.Size = new System.Drawing.Size(178, 28);
this.numAxis2_InitPT.TabIndex = 14;
//
// numAxis0_InitPT
//
this.numAxis0_InitPT.DecimalPlaces = 2;
this.numAxis0_InitPT.Location = new System.Drawing.Point(92, 10);
this.numAxis0_InitPT.Maximum = new decimal(new int[] {
9999,
0,
0,
0});
this.numAxis0_InitPT.Minimum = new decimal(new int[] {
9999,
0,
0,
-2147483648});
this.numAxis0_InitPT.Name = "numAxis0_InitPT";
this.numAxis0_InitPT.Size = new System.Drawing.Size(178, 28);
this.numAxis0_InitPT.TabIndex = 13;
//
// label15
//
this.label15.AutoSize = true;
this.label15.Location = new System.Drawing.Point(356, 52);
this.label15.Name = "label15";
this.label15.Size = new System.Drawing.Size(80, 18);
this.label15.TabIndex = 12;
this.label15.Text = "Axis-3";
//
// label16
//
this.label16.AutoSize = true;
this.label16.Location = new System.Drawing.Point(15, 52);
this.label16.Name = "label16";
this.label16.Size = new System.Drawing.Size(80, 18);
this.label16.TabIndex = 10;
this.label16.Text = "Axis-2";
//
// label13
//
this.label13.AutoSize = true;
this.label13.Location = new System.Drawing.Point(356, 14);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(80, 18);
this.label13.TabIndex = 8;
this.label13.Text = "Axis-1";
//
// label14
//
this.label14.AutoSize = true;
this.label14.Location = new System.Drawing.Point(15, 14);
this.label14.Name = "label14";
this.label14.Size = new System.Drawing.Size(80, 18);
this.label14.TabIndex = 6;
this.label14.Text = "Axis-0";
//
// groupBox1
//
this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.groupBox1.BackColor = System.Drawing.SystemColors.ActiveCaption;
this.groupBox1.Controls.Add(this.panel1);
this.groupBox1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.groupBox1.Location = new System.Drawing.Point(2, 216);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(626, 112);
this.groupBox1.TabIndex = 31;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "上料绝对位置mm";
//
// panel1
//
this.panel1.BackColor = System.Drawing.Color.White;
this.panel1.Controls.Add(this.numAxis3_UpPT);
this.panel1.Controls.Add(this.numAxis1_UpPT);
this.panel1.Controls.Add(this.numAxis2_UpPT);
this.panel1.Controls.Add(this.numAxis0_UpPT);
this.panel1.Controls.Add(this.label1);
this.panel1.Controls.Add(this.label2);
this.panel1.Controls.Add(this.label3);
this.panel1.Controls.Add(this.label4);
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(3, 24);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(620, 85);
this.panel1.TabIndex = 0;
//
// numAxis3_UpPT
//
this.numAxis3_UpPT.DecimalPlaces = 2;
this.numAxis3_UpPT.Location = new System.Drawing.Point(430, 46);
this.numAxis3_UpPT.Maximum = new decimal(new int[] {
9999,
0,
0,
0});
this.numAxis3_UpPT.Minimum = new decimal(new int[] {
9999,
0,
0,
-2147483648});
this.numAxis3_UpPT.Name = "numAxis3_UpPT";
this.numAxis3_UpPT.Size = new System.Drawing.Size(178, 28);
this.numAxis3_UpPT.TabIndex = 16;
//
// numAxis1_UpPT
//
this.numAxis1_UpPT.DecimalPlaces = 2;
this.numAxis1_UpPT.Location = new System.Drawing.Point(430, 10);
this.numAxis1_UpPT.Maximum = new decimal(new int[] {
9999,
0,
0,
0});
this.numAxis1_UpPT.Minimum = new decimal(new int[] {
9999,
0,
0,
-2147483648});
this.numAxis1_UpPT.Name = "numAxis1_UpPT";
this.numAxis1_UpPT.Size = new System.Drawing.Size(178, 28);
this.numAxis1_UpPT.TabIndex = 15;
//
// numAxis2_UpPT
//
this.numAxis2_UpPT.DecimalPlaces = 2;
this.numAxis2_UpPT.Location = new System.Drawing.Point(92, 46);
this.numAxis2_UpPT.Maximum = new decimal(new int[] {
9999,
0,
0,
0});
this.numAxis2_UpPT.Minimum = new decimal(new int[] {
9999,
0,
0,
-2147483648});
this.numAxis2_UpPT.Name = "numAxis2_UpPT";
this.numAxis2_UpPT.Size = new System.Drawing.Size(178, 28);
this.numAxis2_UpPT.TabIndex = 14;
//
// numAxis0_UpPT
//
this.numAxis0_UpPT.DecimalPlaces = 2;
this.numAxis0_UpPT.Location = new System.Drawing.Point(92, 10);
this.numAxis0_UpPT.Maximum = new decimal(new int[] {
9999,
0,
0,
0});
this.numAxis0_UpPT.Minimum = new decimal(new int[] {
9999,
0,
0,
-2147483648});
this.numAxis0_UpPT.Name = "numAxis0_UpPT";
this.numAxis0_UpPT.Size = new System.Drawing.Size(178, 28);
this.numAxis0_UpPT.TabIndex = 13;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(356, 52);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(80, 18);
this.label1.TabIndex = 12;
this.label1.Text = "Axis-3";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(15, 52);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(80, 18);
this.label2.TabIndex = 10;
this.label2.Text = "Axis-2";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(356, 14);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(80, 18);
this.label3.TabIndex = 8;
this.label3.Text = "Axis-1";
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(15, 14);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(80, 18);
this.label4.TabIndex = 6;
this.label4.Text = "Axis-0";
//
// groupBox2
//
this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.groupBox2.BackColor = System.Drawing.SystemColors.ActiveCaption;
this.groupBox2.Controls.Add(this.panel2);
this.groupBox2.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.groupBox2.Location = new System.Drawing.Point(4, 334);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(626, 112);
this.groupBox2.TabIndex = 31;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "下料绝对位置mm";
//
// panel2
//
this.panel2.BackColor = System.Drawing.Color.White;
this.panel2.Controls.Add(this.numAxis3_DownPT);
this.panel2.Controls.Add(this.numAxis1_DownPT);
this.panel2.Controls.Add(this.numAxis2_DownPT);
this.panel2.Controls.Add(this.numAxis0_DownPT);
this.panel2.Controls.Add(this.label5);
this.panel2.Controls.Add(this.label6);
this.panel2.Controls.Add(this.label7);
this.panel2.Controls.Add(this.label8);
this.panel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel2.Location = new System.Drawing.Point(3, 24);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(620, 85);
this.panel2.TabIndex = 0;
//
// numAxis3_DownPT
//
this.numAxis3_DownPT.DecimalPlaces = 2;
this.numAxis3_DownPT.Location = new System.Drawing.Point(430, 46);
this.numAxis3_DownPT.Maximum = new decimal(new int[] {
9999,
0,
0,
0});
this.numAxis3_DownPT.Minimum = new decimal(new int[] {
9999,
0,
0,
-2147483648});
this.numAxis3_DownPT.Name = "numAxis3_DownPT";
this.numAxis3_DownPT.Size = new System.Drawing.Size(178, 28);
this.numAxis3_DownPT.TabIndex = 16;
//
// numAxis1_DownPT
//
this.numAxis1_DownPT.DecimalPlaces = 2;
this.numAxis1_DownPT.Location = new System.Drawing.Point(430, 10);
this.numAxis1_DownPT.Maximum = new decimal(new int[] {
9999,
0,
0,
0});
this.numAxis1_DownPT.Minimum = new decimal(new int[] {
9999,
0,
0,
-2147483648});
this.numAxis1_DownPT.Name = "numAxis1_DownPT";
this.numAxis1_DownPT.Size = new System.Drawing.Size(178, 28);
this.numAxis1_DownPT.TabIndex = 15;
//
// numAxis2_DownPT
//
this.numAxis2_DownPT.DecimalPlaces = 2;
this.numAxis2_DownPT.Location = new System.Drawing.Point(92, 46);
this.numAxis2_DownPT.Maximum = new decimal(new int[] {
9999,
0,
0,
0});
this.numAxis2_DownPT.Minimum = new decimal(new int[] {
9999,
0,
0,
-2147483648});
this.numAxis2_DownPT.Name = "numAxis2_DownPT";
this.numAxis2_DownPT.Size = new System.Drawing.Size(178, 28);
this.numAxis2_DownPT.TabIndex = 14;
//
// numAxis0_DownPT
//
this.numAxis0_DownPT.DecimalPlaces = 2;
this.numAxis0_DownPT.Location = new System.Drawing.Point(92, 10);
this.numAxis0_DownPT.Maximum = new decimal(new int[] {
9999,
0,
0,
0});
this.numAxis0_DownPT.Minimum = new decimal(new int[] {
9999,
0,
0,
-2147483648});
this.numAxis0_DownPT.Name = "numAxis0_DownPT";
this.numAxis0_DownPT.Size = new System.Drawing.Size(178, 28);
this.numAxis0_DownPT.TabIndex = 13;
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(356, 52);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(80, 18);
this.label5.TabIndex = 12;
this.label5.Text = "Axis-3";
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(15, 52);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(80, 18);
this.label6.TabIndex = 10;
this.label6.Text = "Axis-2";
//
// label7
//
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(356, 14);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(80, 18);
this.label7.TabIndex = 8;
this.label7.Text = "Axis-1";
//
// label8
//
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(15, 14);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(80, 18);
this.label8.TabIndex = 6;
this.label8.Text = "Axis-0";
//
// FrmPTSetting
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.ActiveCaption;
this.ClientSize = new System.Drawing.Size(632, 453);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.groupBox8);
this.Controls.Add(this.toolStrip1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "FrmPTSetting";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "点位设置";
this.Load += new System.EventHandler(this.FrmSetParams_Load);
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.groupBox8.ResumeLayout(false);
this.panel8.ResumeLayout(false);
this.panel8.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.numAxis3_InitPT)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis1_InitPT)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis2_InitPT)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis0_InitPT)).EndInit();
this.groupBox1.ResumeLayout(false);
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.numAxis3_UpPT)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis1_UpPT)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis2_UpPT)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis0_UpPT)).EndInit();
this.groupBox2.ResumeLayout(false);
this.panel2.ResumeLayout(false);
this.panel2.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.numAxis3_DownPT)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis1_DownPT)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis2_DownPT)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numAxis0_DownPT)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
private System.Windows.Forms.ToolStripButton tsbtnClose;
private System.Windows.Forms.ToolStripButton tsbtnSave;
private System.Windows.Forms.GroupBox groupBox8;
private System.Windows.Forms.Panel panel8;
private System.Windows.Forms.NumericUpDown numAxis3_InitPT;
private System.Windows.Forms.NumericUpDown numAxis1_InitPT;
private System.Windows.Forms.NumericUpDown numAxis2_InitPT;
private System.Windows.Forms.NumericUpDown numAxis0_InitPT;
private System.Windows.Forms.Label label15;
private System.Windows.Forms.Label label16;
private System.Windows.Forms.Label label13;
private System.Windows.Forms.Label label14;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.NumericUpDown numAxis3_UpPT;
private System.Windows.Forms.NumericUpDown numAxis1_UpPT;
private System.Windows.Forms.NumericUpDown numAxis2_UpPT;
private System.Windows.Forms.NumericUpDown numAxis0_UpPT;
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 groupBox2;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.NumericUpDown numAxis3_DownPT;
private System.Windows.Forms.NumericUpDown numAxis1_DownPT;
private System.Windows.Forms.NumericUpDown numAxis2_DownPT;
private System.Windows.Forms.NumericUpDown numAxis0_DownPT;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.Label label8;
}
}

View File

@ -0,0 +1,112 @@
using Newtonsoft.Json.Linq;
using AssistClient.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AssistClient
{
public partial class FrmPTSetting : Form
{
public FrmPTSetting()
{
InitializeComponent();
}
private void initData()
{
string configPath = Application.StartupPath + "\\PTConfig.json";
string lsTmp = File.ReadAllText(configPath);
JObject joJson = JObject.Parse(lsTmp);
JArray arrItem;
if (joJson.ContainsKey("initPT"))
{
arrItem = joJson.Value<JArray>("initPT");
this.numAxis0_InitPT.Value= (decimal)arrItem[0];
this.numAxis1_InitPT.Value = (decimal)arrItem[1];
this.numAxis2_InitPT.Value = (decimal)arrItem[2];
this.numAxis3_InitPT.Value = (decimal)arrItem[3];
}
if (joJson.ContainsKey("upPT"))
{
arrItem = joJson.Value<JArray>("upPT");
this.numAxis0_UpPT.Value = (decimal)arrItem[0];
this.numAxis1_UpPT.Value = (decimal)arrItem[1];
this.numAxis2_UpPT.Value = (decimal)arrItem[2];
this.numAxis3_UpPT.Value = (decimal)arrItem[3];
}
if (joJson.ContainsKey("downPT"))
{
arrItem = joJson.Value<JArray>("downPT");
this.numAxis0_DownPT.Value = (decimal)arrItem[0];
this.numAxis1_DownPT.Value = (decimal)arrItem[1];
this.numAxis2_DownPT.Value = (decimal)arrItem[2];
this.numAxis3_DownPT.Value = (decimal)arrItem[3];
}
}
private void FrmSetParams_Load(object sender, EventArgs e)
{
try
{
initData();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.Close();
}
}
private void tsbtnSave_Click(object sender, EventArgs e)
{
try
{
string configPath = Application.StartupPath + "\\PTConfig.json";
JObject joJson = new JObject();
decimal axis0Value, axis1Value, axis2Value, axis3Value;
axis0Value = (decimal)this.numAxis0_InitPT.Value;
axis1Value = (decimal)this.numAxis1_InitPT.Value;
axis2Value = (decimal)this.numAxis2_InitPT.Value;
axis3Value = (decimal)this.numAxis3_InitPT.Value;
joJson.Add("initPT", new JArray(axis0Value, axis1Value, axis2Value, axis3Value));
axis0Value = (decimal)this.numAxis0_UpPT.Value;
axis1Value = (decimal)this.numAxis1_UpPT.Value;
axis2Value = (decimal)this.numAxis2_UpPT.Value;
axis3Value = (decimal)this.numAxis3_UpPT.Value;
joJson.Add("upPT", new JArray(axis0Value, axis1Value, axis2Value, axis3Value));
axis0Value = (decimal)this.numAxis0_DownPT.Value;
axis1Value = (decimal)this.numAxis1_DownPT.Value;
axis2Value = (decimal)this.numAxis2_DownPT.Value;
axis3Value = (decimal)this.numAxis3_DownPT.Value;
joJson.Add("downPT", new JArray(axis0Value, axis1Value, axis2Value, axis3Value));
File.WriteAllText(configPath, joJson.ToString());
//
this.Hide();
MessageBox.Show("保存成功,生效需重启程序!");
this.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void tsbtnClose_Click(object sender, EventArgs e)
{
this.Close();
}
}
}

View File

@ -0,0 +1,155 @@
<?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="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="tsbtnSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAIdSURBVFhH7ZdPaxNBGMbfIJQKlkK/QFHRi+BNS4t/LmLS
D5Bj3O7OzO68qx6C38Cb6MXSD9CqWKHQL+BN2mOr4MFjb8WzUlqR/nlnmGx2zCTZ2SxCIA/82GRm3mef
zL67SWAih2oQpw+IRmm4rANPbxk/DzWbU8CSzyDwvBI4vjTOBSXwTo/J6Dwy7gXE5f2skOEBfYJ3IJL3
/sgNiPCH9lnBQ4jjWXOGIYrTe1kAjutmtJy4fJV5CbllRocoH0DIj2a0nIRc7Xppv8DMDFA+AMNNM1pc
DEPauVi/5vjWCtDCI4jSeT3XV6MEaLcvU92ZrlXi+Cbz6hAluzRT0/NOjRIgimao7hdxrN9z+TrzspAv
9LxTVg/gBzNaTGl6BVrhqa5VsprQYlvPO2UHGLCwj/Rta5pX4FrOq8vAnbUDqO1cMjN+Yniban/mvLp4
BFCopvpO7NMD5utwaB3HbxCEf019L54Bqmc8AwTh71J07oo8XgGUiZDLwNhcKZLkBvnsWJ5+O0CNNaoE
ppan5yX4Q139HES64A1L7pJfI/ta7jCeTVglngGO6RI8Af70pm4odSyKWh/Hi8DknuX5/5tQouXpvQNC
tkCI6xDiNX38FzXugj+7SvX0I1c/ogsGyP8otVHfCX64HkIa+cmczSF16ziLqmRQgCCYpkVfeosqohWe
0C7Xzdn6qNm8RIsfUj+4/3aVReBj3RcTWQK4AF41Zkfj/gngAAAAAElFTkSuQmCC
</value>
</data>
<data name="tsbtnClose.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAJQSURBVFhHxZfNctNAEIQFb0UuYEu8DFwoiOwrVPGbFPAE
vKhjV9huzSiz69aubA501XfwuGdms7ORtV3S8/9M/qHQs0T8/l9ArVKIzwbqMA4vj2P/5rDb3FgIcs+1
UIfb/sVx//rtw4f+lYUoGLi609j/ftwPj85p139B3FQWXQuFWnnt4Y99NZmwqmiYjfvhK12TyuItKNRQ
tR/G7Qbf03jcbd8pE7hyJ6jyL4+gJzw0Yz7K5JxuL9oJCjmqloOe8CFhOgOV1YLTuP0Gn6ls6lDwqhpO
3NU8cWFeTkr8blYoNn6qkTwq1ynOlSxQ3wm9CKrZ/Pw8zQXyQq2dGIcfZp2FmPI6C/9RWfM5CDXnOPb3
ZsUz5F55nMr5yT5EqPY8+49AfecsjGzuUwYiVGsRNRrN2UMFI1RrvorinKjaQAZLqLTV1TlH4LU0SNV0
ZFBBteYN4DE7pGpFZFBBpZl+Uk0j8JgdUrUiMlhCpZ/QX6qhAl5Lg1RNRwYj1CXNnZWLkEGHSjPNXlQu
AblWBpI9VBBQreaYd+tcNBZxFmAQSv/HP1VBJ25xa0SoZVYo6xU/MAClVdef7fl8qeYi9LNBNN8Nd6qA
s7ClVHtkw51ZIeYVBVo/qfV5Qs1FpB5mpZA4vZLt+88qwUmJS3OMUPCqGg56mXVKOrzf3CijkxLWPtsB
hRxVy0FP+JhQfy0/m9saqNp5yl7LKxeTNT+pS1BL58qvaE/GdF2KhvSaNc8pqSy+Fgq1strF1Ww24rqE
C6TPxxQLXgOFmryc2pWs67ruL9BDjecFstIGAAAAAElFTkSuQmCC
</value>
</data>
</root>

View File

@ -0,0 +1,334 @@
namespace AssistClient
{
partial class FrmProductList
{
/// <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.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle7 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle8 = new System.Windows.Forms.DataGridViewCellStyle();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmProductList));
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle();
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.tsslCount = new System.Windows.Forms.ToolStripStatusLabel();
this.dataGridView1 = new System.Windows.Forms.DataGridView();
this.tsbtnSetting = new System.Windows.Forms.ToolStripButton();
this.tsbtnClose = new System.Windows.Forms.ToolStripButton();
this.colId = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colCode = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colName = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colSpec = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colTag = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colStepName = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colAssistStepName = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colTargetCount = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colCompleteCount = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colModifyCode = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colModifyTime = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.toolStrip1.SuspendLayout();
this.statusStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
this.SuspendLayout();
//
// toolStrip1
//
this.toolStrip1.BackColor = System.Drawing.SystemColors.GradientInactiveCaption;
this.toolStrip1.ImageScalingSize = new System.Drawing.Size(32, 32);
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripSeparator1,
this.tsbtnSetting,
this.toolStripSeparator3,
this.tsbtnClose});
this.toolStrip1.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.HorizontalStackWithOverflow;
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(1311, 65);
this.toolStrip1.TabIndex = 12;
this.toolStrip1.Text = "toolStrip1";
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(6, 65);
//
// toolStripSeparator3
//
this.toolStripSeparator3.Name = "toolStripSeparator3";
this.toolStripSeparator3.Size = new System.Drawing.Size(6, 65);
//
// statusStrip1
//
this.statusStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tsslCount});
this.statusStrip1.Location = new System.Drawing.Point(0, 766);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(1311, 31);
this.statusStrip1.TabIndex = 21;
this.statusStrip1.Text = "statusStrip1";
//
// tsslCount
//
this.tsslCount.Name = "tsslCount";
this.tsslCount.Size = new System.Drawing.Size(33, 24);
this.tsslCount.Text = "共 ";
//
// dataGridView1
//
this.dataGridView1.AllowUserToAddRows = false;
this.dataGridView1.AllowUserToDeleteRows = false;
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.dataGridView1.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.colId,
this.colCode,
this.colName,
this.colSpec,
this.colTag,
this.colStepName,
this.colAssistStepName,
this.colTargetCount,
this.colCompleteCount,
this.colModifyCode,
this.colModifyTime});
dataGridViewCellStyle7.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle7.BackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle7.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle7.ForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle7.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle7.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle7.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.dataGridView1.DefaultCellStyle = dataGridViewCellStyle7;
this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.dataGridView1.Location = new System.Drawing.Point(0, 65);
this.dataGridView1.MultiSelect = false;
this.dataGridView1.Name = "dataGridView1";
this.dataGridView1.ReadOnly = true;
this.dataGridView1.RowHeadersVisible = false;
this.dataGridView1.RowHeadersWidth = 62;
dataGridViewCellStyle8.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.dataGridView1.RowsDefaultCellStyle = dataGridViewCellStyle8;
this.dataGridView1.RowTemplate.Height = 30;
this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dataGridView1.Size = new System.Drawing.Size(1311, 701);
this.dataGridView1.TabIndex = 22;
this.dataGridView1.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellDoubleClick);
this.dataGridView1.DataBindingComplete += new System.Windows.Forms.DataGridViewBindingCompleteEventHandler(this.dataGridView1_DataBindingComplete);
//
// tsbtnSetting
//
this.tsbtnSetting.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnSetting.Image")));
this.tsbtnSetting.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.tsbtnSetting.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnSetting.Name = "tsbtnSetting";
this.tsbtnSetting.Size = new System.Drawing.Size(140, 60);
this.tsbtnSetting.Text = "流程与配方设置";
this.tsbtnSetting.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbtnSetting.Click += new System.EventHandler(this.tsbtnSetting_Click);
//
// tsbtnClose
//
this.tsbtnClose.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnClose.Image")));
this.tsbtnClose.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.tsbtnClose.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnClose.Name = "tsbtnClose";
this.tsbtnClose.Size = new System.Drawing.Size(70, 60);
this.tsbtnClose.Text = " 关闭 ";
this.tsbtnClose.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbtnClose.Click += new System.EventHandler(this.tsbtnClose_Click);
//
// colId
//
this.colId.DataPropertyName = "Id";
this.colId.HeaderText = "Id";
this.colId.MinimumWidth = 8;
this.colId.Name = "colId";
this.colId.ReadOnly = true;
this.colId.Visible = false;
this.colId.Width = 150;
//
// colCode
//
this.colCode.DataPropertyName = "Code";
dataGridViewCellStyle2.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold);
this.colCode.DefaultCellStyle = dataGridViewCellStyle2;
this.colCode.HeaderText = "编号";
this.colCode.MinimumWidth = 8;
this.colCode.Name = "colCode";
this.colCode.ReadOnly = true;
this.colCode.Width = 150;
//
// colName
//
this.colName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
this.colName.DataPropertyName = "Name";
dataGridViewCellStyle3.BackColor = System.Drawing.Color.White;
dataGridViewCellStyle3.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.colName.DefaultCellStyle = dataGridViewCellStyle3;
this.colName.HeaderText = "名称";
this.colName.MinimumWidth = 135;
this.colName.Name = "colName";
this.colName.ReadOnly = true;
//
// colSpec
//
this.colSpec.DataPropertyName = "Spec";
this.colSpec.HeaderText = "规格";
this.colSpec.MinimumWidth = 8;
this.colSpec.Name = "colSpec";
this.colSpec.ReadOnly = true;
this.colSpec.Width = 130;
//
// colTag
//
this.colTag.DataPropertyName = "BatchId";
this.colTag.HeaderText = "批次";
this.colTag.MinimumWidth = 8;
this.colTag.Name = "colTag";
this.colTag.ReadOnly = true;
this.colTag.Width = 80;
//
// colStepName
//
this.colStepName.HeaderText = "生产流程";
this.colStepName.MinimumWidth = 8;
this.colStepName.Name = "colStepName";
this.colStepName.ReadOnly = true;
this.colStepName.Width = 150;
//
// colAssistStepName
//
this.colAssistStepName.HeaderText = "修复流程";
this.colAssistStepName.MinimumWidth = 8;
this.colAssistStepName.Name = "colAssistStepName";
this.colAssistStepName.ReadOnly = true;
this.colAssistStepName.Width = 200;
//
// colTargetCount
//
this.colTargetCount.DataPropertyName = "TargetCount";
dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
this.colTargetCount.DefaultCellStyle = dataGridViewCellStyle4;
this.colTargetCount.HeaderText = "目标数";
this.colTargetCount.MinimumWidth = 8;
this.colTargetCount.Name = "colTargetCount";
this.colTargetCount.ReadOnly = true;
this.colTargetCount.Width = 150;
//
// colCompleteCount
//
this.colCompleteCount.DataPropertyName = "CompleteCount";
dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
this.colCompleteCount.DefaultCellStyle = dataGridViewCellStyle5;
this.colCompleteCount.HeaderText = "完成数";
this.colCompleteCount.MinimumWidth = 8;
this.colCompleteCount.Name = "colCompleteCount";
this.colCompleteCount.ReadOnly = true;
this.colCompleteCount.Width = 150;
//
// colModifyCode
//
this.colModifyCode.DataPropertyName = "ModifyUserCode";
this.colModifyCode.HeaderText = "修订人";
this.colModifyCode.MinimumWidth = 8;
this.colModifyCode.Name = "colModifyCode";
this.colModifyCode.ReadOnly = true;
this.colModifyCode.Width = 150;
//
// colModifyTime
//
this.colModifyTime.DataPropertyName = "ModifyTime";
dataGridViewCellStyle6.Format = "g";
dataGridViewCellStyle6.NullValue = null;
this.colModifyTime.DefaultCellStyle = dataGridViewCellStyle6;
this.colModifyTime.HeaderText = "修订日期";
this.colModifyTime.MinimumWidth = 8;
this.colModifyTime.Name = "colModifyTime";
this.colModifyTime.ReadOnly = true;
this.colModifyTime.Width = 150;
//
// FrmProductList
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1311, 797);
this.Controls.Add(this.dataGridView1);
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.toolStrip1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FrmProductList";
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "产品管理";
this.Load += new System.EventHandler(this.FrmProductList_Load);
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripButton tsbtnSetting;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.DataGridView dataGridView1;
private System.Windows.Forms.ToolStripStatusLabel tsslCount;
private System.Windows.Forms.ToolStripButton tsbtnClose;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
private System.Windows.Forms.DataGridViewTextBoxColumn colId;
private System.Windows.Forms.DataGridViewTextBoxColumn colCode;
private System.Windows.Forms.DataGridViewTextBoxColumn colName;
private System.Windows.Forms.DataGridViewTextBoxColumn colSpec;
private System.Windows.Forms.DataGridViewTextBoxColumn colTag;
private System.Windows.Forms.DataGridViewTextBoxColumn colStepName;
private System.Windows.Forms.DataGridViewTextBoxColumn colAssistStepName;
private System.Windows.Forms.DataGridViewTextBoxColumn colTargetCount;
private System.Windows.Forms.DataGridViewTextBoxColumn colCompleteCount;
private System.Windows.Forms.DataGridViewTextBoxColumn colModifyCode;
private System.Windows.Forms.DataGridViewTextBoxColumn colModifyTime;
}
}

View File

@ -0,0 +1,130 @@
using Models;
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 AssistClient
{
public partial class FrmProductList : Form
{
Service.ProductService service = new Service.ProductService();
public Models.Product Product { get; private set; }
public FrmProductList()
{
InitializeComponent();
dataGridView1.AutoGenerateColumns = false;
}
private void initDataView()
{
Product = null;
var list = service.GetListNav();
tsslCount.Text = $"共 {list.Count} 条记录";
dataGridView1.DataSource = new BindingSource(list, null);
}
private void FrmProductList_Load(object sender, EventArgs e)
{
initDataView();
}
private void tsbtnAdd_Click(object sender, EventArgs e)
{
//FrmProductInfo frm = new FrmProductInfo();
//frm.ShowDialog();
//initDataView();
}
private void tsbtnDel_Click(object sender, EventArgs e)
{
try
{
if (this.dataGridView1.CurrentRow == null)
return;
if (MessageBox.Show($"确认删除?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
var list = ((BindingSource)dataGridView1.DataSource).DataSource as List<Product>;
int liIndex = this.dataGridView1.CurrentRow.Index;//获取当前选中行的索引
if (!service.DelNav(list[liIndex]))
throw new Exception("删除失败!");
MessageBox.Show("删除成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
initDataView();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void tsbtnSetting_Click(object sender, EventArgs e)
{
if(this.dataGridView1.CurrentRow == null) return;
var list = ((BindingSource)dataGridView1.DataSource).DataSource as List<Product>;
int liIndex = this.dataGridView1.CurrentRow.Index;//获取当前选中行的索引
FrmProductStep frm = new FrmProductStep(list[liIndex]);
frm.ShowDialog();
initDataView();
}
private void tsbtnRevise_Click(object sender, EventArgs e)
{
try
{
if (this.dataGridView1.CurrentRow == null)
throw new Exception("请选择要校正的产品!");
var list = ((BindingSource)dataGridView1.DataSource).DataSource as List<Product>;
int liIndex = this.dataGridView1.CurrentRow.Index;//获取当前选中行的索引
if (list[liIndex].ReviseStepId==null || list[liIndex].ReviseStepId<1)
throw new Exception("此产品未设置校正流程!");
if (MessageBox.Show($"确认执行校正产品流程?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
Product=list[liIndex];
this.DialogResult = DialogResult.Yes;
this.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void tsbtnClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
//if (!this.tsbtnAdd.Enabled) return;
//var list = ((BindingSource)dataGridView1.DataSource).DataSource as List<Product>;
//int liIndex = this.dataGridView1.CurrentRow.Index;//获取当前选中行的索引
//FrmProductInfo frm = new FrmProductInfo(list[liIndex]);
//frm.ShowDialog(this);
//initDataView();
}
private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
var list = ((BindingSource)dataGridView1.DataSource).DataSource as List<Product>;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if (list[i].StepInfo != null)
dataGridView1.Rows[i].Cells["colStepName"].Value = list[i].StepInfo.Name;
//if (list[i].ReviseStepInfo != null)
// dataGridView1.Rows[i].Cells["colReviseStepName"].Value = list[i].ReviseStepInfo.Name;
if (list[i].AssistStepInfo != null)
dataGridView1.Rows[i].Cells["colAssistStepName"].Value = list[i].AssistStepInfo.Name;
}
}
}
}

View File

@ -0,0 +1,465 @@
<?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="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="tsbtnSetting.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAO2SURBVFhH1ZVfSFNRHMcHQRAIPQW9BkJPPvValFQWDQ2p
QMgwNFcZpTNbq21eTFNJSpOlM/Hf1Tt3751GZi3nbOlkfzVfCoIgCPY6EAZCT6fzu/tNt7uzOWJFfeHL
vef3+5zf75z7V/NfipM+F1mk9SNJm8TgIUz9HbXK4S7OuUaSNjkDP+ii9mL6z4qTQgcNzlA8dQHgVmek
DpHCCC4rNxOuUO/MIkf6aDNoqPb3S5K0BzFFMH4gfjqAw/wFzWmjKDWxyL5NsxzhW8VInUkOuRMxtiFv
FsMVFjGipeMxoxyJ0WOUE9eLsfTuguZmIRw1S2FSMNN6eS/C5AgNmcQQKbSN9sBXbJFbD+1B7QNHkBTa
RkdAwBa5BQ+dkQ/GjNN0Esujwa37036ZnuuSVsY0vs0wbKAbwxa7yzAVcBmEAGF4toW+hoilCeKQV/EJ
84FY3t8JTvIWtYz54/em/CTVLZP+IURyCjj13DsTvs370tp+RLLr3uTqYT3vk+9OrpJUN/PLG6wd6Kf8
JXi6LeCAV9e4y/s6EMmUfvRjSeP4iqCf8BGWm8ZXLiKqqGnc13hj2L0FOTjCGFOKgFfXADdN+Naaed9p
xHYEzakJyw2D3p960b8PUaU4i0tdJPC64YUtFqd4bKUP0YRujywLt0eXCcsNo94viCmirJvFQRwRRTCP
yYFpP8QSahjxCrdGPpIs/oaYopsjH/wMhkAcEUU09k3NJA39EEvoxrC37+awlzBtpbfg6c4toKyRxUEc
EQ3wMI/FKX6pWgCo3vZBe33Qs3H95RLJtKcSMfjD7a0fWnKn5mEMcUQ0wKfm0+0R6m3ujLdnW9cGPV31
Ng9JM12Y+lerG1o8es22qIMjhhQBB3xGDZtbrh1YOoxYdtGC+2sG5uN1A4sk1bVWd14fIuDUc6Feg9Vb
hEhuwaWsti7Err5YIJl+P1tjnWd+iiEOefa8BRdiu+tyv0t7pd9FsvrJfLy63yVXP3+n2zYdQ5zJU1f3
v45d4naekZyq6n0jVPW+JQX3s/n8/oaVPXNfL/bMkUL7Qs/cALbIrfLO18Xnu2ej57tfkcJ5Ngp1scXu
Ku8Ui8s4Z1Tb4YxpO2Re+2imQtsxU0nPl2iMZHW77D7X7qxT5nDOTYhBHaiHpfPX2cfiAfW7D+MznP37
mTaJqF3W5kj7wcBDd7ZNrCzjfqN5Lp3kpnWnOAdJs2EsfpyTmK9nwQU7O2YRoqUWO0n6hNnehem/o2Mm
/lCpRTiSNN19fl+5f08azS+K0ESo4Q9F+gAAAABJRU5ErkJggg==
</value>
</data>
<data name="tsbtnClose.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAJQSURBVFhHxZfNctNAEIQFb0UuYEu8DFwoiOwrVPGbFPAE
vKhjV9huzSiz69aubA501XfwuGdms7ORtV3S8/9M/qHQs0T8/l9ArVKIzwbqMA4vj2P/5rDb3FgIcs+1
UIfb/sVx//rtw4f+lYUoGLi609j/ftwPj85p139B3FQWXQuFWnnt4Y99NZmwqmiYjfvhK12TyuItKNRQ
tR/G7Qbf03jcbd8pE7hyJ6jyL4+gJzw0Yz7K5JxuL9oJCjmqloOe8CFhOgOV1YLTuP0Gn6ls6lDwqhpO
3NU8cWFeTkr8blYoNn6qkTwq1ynOlSxQ3wm9CKrZ/Pw8zQXyQq2dGIcfZp2FmPI6C/9RWfM5CDXnOPb3
ZsUz5F55nMr5yT5EqPY8+49AfecsjGzuUwYiVGsRNRrN2UMFI1RrvorinKjaQAZLqLTV1TlH4LU0SNV0
ZFBBteYN4DE7pGpFZFBBpZl+Uk0j8JgdUrUiMlhCpZ/QX6qhAl5Lg1RNRwYj1CXNnZWLkEGHSjPNXlQu
AblWBpI9VBBQreaYd+tcNBZxFmAQSv/HP1VBJ25xa0SoZVYo6xU/MAClVdef7fl8qeYi9LNBNN8Nd6qA
s7ClVHtkw51ZIeYVBVo/qfV5Qs1FpB5mpZA4vZLt+88qwUmJS3OMUPCqGg56mXVKOrzf3CijkxLWPtsB
hRxVy0FP+JhQfy0/m9saqNp5yl7LKxeTNT+pS1BL58qvaE/GdF2KhvSaNc8pqSy+Fgq1strF1Ww24rqE
C6TPxxQLXgOFmryc2pWs67ruL9BDjecFstIGAAAAAElFTkSuQmCC
</value>
</data>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>498, 17</value>
</metadata>
<metadata name="colId.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colCode.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colSpec.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colTag.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colStepName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colAssistStepName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colTargetCount.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colCompleteCount.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colModifyCode.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colModifyTime.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAQAEBAAAAEACABoBQAARgAAACAgAAABAAgAqAgAAK4FAAAwMAAAAQAIAKgOAABWDgAAAAAAAAEA
IACHIAAA/hwAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAABELAAARCwAAAAEAAAABAABaUD0AWlE9AF5V
QABiWEIAYlhEAGtgSQB9cFYAjIJuAI2DbwAZp10AGaldABy6aAAevGoAL755AC/AdwAxwHkANdSFADfW
hwA11ooAN9aKADrZigCCdVoAiHteAIR4YQCHjGcAnY1tAJ6ObgCSiXYAkol6AJWMeQCVjHoAlox6AJCS
bgCfkHAAoI1tAKCObgCjkHAAopByAKKScgCmnIYAqZ+JAKqcigCqn4oA++OxAPvjsgD747MA++S1AP3l
sQD95bMA/+WzAP3ltgD/5bYA++a6AP/oswD/6LYA/+u2AP/swgD+8dIA/vTZAP723gD+9t8A//XhAP75
4QD/+OAA//nhAP/45ABIPy4AUUIxAEs/MQBNRDQAS0UxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARwQEBAQE
BAQEBAQEBAQER0cFHx4cHigpJygeBx4eB0dHR0dHRwECBQUCAUdHR0dHR0dHRkRGAQQEAUZERERHR0dH
FxglISIZGhoaISUGR0dHRyAxCTYxMjEyMjE1GUdHR0cgPQsJNjEsLC4uMRlHRwoKCQkLCwo1MS4uLC8h
R0cJDAsLCwsLCi8sLC41GkdHDxQSEhMTEQ45LCwsNRpHRw0ODg4QEA1AQTouLDUaR0dHRyBAEA5BPT1B
OzQxGkdHR0cgQA5AOzs7O0BAOBlHR0dHFiAlIhkZGRkZIiUVR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR4ABAACAAQAA+B8AAOADAADAAwAAwAMAAMADAAAAAwAAAAMAAAADAAAAAwAAwAMAAMAD
AADAAwAA//8AAP//AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAEAAAAAAAAAAAAAAABAAAAAQAAWVA/AFlT
PwBaUT4AY1lDAGRaRABkXEQAZFxEAHdrUwBhV0EAYVpEAGRaRABkWkQAZlxGAHZqUQB3a1EAd2tSAHdr
VAB3blQAemtRAHpqUwB6a1QAeW1UAHpuVAB6blYAc2hQAHltUwBhV0EAZFpEAGRXRABmV0YAZFpEABa6
ZQAZumgAGbxoABy6aAAcvGgAHLxqAB68aAAevGoAIL9qACm9bgAtvm8AML9wADW/cgA11IcANdSFADXW
hwAkwnEAOcF2AD7EfABRjVwARL98ACnUggAv1oUAMNSFADHUhgAy1IYAM9SHADLWhQA11IUANdWHADXW
hQA11ocAN9aFADfWhwA31YgAVNCMAGHcmwCbqnwAp52IAKqgiwCf3JsAnd6uAKDergCv6rsAtezBALzt
xADGs4sAybaLAMm2jgDMto4AybqXAN3gqADi4aoA5uKsAOrjrQDu464A++OvAPLmtgD747EA++S0AP3j
sQD947MA/uOyAP3lsQD95bMA/+WxAP/msgD75roA++a7AP3nuQD/6LMA/+m1AP/otgD/67YA/+u5AMLu
xwDH78kAze/MANXwzgD268IA++nEAPvqxQD/8M0A/vLVAP7z1QD/89kA/vPdAP/02gD+9d4A/vbeAP/1
4QD+9uAA//bgAP734gD+9+MA//XkAP/15wD/+eMA//jkAP/45wD/+uYA//vnAGZaRABpXkgAZ11HAGRc
RAAcumgAHLpoABy/agCyqJQArqSQALuxnQC7sZ0Abl9FALqwnAC6sJ8ArqSQAHBkSgB1alMAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJaW
lpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpYYCggICAgLCwsLCwsMDAgKCgkLCwsLCwsKCwoD
lpaWlhcVFxcVFQ8PDw8PDw8VFxcXFw8PFxYPDw8VDxeWlpaWlkZGRkZGRUVFRUVFRUVGRkZGRUaWRkVF
RUVGlpaWlpaWjZSTk42TjI6Ojo6OjZWWkJSUlpaNk5OTk42WlpaWlpaWlpaWlpaWBAUGBgYFBgYMBQYA
lpaWlpaWlpaWlpaWlpaWlpaWlpaIhwcXDw8NFxcEiIiWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlQICAggJ
DZaWlpaWlpaWlpaWlpaWlpaWiAaFGhoaGhocAgECAQEBHBwcHBwcHIWFlpaWlpaWlpZETU1FT01NTU1N
TU1NTU1NTU1NTU1NUQ2WlpaWlpaWlhN+cSdSZl9fX19ZZmFZX1lZYVlmYWFoCpaWlpaWlpaWDX19HyhT
X19hWWFZWWVhWWVZYVlhV2gIlpaWlpaWlpYPhH8iIilUZllhWWFhV2FXWWFXYVllaAiWlpaWlpaWlg+C
giMiIjBUZmFhWVdlWWVlV2VZYVdoCJaWlpaJiYmLMkhIIyckIjBWZVdlYVlhV1dhWWVXZWgIlpaWlick
JCQkIiAkJCQjHzBYYVdZYVlhZVdhV2FXaAiWlpaWIiIiIiIiIiIiIiIiIjFuXWFhWWFhV2VXZVloCJaW
lpYvLy8vLy8vLy8vLy8vL0J0WVlhWVllV2FXYWgIlpaWlkBAQEBAQEBAPz9AQEBAbXt3Y11hYVdhV2Fh
aAiWlpaWQEBAQEA7Ozs/Pz9AQGyCe3t9b1lXYVllWWFoCJaWlpYsLS0uM0NDOztAQDlre357d359c1pZ
YVdXYWgIlpaWlpaWlpYShIA6QDo5an17fnt+d3t9e2NZYWFZaAiWlpaWlpaWlg6EezpANUx9e3t3fnd+
fn19e29XWWFoCJaWlpaWlpaWDoSANTpLfXt+fn53fnd+e3t7gHNdXWgIlpaWlpaWlpYRgHs0Sn50d3d3
d3d3d3R3d3d3d3ZkaQiWlpaWlpaWlhNhXUddV1dXV1dXV1lXV1dXV1dXWVdmCJaWlpaWlpaWGRcQFA8P
EBAQEBQNEBAQEBAQEA8QEBcYlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaW
lpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaW
lpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaW
lpb/////wAAAA8AAAAPgAAIH4ABGB//AA///wAP///Af//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADwAA
AA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//////////////
/////////////ygAAAAwAAAAYAAAAAEACAAAAAAAAAkAAAAAAAAAAAAAAAEAAAABAABORjYAZlxGAGNZ
QwBkXEQAYVdDAGRaRABmWkQAZFxEAGZcRQBmXEYAaF5HAGZcRgBmXEYAa2BJAHltUwB6blQAe29VAHxu
VAB8cFYAf3NZAE5GNgBkXEQAa2FKAB66agBmXEYAd2tSAHltUwBmXEYAZlxGAGZcRwCupJAArqSQALGk
kACdknwAnZV8ABO6aAAXumgAGbppABq6aQAbu2oAGbxqABy6aAAeumgAHrtqABy8aAAcvGoAHrxqACC8
awAivG0AJb5wACm/cgA6o2MAKcBxAEyzdgBSuHoAQMN7AB68agAcvGoANdSFADfWhwA11ocALdSFADHU
hgAy1IYAMtaFADXUhQA01IcANdSHADXWhQA11ocAN9aFADfWhwA11YgAN9WJADrVigA81osAP9aMAELX
jQBG2Y8AVtmUAGLNiwBnzpAAeuClAIZ5XACNgWkAkYNlAJaHaACSk28AqJh1AKqadwCtnXoAoqB7AK+g
fACxoHwAs6F9ALWjfwCupJAArqSUAK6kkACvpZEArqSUALKokQCyqJQApJmEAKechwC4o4IAvKqEAL2x
mAC9sJsAvbKbAL21ngCJ0I4Ai9GVAJXdnQCd05MAjtilAJjksQCb5bQApdeYAKvZmgCz2p0AudufAK7e
oAC/3KEAteq8ALvtxADAsJsAyN2jANLepQDX4q8A3ee9APvjsQD747IA++OzAPvltwD947EA/eOyAP3l
sQD95bMA/+WzAP3mtgD75bgA/+W5AP/oswD96LYA/+i2AP/puQDB7scAx+/JAM3vzADV8M4A3fHQAOLs
zwDh7NQA4fLSAOby1ADq89YA6PTVAPvowAD76MEA/evEAP7x0AD+8dEA/vHSAP7y0gD/8tUA//PVAP7z
2wD+9NsA/vXbAP713AD/9d4A/vbeAP/23gD/9eEA/vfhAP734wD/9eQA//jkAHpuVACup5AAd2hOAHVp
TwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3GAwMDAMMDAwMBAQMDAMDAwMDAwMDBAwMDAMK
AwMEAwMDAwMDAwMDDAwAt7e3t7e3Dg0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0ODQ0NDQ0NDQ0N
DQ0Kt7e3t7e3U1NTDw8PDw8PHlNTUw8PDx9THxMTEx4PD1NTEh9TVw8PDw8PDw8PDxITt7e3t7e3tyB/
Z2dnZ2dnZ2d/aGdnaGhsaGhoZ2doZ25oaGhotyFoZ2dnZ2hnaCC1t7e3t7e3t7UeVGIeHmIeACIfZyFT
Zx4eZ2JiZxRnU7RiYlQCt7RiYiBiYiBiYrS3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3GwAZGBgYGBgYGBgYGBgYGQAbt7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3DB0NCggKCAoKCAgICAgKCQAMt7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3tFMTEhISEhISExKzt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
txsEBAQEBAQEBBu3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3txQAAAAAAAAAABS3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3FQUFBQUFBQUJCQgJCAgJCAkJBQUFBQUFCg0FBQUFBQUFBQUV
t7e3t7e3t7e3t7e3ElRZWVdaWVhYWFhYWFhYWFhYWFhYWFhZWFhYWFhYWVlYWVMHt7e3t7e3t7e3t7e3
E26mkm9ykYmJioqKioqKioqKioqKioqKioqKioqKioqKil4Ft7e3t7e3t7e3t7e3Em2vrXAjdpGKiYmJ
iYmJiYmJiYmJiYmJiYmJiYmJiYmJklwFt7e3t7e3t7e3t7e3DmyxsnMoJHeRiomJiYmJiYmJiYmJiYmJ
iYmJiYmJiYmJilwFt7e3t7e3t7e3t7e3Em2xsXMoLiR4kYWKiYmJiYmJiYmJiYmJiYmJiYmJiYmKkl0F
t7e3t7e3t7e3t7e3D2yxsXMoLiwkeZCKioqJiYmJiYmJiYmJiYmJiYmJiYmKkFoFt7e3t7e3t7e3t7e3
EmyxsXMoLi4kLn+KiomJiYmJiYmJiYmJiYmJiYmJiYmJkF0Ft7e3t7e3t7e3t7e3Dn6ysnMuLi4uKSl/
kYqJiYmJiYmJiYmJiYmJiYmJiYmJkF0Ft7e3t7e3OBcXFxc5MzZRUTcuLi4uLiwwgJGJiYmJiYmJiYmJ
iYmJiYmJiYmJkF0Kt7e3t7e3KS8uLi4uLi4oKSkuLi4uLi4sMIGJiYmJiYmJiYmJiYmJiYmJiYmJkGgK
t7e3t7e3Ly4uLi4uLi4uLi4uLi4uLi4uKTGCioiJiYmJiYmJiYmJiYmJiYmJkFwFt7e3t7e3KS4uLi4u
Li4uLi4uLi4uLi4uLik0mYqIiYmJiYmJiYmJiYmJiYmJkFwFt7e3t7e3KSkpKSkpKSkpKSkpKSkuLCkp
KSkpNJmghImJiYmJiYmJiYmJiYmJkFwFt7e3t7e3RkZKREZKRERGRkZKRkpEREpGRkpETpyypISIiYmJ
iYmJiYmJiYmJkFwFt7e3t7e3QkZGRkZGRkZGRkZGRkZGREZGRkJNnLKusq2NiYmJiYmJiYmJiYmJkFwF
t7e3t7e3RERGRkZGRkZGRkZGRkZGRkZGREubsq6urq+vn4iJiYmJiYmJiYmJkFwFt7e3t7e3SUZGRkZE
SURBQkJGRkZGRkRES5qyrq6urq6ysaSEiImJiYmJiYmJkFwJt7e3t7e3Ojs7Ozs8NVBSUk9ERkZGRkRK
l7Gurq6urq6urrKojYmJiYmJiYmJkFwJt7e3t7e3t7e3t7e3EWyysnVERkZGREmWsq6urq6urq6urq6y
r5+DiYmJiYmJkVwFt7e3t7e3t7e3t7e3D2yxsXVERkZESZWyrq6urq6urq6urq6usrGhhIOJiYmJkVwF
t7e3t7e3t7e3t7e3EmyxsXVERERClLGurq6urq6urq6urq6urq6vqIWJiYmKkFwFt7e3t7e3t7e3t7e3
Dm2xsXVERECTsa6urq6urq6urq6urq6urq6usq6fiYmKkFwFt7e3t7e3t7e3t7e3Dm2ysnVAQH2yrq6u
rq6urq6urq6urq6urq6urq6yoYSIilwFt7e3t7e3t7e3t7e3EmutrXQ9fK2nqKenp6enp62np6enp6en
p6etp6etraaKklwFt7e3t7e3t7e3t7e3EmqRkXF6ioqKioqKioqKiomJioqKioqKioqKioqKioqFkV4F
t7e3t7e3t7e3t7e3DlZfX1tpX15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eaVUFt7e3t7e3t7e3t7e3
Gg4SDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8ODhIODhIOEhIZt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3////////AAD///////8AAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAPAA
AABABwAA8AAAAEAPAAD///////8AAP/+AAB//wAA//4AAH//AAD//8AD//8AAP//4Af//wAA///gB///
AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwA
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
wsOQABCEh/n/kzJOKq1u/QcAAAAASUVORK5CYII=
</value>
</data>
</root>

View File

@ -0,0 +1,356 @@
namespace AssistClient
{
partial class FrmProductStep
{
/// <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(FrmProductStep));
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.tsbtnSave = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
this.tsbtnCls = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.tsbtnClose = new System.Windows.Forms.ToolStripButton();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.tsslCount = new System.Windows.Forms.ToolStripStatusLabel();
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.cobStepList = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.dataGridView1 = new System.Windows.Forms.DataGridView();
this.colProcessCode = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colName = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colProdctPrivate = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colSetParams = new System.Windows.Forms.DataGridViewButtonColumn();
this.colStepProcessParams = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colPrivateProcessParams = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.toolStrip1.SuspendLayout();
this.statusStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
this.groupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
this.SuspendLayout();
//
// toolStrip1
//
this.toolStrip1.BackColor = System.Drawing.SystemColors.GradientInactiveCaption;
this.toolStrip1.ImageScalingSize = new System.Drawing.Size(32, 32);
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tsbtnSave,
this.toolStripSeparator4,
this.tsbtnCls,
this.toolStripSeparator1,
this.tsbtnClose});
this.toolStrip1.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.HorizontalStackWithOverflow;
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Padding = new System.Windows.Forms.Padding(0, 0, 3, 0);
this.toolStrip1.Size = new System.Drawing.Size(562, 65);
this.toolStrip1.TabIndex = 17;
this.toolStrip1.Text = "toolStrip1";
//
// tsbtnSave
//
this.tsbtnSave.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnSave.Image")));
this.tsbtnSave.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.tsbtnSave.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnSave.Name = "tsbtnSave";
this.tsbtnSave.Size = new System.Drawing.Size(70, 60);
this.tsbtnSave.Text = " 保存 ";
this.tsbtnSave.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbtnSave.Click += new System.EventHandler(this.tsbtnSave_Click);
//
// toolStripSeparator4
//
this.toolStripSeparator4.Name = "toolStripSeparator4";
this.toolStripSeparator4.Size = new System.Drawing.Size(6, 65);
//
// tsbtnCls
//
this.tsbtnCls.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnCls.Image")));
this.tsbtnCls.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.tsbtnCls.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnCls.Name = "tsbtnCls";
this.tsbtnCls.Size = new System.Drawing.Size(70, 60);
this.tsbtnCls.Text = " 清除 ";
this.tsbtnCls.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbtnCls.ToolTipText = "清除产品私有配方";
this.tsbtnCls.Click += new System.EventHandler(this.tsbtnCls_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(6, 65);
//
// tsbtnClose
//
this.tsbtnClose.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnClose.Image")));
this.tsbtnClose.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.tsbtnClose.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnClose.Name = "tsbtnClose";
this.tsbtnClose.Size = new System.Drawing.Size(70, 60);
this.tsbtnClose.Text = " 关闭 ";
this.tsbtnClose.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbtnClose.Click += new System.EventHandler(this.tsbtnClose_Click);
//
// statusStrip1
//
this.statusStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tsslCount});
this.statusStrip1.Location = new System.Drawing.Point(0, 761);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Padding = new System.Windows.Forms.Padding(2, 0, 14, 0);
this.statusStrip1.Size = new System.Drawing.Size(562, 31);
this.statusStrip1.TabIndex = 24;
this.statusStrip1.Text = "statusStrip1";
//
// tsslCount
//
this.tsslCount.Name = "tsslCount";
this.tsslCount.Size = new System.Drawing.Size(33, 24);
this.tsslCount.Text = "共 ";
//
// splitContainer1
//
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.Location = new System.Drawing.Point(0, 65);
this.splitContainer1.Name = "splitContainer1";
this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.BackColor = System.Drawing.SystemColors.ActiveCaption;
this.splitContainer1.Panel1.Controls.Add(this.cobStepList);
this.splitContainer1.Panel1.Controls.Add(this.label1);
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.groupBox1);
this.splitContainer1.Size = new System.Drawing.Size(562, 696);
this.splitContainer1.SplitterDistance = 57;
this.splitContainer1.TabIndex = 25;
//
// cobStepList
//
this.cobStepList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cobStepList.FlatStyle = System.Windows.Forms.FlatStyle.Popup;
this.cobStepList.FormattingEnabled = true;
this.cobStepList.Location = new System.Drawing.Point(128, 15);
this.cobStepList.Name = "cobStepList";
this.cobStepList.Size = new System.Drawing.Size(336, 26);
this.cobStepList.TabIndex = 1;
this.cobStepList.SelectedIndexChanged += new System.EventHandler(this.cobStepList_SelectedIndexChanged);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(43, 21);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(80, 18);
this.label1.TabIndex = 0;
this.label1.Text = "选择流程";
//
// groupBox1
//
this.groupBox1.BackColor = System.Drawing.SystemColors.ActiveCaption;
this.groupBox1.Controls.Add(this.dataGridView1);
this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox1.Location = new System.Drawing.Point(0, 0);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(562, 635);
this.groupBox1.TabIndex = 15;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "配方设置";
//
// dataGridView1
//
this.dataGridView1.AllowUserToAddRows = false;
this.dataGridView1.AllowUserToDeleteRows = false;
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.dataGridView1.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.colProcessCode,
this.colName,
this.colProdctPrivate,
this.colSetParams,
this.colStepProcessParams,
this.colPrivateProcessParams});
dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle3.BackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle3.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle3.ForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle3.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle3.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.dataGridView1.DefaultCellStyle = dataGridViewCellStyle3;
this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.dataGridView1.Location = new System.Drawing.Point(3, 24);
this.dataGridView1.MultiSelect = false;
this.dataGridView1.Name = "dataGridView1";
this.dataGridView1.ReadOnly = true;
this.dataGridView1.RowHeadersVisible = false;
this.dataGridView1.RowHeadersWidth = 62;
dataGridViewCellStyle4.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.dataGridView1.RowsDefaultCellStyle = dataGridViewCellStyle4;
this.dataGridView1.RowTemplate.Height = 30;
this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dataGridView1.Size = new System.Drawing.Size(556, 608);
this.dataGridView1.TabIndex = 4;
this.dataGridView1.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellContentClick);
this.dataGridView1.DataBindingComplete += new System.Windows.Forms.DataGridViewBindingCompleteEventHandler(this.dataGridView1_DataBindingComplete);
//
// colProcessCode
//
this.colProcessCode.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None;
this.colProcessCode.DataPropertyName = "ProcessCode";
dataGridViewCellStyle2.BackColor = System.Drawing.Color.White;
dataGridViewCellStyle2.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.colProcessCode.DefaultCellStyle = dataGridViewCellStyle2;
this.colProcessCode.HeaderText = "code";
this.colProcessCode.MinimumWidth = 8;
this.colProcessCode.Name = "colProcessCode";
this.colProcessCode.ReadOnly = true;
this.colProcessCode.Visible = false;
this.colProcessCode.Width = 286;
//
// colName
//
this.colName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
this.colName.DataPropertyName = "ProcessName";
this.colName.HeaderText = "工序名称";
this.colName.MinimumWidth = 8;
this.colName.Name = "colName";
this.colName.ReadOnly = true;
//
// colProdctPrivate
//
this.colProdctPrivate.HeaderText = "私有";
this.colProdctPrivate.MinimumWidth = 20;
this.colProdctPrivate.Name = "colProdctPrivate";
this.colProdctPrivate.ReadOnly = true;
this.colProdctPrivate.Width = 70;
//
// colSetParams
//
this.colSetParams.HeaderText = "配方";
this.colSetParams.MinimumWidth = 8;
this.colSetParams.Name = "colSetParams";
this.colSetParams.ReadOnly = true;
this.colSetParams.Text = "设置";
this.colSetParams.UseColumnTextForButtonValue = true;
this.colSetParams.Width = 150;
//
// colStepProcessParams
//
this.colStepProcessParams.DataPropertyName = "ProcessParams";
this.colStepProcessParams.HeaderText = "ProcessP";
this.colStepProcessParams.MinimumWidth = 8;
this.colStepProcessParams.Name = "colStepProcessParams";
this.colStepProcessParams.ReadOnly = true;
this.colStepProcessParams.Visible = false;
this.colStepProcessParams.Width = 150;
//
// colPrivateProcessParams
//
this.colPrivateProcessParams.HeaderText = "ProductP";
this.colPrivateProcessParams.MinimumWidth = 8;
this.colPrivateProcessParams.Name = "colPrivateProcessParams";
this.colPrivateProcessParams.ReadOnly = true;
this.colPrivateProcessParams.Visible = false;
this.colPrivateProcessParams.Width = 150;
//
// FrmProductStep
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(562, 792);
this.Controls.Add(this.splitContainer1);
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.toolStrip1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "FrmProductStep";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "修复流程与配方设置";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmProductStep_FormClosing);
this.Load += new System.EventHandler(this.FrmProductInfo_Load);
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel1.PerformLayout();
this.splitContainer1.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false);
this.groupBox1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
private System.Windows.Forms.ToolStripButton tsbtnClose;
private System.Windows.Forms.ToolStripButton tsbtnSave;
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel tsslCount;
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.ComboBox cobStepList;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.DataGridView dataGridView1;
private System.Windows.Forms.ToolStripButton tsbtnCls;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.DataGridViewTextBoxColumn colProcessCode;
private System.Windows.Forms.DataGridViewTextBoxColumn colName;
private System.Windows.Forms.DataGridViewTextBoxColumn colProdctPrivate;
private System.Windows.Forms.DataGridViewButtonColumn colSetParams;
private System.Windows.Forms.DataGridViewTextBoxColumn colStepProcessParams;
private System.Windows.Forms.DataGridViewTextBoxColumn colPrivateProcessParams;
}
}

View File

@ -0,0 +1,221 @@
using Models;
using Newtonsoft.Json;
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 AssistClient
{
public partial class FrmProductStep : Form
{
Service.ProductService service = new Service.ProductService();
Models.Product model = new Models.Product();
private int? assistStepId;// stepId, reviseStepId;
/// <summary>
/// 产品配方 <StepId,List<Models.ProductProcess>>
/// </summary>
Dictionary<int, List<Models.ProductProcess>> dicProductProcess = new Dictionary<int, List<Models.ProductProcess>>();
public FrmProductStep(Models.Product m)
{
InitializeComponent();
dataGridView1.AutoGenerateColumns = false;
//显示行号与列宽度自动调整
dataGridView1.RowHeadersVisible = true;
dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
dataGridView1.RowPostPaint += (sender, e) =>
{
Utils.Util.showRowNum_onDataGrid_RowPostPaint(this.dataGridView1, sender, e);
};
model = m;
initDataView();
}
private void initDataView()
{
//显示的数据
this.cobStepList.DisplayMember = "Name";
this.cobStepList.ValueMember = "Id";
var list = service.GetStepList(1);
foreach (var item in list)
dicProductProcess.Add(item.Id, new List<Models.ProductProcess>());
if (model.AssistStepId != null)
{
this.assistStepId = (int)model.AssistStepId;
dicProductProcess[(int)model.AssistStepId] = cv2ProductProcess(model.ProductAssistProcessList);
}
this.cobStepList.DataSource = list;
if (model.StepId != null)
this.cobStepList.SelectedValue = (int)model.StepId;
}
private List<ProductProcess> cv2ProductProcess(List<ProductAssistProcess> list)
{
List<ProductProcess> result=new List<ProductProcess>();
foreach (var item in list)
result.Add(item);
return result;
}
private List<ProductAssistProcess> cv2ProductAssistProcess(List<ProductProcess> list)
{
string json;
List<ProductAssistProcess> result = new List<ProductAssistProcess>();
foreach (var item in list)
{
json=JsonConvert.SerializeObject(item);
result.Add(JsonConvert.DeserializeObject<ProductAssistProcess>(json));
}
return result;
}
private void FrmProductInfo_Load(object sender, EventArgs e)
{
}
private void cobStepList_SelectedIndexChanged(object sender, EventArgs e)
{
var list = this.cobStepList.DataSource as List<Models.Step>;
int liIndex=this.cobStepList.SelectedIndex;
if (liIndex < 0)
return;
dataGridView1.DataSource = new BindingSource(list[liIndex].ProcessList, null);
tsslCount.Text = $"共{list[liIndex].ProcessList.Count}条工序";
this.assistStepId = (int)this.cobStepList.SelectedValue;
}
private void tsbtnSave_Click(object sender, EventArgs e)
{
try
{
if (assistStepId == null)
throw new Exception("请设置产品流程!");
model.AssistStepId = assistStepId;
model.ProductAssistProcessList = cv2ProductAssistProcess(dicProductProcess[(int)assistStepId]);
//model.ModifyUserCode = Config.loginUser.Code;
//model.ModifyTime = DateTime.Now;
bool result = service.UpdateNav(model);
if (!result)
throw new Exception("保存失败!");
MessageBox.Show("保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void tsbtnCls_Click(object sender, EventArgs e)
{
try
{
if (this.dataGridView1.CurrentRow == null)
throw new Exception("请选择要清除私有产品配方的工序!");
if(this.dataGridView1.CurrentRow.Cells["colPrivateProcessParams"].Value.ToString() == "")
throw new Exception("此工序未配置私有配方,无需清除!");
//
int liNewStepId = (int)this.cobStepList.SelectedValue;
string processCode= this.dataGridView1.CurrentRow.Cells[0].Value.ToString();
var m = dicProductProcess[liNewStepId].Find(x => x.ProcessCode == processCode);
if (m != null)
{
dicProductProcess[liNewStepId].Remove(m);
this.dataGridView1.CurrentRow.Cells["colProdctPrivate"].Value = "";
this.dataGridView1.CurrentRow.Cells["colPrivateProcessParams"].Value = "";
MessageBox.Show("清除成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void tsbtnClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
if (this.cobStepList.SelectedValue == null)
return;
int liNewStepId = (int)this.cobStepList.SelectedValue;
string processCode;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
processCode = dataGridView1.Rows[i].Cells[0].Value.ToString();
//dataGridView1.Rows[i].Cells[1].Value = Config.dicDevType[processCode];
var m= dicProductProcess[liNewStepId].Find(x=>x.ProcessCode==processCode);
if (m != null)
{
dataGridView1.Rows[i].Cells["colProdctPrivate"].Value = "是";
dataGridView1.Rows[i].Cells["colPrivateProcessParams"].Value = m.ProcessParams;
}
else
{
dataGridView1.Rows[i].Cells["colProdctPrivate"].Value = "";
dataGridView1.Rows[i].Cells["colPrivateProcessParams"].Value = "";
}
}
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
int liNewStepId = (int)this.cobStepList.SelectedValue;
int Index = this.dataGridView1.CurrentRow.Index;//获取当前选中行的索引
if (Index < this.dataGridView1.Rows.Count && this.dataGridView1.CurrentCell.Value.ToString() == "设置")
{
string processCode = this.dataGridView1.Rows[Index].Cells["colProcessCode"].Value.ToString();
string processParams = "";
if (this.dataGridView1.Rows[Index].Cells["colPrivateProcessParams"].Value != null && this.dataGridView1.Rows[Index].Cells["colPrivateProcessParams"].Value.ToString()!="")
processParams = this.dataGridView1.Rows[Index].Cells["colPrivateProcessParams"].Value.ToString();
else if (this.dataGridView1.Rows[Index].Cells["colStepProcessParams"].Value != null && this.dataGridView1.Rows[Index].Cells["colStepProcessParams"].Value.ToString()!="")
processParams = this.dataGridView1.Rows[Index].Cells["colStepProcessParams"].Value.ToString();
FrmSetParams frm = new FrmSetParams(processCode, processParams);
if (frm.ShowDialog() == DialogResult.OK)
{
this.dataGridView1.Rows[Index].Cells["colProdctPrivate"].Value = "是";
this.dataGridView1.Rows[Index].Cells["colPrivateProcessParams"].Value = frm.ParamsData;
var m = dicProductProcess[liNewStepId].Find(x => x.ProcessCode == processCode);
if (m == null)
dicProductProcess[liNewStepId].Add(new Models.ProductProcess()
{
Pid = model.Id,
ProcessCode = processCode,
ProcessParams = frm.ParamsData,
ModifyUserCode=Config.loginUser.Code,
CreateUserCode = Config.loginUser.Code,
});
else
{
m.ProcessParams = frm.ParamsData;
m.ModifyUserCode = Config.loginUser.Code;
}
}
}
}
private void FrmProductStep_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show($"确认修改已保存,是否退出?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
{
e.Cancel = true;
return;
}
}
}
}

View File

@ -0,0 +1,189 @@
<?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="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="tsbtnSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAIcSURBVFhH7ZdNaxNBGMefIpQKlkK/QLFiL4I3Wyx9uYhJ
P0COZtt52Z1ntYfiN+hN9KL4AXzDFgS/gDepR2uhB4+9Fc+W0oqofWaYbHaaSbKzWYRA/vBjk5l5/vvP
7LObBEbyaAzidIWol0aoGoj0lvULUKMxDjz5BBL/VYLAbetcUBLvdJgMzj3rXkBCLWeFHI/oE7wBmbwN
R70Ght+NzzoeQxxP2TP0UZwuZQEEvrKj5STUk8xLqg92tI/yAaR6b0fLSaoXbS/jF9mZHsoH4LhjR4uL
4wbtXGxeC3zuBGjiKbB0xsx11SABtrauUt1fU6sl8Fnm1YIlX2hmzMx7NUgAxiap7idxZt4L9TTzclCP
zbxXTg/gOztaTGl6DZrsj6nVcprQ4aOZ98oN0GNhF5nb1javxJc5rzY9d9YNoLdz0c6EieNtqv2R82oT
EECjm+qQ2KcHzLf+0DqBBxCx37a+k8AA1TOcASJ2UorWXZEnKIA2kWoNOJ8uRZLcJJ89xzNsB6ixBpXE
1PEMvAS/qKs3QaYLwfBknvzq2ddyi+FswioJDHBGl6AJ4uGcaSh9LIpeH8d3gauvjuf/b0KFjmfwDkj1
AKS8ARs4a46X0eM+xKPrVE8/cs0jumCA/I9SF/2dEIbvIWRQu/ZsHulbx1tUJb0CRNEELfrcWVQRTXZO
u1yzZ+uiRuMKLV6lfvD/7SqLxPumL0ZyBHABC1BmYPLlTLYAAAAASUVORK5CYII=
</value>
</data>
<data name="tsbtnCls.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAGSSURBVFhH7dTdK4NhGMfx/QUM81pS8vIfiCQtL1lpJQcc
SKFma9uzNRpLSikHThxISCLGrGlZHMgi5LX2R3gNEaWUkn62XBxM9563ew7kW59Wz3Pf17V2MM1/vIJQ
HIFQitgnPfq93q0liEevkt9bdxFY6Ejyeu0shBg6yr+XtgJIRVf49dySD7noqvqemvKgFI1Q3qMxF2rR
KPk9NOaAFxopvQH/KdY9TtwbsvloyJL+Z+VZOcGXUJ8Dd/WZXND4xPX7jhFvzS3gtlanTo1O/BdwLx2B
Jdhjx40+QzFawa7Xewgxqy4brqvTZaMV7FwLB5Aq4LTiqipNMlrBzjG/D7n8ggWXlVpRtIKdfW4PSvls
FlxUaJloBTvr7G4kCmosW804L0/9gVYkzjyzAx68FhPOylK+0XjxTFPhiGl6Gzwsmj+/BI2WXtdkGLzQ
SPl1TGxBLRqlvPbxTShFI9TXOrYBuegqv5pHQ5CKrvDPOBKEGDqavAzDAbDQkeRXN+RHPHr1e+kHfZEo
xD7p0V9Io/kAi8laAb3BwlUAAAAASUVORK5CYII=
</value>
</data>
<data name="tsbtnClose.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAJQSURBVFhHxZfNctNAEIQFb0UuYEu8DFwoiOwrVPGbFPAE
vKhjV9huzSiz69aubA501XfwuGdms7ORtV3S8/9M/qHQs0T8/l9ArVKIzwbqMA4vj2P/5rDb3FgIcs+1
UIfb/sVx//rtw4f+lYUoGLi609j/ftwPj85p139B3FQWXQuFWnnt4Y99NZmwqmiYjfvhK12TyuItKNRQ
tR/G7Qbf03jcbd8pE7hyJ6jyL4+gJzw0Yz7K5JxuL9oJCjmqloOe8CFhOgOV1YLTuP0Gn6ls6lDwqhpO
3NU8cWFeTkr8blYoNn6qkTwq1ynOlSxQ3wm9CKrZ/Pw8zQXyQq2dGIcfZp2FmPI6C/9RWfM5CDXnOPb3
ZsUz5F55nMr5yT5EqPY8+49AfecsjGzuUwYiVGsRNRrN2UMFI1RrvorinKjaQAZLqLTV1TlH4LU0SNV0
ZFBBteYN4DE7pGpFZFBBpZl+Uk0j8JgdUrUiMlhCpZ/QX6qhAl5Lg1RNRwYj1CXNnZWLkEGHSjPNXlQu
AblWBpI9VBBQreaYd+tcNBZxFmAQSv/HP1VBJ25xa0SoZVYo6xU/MAClVdef7fl8qeYi9LNBNN8Nd6qA
s7ClVHtkw51ZIeYVBVo/qfV5Qs1FpB5mpZA4vZLt+88qwUmJS3OMUPCqGg56mXVKOrzf3CijkxLWPtsB
hRxVy0FP+JhQfy0/m9saqNp5yl7LKxeTNT+pS1BL58qvaE/GdF2KhvSaNc8pqSy+Fgq1strF1Ww24rqE
C6TPxxQLXgOFmryc2pWs67ruL9BDjecFstIGAAAAAElFTkSuQmCC
</value>
</data>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>996, 17</value>
</metadata>
<metadata name="colProcessCode.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colProdctPrivate.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colSetParams.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colStepProcessParams.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colPrivateProcessParams.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@ -0,0 +1,54 @@
namespace AssistClient
{
partial class FrmSetParams
{
/// <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.SuspendLayout();
//
// FrmSetParams
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.ActiveCaption;
this.ClientSize = new System.Drawing.Size(778, 744);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "FrmSetParams";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "设置工序参数";
this.Load += new System.EventHandler(this.FrmSetParams_Load);
this.ResumeLayout(false);
}
#endregion
}
}

View File

@ -0,0 +1,132 @@
using Newtonsoft.Json.Linq;
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 AssistClient
{
public partial class FrmSetParams : Form
{
public string ParamsData;
private string ProcessCode;
private string ProcessParams;
private UI.UICodeScannerDev uiCodeScanner1;
private UI.UIAxisDev uiAxis1;
private UI.UIIOCardDev uiIOCard1;
private UI.UILightDev uiLight1;
private UI.UIScannerDev uiScanner1;
private UI.UISizeLib uiSizeLib1;
private UI.UIForLib uiForLib1;
private UI.UIIFLib uiIFLib1;
public FrmSetParams(string processCode,string processParams)
{
InitializeComponent();
ProcessCode= processCode;
ProcessParams= processParams;
}
private void initData()
{
switch (ProcessCode)
{
case "CodeScanner":
uiCodeScanner1= new UI.UICodeScannerDev();
this.Controls.Add(uiCodeScanner1);
uiCodeScanner1.Dock = System.Windows.Forms.DockStyle.Fill;
uiCodeScanner1.Location = new System.Drawing.Point(0, 0);
uiCodeScanner1.init();
break;
case "IOCard":
uiIOCard1 = new UI.UIIOCardDev();
this.Controls.Add(uiIOCard1);
uiIOCard1.Dock = System.Windows.Forms.DockStyle.Fill;
uiIOCard1.Location = new System.Drawing.Point(0, 0);
uiIOCard1.GetParamsEvent = save;
uiIOCard1.init();
uiIOCard1.setParamsData(ProcessParams);
break;
case "Axis":
uiAxis1 = new UI.UIAxisDev();
this.Controls.Add(uiAxis1);
uiAxis1.Dock = System.Windows.Forms.DockStyle.Fill;
uiAxis1.Location = new System.Drawing.Point(0, 0);
uiAxis1.GetParamsEvent = save;
uiAxis1.init();
uiAxis1.setParamsData(ProcessParams);
break;
case "Light":
uiLight1 = new UI.UILightDev();
this.Controls.Add(uiLight1);
uiLight1.Dock = System.Windows.Forms.DockStyle.Fill;
uiLight1.Location = new System.Drawing.Point(0, 0);
uiLight1.GetParamsEvent = save;
uiLight1.init();
uiLight1.setParamsData(ProcessParams);
break;
case "Scanner_CC":
uiScanner1 = new UI.UIScannerDev();
this.Controls.Add(uiScanner1);
uiScanner1.Dock = System.Windows.Forms.DockStyle.Fill;
uiScanner1.Location = new System.Drawing.Point(0, 0);
uiScanner1.GetParamsEvent = save;
uiScanner1.init(Device.ScannerDev.ScannerType.CC);
uiScanner1.setParamsData(ProcessParams);
break;
case "Size":
uiSizeLib1 = new UI.UISizeLib();
this.Controls.Add(uiSizeLib1);
uiSizeLib1.Dock = System.Windows.Forms.DockStyle.Fill;
uiSizeLib1.Location = new System.Drawing.Point(0, 0);
uiSizeLib1.GetParamsEvent = save;
uiSizeLib1.init();
uiSizeLib1.setParamsData(ProcessParams);
break;
case "For":
uiForLib1 = new UI.UIForLib();
this.Controls.Add(uiForLib1);
uiForLib1.Dock = System.Windows.Forms.DockStyle.Fill;
uiForLib1.Location = new System.Drawing.Point(0, 0);
uiForLib1.GetParamsEvent = save;
uiForLib1.init();
uiForLib1.setParamsData(ProcessParams);
break;
case "If":
uiIFLib1 = new UI.UIIFLib();
this.Controls.Add(uiIFLib1);
uiIFLib1.Dock = System.Windows.Forms.DockStyle.Fill;
uiIFLib1.Location = new System.Drawing.Point(0, 0);
uiIFLib1.GetParamsEvent = save;
uiIFLib1.init();
uiIFLib1.setParamsData(ProcessParams);
break;
default:
throw new Exception("不支持的工序类型!");
}
}
private void FrmSetParams_Load(object sender, EventArgs e)
{
try
{
initData();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.Close();
}
}
private void save(string json)
{
this.ParamsData = json;
this.DialogResult = DialogResult.OK;
this.Close();
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,532 @@
namespace AssistClient
{
partial class FrmStepInfo
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle29 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle30 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle31 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle32 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle34 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle35 = new System.Windows.Forms.DataGridViewCellStyle();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmStepInfo));
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle33 = new System.Windows.Forms.DataGridViewCellStyle();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.dataGridView1 = new System.Windows.Forms.DataGridView();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.dataGridView2 = new System.Windows.Forms.DataGridView();
this.btnInsert = new System.Windows.Forms.Button();
this.btnDel = new System.Windows.Forms.Button();
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.tsbtnSave = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
this.tsbtnDebug = new System.Windows.Forms.ToolStripButton();
this.tsbtnClose = new System.Windows.Forms.ToolStripButton();
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.txtName = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.txtCode = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.btnAdd = new System.Windows.Forms.Button();
this.btnDown = new System.Windows.Forms.Button();
this.btnUp = new System.Windows.Forms.Button();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
this.colProcessCode = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colProcessName = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colTypeName = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colSetParams = new System.Windows.Forms.DataGridViewButtonColumn();
this.colProcessParams = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.label3 = new System.Windows.Forms.Label();
this.numStartTimeIndex = new System.Windows.Forms.NumericUpDown();
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.groupBox2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
this.groupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.dataGridView2)).BeginInit();
this.toolStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
this.statusStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.numStartTimeIndex)).BeginInit();
this.SuspendLayout();
//
// groupBox2
//
this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.groupBox2.BackColor = System.Drawing.SystemColors.ActiveCaption;
this.groupBox2.Controls.Add(this.dataGridView1);
this.groupBox2.Location = new System.Drawing.Point(3, 3);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(446, 716);
this.groupBox2.TabIndex = 13;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "工序库";
//
// dataGridView1
//
this.dataGridView1.AllowUserToAddRows = false;
this.dataGridView1.AllowUserToDeleteRows = false;
this.dataGridView1.AllowUserToResizeRows = false;
dataGridViewCellStyle29.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle29.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle29.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle29.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle29.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle29.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle29.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.dataGridView1.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle29;
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewCellStyle30.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle30.BackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle30.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle30.ForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle30.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle30.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle30.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.dataGridView1.DefaultCellStyle = dataGridViewCellStyle30;
this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.dataGridView1.Location = new System.Drawing.Point(3, 24);
this.dataGridView1.MultiSelect = false;
this.dataGridView1.Name = "dataGridView1";
this.dataGridView1.ReadOnly = true;
this.dataGridView1.RowHeadersVisible = false;
this.dataGridView1.RowHeadersWidth = 62;
dataGridViewCellStyle31.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.dataGridView1.RowsDefaultCellStyle = dataGridViewCellStyle31;
this.dataGridView1.RowTemplate.Height = 30;
this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dataGridView1.Size = new System.Drawing.Size(440, 689);
this.dataGridView1.TabIndex = 4;
//
// groupBox1
//
this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.groupBox1.BackColor = System.Drawing.SystemColors.ActiveCaption;
this.groupBox1.Controls.Add(this.dataGridView2);
this.groupBox1.Location = new System.Drawing.Point(558, 3);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(608, 716);
this.groupBox1.TabIndex = 14;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "流程配置";
//
// dataGridView2
//
this.dataGridView2.AllowUserToAddRows = false;
this.dataGridView2.AllowUserToDeleteRows = false;
dataGridViewCellStyle32.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle32.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle32.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle32.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle32.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle32.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle32.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.dataGridView2.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle32;
this.dataGridView2.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView2.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.colProcessCode,
this.colProcessName,
this.colTypeName,
this.colSetParams,
this.colProcessParams});
dataGridViewCellStyle34.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle34.BackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle34.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle34.ForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle34.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle34.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle34.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.dataGridView2.DefaultCellStyle = dataGridViewCellStyle34;
this.dataGridView2.Dock = System.Windows.Forms.DockStyle.Fill;
this.dataGridView2.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter;
this.dataGridView2.Location = new System.Drawing.Point(3, 24);
this.dataGridView2.MultiSelect = false;
this.dataGridView2.Name = "dataGridView2";
this.dataGridView2.RowHeadersVisible = false;
this.dataGridView2.RowHeadersWidth = 62;
dataGridViewCellStyle35.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.dataGridView2.RowsDefaultCellStyle = dataGridViewCellStyle35;
this.dataGridView2.RowTemplate.Height = 30;
this.dataGridView2.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dataGridView2.Size = new System.Drawing.Size(602, 689);
this.dataGridView2.TabIndex = 3;
this.dataGridView2.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView2_CellContentClick);
this.dataGridView2.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView2_CellEndEdit);
this.dataGridView2.DataBindingComplete += new System.Windows.Forms.DataGridViewBindingCompleteEventHandler(this.dataGridView2_DataBindingComplete);
//
// btnInsert
//
this.btnInsert.BackColor = System.Drawing.SystemColors.ButtonFace;
this.btnInsert.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btnInsert.BackgroundImage")));
this.btnInsert.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
this.btnInsert.ImageAlign = System.Drawing.ContentAlignment.TopCenter;
this.btnInsert.Location = new System.Drawing.Point(454, 186);
this.btnInsert.Name = "btnInsert";
this.btnInsert.Size = new System.Drawing.Size(88, 92);
this.btnInsert.TabIndex = 15;
this.btnInsert.Text = "插入->>";
this.btnInsert.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
this.btnInsert.UseVisualStyleBackColor = false;
this.btnInsert.Click += new System.EventHandler(this.btnInsert_Click);
//
// btnDel
//
this.btnDel.BackColor = System.Drawing.SystemColors.ButtonFace;
this.btnDel.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btnDel.BackgroundImage")));
this.btnDel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
this.btnDel.Location = new System.Drawing.Point(454, 285);
this.btnDel.Name = "btnDel";
this.btnDel.Size = new System.Drawing.Size(88, 93);
this.btnDel.TabIndex = 16;
this.btnDel.Text = "<<-移除";
this.btnDel.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
this.btnDel.UseVisualStyleBackColor = false;
this.btnDel.Click += new System.EventHandler(this.btnDel_Click);
//
// toolStrip1
//
this.toolStrip1.BackColor = System.Drawing.SystemColors.GradientInactiveCaption;
this.toolStrip1.ImageScalingSize = new System.Drawing.Size(32, 32);
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tsbtnSave,
this.toolStripSeparator4,
this.tsbtnDebug,
this.tsbtnClose});
this.toolStrip1.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.HorizontalStackWithOverflow;
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Padding = new System.Windows.Forms.Padding(0, 0, 3, 0);
this.toolStrip1.Size = new System.Drawing.Size(1168, 65);
this.toolStrip1.TabIndex = 17;
this.toolStrip1.Text = "toolStrip1";
//
// tsbtnSave
//
this.tsbtnSave.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnSave.Image")));
this.tsbtnSave.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.tsbtnSave.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnSave.Name = "tsbtnSave";
this.tsbtnSave.Size = new System.Drawing.Size(70, 60);
this.tsbtnSave.Text = " 保存 ";
this.tsbtnSave.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbtnSave.Click += new System.EventHandler(this.tsbtnSave_Click);
//
// toolStripSeparator4
//
this.toolStripSeparator4.Name = "toolStripSeparator4";
this.toolStripSeparator4.Size = new System.Drawing.Size(6, 65);
//
// tsbtnDebug
//
this.tsbtnDebug.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnDebug.Image")));
this.tsbtnDebug.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.tsbtnDebug.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnDebug.Name = "tsbtnDebug";
this.tsbtnDebug.Size = new System.Drawing.Size(86, 60);
this.tsbtnDebug.Text = "单步调试";
this.tsbtnDebug.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbtnDebug.Visible = false;
this.tsbtnDebug.Click += new System.EventHandler(this.tsbtnDebug_Click);
//
// tsbtnClose
//
this.tsbtnClose.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnClose.Image")));
this.tsbtnClose.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.tsbtnClose.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnClose.Name = "tsbtnClose";
this.tsbtnClose.Size = new System.Drawing.Size(70, 60);
this.tsbtnClose.Text = " 关闭 ";
this.tsbtnClose.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbtnClose.Click += new System.EventHandler(this.tsbtnClose_Click);
//
// splitContainer1
//
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.Location = new System.Drawing.Point(0, 65);
this.splitContainer1.Name = "splitContainer1";
this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.BackColor = System.Drawing.SystemColors.ActiveCaption;
this.splitContainer1.Panel1.Controls.Add(this.numStartTimeIndex);
this.splitContainer1.Panel1.Controls.Add(this.label3);
this.splitContainer1.Panel1.Controls.Add(this.txtName);
this.splitContainer1.Panel1.Controls.Add(this.label2);
this.splitContainer1.Panel1.Controls.Add(this.txtCode);
this.splitContainer1.Panel1.Controls.Add(this.label1);
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.btnAdd);
this.splitContainer1.Panel2.Controls.Add(this.btnDown);
this.splitContainer1.Panel2.Controls.Add(this.btnUp);
this.splitContainer1.Panel2.Controls.Add(this.groupBox2);
this.splitContainer1.Panel2.Controls.Add(this.groupBox1);
this.splitContainer1.Panel2.Controls.Add(this.btnDel);
this.splitContainer1.Panel2.Controls.Add(this.btnInsert);
this.splitContainer1.Size = new System.Drawing.Size(1168, 843);
this.splitContainer1.SplitterDistance = 89;
this.splitContainer1.TabIndex = 18;
//
// txtName
//
this.txtName.Location = new System.Drawing.Point(558, 25);
this.txtName.Name = "txtName";
this.txtName.Size = new System.Drawing.Size(328, 28);
this.txtName.TabIndex = 3;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(506, 31);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(44, 18);
this.label2.TabIndex = 2;
this.label2.Text = "名称";
//
// txtCode
//
this.txtCode.Location = new System.Drawing.Point(78, 24);
this.txtCode.Name = "txtCode";
this.txtCode.Size = new System.Drawing.Size(328, 28);
this.txtCode.TabIndex = 1;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(28, 28);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(44, 18);
this.label1.TabIndex = 0;
this.label1.Text = "编号";
//
// btnAdd
//
this.btnAdd.BackColor = System.Drawing.SystemColors.ButtonFace;
this.btnAdd.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btnAdd.BackgroundImage")));
this.btnAdd.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
this.btnAdd.ImageAlign = System.Drawing.ContentAlignment.TopCenter;
this.btnAdd.Location = new System.Drawing.Point(454, 88);
this.btnAdd.Name = "btnAdd";
this.btnAdd.Size = new System.Drawing.Size(88, 92);
this.btnAdd.TabIndex = 19;
this.btnAdd.Text = "追加->>";
this.btnAdd.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
this.btnAdd.UseVisualStyleBackColor = false;
this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
//
// btnDown
//
this.btnDown.BackColor = System.Drawing.SystemColors.ButtonFace;
this.btnDown.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btnDown.BackgroundImage")));
this.btnDown.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
this.btnDown.Location = new System.Drawing.Point(454, 484);
this.btnDown.Name = "btnDown";
this.btnDown.Size = new System.Drawing.Size(88, 96);
this.btnDown.TabIndex = 18;
this.btnDown.Text = "下移";
this.btnDown.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
this.btnDown.UseVisualStyleBackColor = false;
this.btnDown.Click += new System.EventHandler(this.btnDown_Click);
//
// btnUp
//
this.btnUp.BackColor = System.Drawing.SystemColors.ButtonFace;
this.btnUp.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btnUp.BackgroundImage")));
this.btnUp.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
this.btnUp.ImageAlign = System.Drawing.ContentAlignment.TopCenter;
this.btnUp.Location = new System.Drawing.Point(454, 384);
this.btnUp.Name = "btnUp";
this.btnUp.Size = new System.Drawing.Size(88, 94);
this.btnUp.TabIndex = 17;
this.btnUp.Text = "上移";
this.btnUp.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
this.btnUp.UseVisualStyleBackColor = false;
this.btnUp.Click += new System.EventHandler(this.btnUp_Click);
//
// statusStrip1
//
this.statusStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripStatusLabel1});
this.statusStrip1.Location = new System.Drawing.Point(0, 886);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Padding = new System.Windows.Forms.Padding(2, 0, 14, 0);
this.statusStrip1.Size = new System.Drawing.Size(1168, 22);
this.statusStrip1.TabIndex = 20;
this.statusStrip1.Text = "statusStrip1";
//
// toolStripStatusLabel1
//
this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
this.toolStripStatusLabel1.Size = new System.Drawing.Size(0, 15);
//
// colProcessCode
//
this.colProcessCode.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None;
this.colProcessCode.DataPropertyName = "ProcessCode";
dataGridViewCellStyle33.BackColor = System.Drawing.Color.White;
dataGridViewCellStyle33.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.colProcessCode.DefaultCellStyle = dataGridViewCellStyle33;
this.colProcessCode.HeaderText = "code";
this.colProcessCode.MinimumWidth = 8;
this.colProcessCode.Name = "colProcessCode";
this.colProcessCode.Visible = false;
//
// colProcessName
//
this.colProcessName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
this.colProcessName.DataPropertyName = "ProcessName";
this.colProcessName.HeaderText = "工序名称";
this.colProcessName.MinimumWidth = 8;
this.colProcessName.Name = "colProcessName";
//
// colTypeName
//
this.colTypeName.HeaderText = "类型";
this.colTypeName.MinimumWidth = 8;
this.colTypeName.Name = "colTypeName";
this.colTypeName.ReadOnly = true;
this.colTypeName.Width = 80;
//
// colSetParams
//
this.colSetParams.HeaderText = "默认配方";
this.colSetParams.MinimumWidth = 8;
this.colSetParams.Name = "colSetParams";
this.colSetParams.Text = "设置";
this.colSetParams.UseColumnTextForButtonValue = true;
//
// colProcessParams
//
this.colProcessParams.DataPropertyName = "ProcessParams";
this.colProcessParams.HeaderText = "ProcessParams";
this.colProcessParams.MinimumWidth = 8;
this.colProcessParams.Name = "colProcessParams";
this.colProcessParams.Visible = false;
this.colProcessParams.Width = 160;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(928, 31);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(116, 18);
this.label3.TabIndex = 4;
this.label3.Text = "起始计时工序";
//
// numStartTimeIndex
//
this.numStartTimeIndex.Location = new System.Drawing.Point(1050, 24);
this.numStartTimeIndex.Maximum = new decimal(new int[] {
9999,
0,
0,
0});
this.numStartTimeIndex.Name = "numStartTimeIndex";
this.numStartTimeIndex.Size = new System.Drawing.Size(81, 28);
this.numStartTimeIndex.TabIndex = 5;
this.toolTip1.SetToolTip(this.numStartTimeIndex, "有效索引大于10则不计时");
//
// FrmStepInfo
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1168, 908);
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.splitContainer1);
this.Controls.Add(this.toolStrip1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "FrmStepInfo";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "流程信息";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmStepInfo_FormClosing);
this.Load += new System.EventHandler(this.FrmStepInfo_Load);
this.groupBox2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
this.groupBox1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.dataGridView2)).EndInit();
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel1.PerformLayout();
this.splitContainer1.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false);
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.numStartTimeIndex)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.DataGridView dataGridView2;
private System.Windows.Forms.Button btnInsert;
private System.Windows.Forms.Button btnDel;
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
private System.Windows.Forms.ToolStripButton tsbtnClose;
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.TextBox txtName;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox txtCode;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ToolStripButton tsbtnDebug;
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
private System.Windows.Forms.ToolStripButton tsbtnSave;
private System.Windows.Forms.Button btnDown;
private System.Windows.Forms.Button btnUp;
private System.Windows.Forms.DataGridView dataGridView1;
private System.Windows.Forms.Button btnAdd;
private System.Windows.Forms.DataGridViewTextBoxColumn colProcessCode;
private System.Windows.Forms.DataGridViewTextBoxColumn colProcessName;
private System.Windows.Forms.DataGridViewTextBoxColumn colTypeName;
private System.Windows.Forms.DataGridViewButtonColumn colSetParams;
private System.Windows.Forms.DataGridViewTextBoxColumn colProcessParams;
private System.Windows.Forms.NumericUpDown numStartTimeIndex;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.ToolTip toolTip1;
}
}

View File

@ -0,0 +1,300 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AssistClient
{
public partial class FrmStepInfo : Form
{
Service.StepService service = new Service.StepService();
Models.Step model=new Models.Step();
public FrmStepInfo(Models.Step m=null)
{
InitializeComponent();
dataGridView1.AutoGenerateColumns = false;
dataGridView2.AutoGenerateColumns = false;
//显示行号与列宽度自动调整
dataGridView2.RowHeadersVisible = true;
dataGridView2.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
dataGridView2.RowPostPaint += (sender, e) =>
{
Utils.Util.showRowNum_onDataGrid_RowPostPaint(this.dataGridView2, sender, e);
};
if (m == null)
model.ProcessList = new List<Models.StepProcess>();
else
model = m;
model.Tag = 1;//*
}
private void initDataView()
{
dataGridView1.Columns.Add("colCode", "code");
dataGridView1.Columns.Add("colName", "工序");
dataGridView1.Columns[0].Visible = false;
dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
foreach (var item in Config.dicDevType)
dataGridView1.Rows.Add(item.Key, item.Value);
//
this.txtCode.Text = model.Code;
this.txtName.Text = model.Name;
this.numStartTimeIndex.Value = model.StartTimeIndex;
if (model.ProcessList!=null)
dataGridView2.DataSource = new BindingSource(model.ProcessList, null);
}
private class Process
{
public Process(string code, string name)
{
Code = code;
Name = name;
}
public string Code { get; set; }
public string Name { get; set; }
}
private void FrmStepInfo_Load(object sender, EventArgs e)
{
initDataView();
}
#region private
private void reOrderProcess()
{
for (int i = 0; i < model.ProcessList.Count; i++)
model.ProcessList[i].Order = i;
}
private void refreshDataGridView()
{
dataGridView2.DataSource = null;
dataGridView2.DataSource = new BindingSource(model.ProcessList, null);
}
#endregion
private bool saveExit=false;
private void tsbtnSave_Click(object sender, EventArgs e)
{
try
{
string szCode = this.txtCode.Text.Trim();
string szName = this.txtName.Text.Trim();
if (szCode == "" || szName == "")
throw new Exception("请填写编号和名称!");
if (model.ProcessList == null || model.ProcessList.Count == 0)
throw new Exception("请添加流程工序!");
foreach(var item in model.ProcessList)
{
if (string.IsNullOrWhiteSpace(item.ProcessParams))
throw new Exception($"{Config.dicDevType[item.ProcessCode]} 配方未设置!");
}
model.Code = szCode;
model.Name = szName;
model.StartTimeIndex = (int)numStartTimeIndex.Value;
model.ModifyUserCode = Config.loginUser.Code;
bool result;
if (model.Id == 0)
{
model.CreateUserCode=Config.loginUser.Code;
result = service.InsertNav(model);
}
else
result = service.UpdateNav(model);
if (!result)
throw new Exception("保存失败!");
MessageBox.Show("保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
saveExit=true;
this.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnAdd_Click(object sender, EventArgs e)
{
try
{
if (this.dataGridView1.SelectedRows.Count != 1)
throw new Exception("请选择要插入的工序!");
string processCode = this.dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
model.ProcessList.Add(new Models.StepProcess()
{
ProcessCode = processCode,
ProcessName= Config.dicDevType[processCode],
ModifyUserCode = Config.loginUser.Code,
CreateUserCode = Config.loginUser.Code
});
reOrderProcess();
this.refreshDataGridView();
this.dataGridView2.Rows[this.dataGridView2.Rows.Count-1].Selected = true;
dataGridView2.CurrentCell = dataGridView2.Rows[this.dataGridView2.Rows.Count - 1].Cells[1];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnInsert_Click(object sender, EventArgs e)
{
try
{
if (this.dataGridView1.SelectedRows.Count != 1)
throw new Exception("请选择要插入的工序!");
string processCode= this.dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
int liInsertIndex = this.dataGridView2.Rows.Count;
if (this.dataGridView2.SelectedRows.Count > 0)
liInsertIndex = this.dataGridView2.SelectedRows[0].Index;
model.ProcessList.Insert(liInsertIndex, new Models.StepProcess()
{
ProcessCode = processCode,
ProcessName = Config.dicDevType[processCode],
Order = liInsertIndex,
ModifyUserCode=Config.loginUser.Code,
CreateUserCode=Config.loginUser.Code
});
reOrderProcess();
this.refreshDataGridView();
this.dataGridView2.Rows[liInsertIndex].Selected = true;
dataGridView2.CurrentCell = dataGridView2.Rows[liInsertIndex].Cells[1];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnDel_Click(object sender, EventArgs e)
{
try
{
if (this.dataGridView2.SelectedRows.Count != 1)
throw new Exception("请选择要删除的工序!");
int liRowIndex = this.dataGridView2.SelectedRows[0].Index;
model.ProcessList.RemoveAt(liRowIndex);
if(liRowIndex>= dataGridView2.Rows.Count-1)
liRowIndex= dataGridView2.Rows.Count-1;
dataGridView2.CurrentCell = dataGridView2.Rows[liRowIndex].Cells[1];
//reOrderProcess();
this.refreshDataGridView();
if (dataGridView2.Rows.Count < 1)
return;
if (liRowIndex >= dataGridView2.Rows.Count)
liRowIndex = dataGridView2.Rows.Count - 1;
dataGridView2.CurrentCell = dataGridView2.Rows[liRowIndex].Cells[1];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnUp_Click(object sender, EventArgs e)
{
try
{
if (this.dataGridView2.SelectedRows.Count != 1)
throw new Exception("请选择要调整顺序的工序!");
int liSelIndex = this.dataGridView2.SelectedRows[0].Index;
if (liSelIndex == 0)
return;
model.ProcessList.Insert(liSelIndex - 1, model.ProcessList[liSelIndex]);
model.ProcessList.RemoveAt(liSelIndex + 1);
reOrderProcess();
this.refreshDataGridView();
this.dataGridView2.Rows[liSelIndex-1].Selected = true;
dataGridView2.CurrentCell = dataGridView2.Rows[liSelIndex - 1].Cells[1];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnDown_Click(object sender, EventArgs e)
{
try
{
if (this.dataGridView2.SelectedRows.Count != 1)
throw new Exception("请选择要调整顺序的工序!");
int liSelIndex = this.dataGridView2.SelectedRows[0].Index;
if (liSelIndex == this.dataGridView2.Rows.Count-1)
return;
model.ProcessList.Insert(liSelIndex +2, model.ProcessList[liSelIndex]);
model.ProcessList.RemoveAt(liSelIndex);
reOrderProcess();
this.refreshDataGridView();
this.dataGridView2.Rows[liSelIndex+1].Selected = true;
dataGridView2.CurrentCell = dataGridView2.Rows[liSelIndex + 1].Cells[1];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void tsbtnDebug_Click(object sender, EventArgs e)
{
}
private void dataGridView2_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
for(int i=0;i< dataGridView2.Rows.Count;i++)
{
dataGridView2.Rows[i].Cells["colTypeName"].Value = Config.dicDevType[dataGridView2.Rows[i].Cells[0].Value.ToString()];
}
}
private void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
int Index = this.dataGridView2.CurrentRow.Index;//获取当前选中行的索引
if (Index < this.dataGridView2.Rows.Count && this.dataGridView2.CurrentCell.Value.ToString() == "设置")
{
string processCode = this.dataGridView2.Rows[Index].Cells["colProcessCode"].Value.ToString();
string processParams="";
if(this.dataGridView2.Rows[Index].Cells["colProcessParams"].Value!=null)
processParams=this.dataGridView2.Rows[Index].Cells["colProcessParams"].Value.ToString();
FrmSetParams frm=new FrmSetParams(processCode, processParams);
if (frm.ShowDialog() == DialogResult.OK)
this.dataGridView2.Rows[Index].Cells["colProcessParams"].Value = frm.ParamsData;
}
}
private void tsbtnClose_Click(object sender, EventArgs e)
{
this.Close();
}
//单元格编译完成
private void dataGridView2_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
var value = dataGridView2.Rows[e.RowIndex].Cells["colProcessName"].Value;
if (value==null || value.ToString().Trim() == "")
{
dataGridView2.Rows[e.RowIndex].Cells["colProcessName"].Value = dataGridView2.Rows[e.RowIndex].Cells["colTypeName"].Value;
}
}
private void FrmStepInfo_FormClosing(object sender, FormClosingEventArgs e)
{
if (!saveExit && MessageBox.Show($"确认修改已保存,是否退出?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
{
e.Cancel = true;
return;
}
}
}
}

View File

@ -0,0 +1,265 @@
<?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="colProcessCode.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colProcessName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colTypeName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colSetParams.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="colProcessParams.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="btnInsert.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHjSURBVFhHxdZJSxxBGMbxR+NCRAIiCIIgCDkIHgQP
QsCDIAiCIH4F9z0u0VET233/Lq5x3+OeGZfxA72+NUJIVwv1nMrDO4e+/P7d011VEJEPnXcv+pzUz+pL
I1aSDVhO1mP5uQ5Lz7VYfKrBwlM15h+rdL5h7qESs4mKYCZRLtPxMpmKl8rk368S3JfIxH2xTNwVya/b
wuDnbQHGb/Ixdp2H0esviF3lInaZg5HLzxj+k40fF1kYOs8MB5A4HLgoLgw+dJ4RDiBxELgw+ODZJyuA
w0HgwuADp+nhABIHgQuD95+khQNIHAQuDP792AogcRC4MHjf0Zv7L4DEQeDC4L2HkQAKB4ELg0cCSBwE
Lgzec2AFKO5a4Zg7N7hOhiguioviorgoLgqnRnHp3kcQCvCMS9eeYf8L8I137loBvvGOHSvAN97x2wrw
jbfbAb7xtm07wDPetmUFKG5OMt7w1k1rHVCcOkaROBSH4lAcikNxKA7FoThadEIBJG6WV+bOnXjLhhVA
4mZtZx67E29etwJI3GwszH/uxCMBJG52NeaFc+JNa3YAh5st1YWbt92JRwJI3OzlLtx8ak48EkDiqQAH
br5zJx4JIHFzknHhZpFx4pEAEofigQMPGNxMKODjRvAK8oH7bE+ulgsAAAAASUVORK5CYII=
</value>
</data>
<data name="btnDel.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAACeSURBVFhHxdQhCgJhFEXhWYGICGKxGFyCYDBZTHYX
YHQL/1oVBEEwTTNcByY9OPlM+OBx0k2vSzIpjCaMJowmjCaMJowmjCaMJowmjCaMpvG479ogolYG/G7b
2MqA/rqJrQz4XtaxlQGf8yq2MuB9WsZWBryOi9jKgOdhHlsZ8NjP2iCi+gemhNGE0YTRhNGE0YTRhNGE
0YTRhNGT7g8KckRsbOBsnAAAAABJRU5ErkJggg==
</value>
</data>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<data name="tsbtnSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAIcSURBVFhH7ZdNaxNBGMefIpQKlkK/QLFiL4I3Wyx9uYhJ
P0COZtt52Z1ntYfiN+hN9KL4AXzDFgS/gDepR2uhB4+9Fc+W0oqofWaYbHaaSbKzWYRA/vBjk5l5/vvP
7LObBEbyaAzidIWol0aoGoj0lvULUKMxDjz5BBL/VYLAbetcUBLvdJgMzj3rXkBCLWeFHI/oE7wBmbwN
R70Ght+NzzoeQxxP2TP0UZwuZQEEvrKj5STUk8xLqg92tI/yAaR6b0fLSaoXbS/jF9mZHsoH4LhjR4uL
4wbtXGxeC3zuBGjiKbB0xsx11SABtrauUt1fU6sl8Fnm1YIlX2hmzMx7NUgAxiap7idxZt4L9TTzclCP
zbxXTg/gOztaTGl6DZrsj6nVcprQ4aOZ98oN0GNhF5nb1javxJc5rzY9d9YNoLdz0c6EieNtqv2R82oT
EECjm+qQ2KcHzLf+0DqBBxCx37a+k8AA1TOcASJ2UorWXZEnKIA2kWoNOJ8uRZLcJJ89xzNsB6ixBpXE
1PEMvAS/qKs3QaYLwfBknvzq2ddyi+FswioJDHBGl6AJ4uGcaSh9LIpeH8d3gauvjuf/b0KFjmfwDkj1
AKS8ARs4a46X0eM+xKPrVE8/cs0jumCA/I9SF/2dEIbvIWRQu/ZsHulbx1tUJb0CRNEELfrcWVQRTXZO
u1yzZ+uiRuMKLV6lfvD/7SqLxPumL0ZyBHABC1BmYPLlTLYAAAAASUVORK5CYII=
</value>
</data>
<data name="tsbtnDebug.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAANQSURBVFhHtVdbS1RRGF1GGF2hwqdIIughKe2hp3pMhHoJ
okGF0hnL8VJmEthjTwWRvyKieijoJ5RShNlNgqB6KCgpU0edbuo401r27XFGt845Ni5YnHP2/r71rX05
e85gpWhDQ2UNamrFc4jut+bVx3nEqlpx9n4LokONaEyKuldbOxoPWNjqoB2x+hY0p+KIZ3yMomG2FU11
Fl5caORxNHsL51ImtDyWVjy04MxDX0EfFWtp4fAAOHgFKLXHLDoQK+Naz/qKLcF0Fxp2WHoWHcA61bDH
fPwEbvwBMr+B/qfAFmueQzWq9zajKR3j9EZxuiC5ITNtOHXI0ucgTWlPsYZqWfM8JtmYYafIwGdvgc3W
hQgqSjtxfFcnagMzgkh2JqUlTafPWj3WNQ9O/ZofwJ30vIn+N8Am614xpCEtaUqbNe6qlnUvhkw4p9PA
SyZf/x9Kw+lJ28osj9yZKAZt5MGKC5yitXQ/6hNz5Iad4ob6JureF+MoLWmafGFw3Uol7BNzTAGPObL1
ou59MY7SkqbJF8YTinJUwz4xRxZ9ZOHQvS/GUVrStPDCCGigz8JloM8X4xjaAFESYAkCG5AWw0r+RXsw
AWxnYDnXc6dIx3vIkYVCuQw5AyPSdPpsKx8Hts0lfweucpcmGJAyztg1vVAolyENpBdop1STJnpkoNeX
VIhhDCxFzvwrcEo2/gLqee0yXuTp1c0fjElfkmMYA9KSprRdHdX8AmwwicXgxvnoE3MMY4Banyw0OGaA
5z4xxzAGqPXCQoODm+SWT8wxjAFuupsWGhzcoRGulVdQDGpAGgnghIWGA50veRYENcDpf29h4cCde03v
rU9UDGqAG3CI13D/F1j4gpt+GpnyLUUhA8pxeTp0+D1QZeHLg2tfN2uJfFfHh4CKJHCJRlK5BVi011Jk
IO8wUywPmS7mdeaYGBsFlv8Lx1PxiCukKxMOWxe+ApUUuceRJCXKooPWJQODMq0i7L/N2GwhPne7AbF/
dIw61pUP+3hMKFAF+OV60rry8A4oGwFqaO6YNYH3R9lWTUdbrSkPNHHZzQSXd9j7sTvAY5FT/pojT5Jx
ay4aqNlBTvBIHlAta87HB2Afz+d6eyw6PvNs4Zm82x4J4C/gpfb3NNnmBQAAAABJRU5ErkJggg==
</value>
</data>
<data name="tsbtnClose.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAJQSURBVFhHxZfNctNAEIQFb0UuYEu8DFwoiOwrVPGbFPAE
vKhjV9huzSiz69aubA501XfwuGdms7ORtV3S8/9M/qHQs0T8/l9ArVKIzwbqMA4vj2P/5rDb3FgIcs+1
UIfb/sVx//rtw4f+lYUoGLi609j/ftwPj85p139B3FQWXQuFWnnt4Y99NZmwqmiYjfvhK12TyuItKNRQ
tR/G7Qbf03jcbd8pE7hyJ6jyL4+gJzw0Yz7K5JxuL9oJCjmqloOe8CFhOgOV1YLTuP0Gn6ls6lDwqhpO
3NU8cWFeTkr8blYoNn6qkTwq1ynOlSxQ3wm9CKrZ/Pw8zQXyQq2dGIcfZp2FmPI6C/9RWfM5CDXnOPb3
ZsUz5F55nMr5yT5EqPY8+49AfecsjGzuUwYiVGsRNRrN2UMFI1RrvorinKjaQAZLqLTV1TlH4LU0SNV0
ZFBBteYN4DE7pGpFZFBBpZl+Uk0j8JgdUrUiMlhCpZ/QX6qhAl5Lg1RNRwYj1CXNnZWLkEGHSjPNXlQu
AblWBpI9VBBQreaYd+tcNBZxFmAQSv/HP1VBJ25xa0SoZVYo6xU/MAClVdef7fl8qeYi9LNBNN8Nd6qA
s7ClVHtkw51ZIeYVBVo/qfV5Qs1FpB5mpZA4vZLt+88qwUmJS3OMUPCqGg56mXVKOrzf3CijkxLWPtsB
hRxVy0FP+JhQfy0/m9saqNp5yl7LKxeTNT+pS1BL58qvaE/GdF2KhvSaNc8pqSy+Fgq1strF1Ww24rqE
C6TPxxQLXgOFmryc2pWs67ruL9BDjecFstIGAAAAAElFTkSuQmCC
</value>
</data>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>498, 17</value>
</metadata>
<data name="btnAdd.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHjSURBVFhHxdZJSxxBGMbxR+NCRAIiCIIgCDkIHgQP
QsCDIAiCIH4F9z0u0VET233/Lq5x3+OeGZfxA72+NUJIVwv1nMrDO4e+/P7d011VEJEPnXcv+pzUz+pL
I1aSDVhO1mP5uQ5Lz7VYfKrBwlM15h+rdL5h7qESs4mKYCZRLtPxMpmKl8rk368S3JfIxH2xTNwVya/b
wuDnbQHGb/Ixdp2H0esviF3lInaZg5HLzxj+k40fF1kYOs8MB5A4HLgoLgw+dJ4RDiBxELgw+ODZJyuA
w0HgwuADp+nhABIHgQuD95+khQNIHAQuDP792AogcRC4MHjf0Zv7L4DEQeDC4L2HkQAKB4ELg0cCSBwE
Lgzec2AFKO5a4Zg7N7hOhiguioviorgoLgqnRnHp3kcQCvCMS9eeYf8L8I137loBvvGOHSvAN97x2wrw
jbfbAb7xtm07wDPetmUFKG5OMt7w1k1rHVCcOkaROBSH4lAcikNxKA7FoThadEIBJG6WV+bOnXjLhhVA
4mZtZx67E29etwJI3GwszH/uxCMBJG52NeaFc+JNa3YAh5st1YWbt92JRwJI3OzlLtx8ak48EkDiqQAH
br5zJx4JIHFzknHhZpFx4pEAEofigQMPGNxMKODjRvAK8oH7bE+ulgsAAAAASUVORK5CYII=
</value>
</data>
<data name="btnDown.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAF2SURBVFhHxc7LK4RhGAXw+deUsrCwsbBRSpIkSUSM
SVkoC6XIJSK3MabUlCTkGsP4n46ZaUzPmTmP+b7XXBa/xfm+9z3nTQDoKAqp7Ldnpwgxle6oLtqkoA5X
qIEoVBdtUlCHK1R5FKqLNiksZQseBFJdtEkheVnwIJDqok0Ki5kvDwKpLtqksHDx6UEg1UWbFObTeQ8C
qS7apDB3nvcgkOqiTQqzpx8eBFJdtElh5uTdg0CqizYpTB+/eRBIddEmhamjVw8CqS7apDB5+OJBINVF
mxQmDp49CKS6aJPC+P5TrggtlrOb9ICxvUe0g92kB4zuPpSgxWiTwsj2/S+0SLnfblIY3rqz0GTVbrtJ
YWjzthaahHrtJoXBjRsF/1TXaTcpDKxfexBIddEmhf613F8Qk+oos5sU+lavGkFE6m6V3aTQu5KNAg2o
O8RuUuhZzkQFhzpbx25S6E6l40ANdUaymxS6kmdxoUL9c9lNCp0gP7YPEj/UlPRWdUd2IAAAAABJRU5E
rkJggg==
</value>
</data>
<data name="btnUp.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAF7SURBVFhHxc7fK0NxGAbw/WdSyoULNy7cKCVJkiSi
maVcKBdKkR8RMWZW6pQkNL9izP/0OFttvc/2vtvOa2e7+Fw853y/z/NNAOgpCn3JTCTp/C/KtH/NyE0K
YVkUlXFBO6OSmxS0w4b68SrtbAO5SWEtX2oHWtDuELlJIXVTagVt0u7WyE0Kq7mfZhCR1lEhNykkr78t
cNK6aJPCSraowT81dMpNCstXxXroEOqVmxSWMl8SOqzWLTcpLF58ViEmlX65SWHh/KMMMaNNCvNn7+gG
uUkPmDt9C0KIWSA36QGzJ68WOGldtElh5vjFAietizYpTB8VLHDSumiTwtThswVOWhdtUpjcf7LASeui
TQoTe48WOGldtElhfPfBAietizYpjO3cW+CkddEmhdHtOwuctC7apDCyFVjgpHXRJoXhzVsLnLQu2qQw
tJG3wEnrok0Kg+s5C5y0LtqkMJDOWuCkddEmhf7UpeUghIjKd7Qu2qTQC+rH7kHiD+1q5ha1YbleAAAA
AElFTkSuQmCC
</value>
</data>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>332, 17</value>
</metadata>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>498, 17</value>
</metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>74</value>
</metadata>
</root>

View File

@ -0,0 +1,286 @@
namespace AssistClient
{
partial class FrmStepList
{
/// <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(FrmStepList));
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle();
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.tsbtnAdd = new System.Windows.Forms.ToolStripButton();
this.tsbtnDel = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
this.tsbtnClone = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.tsbtnClose = new System.Windows.Forms.ToolStripButton();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.tsslCount = new System.Windows.Forms.ToolStripStatusLabel();
this.dataGridView1 = new System.Windows.Forms.DataGridView();
this.colId = new System.Windows.Forms.DataGridViewTextBoxColumn();
this. = new System.Windows.Forms.DataGridViewTextBoxColumn();
this. = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.toolStrip1.SuspendLayout();
this.statusStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
this.SuspendLayout();
//
// toolStrip1
//
this.toolStrip1.BackColor = System.Drawing.SystemColors.GradientInactiveCaption;
this.toolStrip1.ImageScalingSize = new System.Drawing.Size(32, 32);
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tsbtnAdd,
this.tsbtnDel,
this.toolStripSeparator4,
this.tsbtnClone,
this.toolStripSeparator1,
this.tsbtnClose});
this.toolStrip1.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.HorizontalStackWithOverflow;
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(1002, 65);
this.toolStrip1.TabIndex = 12;
this.toolStrip1.Text = "toolStrip1";
//
// tsbtnAdd
//
this.tsbtnAdd.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnAdd.Image")));
this.tsbtnAdd.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.tsbtnAdd.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnAdd.Name = "tsbtnAdd";
this.tsbtnAdd.Size = new System.Drawing.Size(70, 60);
this.tsbtnAdd.Text = " 添加 ";
this.tsbtnAdd.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbtnAdd.Click += new System.EventHandler(this.tsbtnAdd_Click);
//
// tsbtnDel
//
this.tsbtnDel.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnDel.Image")));
this.tsbtnDel.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.tsbtnDel.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnDel.Name = "tsbtnDel";
this.tsbtnDel.Size = new System.Drawing.Size(70, 60);
this.tsbtnDel.Text = " 删除 ";
this.tsbtnDel.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbtnDel.Click += new System.EventHandler(this.tsbtnDel_Click);
//
// toolStripSeparator4
//
this.toolStripSeparator4.Name = "toolStripSeparator4";
this.toolStripSeparator4.Size = new System.Drawing.Size(6, 65);
//
// tsbtnClone
//
this.tsbtnClone.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnClone.Image")));
this.tsbtnClone.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.tsbtnClone.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnClone.Name = "tsbtnClone";
this.tsbtnClone.Size = new System.Drawing.Size(70, 60);
this.tsbtnClone.Text = " 克隆 ";
this.tsbtnClone.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbtnClone.ToolTipText = "克隆当前流程";
this.tsbtnClone.Click += new System.EventHandler(this.tsbtnClone_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(6, 65);
//
// tsbtnClose
//
this.tsbtnClose.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnClose.Image")));
this.tsbtnClose.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.tsbtnClose.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnClose.Name = "tsbtnClose";
this.tsbtnClose.Size = new System.Drawing.Size(70, 60);
this.tsbtnClose.Text = " 关闭 ";
this.tsbtnClose.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbtnClose.Click += new System.EventHandler(this.tsbtnClose_Click);
//
// statusStrip1
//
this.statusStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tsslCount});
this.statusStrip1.Location = new System.Drawing.Point(0, 681);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(1002, 31);
this.statusStrip1.TabIndex = 22;
this.statusStrip1.Text = "statusStrip1";
//
// tsslCount
//
this.tsslCount.Name = "tsslCount";
this.tsslCount.Size = new System.Drawing.Size(33, 24);
this.tsslCount.Text = "共 ";
//
// dataGridView1
//
this.dataGridView1.AllowUserToAddRows = false;
this.dataGridView1.AllowUserToDeleteRows = false;
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.dataGridView1.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.colId,
this.,
this.,
this.Column2,
this.Column1});
dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle5.BackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle5.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle5.ForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle5.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle5.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.dataGridView1.DefaultCellStyle = dataGridViewCellStyle5;
this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.dataGridView1.Location = new System.Drawing.Point(0, 65);
this.dataGridView1.MultiSelect = false;
this.dataGridView1.Name = "dataGridView1";
this.dataGridView1.ReadOnly = true;
this.dataGridView1.RowHeadersVisible = false;
this.dataGridView1.RowHeadersWidth = 62;
dataGridViewCellStyle6.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.dataGridView1.RowsDefaultCellStyle = dataGridViewCellStyle6;
this.dataGridView1.RowTemplate.Height = 30;
this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dataGridView1.Size = new System.Drawing.Size(1002, 616);
this.dataGridView1.TabIndex = 23;
this.dataGridView1.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellDoubleClick);
//
// colId
//
this.colId.DataPropertyName = "Id";
this.colId.HeaderText = "ID";
this.colId.MinimumWidth = 8;
this.colId.Name = "colId";
this.colId.ReadOnly = true;
this.colId.Visible = false;
this.colId.Width = 150;
//
// 检测值
//
this..DataPropertyName = "Code";
dataGridViewCellStyle2.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold);
this..DefaultCellStyle = dataGridViewCellStyle2;
this..HeaderText = "编号";
this..MinimumWidth = 8;
this..Name = "检测值";
this..ReadOnly = true;
this..Width = 200;
//
// 工序
//
this..AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
this..DataPropertyName = "Name";
dataGridViewCellStyle3.BackColor = System.Drawing.Color.White;
dataGridViewCellStyle3.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this..DefaultCellStyle = dataGridViewCellStyle3;
this..HeaderText = "名称";
this..MinimumWidth = 8;
this..Name = "工序";
this..ReadOnly = true;
//
// Column2
//
this.Column2.DataPropertyName = "ModifyUserCode";
this.Column2.HeaderText = "修订人";
this.Column2.MinimumWidth = 8;
this.Column2.Name = "Column2";
this.Column2.ReadOnly = true;
this.Column2.Width = 150;
//
// Column1
//
this.Column1.DataPropertyName = "ModifyTime";
dataGridViewCellStyle4.Format = "g";
dataGridViewCellStyle4.NullValue = null;
this.Column1.DefaultCellStyle = dataGridViewCellStyle4;
this.Column1.HeaderText = "修订日期";
this.Column1.MinimumWidth = 8;
this.Column1.Name = "Column1";
this.Column1.ReadOnly = true;
this.Column1.Width = 150;
//
// FrmStepList
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1002, 712);
this.Controls.Add(this.dataGridView1);
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.toolStrip1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FrmStepList";
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "流程管理";
this.Load += new System.EventHandler(this.FrmStepList_Load);
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripButton tsbtnDel;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
private System.Windows.Forms.ToolStripButton tsbtnClose;
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel tsslCount;
private System.Windows.Forms.DataGridView dataGridView1;
private System.Windows.Forms.ToolStripButton tsbtnAdd;
private System.Windows.Forms.ToolStripButton tsbtnClone;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.DataGridViewTextBoxColumn colId;
private System.Windows.Forms.DataGridViewTextBoxColumn ;
private System.Windows.Forms.DataGridViewTextBoxColumn ;
private System.Windows.Forms.DataGridViewTextBoxColumn Column2;
private System.Windows.Forms.DataGridViewTextBoxColumn Column1;
}
}

View File

@ -0,0 +1,131 @@
using Models;
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 AssistClient
{
public partial class FrmStepList : Form
{
Service.StepService service=new Service.StepService();
public FrmStepList()
{
InitializeComponent();
dataGridView1.AutoGenerateColumns = false;
}
private void initDataView()
{
var list = service.GetListNav(1);
tsslCount.Text = $"共 {list.Count} 条记录";
dataGridView1.DataSource = new BindingSource(list, null);
}
private void FrmStepList_Load(object sender, EventArgs e)
{
initDataView();
}
private void tsbtnAdd_Click(object sender, EventArgs e)
{
FrmStepInfo frm = new FrmStepInfo();
frm.ShowDialog();
initDataView();
}
private void tsbtnDel_Click(object sender, EventArgs e)
{
try
{
if(this.dataGridView1.CurrentRow==null)
return;
var list = ((BindingSource)dataGridView1.DataSource).DataSource as List<Step>;
int liIndex = this.dataGridView1.CurrentRow.Index;//获取当前选中行的索引
if (service.InUse(list[liIndex].Id))
throw new Exception("此流程已有产品在使用中,不可删除!");
if (MessageBox.Show($"确认删除?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
if (!service.DelNav(list[liIndex]))
throw new Exception("删除失败!");
MessageBox.Show("删除成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
initDataView();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void tsbtnClone_Click(object sender, EventArgs e)
{
if (this.dataGridView1.CurrentRow == null)
{
MessageBox.Show("请选择要克隆的流程!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
var list = ((BindingSource)dataGridView1.DataSource).DataSource as List<Step>;
int liIndex = this.dataGridView1.CurrentRow.Index;//获取当前选中行的索引
Step newStep = new Step()
{
Tag = 1,
Code = list[liIndex].Code + "_clone",
Name = $"{list[liIndex].Name} (克隆)",
StartTimeIndex = list[liIndex].StartTimeIndex,
ModifyUserCode = Config.loginUser.Code,
CreateUserCode = Config.loginUser.Code,
ProcessList = new List<StepProcess>()
};
foreach(var item in list[liIndex].ProcessList)
{
newStep.ProcessList.Add(new StepProcess()
{
Order = item.Order,
ProcessCode=item.ProcessCode,
ProcessName = item.ProcessName,
ProcessParams=item.ProcessParams,
ModifyUserCode = Config.loginUser.Code,
CreateUserCode = Config.loginUser.Code
});
}
try
{
bool result = service.InsertNav(newStep);
if (result)
{
MessageBox.Show("克隆成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
initDataView();
}
else
throw new Exception("克隆失败!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void tsbtnClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
var list = ((BindingSource)dataGridView1.DataSource).DataSource as List<Step>;
int liIndex = this.dataGridView1.CurrentRow.Index;//获取当前选中行的索引
FrmStepInfo frm = new FrmStepInfo(list[liIndex]);
frm.ShowDialog(this);
initDataView();
}
}
}

View File

@ -0,0 +1,473 @@
<?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="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="tsbtnAdd.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAHoSURBVFhH3ZfNSwJBGMaFIIgM3R2/gu5B/0OXDp26eutk
uTv2QfQvddf+gCCKTkKn8BituDNqdI6+IJtH39RUGHcakfrBA77jvM/7oLvLTmyUuCdTjIsK48En47Jj
R/ASFXjTmMlkeSujGqrjBtZUxQwaN45KWcZG15dH6vO6TfU8EUKUadwI+dqiW5Cvjhfe0op14I0ZmEVL
A7K7rWWV8M31xRUtWQfemIFZtDQAi0jHeHhDS3rynYWupgTemGEtAPPlBUSlFusBEvuiBVGpxf4vwMMA
olLL/wvgcnkPUanFOEDuuJl2PHHm+OH5sFZ48AyNrmMveqi9j3EA129u9J5i0ws91N7HOABInATJVLG+
mj54zH2LFWUDGl7DHuylth/8KsAk1N4HiEotswgw59vQa9QhKrVYD5DkYRuiUov9X4CHWxCVWqwHiIpR
gLXTxpK6veL4PorQg16y6RI5gFsS+QSXL6wQfKiHy3skqR70woPsogdIcbnp+PLS5eLaROiFB9n90WvA
JpEDuCW5rf7PO+aLmpFULzzIzuQaEDt45VInmycToRceZKcPoBLP77UchwXcNrM+mGDGxIMJwLFJJZzT
0UyR2Wtn1aaZHk4xg8ZNZuVQMLzXqYvI6vEcnvCmMUQs9gWGsZeiWY4KFwAAAABJRU5ErkJggg==
</value>
</data>
<data name="tsbtnDel.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAMMSURBVFhH7VfbS5NhGH86SArdqG3TOV2QF9WFXlSEF/0D
naDuRehEFILG0rkJowIlA7voKjEpCwWhoJKyyLJ5gIIwSsTKY+kOmpuJZnbw1/Ns7zQ3NLcmdLEf/Hi/
932e5/f8vm8f+96XVgozGUwWMjzlsZ3HtqWo4pJnUqX/jhJKu8KiCJdSpyQih410WhabKyGD20z6HCul
b+G7y1yK/rg+R/KlTuqV1MpQSIaEP2mmjB3qblpVyoog+VIn9cGaKiUUXFBbTDqv0EJpLgvpncWUPMZz
nCHNLI881zlNpHMtxUCOyofUi47o8VxpG2pVy8XgwHUz6cZVEqxrM3AhaTvOJ25T3BoGF2qsa9N974To
ir70US1DkU+ZG0xkTCkk7USZLgsf7zzCSOMzDN9rDpuBuvKUbIie6Iq+arU0bKTZWERab5k2C6OP24Ah
N9DvCJ+DLszxeDFjJ86Sxiu6qsXy4Bcn0fcE2IDroZ2FnEDvMNA3AjjG/Yb6eO5bU5RryZO4NJc5j784
JgYKSDMhuqrF8ggxMKAM8OhuasP0q26/GVkLkJt97+qF84EdP3sG/XExwLHoGHB4MHy/GfmUgLp9edys
b+HJCMen0HisCKcpDp2V1X4D/BNEz8DoF/TUNOAkrUF1zkHMdPYsNuCZwq0DeRwntJVe8q8NRdOAewLv
b9zGKVqPmj2HMfP6XYiB+kNHOb4OHbbKmIGYgZiBmIGYgVUwIN+Caw04zv/1Vbv342vwt8A7jZt7c3GC
463WilUwMPwZo086ULppM+7mFuBHd79/PWBgbBItReWwJBrQXVWvvobOKBr48IkFXZh92485uQ7eDwgH
HPj2pnfxhoTH6BgINGET8w2CKab4sc+bi9SAjQxJvCecLNNlw9PyEnB6fT9B2ORNDJweVBh3iYFJ0VUt
loeNjPElpHdb4tLRce4yXPYXcDW3h0+u67pah9J4Ix9QUt2iq1r8HXzMMrEJ2c3yfj41YpoomU9Velgj
OazyAeIIn/OaiklvZ5Hn4VLqpF50lOT/BqLf422j357aoPMAAAAASUVORK5CYII=
</value>
</data>
<data name="tsbtnClone.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAIUSURBVFhH7ZNrS9tgGIb7///LQMb2QSbTTTJXMm3XQ9Ic
WpK0OfVoutZqrN7LK4/wkrwGfepHb7igFO7nbkKvxkeeo9kp3HTNRvTpFC9OmiF/eGQj+nSKFzvJcLd/
ZCP6dIoXO85we//ARvTpFC+D6Bo3+Z6N6NMpXsxwhc3tPRvRp1O8GJMl/u1yNqKvskOm1pTeeIlse8dG
9FV2yNSa0g3mWG12bERfZYdMrSl/vRkW6xs2oq+yQ6bWlHZxYJZt2Yi+yg6ZWlOuRlOkqw0b0VfZIVNr
yuUwQbxYs9HtUGmHjDCF5qrR3QSTecbCT5fQjEBph4wwheaqadoRgunqzYyiGdxJgrO2o7RDRphCc9X8
tkJ4yfJNuJMpLD9GfzjGN91Q2iEjTKG5an4NQozixatxxilML0LPDdAaDPFFayvtkBGm0Fw1mjmBG85f
heUn2OR44nq3x3S9g5eulHbICFNorprz4k9kF6+0Doueulu88sU2R7TcFD9ohv4oVJpRRphCc9X87AWw
gvRFBsVTG8VQxwlwabjFd0nx2UezYynNKPNsCs1V86PnwyxGVBhe/PTULcuD3ndw0TahXfVwoulKM8rI
ptBcNUdNF2ddv8Jpx8NJa4jjPxa+XvTx+byNT991HB2fKs0oUzaF5nh5D1PoFC/vYQqd4uVQU+gMP4eY
QicOC9cUqh8ejilU/cgLaTT+A+NY6S8KKsPSAAAAAElFTkSuQmCC
</value>
</data>
<data name="tsbtnClose.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAJQSURBVFhHxZfNctNAEIQFb0UuYEu8DFwoiOwrVPGbFPAE
vKhjV9huzSiz69aubA501XfwuGdms7ORtV3S8/9M/qHQs0T8/l9ArVKIzwbqMA4vj2P/5rDb3FgIcs+1
UIfb/sVx//rtw4f+lYUoGLi609j/ftwPj85p139B3FQWXQuFWnnt4Y99NZmwqmiYjfvhK12TyuItKNRQ
tR/G7Qbf03jcbd8pE7hyJ6jyL4+gJzw0Yz7K5JxuL9oJCjmqloOe8CFhOgOV1YLTuP0Gn6ls6lDwqhpO
3NU8cWFeTkr8blYoNn6qkTwq1ynOlSxQ3wm9CKrZ/Pw8zQXyQq2dGIcfZp2FmPI6C/9RWfM5CDXnOPb3
ZsUz5F55nMr5yT5EqPY8+49AfecsjGzuUwYiVGsRNRrN2UMFI1RrvorinKjaQAZLqLTV1TlH4LU0SNV0
ZFBBteYN4DE7pGpFZFBBpZl+Uk0j8JgdUrUiMlhCpZ/QX6qhAl5Lg1RNRwYj1CXNnZWLkEGHSjPNXlQu
AblWBpI9VBBQreaYd+tcNBZxFmAQSv/HP1VBJ25xa0SoZVYo6xU/MAClVdef7fl8qeYi9LNBNN8Nd6qA
s7ClVHtkw51ZIeYVBVo/qfV5Qs1FpB5mpZA4vZLt+88qwUmJS3OMUPCqGg56mXVKOrzf3CijkxLWPtsB
hRxVy0FP+JhQfy0/m9saqNp5yl7LKxeTNT+pS1BL58qvaE/GdF2KhvSaNc8pqSy+Fgq1strF1Ww24rqE
C6TPxxQLXgOFmryc2pWs67ruL9BDjecFstIGAAAAAElFTkSuQmCC
</value>
</data>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>664, 17</value>
</metadata>
<metadata name="colId.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="检测值.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="工序.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column2.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column1.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAQAEBAAAAEACABoBQAARgAAACAgAAABAAgAqAgAAK4FAAAwMAAAAQAIAKgOAABWDgAAAAAAAAEA
IACHIAAA/hwAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAABELAAARCwAAAAEAAAABAABaUD0AWlE9AF5V
QABiWEIAYlhEAGtgSQB9cFYAjIJuAI2DbwAZp10AGaldABy6aAAevGoAL755AC/AdwAxwHkANdSFADfW
hwA11ooAN9aKADrZigCCdVoAiHteAIR4YQCHjGcAnY1tAJ6ObgCSiXYAkol6AJWMeQCVjHoAlox6AJCS
bgCfkHAAoI1tAKCObgCjkHAAopByAKKScgCmnIYAqZ+JAKqcigCqn4oA++OxAPvjsgD747MA++S1AP3l
sQD95bMA/+WzAP3ltgD/5bYA++a6AP/oswD/6LYA/+u2AP/swgD+8dIA/vTZAP723gD+9t8A//XhAP75
4QD/+OAA//nhAP/45ABIPy4AUUIxAEs/MQBNRDQAS0UxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARwQEBAQE
BAQEBAQEBAQER0cFHx4cHigpJygeBx4eB0dHR0dHRwECBQUCAUdHR0dHR0dHRkRGAQQEAUZERERHR0dH
FxglISIZGhoaISUGR0dHRyAxCTYxMjEyMjE1GUdHR0cgPQsJNjEsLC4uMRlHRwoKCQkLCwo1MS4uLC8h
R0cJDAsLCwsLCi8sLC41GkdHDxQSEhMTEQ45LCwsNRpHRw0ODg4QEA1AQTouLDUaR0dHRyBAEA5BPT1B
OzQxGkdHR0cgQA5AOzs7O0BAOBlHR0dHFiAlIhkZGRkZIiUVR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR4ABAACAAQAA+B8AAOADAADAAwAAwAMAAMADAAAAAwAAAAMAAAADAAAAAwAAwAMAAMAD
AADAAwAA//8AAP//AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAEAAAAAAAAAAAAAAABAAAAAQAAWVA/AFlT
PwBaUT4AY1lDAGRaRABkXEQAZFxEAHdrUwBhV0EAYVpEAGRaRABkWkQAZlxGAHZqUQB3a1EAd2tSAHdr
VAB3blQAemtRAHpqUwB6a1QAeW1UAHpuVAB6blYAc2hQAHltUwBhV0EAZFpEAGRXRABmV0YAZFpEABa6
ZQAZumgAGbxoABy6aAAcvGgAHLxqAB68aAAevGoAIL9qACm9bgAtvm8AML9wADW/cgA11IcANdSFADXW
hwAkwnEAOcF2AD7EfABRjVwARL98ACnUggAv1oUAMNSFADHUhgAy1IYAM9SHADLWhQA11IUANdWHADXW
hQA11ocAN9aFADfWhwA31YgAVNCMAGHcmwCbqnwAp52IAKqgiwCf3JsAnd6uAKDergCv6rsAtezBALzt
xADGs4sAybaLAMm2jgDMto4AybqXAN3gqADi4aoA5uKsAOrjrQDu464A++OvAPLmtgD747EA++S0AP3j
sQD947MA/uOyAP3lsQD95bMA/+WxAP/msgD75roA++a7AP3nuQD/6LMA/+m1AP/otgD/67YA/+u5AMLu
xwDH78kAze/MANXwzgD268IA++nEAPvqxQD/8M0A/vLVAP7z1QD/89kA/vPdAP/02gD+9d4A/vbeAP/1
4QD+9uAA//bgAP734gD+9+MA//XkAP/15wD/+eMA//jkAP/45wD/+uYA//vnAGZaRABpXkgAZ11HAGRc
RAAcumgAHLpoABy/agCyqJQArqSQALuxnQC7sZ0Abl9FALqwnAC6sJ8ArqSQAHBkSgB1alMAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJaW
lpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpYYCggICAgLCwsLCwsMDAgKCgkLCwsLCwsKCwoD
lpaWlhcVFxcVFQ8PDw8PDw8VFxcXFw8PFxYPDw8VDxeWlpaWlkZGRkZGRUVFRUVFRUVGRkZGRUaWRkVF
RUVGlpaWlpaWjZSTk42TjI6Ojo6OjZWWkJSUlpaNk5OTk42WlpaWlpaWlpaWlpaWBAUGBgYFBgYMBQYA
lpaWlpaWlpaWlpaWlpaWlpaWlpaIhwcXDw8NFxcEiIiWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlQICAggJ
DZaWlpaWlpaWlpaWlpaWlpaWiAaFGhoaGhocAgECAQEBHBwcHBwcHIWFlpaWlpaWlpZETU1FT01NTU1N
TU1NTU1NTU1NTU1NUQ2WlpaWlpaWlhN+cSdSZl9fX19ZZmFZX1lZYVlmYWFoCpaWlpaWlpaWDX19HyhT
X19hWWFZWWVhWWVZYVlhV2gIlpaWlpaWlpYPhH8iIilUZllhWWFhV2FXWWFXYVllaAiWlpaWlpaWlg+C
giMiIjBUZmFhWVdlWWVlV2VZYVdoCJaWlpaJiYmLMkhIIyckIjBWZVdlYVlhV1dhWWVXZWgIlpaWlick
JCQkIiAkJCQjHzBYYVdZYVlhZVdhV2FXaAiWlpaWIiIiIiIiIiIiIiIiIjFuXWFhWWFhV2VXZVloCJaW
lpYvLy8vLy8vLy8vLy8vL0J0WVlhWVllV2FXYWgIlpaWlkBAQEBAQEBAPz9AQEBAbXt3Y11hYVdhV2Fh
aAiWlpaWQEBAQEA7Ozs/Pz9AQGyCe3t9b1lXYVllWWFoCJaWlpYsLS0uM0NDOztAQDlre357d359c1pZ
YVdXYWgIlpaWlpaWlpYShIA6QDo5an17fnt+d3t9e2NZYWFZaAiWlpaWlpaWlg6EezpANUx9e3t3fnd+
fn19e29XWWFoCJaWlpaWlpaWDoSANTpLfXt+fn53fnd+e3t7gHNdXWgIlpaWlpaWlpYRgHs0Sn50d3d3
d3d3d3R3d3d3d3ZkaQiWlpaWlpaWlhNhXUddV1dXV1dXV1lXV1dXV1dXWVdmCJaWlpaWlpaWGRcQFA8P
EBAQEBQNEBAQEBAQEA8QEBcYlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaW
lpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaW
lpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaW
lpb/////wAAAA8AAAAPgAAIH4ABGB//AA///wAP///Af//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADwAA
AA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//////////////
/////////////ygAAAAwAAAAYAAAAAEACAAAAAAAAAkAAAAAAAAAAAAAAAEAAAABAABORjYAZlxGAGNZ
QwBkXEQAYVdDAGRaRABmWkQAZFxEAGZcRQBmXEYAaF5HAGZcRgBmXEYAa2BJAHltUwB6blQAe29VAHxu
VAB8cFYAf3NZAE5GNgBkXEQAa2FKAB66agBmXEYAd2tSAHltUwBmXEYAZlxGAGZcRwCupJAArqSQALGk
kACdknwAnZV8ABO6aAAXumgAGbppABq6aQAbu2oAGbxqABy6aAAeumgAHrtqABy8aAAcvGoAHrxqACC8
awAivG0AJb5wACm/cgA6o2MAKcBxAEyzdgBSuHoAQMN7AB68agAcvGoANdSFADfWhwA11ocALdSFADHU
hgAy1IYAMtaFADXUhQA01IcANdSHADXWhQA11ocAN9aFADfWhwA11YgAN9WJADrVigA81osAP9aMAELX
jQBG2Y8AVtmUAGLNiwBnzpAAeuClAIZ5XACNgWkAkYNlAJaHaACSk28AqJh1AKqadwCtnXoAoqB7AK+g
fACxoHwAs6F9ALWjfwCupJAArqSUAK6kkACvpZEArqSUALKokQCyqJQApJmEAKechwC4o4IAvKqEAL2x
mAC9sJsAvbKbAL21ngCJ0I4Ai9GVAJXdnQCd05MAjtilAJjksQCb5bQApdeYAKvZmgCz2p0AudufAK7e
oAC/3KEAteq8ALvtxADAsJsAyN2jANLepQDX4q8A3ee9APvjsQD747IA++OzAPvltwD947EA/eOyAP3l
sQD95bMA/+WzAP3mtgD75bgA/+W5AP/oswD96LYA/+i2AP/puQDB7scAx+/JAM3vzADV8M4A3fHQAOLs
zwDh7NQA4fLSAOby1ADq89YA6PTVAPvowAD76MEA/evEAP7x0AD+8dEA/vHSAP7y0gD/8tUA//PVAP7z
2wD+9NsA/vXbAP713AD/9d4A/vbeAP/23gD/9eEA/vfhAP734wD/9eQA//jkAHpuVACup5AAd2hOAHVp
TwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3GAwMDAMMDAwMBAQMDAMDAwMDAwMDBAwMDAMK
AwMEAwMDAwMDAwMDDAwAt7e3t7e3Dg0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0ODQ0NDQ0NDQ0N
DQ0Kt7e3t7e3U1NTDw8PDw8PHlNTUw8PDx9THxMTEx4PD1NTEh9TVw8PDw8PDw8PDxITt7e3t7e3tyB/
Z2dnZ2dnZ2d/aGdnaGhsaGhoZ2doZ25oaGhotyFoZ2dnZ2hnaCC1t7e3t7e3t7UeVGIeHmIeACIfZyFT
Zx4eZ2JiZxRnU7RiYlQCt7RiYiBiYiBiYrS3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3GwAZGBgYGBgYGBgYGBgYGQAbt7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3DB0NCggKCAoKCAgICAgKCQAMt7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3tFMTEhISEhISExKzt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
txsEBAQEBAQEBBu3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3txQAAAAAAAAAABS3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3FQUFBQUFBQUJCQgJCAgJCAkJBQUFBQUFCg0FBQUFBQUFBQUV
t7e3t7e3t7e3t7e3ElRZWVdaWVhYWFhYWFhYWFhYWFhYWFhZWFhYWFhYWVlYWVMHt7e3t7e3t7e3t7e3
E26mkm9ykYmJioqKioqKioqKioqKioqKioqKioqKioqKil4Ft7e3t7e3t7e3t7e3Em2vrXAjdpGKiYmJ
iYmJiYmJiYmJiYmJiYmJiYmJiYmJklwFt7e3t7e3t7e3t7e3DmyxsnMoJHeRiomJiYmJiYmJiYmJiYmJ
iYmJiYmJiYmJilwFt7e3t7e3t7e3t7e3Em2xsXMoLiR4kYWKiYmJiYmJiYmJiYmJiYmJiYmJiYmKkl0F
t7e3t7e3t7e3t7e3D2yxsXMoLiwkeZCKioqJiYmJiYmJiYmJiYmJiYmJiYmKkFoFt7e3t7e3t7e3t7e3
EmyxsXMoLi4kLn+KiomJiYmJiYmJiYmJiYmJiYmJiYmJkF0Ft7e3t7e3t7e3t7e3Dn6ysnMuLi4uKSl/
kYqJiYmJiYmJiYmJiYmJiYmJiYmJkF0Ft7e3t7e3OBcXFxc5MzZRUTcuLi4uLiwwgJGJiYmJiYmJiYmJ
iYmJiYmJiYmJkF0Kt7e3t7e3KS8uLi4uLi4oKSkuLi4uLi4sMIGJiYmJiYmJiYmJiYmJiYmJiYmJkGgK
t7e3t7e3Ly4uLi4uLi4uLi4uLi4uLi4uKTGCioiJiYmJiYmJiYmJiYmJiYmJkFwFt7e3t7e3KS4uLi4u
Li4uLi4uLi4uLi4uLik0mYqIiYmJiYmJiYmJiYmJiYmJkFwFt7e3t7e3KSkpKSkpKSkpKSkpKSkuLCkp
KSkpNJmghImJiYmJiYmJiYmJiYmJkFwFt7e3t7e3RkZKREZKRERGRkZKRkpEREpGRkpETpyypISIiYmJ
iYmJiYmJiYmJkFwFt7e3t7e3QkZGRkZGRkZGRkZGRkZGREZGRkJNnLKusq2NiYmJiYmJiYmJiYmJkFwF
t7e3t7e3RERGRkZGRkZGRkZGRkZGRkZGREubsq6urq+vn4iJiYmJiYmJiYmJkFwFt7e3t7e3SUZGRkZE
SURBQkJGRkZGRkRES5qyrq6urq6ysaSEiImJiYmJiYmJkFwJt7e3t7e3Ojs7Ozs8NVBSUk9ERkZGRkRK
l7Gurq6urq6urrKojYmJiYmJiYmJkFwJt7e3t7e3t7e3t7e3EWyysnVERkZGREmWsq6urq6urq6urq6y
r5+DiYmJiYmJkVwFt7e3t7e3t7e3t7e3D2yxsXVERkZESZWyrq6urq6urq6urq6usrGhhIOJiYmJkVwF
t7e3t7e3t7e3t7e3EmyxsXVERERClLGurq6urq6urq6urq6urq6vqIWJiYmKkFwFt7e3t7e3t7e3t7e3
Dm2xsXVERECTsa6urq6urq6urq6urq6urq6usq6fiYmKkFwFt7e3t7e3t7e3t7e3Dm2ysnVAQH2yrq6u
rq6urq6urq6urq6urq6urq6yoYSIilwFt7e3t7e3t7e3t7e3EmutrXQ9fK2nqKenp6enp62np6enp6en
p6etp6etraaKklwFt7e3t7e3t7e3t7e3EmqRkXF6ioqKioqKioqKiomJioqKioqKioqKioqKioqFkV4F
t7e3t7e3t7e3t7e3DlZfX1tpX15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eaVUFt7e3t7e3t7e3t7e3
Gg4SDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8ODhIODhIOEhIZt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3
t7e3t7e3t7e3t7e3t7e3t7e3////////AAD///////8AAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAPAA
AABABwAA8AAAAEAPAAD///////8AAP/+AAB//wAA//4AAH//AAD//8AD//8AAP//4Af//wAA///gB///
AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwA
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
wsOQABCEh/n/kzJOKq1u/QcAAAAASUVORK5CYII=
</value>
</data>
</root>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,329 @@
using Newtonsoft.Json.Linq;
using AssistClient.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
namespace AssistClient
{
public partial class FrmSysSetting : Form
{
public FrmSysSetting()
{
InitializeComponent();
}
private void initData()
{
string configPath = Application.StartupPath + "\\SysConfig.ini";
string lsTmp = "";
var comNameList = Utils.SSerialPort.getPortNames().ToList();
comNameList.ForEach(comName =>
{
this.cobLight_PortNum.Items.Add(comName);
});
//Server
this.txtDBConStr.Text = Util.ReadIniValue(configPath, "Server", "DBConStr");
this.txtServerIp.Text = Util.ReadIniValue(configPath, "Server", "ServerIP");
lsTmp = Util.ReadIniValue(configPath, "Server", "ServerPort");
if (Util.IsNumber(lsTmp))
this.numServerPort.Value = Convert.ToInt32(lsTmp);
//Skip
this.chkSkipAxis0.Checked = Util.ReadIniValue(configPath, "SKIP", "SkipAxis0") == "1";
this.chkSkipAxis1.Checked = Util.ReadIniValue(configPath, "SKIP", "SkipAxis1") == "1";
this.chkSkipAxis2.Checked = Util.ReadIniValue(configPath, "SKIP", "SkipAxis2") == "1";
this.chkSkipAxis3.Checked = Util.ReadIniValue(configPath, "SKIP", "SkipAxis3") == "1";
this.chkSkipLight.Checked = Util.ReadIniValue(configPath, "SKIP", "SkipLight") == "1";
this.chkSkipScannerCC.Checked = Util.ReadIniValue(configPath, "SKIP", "SkipScannerCC") == "1";
//DEV
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis0_PulseOutMode");
EnumUtil.BindToEnumName<AxisPulseOutMode>(this.cobAxis0PulseOutMode, typeof(AxisPulseOutMode), lsTmp == "" ? AxisPulseOutMode.O_CW_CCW : (AxisPulseOutMode)Convert.ToInt32(lsTmp));
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis1_PulseOutMode");
EnumUtil.BindToEnumName<AxisPulseOutMode>(this.cobAxis1PulseOutMode, typeof(AxisPulseOutMode), lsTmp == "" ? AxisPulseOutMode.O_CW_CCW : (AxisPulseOutMode)Convert.ToInt32(lsTmp));
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis2_PulseOutMode");
EnumUtil.BindToEnumName<AxisPulseOutMode>(this.cobAxis2PulseOutMode, typeof(AxisPulseOutMode), lsTmp == "" ? AxisPulseOutMode.O_CW_CCW : (AxisPulseOutMode)Convert.ToInt32(lsTmp));
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis3_PulseOutMode");
EnumUtil.BindToEnumName<AxisPulseOutMode>(this.cobAxis3PulseOutMode, typeof(AxisPulseOutMode), lsTmp == "" ? AxisPulseOutMode.O_CW_CCW : (AxisPulseOutMode)Convert.ToInt32(lsTmp));
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis0_HomeMode");
EnumUtil.BindToEnumName<AxitHomeMode>(this.cobAxis0HomeMode, typeof(AxitHomeMode), lsTmp == "" ? AxitHomeMode.MODE11_LmtSearch_Ref : (AxitHomeMode)Convert.ToInt32(lsTmp));
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis1_HomeMode");
EnumUtil.BindToEnumName<AxitHomeMode>(this.cobAxis1HomeMode, typeof(AxitHomeMode), lsTmp == "" ? AxitHomeMode.MODE11_LmtSearch_Ref : (AxitHomeMode)Convert.ToInt32(lsTmp));
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis2_HomeMode");
EnumUtil.BindToEnumName<AxitHomeMode>(this.cobAxis2HomeMode, typeof(AxitHomeMode), lsTmp == "" ? AxitHomeMode.MODE11_LmtSearch_Ref : (AxitHomeMode)Convert.ToInt32(lsTmp));
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis3_HomeMode");
EnumUtil.BindToEnumName<AxitHomeMode>(this.cobAxis3HomeMode, typeof(AxitHomeMode), lsTmp == "" ? AxitHomeMode.MODE11_LmtSearch_Ref : (AxitHomeMode)Convert.ToInt32(lsTmp));
this.cobLight_PortNum.Text = "COM" + Util.ReadIniValue(configPath, "DEV", "Light_PortNum");
this.cobAxis0HomeDir.SelectedIndex = Convert.ToInt32(Util.ReadIniValue(configPath, "DEV", "Axis0_HomeDir"));
this.cobAxis1HomeDir.SelectedIndex = Convert.ToInt32(Util.ReadIniValue(configPath, "DEV", "Axis1_HomeDir"));
this.cobAxis2HomeDir.SelectedIndex = Convert.ToInt32(Util.ReadIniValue(configPath, "DEV", "Axis2_HomeDir"));
this.cobAxis3HomeDir.SelectedIndex = Convert.ToInt32(Util.ReadIniValue(configPath, "DEV", "Axis3_HomeDir"));
#region HOME速度
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis_HomeVelLow");
if (!string.IsNullOrWhiteSpace(lsTmp))
{
JArray Axis_HomeVelLow = JArray.Parse(lsTmp);
this.numAxis0HomeVelLow.Value = Axis_HomeVelLow.Count > 0 ? (decimal)Axis_HomeVelLow[0] : 0;
this.numAxis1HomeVelLow.Value = Axis_HomeVelLow.Count > 1 ? (decimal)Axis_HomeVelLow[1] : 0;
this.numAxis2HomeVelLow.Value = Axis_HomeVelLow.Count > 2 ? (decimal)Axis_HomeVelLow[2] : 0;
this.numAxis3HomeVelLow.Value = Axis_HomeVelLow.Count > 3 ? (decimal)Axis_HomeVelLow[3] : 0;
}
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis_HomeVelHigh");
if (!string.IsNullOrWhiteSpace(lsTmp))
{
JArray Axis_HomeVelHigh = JArray.Parse(lsTmp);
this.numAxis0HomeVelHigh.Value = Axis_HomeVelHigh.Count > 0 ? (decimal)Axis_HomeVelHigh[0] : 0;
this.numAxis1HomeVelHigh.Value = Axis_HomeVelHigh.Count > 1 ? (decimal)Axis_HomeVelHigh[1] : 0;
this.numAxis2HomeVelHigh.Value = Axis_HomeVelHigh.Count > 2 ? (decimal)Axis_HomeVelHigh[2] : 0;
this.numAxis3HomeVelHigh.Value = Axis_HomeVelHigh.Count > 3 ? (decimal)Axis_HomeVelHigh[3] : 0;
}
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis_HomeAcc");
if (!string.IsNullOrWhiteSpace(lsTmp))
{
JArray Axis_HomeAcc = JArray.Parse(lsTmp);
this.numAxis0HomeAcc.Value = Axis_HomeAcc.Count > 0 ? (decimal)Axis_HomeAcc[0] : 0;
this.numAxis1HomeAcc.Value = Axis_HomeAcc.Count > 1 ? (decimal)Axis_HomeAcc[1] : 0;
this.numAxis2HomeAcc.Value = Axis_HomeAcc.Count > 2 ? (decimal)Axis_HomeAcc[2] : 0;
this.numAxis3HomeAcc.Value = Axis_HomeAcc.Count > 3 ? (decimal)Axis_HomeAcc[3] : 0;
}
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis_HomeDec");
if (!string.IsNullOrWhiteSpace(lsTmp))
{
JArray Axis_HomeDec = JArray.Parse(lsTmp);
this.numAxis0HomeDec.Value = Axis_HomeDec.Count > 0 ? (decimal)Axis_HomeDec[0] : 0;
this.numAxis1HomeDec.Value = Axis_HomeDec.Count > 1 ? (decimal)Axis_HomeDec[1] : 0;
this.numAxis2HomeDec.Value = Axis_HomeDec.Count > 2 ? (decimal)Axis_HomeDec[2] : 0;
this.numAxis3HomeDec.Value = Axis_HomeDec.Count > 3 ? (decimal)Axis_HomeDec[3] : 0;
}
#endregion
#region JOG速度
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis_JogVelLow");
if (!string.IsNullOrWhiteSpace(lsTmp))
{
JArray Axis_JogVelLow = JArray.Parse(lsTmp);
this.numAxis0JogVelLow.Value = Axis_JogVelLow.Count > 0 ? (decimal)Axis_JogVelLow[0] : 0;
this.numAxis1JogVelLow.Value = Axis_JogVelLow.Count > 1 ? (decimal)Axis_JogVelLow[1] : 0;
this.numAxis2JogVelLow.Value = Axis_JogVelLow.Count > 2 ? (decimal)Axis_JogVelLow[2] : 0;
this.numAxis3JogVelLow.Value = Axis_JogVelLow.Count > 3 ? (decimal)Axis_JogVelLow[3] : 0;
}
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis_JogVelHigh");
if (!string.IsNullOrWhiteSpace(lsTmp))
{
JArray Axis_JogVelHigh = JArray.Parse(lsTmp);
this.numAxis0JogVelHigh.Value = Axis_JogVelHigh.Count > 0 ? (decimal)Axis_JogVelHigh[0] : 0;
this.numAxis1JogVelHigh.Value = Axis_JogVelHigh.Count > 1 ? (decimal)Axis_JogVelHigh[1] : 0;
this.numAxis2JogVelHigh.Value = Axis_JogVelHigh.Count > 2 ? (decimal)Axis_JogVelHigh[2] : 0;
this.numAxis3JogVelHigh.Value = Axis_JogVelHigh.Count > 3 ? (decimal)Axis_JogVelHigh[3] : 0;
}
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis_JogAcc");
if (!string.IsNullOrWhiteSpace(lsTmp))
{
JArray Axis_JogAcc = JArray.Parse(lsTmp);
this.numAxis0JogAcc.Value = Axis_JogAcc.Count > 0 ? (decimal)Axis_JogAcc[0] : 0;
this.numAxis1JogAcc.Value = Axis_JogAcc.Count > 1 ? (decimal)Axis_JogAcc[1] : 0;
this.numAxis2JogAcc.Value = Axis_JogAcc.Count > 2 ? (decimal)Axis_JogAcc[2] : 0;
this.numAxis3JogAcc.Value = Axis_JogAcc.Count > 3 ? (decimal)Axis_JogAcc[3] : 0;
}
lsTmp = Util.ReadIniValue(configPath, "DEV", "Axis_JogDec");
if (!string.IsNullOrWhiteSpace(lsTmp))
{
JArray Axis_JogDec = JArray.Parse(lsTmp);
this.numAxis0JogDec.Value = Axis_JogDec.Count > 0 ? (decimal)Axis_JogDec[0] : 0;
this.numAxis1JogDec.Value = Axis_JogDec.Count > 1 ? (decimal)Axis_JogDec[1] : 0;
this.numAxis2JogDec.Value = Axis_JogDec.Count > 2 ? (decimal)Axis_JogDec[2] : 0;
this.numAxis3JogDec.Value = Axis_JogDec.Count > 3 ? (decimal)Axis_JogDec[3] : 0;
}
#endregion
this.txtIO_DevNum.Text = Util.ReadIniValue(configPath, "DEV", "IOCard_DeviceNum");
this.txtSizeEnginePath.Text= Util.ReadIniValue(configPath, "DEV", "SizeEnginePath");
this.txtSizeBmp_Path.Text= Util.ReadIniValue(configPath, "DEV", "SizeBmp_Path");
this.ckbSizeBmp_IsSave.Checked = (Util.ReadIniValue(configPath, "DEV", "SizeBmp_IsSave") == "1");
this.txtSizeRepairTable.Text = Util.ReadIniValue(configPath, "DEV", "SizeRepairTablePath");
//LOG
this.txtLogPath.Text = Util.ReadIniValue(configPath, "LOG", "LogPath");
}
private void FrmSetParams_Load(object sender, EventArgs e)
{
initData();
}
private void tsbtnSave_Click(object sender, EventArgs e)
{
try
{
string configPath = Application.StartupPath + "\\SysConfig.ini";
//DEV
string Light_PortNum = this.cobLight_PortNum.Text.Trim();
if (Light_PortNum == "" )
throw new Exception("请设置设备COM端口");
string IOCard_DeviceNum = this.txtIO_DevNum.Text.Trim();
if (IOCard_DeviceNum == "")
throw new Exception("请设置I/O设备编号 ");
//LOG
string LogPath = this.txtLogPath.Text.Trim();
if (LogPath == "")
throw new Exception("请设置日志保存路径 ");
//最后统一保存
//Skip
Util.WriteIniValue(configPath, "SKIP", "SkipAxis0", this.chkSkipAxis0.Checked ? "1" : "0");
Util.WriteIniValue(configPath, "SKIP", "SkipAxis1", this.chkSkipAxis1.Checked ? "1" : "0");
Util.WriteIniValue(configPath, "SKIP", "SkipAxis2", this.chkSkipAxis2.Checked ? "1" : "0");
Util.WriteIniValue(configPath, "SKIP", "SkipAxis3", this.chkSkipAxis3.Checked ? "1" : "0");
Util.WriteIniValue(configPath, "SKIP", "SkipLight", this.chkSkipLight.Checked ? "1" : "0");
//Util.WriteIniValue(configPath, "SKIP", "SkipScannerGL", this.chkSkipScannerGL.Checked ? "1" : "0");
Util.WriteIniValue(configPath, "SKIP", "SkipScannerCC", this.chkSkipScannerCC.Checked ? "1" : "0");
Utils.Util.WriteIniValue(configPath, "DEV", "Light_PortNum", Light_PortNum.Substring(3));
//DEV
Utils.Util.WriteIniValue(configPath, "DEV", "Axis0_PulseOutMode", ((int)EnumUtil.GetSelectedItemToEnum<AxisPulseOutMode>(this.cobAxis0PulseOutMode)).ToString());
Utils.Util.WriteIniValue(configPath, "DEV", "Axis1_PulseOutMode", ((int)EnumUtil.GetSelectedItemToEnum<AxisPulseOutMode>(this.cobAxis1PulseOutMode)).ToString());
Utils.Util.WriteIniValue(configPath, "DEV", "Axis2_PulseOutMode", ((int)EnumUtil.GetSelectedItemToEnum<AxisPulseOutMode>(this.cobAxis2PulseOutMode)).ToString());
Utils.Util.WriteIniValue(configPath, "DEV", "Axis3_PulseOutMode", ((int)EnumUtil.GetSelectedItemToEnum<AxisPulseOutMode>(this.cobAxis3PulseOutMode)).ToString());
Utils.Util.WriteIniValue(configPath, "DEV", "Axis0_HomeMode", ((int)EnumUtil.GetSelectedItemToEnum<AxitHomeMode>(this.cobAxis0HomeMode)).ToString());
Utils.Util.WriteIniValue(configPath, "DEV", "Axis1_HomeMode", ((int)EnumUtil.GetSelectedItemToEnum<AxitHomeMode>(this.cobAxis1HomeMode)).ToString());
Utils.Util.WriteIniValue(configPath, "DEV", "Axis2_HomeMode", ((int)EnumUtil.GetSelectedItemToEnum<AxitHomeMode>(this.cobAxis2HomeMode)).ToString());
Utils.Util.WriteIniValue(configPath, "DEV", "Axis3_HomeMode", ((int)EnumUtil.GetSelectedItemToEnum<AxitHomeMode>(this.cobAxis3HomeMode)).ToString());
Utils.Util.WriteIniValue(configPath, "DEV", "Axis0_HomeDir", this.cobAxis0HomeDir.SelectedIndex.ToString());
Utils.Util.WriteIniValue(configPath, "DEV", "Axis1_HomeDir", this.cobAxis1HomeDir.SelectedIndex.ToString());
Utils.Util.WriteIniValue(configPath, "DEV", "Axis2_HomeDir", this.cobAxis2HomeDir.SelectedIndex.ToString());
Utils.Util.WriteIniValue(configPath, "DEV", "Axis3_HomeDir", this.cobAxis3HomeDir.SelectedIndex.ToString());
#region HOME速度
JArray Axis_HomeVelLow = new JArray()
{
numAxis0HomeVelLow.Value,numAxis1HomeVelLow.Value,numAxis2HomeVelLow.Value,numAxis3HomeVelLow.Value
};
Utils.Util.WriteIniValue(configPath, "DEV", "Axis_HomeVelLow", Axis_HomeVelLow.ToString().Replace("\r\n",""));
JArray Axis_HomeVelHigh = new JArray()
{
numAxis0HomeVelHigh.Value,numAxis1HomeVelHigh.Value,numAxis2HomeVelHigh.Value,numAxis3HomeVelHigh.Value
};
Utils.Util.WriteIniValue(configPath, "DEV", "Axis_HomeVelHigh", Axis_HomeVelHigh.ToString().Replace("\r\n", ""));
JArray Axis_HomeAcc = new JArray()
{
numAxis0HomeAcc.Value,numAxis1HomeAcc.Value,numAxis2HomeAcc.Value,numAxis3HomeAcc.Value
};
Utils.Util.WriteIniValue(configPath, "DEV", "Axis_HomeAcc", Axis_HomeAcc.ToString().Replace("\r\n", ""));
JArray Axis_HomeDec = new JArray()
{
numAxis0HomeDec.Value,numAxis1HomeDec.Value,numAxis2HomeDec.Value,numAxis3HomeDec.Value
};
Utils.Util.WriteIniValue(configPath, "DEV", "Axis_HomeDec", Axis_HomeDec.ToString().Replace("\r\n", ""));
#endregion
#region Jog速度
JArray Axis_JogVelLow = new JArray()
{
numAxis0JogVelLow.Value,numAxis1JogVelLow.Value,numAxis2JogVelLow.Value,numAxis3JogVelLow.Value
};
Utils.Util.WriteIniValue(configPath, "DEV", "Axis_JogVelLow", Axis_JogVelLow.ToString().Replace("\r\n", ""));
JArray Axis_JogVelHigh = new JArray()
{
numAxis0JogVelHigh.Value,numAxis1JogVelHigh.Value,numAxis2JogVelHigh.Value,numAxis3JogVelHigh.Value
};
Utils.Util.WriteIniValue(configPath, "DEV", "Axis_JogVelHigh", Axis_JogVelHigh.ToString().Replace("\r\n", ""));
JArray Axis_JogAcc = new JArray()
{
numAxis0JogAcc.Value,numAxis1JogAcc.Value,numAxis2JogAcc.Value,numAxis3JogAcc.Value
};
Utils.Util.WriteIniValue(configPath, "DEV", "Axis_JogAcc", Axis_JogAcc.ToString().Replace("\r\n", ""));
JArray Axis_JogDec = new JArray()
{
numAxis0JogDec.Value,numAxis1JogDec.Value,numAxis2JogDec.Value,numAxis3JogDec.Value
};
Utils.Util.WriteIniValue(configPath, "DEV", "Axis_JogDec", Axis_JogDec.ToString().Replace("\r\n", ""));
#endregion
Utils.Util.WriteIniValue(configPath, "DEV", "IOCard_DeviceNum", IOCard_DeviceNum);
Utils.Util.WriteIniValue(configPath, "DEV", "SizeEnginePath", this.txtSizeEnginePath.Text.Trim());
Utils.Util.WriteIniValue(configPath, "DEV", "SizeBmp_Path", this.txtSizeBmp_Path.Text.Trim());
Utils.Util.WriteIniValue(configPath, "DEV", "SizeBmp_IsSave", this.ckbSizeBmp_IsSave.Checked?"1":"0");
Utils.Util.WriteIniValue(configPath, "DEV", "SizeRepairTablePath", this.txtSizeRepairTable.Text.Trim());
//
Utils.Util.WriteIniValue(configPath, "Server", "DBConStr", this.txtDBConStr.Text.Trim());
Utils.Util.WriteIniValue(configPath, "Server", "ServerIP", this.txtServerIp.Text.Trim());
Utils.Util.WriteIniValue(configPath, "Server", "ServerPort", ((int)this.numServerPort.Value).ToString());
//LOG
Utils.Util.WriteIniValue(configPath, "LOG", "LogPath", LogPath);
//
this.Hide();
MessageBox.Show("保存成功,生效需重启程序!");
this.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void tsbtnClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void txtLogPath_Click(object sender, EventArgs e)
{
this.txtLogPath.Text = FileUtil.selectFolder(Application.StartupPath);
}
private void txtSizeEnginePath_Click(object sender, EventArgs e)
{
this.txtSizeEnginePath.Text = FileUtil.selectFolder(Application.StartupPath);
}
private void txtSizeRepairTable_Click(object sender, EventArgs e)
{
this.txtSizeRepairTable.Text = FileUtil.openFile();
}
private void txtSizeBmp_Path_Click(object sender, EventArgs e)
{
this.txtSizeBmp_Path.Text = FileUtil.selectFolder(Application.StartupPath);
}
private void btnInitDB_Click(object sender, EventArgs e)
{
try
{
Service.InitDB.initDB( false);
MessageBox.Show("成功!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}

View File

@ -0,0 +1,161 @@
<?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="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="tsbtnSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAIfSURBVFhH7ZdPS9xAGMZfKUiFiuAXKFXqRfBmi8U/F1Hr
wdseRGxqZiaZN60H8Rt4K+2l0g/QVrEFwS/gTfRoFTz02Jt4rhQrpdV3htlspju7m8kGQfCBH9mdmffJ
s5M32V24k0MdECXjxExhuJwGngwaPw9VKp3A4l0QeFUKHNeMc04JHK4zaZ9J455DXI6lhQx/0Cf4DCLe
8Ed+ghC/a5+XeApR1GPO0EJRMpoG4PjRjBYTl29SLyG3zWgLZQMIuWVGi0nI9ZqX9gvMTBNlAzD8Ykbz
i+ES7VykX3N8bwWYx18QJg/1XEO1E2BlpYvq/ulaJY7vUq8qYXxAMx163ql2AoRhN9X9JC70ey7fpl4W
clXPO2X1AG6a0XxKkgcwO/dX1ypZTWixo+edsgM0WdhA+rY1zSvwQ8arRtOdtQOo7XxmZvzEcIhqzzJe
NTwCKFRTnRDf6AFz1Bpax/EYguCPqa/HM0D53M4AQXBeiOpdkcUrgDIR8jkw1luIOH5MPvuWp98OUGO1
K4GJ5el5CS6pq5dBJE+9YfET8ptJv5ar3M4mLBPPABd0CV4AfzWgG0od86LWR9EIMHloed58E0q0PL13
QMhFEKIflrBPH/9Hjbvgrx9RPf3I1Y/onAGyP0pt1HeCH66HkEZ+NWdzSN06zqIyaRYgCO7Tor36opJY
WPhNuzxtztZAlco9WjxB/eD+21UUgVO6L+5kCeAaOZxlqQnAQFgAAAAASUVORK5CYII=
</value>
</data>
<data name="tsbtnClose.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAJQSURBVFhHxZfNctNAEIQFb0UuYEu8DFwoiOwrVPGbFPAE
vKhjV9huzSiz69aubA501XfwuGdms7ORtV3S8/9M/qHQs0T8/l9ArVKIzwbqMA4vj2P/5rDb3FgIcs+1
UIfb/sVx//rtw4f+lYUoGLi609j/ftwPj85p139B3FQWXQuFWnnt4Y99NZmwqmiYjfvhK12TyuItKNRQ
tR/G7Qbf03jcbd8pE7hyJ6jyL4+gJzw0Yz7K5JxuL9oJCjmqloOe8CFhOgOV1YLTuP0Gn6ls6lDwqhpO
3NU8cWFeTkr8blYoNn6qkTwq1ynOlSxQ3wm9CKrZ/Pw8zQXyQq2dGIcfZp2FmPI6C/9RWfM5CDXnOPb3
ZsUz5F55nMr5yT5EqPY8+49AfecsjGzuUwYiVGsRNRrN2UMFI1RrvorinKjaQAZLqLTV1TlH4LU0SNV0
ZFBBteYN4DE7pGpFZFBBpZl+Uk0j8JgdUrUiMlhCpZ/QX6qhAl5Lg1RNRwYj1CXNnZWLkEGHSjPNXlQu
AblWBpI9VBBQreaYd+tcNBZxFmAQSv/HP1VBJ25xa0SoZVYo6xU/MAClVdef7fl8qeYi9LNBNN8Nd6qA
s7ClVHtkw51ZIeYVBVo/qfV5Qs1FpB5mpZA4vZLt+88qwUmJS3OMUPCqGg56mXVKOrzf3CijkxLWPtsB
hRxVy0FP+JhQfy0/m9saqNp5yl7LKxeTNT+pS1BL58qvaE/GdF2KhvSaNc8pqSy+Fgq1strF1Ww24rqE
C6TPxxQLXgOFmryc2pWs67ruL9BDjecFstIGAAAAAElFTkSuQmCC
</value>
</data>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>166, 17</value>
</metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>56</value>
</metadata>
</root>

View File

@ -0,0 +1,70 @@
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AssistClient
{
internal static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Thread.Sleep(500);
Process instance = RunningInstance();
if (instance == null)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Config.LoadAllConfig();
while (string.IsNullOrWhiteSpace(Config.DBConStr))
{
Application.Run(new FrmSysSetting());
Config.LoadAllConfig();
}
Service.InitDB.ConnectionString = Config.DBConStr;
//Application.Run(new Form1());
Application.Run(new FrmLogin());
}
else
{
MessageBox.Show("当前程序已经运行!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, 0);
}
}
//不允许有两个程序同时启动
public static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
//遍历正在有相同名字运行的例程
foreach (Process process in processes)
{
//忽略现有的例程
if (process.Id != current.Id)
{
//确保例程从EXE文件运行
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") ==
current.MainModule.FileName)
{
//返回另一个例程实例
return process;
}
}
}
//没有其它的例程返回Null
return null;
}
}
}

View File

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

View File

@ -0,0 +1,103 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace AssistClient.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("AssistClient.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;
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap down {
get {
object obj = ResourceManager.GetObject("down", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap left {
get {
object obj = ResourceManager.GetObject("left", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap right {
get {
object obj = ResourceManager.GetObject("right", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap up {
get {
object obj = ResourceManager.GetObject("up", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View File

@ -0,0 +1,133 @@
<?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.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="down" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="left" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\left.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="right" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\right.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="up" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\up.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace AssistClient.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;
}
}
}
}

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>

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC 清单选项
如果想要更改 Windows 用户帐户控制级别,请使用
以下节点之一替换 requestedExecutionLevel 节点。n
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
指定 requestedExecutionLevel 元素将禁用文件和注册表虚拟化。
如果你的应用程序需要此虚拟化来实现向后兼容性,则删除此
元素。
-->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
<applicationRequestMinimum>
<defaultAssemblyRequest permissionSetReference="Custom" />
<PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
</applicationRequestMinimum>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- 设计此应用程序与其一起工作且已针对此应用程序进行测试的
Windows 版本的列表。取消评论适当的元素,
Windows 将自动选择最兼容的环境。 -->
<!-- Windows Vista -->
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
<!-- Windows 7 -->
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
<!-- Windows 8 -->
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
<!-- Windows 8.1 -->
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
<!-- Windows 10 -->
<!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
</application>
</compatibility>
<!-- 指示该应用程序可感知 DPI 且 Windows 在 DPI 较高时将不会对其进行
自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI无需
选择加入。选择加入此设置的 Windows 窗体应用程序(面向 .NET Framework 4.6)还应
在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"。
将应用程序设为感知长路径。请参阅 https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation -->
<!--
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
-->
<!-- 启用 Windows 公共控件和对话框的主题(Windows XP 和更高版本) -->
<!--
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
-->
</assembly>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -0,0 +1,116 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Advantech.Motion;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using AssistClient.UI.PropExtend;
using static AssistClient.UI.UIAxisDev;
namespace AssistClient.UI
{
//[TypeConverter(typeof(PropertySorter))] //此属性使类无法序列化和反序列化
public class AxisDevProp
{
[PropertyOrder(1), Browsable(true), Category("1 设备"), DisplayName("1.1 设置编号"), Description("设置编号"), ReadOnly(true), JsonIgnore]
public string DeviceNum { get; set; }
[PropertyOrder(1), Browsable(true), Category("1 设备"), DisplayName("1.2 轴索引"), Description("轴索引")]
public AxisName AxisIndex { get; set; }
//[PropertyOrder(2), Browsable(true), Category("设备"), DisplayName("类型"), Description("类型")]
//public AxisType DeviceType { get; set; }
//[PropertyOrder(2), Browsable(true), Category("设备"), DisplayName("回原点模式"), Description("回原点模式"), ReadOnly(true), JsonIgnore]
//public AxitHomeMode HomeMode { get; set; }
//
[PropertyOrder(11), Browsable(true), Category("2 速度"), DisplayName("2.1 起始速度(mm/s)"), Description("起始速度")]
public double VelLow { get; set; }
[PropertyOrder(12), Browsable(true), Category("2 速度"), DisplayName("2.2 运行速度(mm/s)"), Description("运行速度")]
public double VelHigh { get; set; }
[PropertyOrder(13), Browsable(true), Category("2 速度"), DisplayName("2.3 加速度(mm/s)"), Description("加速度")]
public double Acc { get; set; }
[PropertyOrder(14), Browsable(true), Category("2 速度"), DisplayName("2.4 减速度(mm/s)"), Description("减速度")]
public double Dec { get; set; }
//
[PropertyOrder(21), Browsable(true), Category("3 位置"), DisplayName("3.1 运动模式"), Description("运动模式")]
public AxMoveMode MoveMode { get; set; } = AxMoveMode.MODE2_Rel;
[PropertyOrder(22), Browsable(true), Category("3 位置"), DisplayName("3.2 运动距离(mm)"), Description("移动量")]
public double Value { get; set; }
[PropertyOrder(23), Browsable(true), Category("3 位置"), DisplayName("3.3 命令位置(mm)"), Description("命令位置"), ReadOnly(true), JsonIgnore]
public double CmdPos { get; set; }
[PropertyOrder(24), Browsable(true), Category("3 位置"), DisplayName("3.4 反馈位置(mm)"), Description("实际/反馈位置"), ReadOnly(true), JsonIgnore]
public double ActualPos { get; set; }
[PropertyOrder(25), Browsable(true), Category("4 控制"), DisplayName("4.1 运行前Sleep(ms)"), Description("休息时间")]
public uint SleepPre { get; set; }
[PropertyOrder(26), Browsable(true), Category("4 控制"), DisplayName("4.2 运行后Sleep(ms)"), Description("休息时间")]
public uint SleepLater { get; set; }
[PropertyOrder(27), Browsable(true), Category("4 控制"), DisplayName("4.3 异步运行"), Description("非阻塞后续流程运行")]
public bool AsynRun { get; set; }
[PropertyOrder(28), Browsable(true), Category("4 控制"), DisplayName("4.4 禁用工序"), Description("禁用本工序")]
public bool Disable { get; set; }
//[PropertyOrder(27), Browsable(true), Category("模式"), DisplayName("脉冲输出模式"), Description("脉冲输出模式")]
//public AxisPulseOutMode PulseOutMode { get; set; } = AxisPulseOutMode.O_CW_CCW;
//
[PropertyOrder(31), Browsable(true), Category("5 状态"), DisplayName("5.1 轴状态"), Description("轴状态"), ReadOnly(true), JsonIgnore]
public AxisState AxState { get; set; }
[PropertyOrder(32), Browsable(false), Category("5 状态"), DisplayName("5.2 轴IO状态"), Description("轴IO状态"), ReadOnly(true), JsonIgnore]
public uint AxIOStatus { get; set; }
[PropertyOrder(33), Browsable(true), Category("5 状态"), DisplayName("5.2 轴运动状态"), Description("轴运动状态"), ReadOnly(true), JsonIgnore]
public uint AxMotionState { get; set; }
[PropertyOrder(35), Browsable(true), Category("5 状态"), DisplayName("5.3 ALM"), Description("轴IO状态"), ReadOnly(true), JsonIgnore]
public bool ALM { get; set; }
[PropertyOrder(35), Browsable(true), Category("5 状态"), DisplayName("5.4 EMG"), Description("轴IO状态"), ReadOnly(true), JsonIgnore]
public bool EMG { get; set; }
[PropertyOrder(36), Browsable(true), Category("5 状态"), DisplayName("5.5 LMT+"), Description("轴IO状态"), ReadOnly(true), JsonIgnore]
public bool LMTP { get; set; }
[PropertyOrder(37), Browsable(true), Category("5 状态"), DisplayName("5.6 LMT-"), Description("轴IO状态"), ReadOnly(true), JsonIgnore]
public bool LMTN { get; set; }
[PropertyOrder(38), Browsable(true), Category("5 状态"), DisplayName("5.7 ORG"), Description("轴IO状态"), ReadOnly(true), JsonIgnore]
public bool ORG { get; set; }
[PropertyOrder(38), Browsable(true), Category("5 状态"), DisplayName("5.8 EZ"), Description("轴EZ状态"), ReadOnly(true), JsonIgnore]
public bool EZ { get; set; }
[PropertyOrder(39), Browsable(true), Category("5 状态"), DisplayName("5.9 SVON"), Description("轴IO状态"), ReadOnly(true), JsonIgnore]
public bool SVON { get; set; }
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public string serialize()
{
return JsonConvert.SerializeObject(this);
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public void deserialize(string json)
{
var o = JsonConvert.DeserializeObject<AxisDevProp>(json);
Type type = o.GetType();
System.Reflection.PropertyInfo[] properties = type.GetProperties();
foreach (System.Reflection.PropertyInfo property in properties)
{
string name = property.Name;
if (!type.GetProperty(name).IsDefined(typeof(JsonIgnoreAttribute), true))
{
var value = property.GetValue(o);
this.GetType().GetProperty(name).SetValue(this, value);
}
}
}
}
}

View File

@ -0,0 +1,87 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Advantech.Motion;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using AssistClient.UI.PropExtend;
using static AssistClient.UI.UIAxisDev;
namespace AssistClient.UI
{
//[TypeConverter(typeof(PropertySorter))] //此属性使类无法序列化和反序列化
public class DefectLibProp
{
public DefectLibProp(Size cut_size, Size resize,float thresholds) {
CutSize = cut_size;
Resize=resize;
Thresholds = thresholds;
}
[PropertyOrder(1), Browsable(true), Category("1 数据"), DisplayName("源图"), JsonIgnore, Description("源图")]
public string BmpPath { get; set; }
[PropertyOrder(11), Browsable(true), Category("2 参数"), DisplayName("2.1 切割大小"), Description("切割大小")]
public Size CutSize { get;set; }
[PropertyOrder(12), Browsable(true), Category("2 参数"), DisplayName("2.2 重置大小"), Description("重置大小")]
public Size Resize { get; set; }
[PropertyOrder(13), Browsable(true), Category("2 参数"), DisplayName("2.3 阀值"), Description("阀值")]
public float Thresholds { get; set; }
[PropertyOrder(13), Browsable(true), Category("2 参数"), DisplayName("2.4 种类阀值"), Description("多个用半号逗号(,)或分号(;)分隔")]
public string ThresholdsClass { get; set; }
[PropertyOrder(13), Browsable(true), Category("2 参数"), DisplayName("2.5 种类个数"), Description("种类阀值的数量")]
public int ThresholdsClassCount { get; set; }
[PropertyOrder(15), Browsable(true), Category("3 结果"), DisplayName("结果"), JsonIgnore, Description("结果"), ReadOnly(true)]
public string InformationList { get; set; }
//public List<Dictionary<int, List<string>[]>> InformationList { get; set; }
[PropertyOrder(15), Browsable(true), Category("3 结果"), DisplayName("信息"), JsonIgnore, Description("信息"), ReadOnly(true)]
public string resultInfo { get; set; }
[PropertyOrder(91), Browsable(true), Category("4 阀值"), DisplayName("阀值上限"), Description("阀值上限")]
public double LimitThresholdVal { get; set; }
[PropertyOrder(92), Browsable(true), Category("4 阀值"), DisplayName("阀值下限"), Description("阀值下限")]
public double LowerThresholdVal { get; set; }
[PropertyOrder(25), Browsable(true), Category("5 控制"), DisplayName("5.1 运行前Sleep(ms)"), Description("休息时间")]
public uint SleepPre { get; set; }
[PropertyOrder(26), Browsable(true), Category("5 控制"), DisplayName("5.2 运行后Sleep(ms)"), Description("休息时间")]
public uint SleepLater { get; set; }
[PropertyOrder(27), Browsable(true), Category("5 控制"), DisplayName("5.4 禁用工序"), Description("禁用本工序")]
public bool Disable { get; set; }
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public string serialize()
{
return JsonConvert.SerializeObject(this);
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public void deserialize(string json)
{
var o= JsonConvert.DeserializeObject<DefectLibProp>(json);
Type type = o.GetType();
System.Reflection.PropertyInfo[] properties = type.GetProperties();
foreach (System.Reflection.PropertyInfo property in properties)
{
string name = property.Name;
if (!type.GetProperty(name).IsDefined(typeof(JsonIgnoreAttribute), true))
{
var value = property.GetValue(o);
this.GetType().GetProperty(name).SetValue(this, value);
}
}
}
}
}

View File

@ -0,0 +1,63 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Advantech.Motion;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using AssistClient.UI.PropExtend;
using static AssistClient.UI.UIAxisDev;
namespace AssistClient.UI
{
//[TypeConverter(typeof(PropertySorter))] //此属性使类无法序列化和反序列化
public class ForProp
{
[PropertyOrder(11), Browsable(false), Category("1 标识"), DisplayName("1.1 标识"), Description("标识"), ReadOnly(true)]
public long UniqueId { get; set; } = DateTime.Now.Ticks;
[PropertyOrder(11), Browsable(true), Category("1 控制"), DisplayName("1.1 跳转步骤"), Description("跳转步骤 1-n")]
public int GotoStepIndex { get; set; } = 1;
[PropertyOrder(12), Browsable(true), Category("1 控制"), DisplayName("1.2 循环次数"), Description("循环次数 1-n")]
public int LimitNum { get; set; } = 1;
[PropertyOrder(25), Browsable(true), Category("1 控制"), DisplayName("1.3 是否重置"), Description("达到循环次数后是否置0")]
public bool Reset { get; set; }
[PropertyOrder(27), Browsable(true), Category("1 控制"), DisplayName("1.4 禁用工序"), Description("禁用本工序")]
public bool Disable { get; set; }
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public string serialize()
{
return JsonConvert.SerializeObject(this);
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public void deserialize(string json)
{
var o= JsonConvert.DeserializeObject<ForProp>(json);
Type type = o.GetType();
System.Reflection.PropertyInfo[] properties = type.GetProperties();
foreach (System.Reflection.PropertyInfo property in properties)
{
string name = property.Name;
if (!type.GetProperty(name).IsDefined(typeof(JsonIgnoreAttribute), true))
{
var value = property.GetValue(o);
this.GetType().GetProperty(name).SetValue(this, value);
}
}
}
}
}

View File

@ -0,0 +1,67 @@
namespace AssistClient.UI
{
partial class FrmScannerShow
{
/// <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.pictureBox1 = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// pictureBox1
//
this.pictureBox1.Cursor = System.Windows.Forms.Cursors.Hand;
this.pictureBox1.Location = new System.Drawing.Point(12, 12);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(987, 662);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;
//
// FrmScannerShow
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1011, 686);
this.Controls.Add(this.pictureBox1);
this.Cursor = System.Windows.Forms.Cursors.Default;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.Name = "FrmScannerShow";
this.Text = "图像预览";
this.TopMost = true;
this.Load += new System.EventHandler(this.FrmScannerShow_Load);
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.PictureBox pictureBox1;
}
}

View File

@ -0,0 +1,139 @@
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 AssistClient.UI
{
public partial class FrmScannerShow : Form
{
public Action reDraw;
private Size size;
private double ratio = 1; // 图片的起始显示比例
private double ratioStep = 0.1;
private Size pic_size;
private int xPos;
private int yPos;
public IntPtr picHwnd
{
get { return this.pictureBox1.Handle; }
}
public FrmScannerShow(Size _size)
{
InitializeComponent();
this.Width = Screen.PrimaryScreen.WorkingArea.Width/3;
this.Location=new Point(0,0);
size = _size;
this.ClientSize = new Size(this.ClientSize.Width,
(int)(this.ClientSize.Width * (size.Height * 1.0f / size.Width)));
this.pictureBox1.Size = this.ClientSize;
this.pictureBox1.Location=new Point(0,0);
}
private void FrmScannerShow_Load(object sender, EventArgs e)
{
pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
pictureBox1.MouseWheel += new MouseEventHandler(pictureBox1_MouseWheel);
pictureBox1.MouseMove += pictureBox1_MouseMove;
pictureBox1.MouseDown += pictureBox1_MouseDown;
this.ActiveControl = this.pictureBox1; // 设置焦点
pic_size = this.pictureBox1.Size;
}
public void updateBmp(Bitmap bmp)
{
this.pictureBox1.Image = bmp;
}
private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
{
//Point pictureBoxPoint = this.PointToClient(Cursor.Position);
//this.Text = $"{e.X}:{e.Y}; {pictureBoxPoint.X}:{pictureBoxPoint.Y}; {pictureBox1.Left}:{pictureBox1.Top}; " +
// $"{this.pictureBox1.Width}:{this.pictureBox1.Height}; {this.Width}:{this.Height}; " +
// $"Cursor:{Cursor.Position.X}:{Cursor.Position.Y}";
if (e.Delta > 0)
{
ratio += ratioStep;
if (ratio > 100) // 放大上限
ratio = 100;
else
{
int x = (int)(pictureBox1.Left - e.X * (e.X * 1.0d / pictureBox1.Width * ratioStep) + 0.5);
int y = (int)(pictureBox1.Top - e.Y * (e.Y * 1.0d / pictureBox1.Height * ratioStep) + 0.5);
this.changePictureBoxSize(new Point(x, y), ratio);
}
}
else if (ratio - ratioStep >= 1)
{
ratio -= ratioStep;
//if (ratio < 0.1) // 放大下限
// ratio = 0.1;
//else
int x = (int)(pictureBox1.Left + e.X * (e.X * 1.0d / pictureBox1.Width * ratioStep) + 0.5);
int y = (int)(pictureBox1.Top + e.Y * (e.Y * 1.0d / pictureBox1.Height * ratioStep) + 0.5);
this.changePictureBoxSize(new Point(x, y), ratio);
}
}
private void changePictureBoxSize(Point location, double ratio)
{
var picSize = pictureBox1.Size;
picSize.Width = Convert.ToInt32(pic_size.Width * ratio);
picSize.Height = Convert.ToInt32(pic_size.Height * ratio);
pictureBox1.Size = picSize;
if (location.X > 0) location.X = 0;
if (location.Y > 0) location.Y = 0;
if (picSize.Width + location.X < this.ClientSize.Width) location.X = -(picSize.Width - this.ClientSize.Width);
if (picSize.Height + location.Y < this.ClientSize.Height) location.Y = -(picSize.Height - this.ClientSize.Height);
//Point location = new Point();
//location.X = (this.ClientSize.Width - this.pictureBox1.Width) / 2;
//location.Y = (this.ClientSize.Height - this.pictureBox1.Height) / 2;
this.pictureBox1.Location = location;
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
try
{
// 鼠标按下拖拽图片
if (e.Button == MouseButtons.Left)
{
// 限制拖拽出框
if (pictureBox1.Width > this.ClientSize.Width || pictureBox1.Height > this.ClientSize.Height)
{
int moveX = e.X - xPos;
int moveY = e.Y - yPos;
if ((pictureBox1.Left + moveX) <= 0
&& (pictureBox1.Top + moveY) <= 0
&& (pictureBox1.Right + moveX) >= this.ClientSize.Width
&& (pictureBox1.Bottom + moveY) >= this.ClientSize.Height)
{
pictureBox1.Left += moveX;//设置x坐标.
pictureBox1.Top += moveY;//设置y坐标.
}
}
}
}
catch (Exception dd)
{
MessageBox.Show(dd.Message);
}
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
xPos = e.X;//当前x坐标.
yPos = e.Y;//当前y坐标.
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,80 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Advantech.Motion;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using AssistClient.UI.PropExtend;
using static AssistClient.UI.UIAxisDev;
namespace AssistClient.UI
{
//[TypeConverter(typeof(PropertySorter))] //此属性使类无法序列化和反序列化
public class HeightDevProp
{
public HeightDevProp(string ip,int port) {
IP = ip;
Port = port;
}
[PropertyOrder(1), Browsable(true), Category("1 设备连接"), DisplayName("IP地址"), Description("IP地址"), ReadOnly(true), JsonIgnore]
public string IP { get;private set; }
[PropertyOrder(1), Browsable(true), Category("1 设备连接"), DisplayName("端品号"), Description("端品号"), ReadOnly(true), JsonIgnore]
public int Port { get; private set; }
//
[PropertyOrder(12), Browsable(true), Category("2 数据"), DisplayName("厚度值(um)"), Description("厚度值(um)"), ReadOnly(true), JsonIgnore]
public double HeightValue { get; set; }
[PropertyOrder(91), Browsable(true), Category("3 阀值"), DisplayName("阀值上限"), Description("阀值上限")]
public double LimitThresholdVal { get; set; }
[PropertyOrder(92), Browsable(true), Category("3 阀值"), DisplayName("阀值下限"), Description("阀值下限")]
public double LowerThresholdVal { get; set; }
[PropertyOrder(25), Browsable(true), Category("4 控制"), DisplayName("4.1 运行前Sleep(ms)"), Description("休息时间")]
public uint SleepPre { get; set; }
[PropertyOrder(26), Browsable(true), Category("4 控制"), DisplayName("4.2 运行后Sleep(ms)"), Description("休息时间")]
public uint SleepLater { get; set; }
[PropertyOrder(26), Browsable(true), Category("4 控制"), DisplayName("4.3 用于基准校正"), Description("用于基准校正,后续测量按索引顺序减扣校正值。")]
public bool IsRevise { get; set; }
[PropertyOrder(26), Browsable(true), Category("4 控制"), DisplayName("4.4 相对偏移值(um)"), Description("在现有值基础上相对相加此偏移值。")]
public double RelBaseValue { get; set; }
[PropertyOrder(27), Browsable(true), Category("4 控制"), DisplayName("4.5 禁用工序"), Description("禁用本工序")]
public bool Disable { get; set; }
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public string serialize()
{
return JsonConvert.SerializeObject(this);
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public void deserialize(string json)
{
var o= JsonConvert.DeserializeObject<HeightDevProp>(json);
Type type = o.GetType();
System.Reflection.PropertyInfo[] properties = type.GetProperties();
foreach (System.Reflection.PropertyInfo property in properties)
{
string name = property.Name;
if (!type.GetProperty(name).IsDefined(typeof(JsonIgnoreAttribute), true))
{
var value = property.GetValue(o);
this.GetType().GetProperty(name).SetValue(this, value);
}
}
}
}
}

View File

@ -0,0 +1,63 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Advantech.Motion;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using AssistClient.UI.PropExtend;
using static AssistClient.UI.UIAxisDev;
namespace AssistClient.UI
{
//[TypeConverter(typeof(PropertySorter))] //此属性使类无法序列化和反序列化
public class IFProp
{
[PropertyOrder(11), Browsable(false), Category("1 标识"), DisplayName("1.1 标识"), Description("标识"), ReadOnly(true)]
public long UniqueId { get; set; } = DateTime.Now.Ticks;
[PropertyOrder(11), Browsable(true), Category("1 控制"), DisplayName("1.1 跳转步骤"), Description("跳转步骤 1-n")]
public int GotoStepIndex { get; set; } = 1;
[PropertyOrder(12), Browsable(true), Category("1 控制"), DisplayName("1.2 计数次数"), Description("达到计数次数后触发 1-n")]
public int LimitNum { get; set; } = 1;
[PropertyOrder(25), Browsable(true), Category("1 控制"), DisplayName("1.3 是否重置"), Description("达到计数要求触发后是否置0")]
public bool Reset { get; set; }
[PropertyOrder(27), Browsable(true), Category("1 控制"), DisplayName("1.4 禁用工序"), Description("禁用本工序")]
public bool Disable { get; set; }
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public string serialize()
{
return JsonConvert.SerializeObject(this);
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public void deserialize(string json)
{
var o= JsonConvert.DeserializeObject<IFProp>(json);
Type type = o.GetType();
System.Reflection.PropertyInfo[] properties = type.GetProperties();
foreach (System.Reflection.PropertyInfo property in properties)
{
string name = property.Name;
if (!type.GetProperty(name).IsDefined(typeof(JsonIgnoreAttribute), true))
{
var value = property.GetValue(o);
this.GetType().GetProperty(name).SetValue(this, value);
}
}
}
}
}

View File

@ -0,0 +1,163 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Advantech.Motion;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using AssistClient.UI.PropExtend;
using static AssistClient.UI.UIAxisDev;
namespace AssistClient.UI
{
//[TypeConverter(typeof(PropertySorter))] //此属性使类无法序列化和反序列化
public class IOCardDevProp
{
private byte[] _in, _out;
public IOCardDevProp(string deviceNum) {
DeviceNum = deviceNum;
}
[PropertyOrder(1), Browsable(true), Category("1 设备"), DisplayName("设备号"), Description("设备号"), ReadOnly(true), JsonIgnore]
public string DeviceNum { get;private set; }
//
[PropertyOrder(11), Browsable(false), Category("2 时时数据"), DisplayName("输入"), Description("输入"), ReadOnly(true), JsonIgnore]
public byte[] IN
{
get
{
return _in;
}
set
{
_in = value;
if (value == null)
IN_SHOW = null;
else
{
IN_SHOW = new string[value.Length];
IN_OP_SHOW= new string[value.Length];
for (int i = 0; i < IN_OP_SHOW.Length; i++)
{
if (string.IsNullOrWhiteSpace(IN_OP_SHOW[i]))
IN_OP_SHOW[i] = "XXXX XXXX";
}
string s;
for (int i = 0; i < value.Length; i++)
{
s = Convert.ToString(value[i], 2).PadLeft(8, '0').Replace('0', 'L').Replace('1', 'H');
//IN_SHOW[i] = String.Join(" ", s.Reverse());
IN_SHOW[i] = s.Substring(0, 4) + " " + s.Substring(4);
}
}
}
}
[PropertyOrder(12), Browsable(false), Category("2 时时数据"), DisplayName("输出"), Description("输出"), ReadOnly(true), JsonIgnore]
public byte[] OUT
{
get
{
return _out;
}
set
{
_out = value;
if (value == null)
OUT_SHOW = null;
else
{
OUT_SHOW = new string[value.Length];
OUT_OP_SHOW = new string[value.Length];
string s;
for (int i = 0; i < value.Length; i++)
{
s = Convert.ToString(value[i], 2).PadLeft(8, '0').Replace('0', 'L').Replace('1', 'H');
OUT_SHOW[i] = s.Substring(0, 4) + " " + s.Substring(4); //String.Join(" ", s.Reverse());
OUT_OP_SHOW[i] = "XXXX XXXX";
}
}
}
}
[PropertyOrder(11), Browsable(true), Category("2 时时数据"), DisplayName("2.1 输入"), Description("输入"), ReadOnly(true), JsonIgnore]
public string[] IN_SHOW { get; set; }
[PropertyOrder(12), Browsable(true), Category("2 时时数据"), DisplayName("2.2 输出"), Description("输出"), ReadOnly(true), JsonIgnore]
public string[] OUT_SHOW { get; set; }
//IN_OP OUT_OP_INDEX OUT_OP_BIT_INDEX OUT_OP_VALUE
[PropertyOrder(1), Browsable(true), Category("3 指令"), DisplayName("3.1 作业方向"), Description("作业方向")]
public IODirectionEnum Direction { get; set; }
/// <summary>
/// 输入值, XXXX XXHL
/// </summary>
[PropertyOrder(11), Browsable(true), Category("3 指令"), DisplayName("3.2 输入指令值"), Description("输入指令值")]
public string[] IN_OP_SHOW { get; set; }//单改数组属性不触发SET
[PropertyOrder(11), Browsable(true), Category("3 指令"), DisplayName("3.3 输入超时告警(ms)"), Description("自动流程中等待输入指令超时则告警,0则无限期等待")]
public uint IN_Waiting_Timeout { get; set; } = 0;
/// <summary>
/// 输出值, XXXX XXHL
/// </summary>
[PropertyOrder(11), Browsable(true), Category("3 指令"), DisplayName("3.4 输出指令值"), Description("输出指令值")]
public string[] OUT_OP_SHOW { get; set; }
//
[PropertyOrder(25), Browsable(true), Category("4 控制"), DisplayName("4.1 运行前Sleep(ms)"), Description("休息时间")]
public uint SleepPre { get; set; }
[PropertyOrder(26), Browsable(true), Category("4 控制"), DisplayName("4.2 运行后Sleep(ms)"), Description("休息时间")]
public uint SleepLater { get; set; }
[PropertyOrder(27), Browsable(true), Category("4 控制"), DisplayName("4.4 禁用工序"), Description("禁用本工序")]
public bool Disable { get; set; }
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public string serialize()
{
return JsonConvert.SerializeObject(this);
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public void deserialize(string json)
{
var o= JsonConvert.DeserializeObject<IOCardDevProp>(json);
Type type = o.GetType();
System.Reflection.PropertyInfo[] properties = type.GetProperties();
foreach (System.Reflection.PropertyInfo property in properties)
{
string name = property.Name;
if (!type.GetProperty(name).IsDefined(typeof(JsonIgnoreAttribute), true))
{
var value = property.GetValue(o);
this.GetType().GetProperty(name).SetValue(this, value);
}
}
}
private byte[] inputValue2byte(string[] strList)
{
byte[] result=new byte[strList.Length];
string[] strArr = Utils.Util.IODataFormatBinaryStr(strList,false, 'L');
for (int i=0; i< strArr.Length; i++)
{
strArr[i] = strArr[i].Replace("L", "0").Replace("H", "1").Replace("X", "0");
result[i] = Convert.ToByte(strArr[i], 2);
}
return result;
}
}
}

View File

@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Advantech.Motion;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using AssistClient.UI.PropExtend;
using static AssistClient.UI.UIAxisDev;
namespace AssistClient.UI
{
//[TypeConverter(typeof(PropertySorter))] //此属性使类无法序列化和反序列化
public class LightDevProp
{
public LightDevProp(int portNum) {
PortNum = portNum;
}
[PropertyOrder(1), Browsable(true), Category("1 设备"), DisplayName("端口号"), Description("端口号"), ReadOnly(true), JsonIgnore]
public int PortNum { get;private set; }
//
[PropertyOrder(11), Browsable(true), Category("2 通道"), DisplayName("通道号"), Description("通道号")]
public int ChannelIndex { get; set; } = 1;
[PropertyOrder(12), Browsable(true), Category("3 数据"), DisplayName("亮度"), Description("亮度")]
public int DigitalValue { get; set; }
[PropertyOrder(25), Browsable(true), Category("4 控制"), DisplayName("4.1 运行前Sleep(ms)"), Description("休息时间")]
public uint SleepPre { get; set; }
[PropertyOrder(26), Browsable(true), Category("4 控制"), DisplayName("4.2 运行后Sleep(ms)"), Description("休息时间")]
public uint SleepLater { get; set; }
[PropertyOrder(27), Browsable(true), Category("4 控制"), DisplayName("4.4 禁用工序"), Description("禁用本工序")]
public bool Disable { get; set; }
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public string serialize()
{
return JsonConvert.SerializeObject(this);
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public void deserialize(string json)
{
var o= JsonConvert.DeserializeObject<LightDevProp>(json);
Type type = o.GetType();
System.Reflection.PropertyInfo[] properties = type.GetProperties();
foreach (System.Reflection.PropertyInfo property in properties)
{
string name = property.Name;
if (!type.GetProperty(name).IsDefined(typeof(JsonIgnoreAttribute), true))
{
var value = property.GetValue(o);
this.GetType().GetProperty(name).SetValue(this, value);
}
}
}
}
}

View File

@ -0,0 +1,253 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Collections;
namespace AssistClient.UI.PropExtend
{
[AttributeUsage(AttributeTargets.Property)]
public class PropertyOrderAttribute : Attribute//自定义Attribute类向property提供
{
private int order;
public PropertyOrderAttribute(int order)
{
this.order = order;
}
public int Order
{
get
{
return order;
}
}
}
#region Helper Class - PropertyOrderPair
public class PropertyOrderPair : IComparable
{
private int _order;
private string _name;
public string Name
{
get
{
return _name;
}
}
public PropertyOrderPair(string name, int order)
{
_order = order;
_name = name;
}
public int CompareTo(object obj)
{
//
// Sort the pair objects by ordering by order value
// Equal values get the same rank
//
int otherOrder = ((PropertyOrderPair)obj)._order;
if (otherOrder == _order)
{
//
// If order not specified, sort by name
//
string otherName = ((PropertyOrderPair)obj)._name;
return string.Compare(_name, otherName);
}
else if (otherOrder > _order)
{
return -1;
}
return 1;
}
}
#endregion
class TestPropertyDescriptor : PropertyDescriptor, IComparable//继承PropertyDescriptor类并实现IComparable接口
{
private PropertyDescriptor basePropertyDescriptor;
private int order;
//构造函数
public TestPropertyDescriptor(PropertyDescriptor basePropertyDescriptor) : base(basePropertyDescriptor)
{
this.basePropertyDescriptor = basePropertyDescriptor;
order = GetOrder(basePropertyDescriptor.Attributes);
}
//获得property的order属性
private int GetOrder(AttributeCollection ac)
{
foreach (Attribute a in ac)
{
if (a is PropertyOrderAttribute)
return ((PropertyOrderAttribute)a).Order;
}
return 0;
}
#region "IComparable"
public int CompareTo(object tpd)//实现接口使此类的对象可以依据order进行比较、排序
{
TestPropertyDescriptor other = (TestPropertyDescriptor)tpd;
if (order == other.order) return string.Compare(Name, other.Name);
else return (order > other.order) ? 1 : -1;
}
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return this.GetType();
}
}
public override object GetValue(object component)
{
return component;
}
public override bool IsReadOnly
{
get
{
return false;
}
}
public override Type PropertyType
{
get
{
return this.GetType();
}
}
public override void ResetValue(object component)
{
//不重置,无动作
}
public override void SetValue(object component, object value)
{
;
}
/// <summary>
/// 是否应该持久化保存
/// </summary>
/// <param name="component"></param>
/// <returns></returns>
public override bool ShouldSerializeValue(object component)
{
return false;
}
/// <summary>
/// 属性说明
/// </summary>
public override string Description
{
get
{
return this.Description;
}
}
#endregion
}
class ICustomTDClass1 : ICustomTypeDescriptor//Class1为需要对其属性进行排序的自定义类。
{
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptorCollection tmpPDC = TypeDescriptor.GetProperties(typeof(ICustomTDClass1), attributes);
PropertyDescriptorCollection result = new PropertyDescriptorCollection(null);
ArrayList orderPdList = new ArrayList();
foreach (PropertyDescriptor pd in tmpPDC)
{
TestPropertyDescriptor tpd = new TestPropertyDescriptor(pd);
result.Add(tpd);
orderPdList.Add(tpd);
}
orderPdList.Sort();//根据order排序
ArrayList propertyNames = new ArrayList();
foreach (TestPropertyDescriptor propertyAttributes in orderPdList)//获得排序后的DisplayName数组
{
propertyNames.Add(propertyAttributes.DisplayName);
}
return result.Sort((string[])propertyNames.ToArray(typeof(string)));//根据数组对结果排序注意这里不能直接return
}
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public string GetComponentName()
{
return TypeDescriptor.GetClassName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
}
}

View File

@ -0,0 +1,66 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AssistClient.UI;
namespace AssistClient.UI.PropExtend
{
public class PropertySorter : ExpandableObjectConverter
{
#region Methods
public override bool GetPropertiesSupported(ITypeDescriptorContext context)
{
return true;
}
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
{
//
// This override returns a list of properties in order
//
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(value, attributes);
ArrayList orderedProperties = new ArrayList();
foreach (PropertyDescriptor pd in pdc)
{
Attribute attribute = pd.Attributes[typeof(PropertyOrderAttribute)];
if (attribute != null)
{
//
// If the attribute is found, then create an pair object to hold it
//
PropertyOrderAttribute poa = (PropertyOrderAttribute)attribute;
orderedProperties.Add(new PropertyOrderPair(pd.Name, poa.Order));
}
else
{
//
// If no order attribute is specifed then given it an order of 0
//
orderedProperties.Add(new PropertyOrderPair(pd.Name, 0));
}
}
//
// Perform the actual order using the value PropertyOrderPair classes
// implementation of IComparable to sort
//
orderedProperties.Sort();
//
// Build a string list of the ordered names
//
ArrayList propertyNames = new ArrayList();
foreach (PropertyOrderPair pop in orderedProperties)
{
propertyNames.Add(pop.Name);
}
//
// Pass in the ordered list for the PropertyDescriptorCollection to sort by
//
return pdc.Sort((string[])propertyNames.ToArray(typeof(string)));
}
#endregion
}
}

View File

@ -0,0 +1,75 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Advantech.Motion;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using AssistClient.UI.PropExtend;
using static AssistClient.Device.ScannerDev;
using static AssistClient.UI.UIAxisDev;
namespace AssistClient.UI
{
//[TypeConverter(typeof(PropertySorter))] //此属性使类无法序列化和反序列化
public class ScannerDevProp
{
public ScannerDevProp(ScannerType devType) {
DeviceType=devType;
}
[PropertyOrder(1), Browsable(true), Category("1 设备"), DisplayName("设备类型"), Description("设备类型"), ReadOnly(true)]
public ScannerType DeviceType { get;set; }
[PropertyOrder(1), Browsable(true), Category("2 图像"), DisplayName("图像名称"), Description("图像名称"), ReadOnly(true), JsonIgnore]
public string[] ImageList { get; set; }
//
[PropertyOrder(11), Browsable(true), Category("3 参数"), DisplayName("曝光"), Description("曝光")]
public float ExposureTime { get; set; }
[PropertyOrder(12), Browsable(true), Category("3 参数"), DisplayName("增益"), Description("增益")]
public float Gain { get; set; }
[PropertyOrder(13), Browsable(true), Category("3 参数"), DisplayName("帧率"), Description("帧率")]
public float ResultingFrameRate { get; set; }
[PropertyOrder(25), Browsable(true), Category("4 控制"), DisplayName("4.1 运行前Sleep(ms)"), Description("休息时间")]
public uint SleepPre { get; set; }
[PropertyOrder(26), Browsable(true), Category("4 控制"), DisplayName("4.2 运行后Sleep(ms)"), Description("休息时间")]
public uint SleepLater { get; set; }
[PropertyOrder(27), Browsable(true), Category("4 控制"), DisplayName("4.4 禁用工序"), Description("禁用本工序")]
public bool Disable { get; set; }
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public string serialize()
{
return JsonConvert.SerializeObject(this);
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public void deserialize(string json)
{
var o= JsonConvert.DeserializeObject<ScannerDevProp>(json);
Type type = o.GetType();
System.Reflection.PropertyInfo[] properties = type.GetProperties();
foreach (System.Reflection.PropertyInfo property in properties)
{
string name = property.Name;
if (!type.GetProperty(name).IsDefined(typeof(JsonIgnoreAttribute), true))
{
var value = property.GetValue(o);
this.GetType().GetProperty(name).SetValue(this, value);
}
}
}
}
}

View File

@ -0,0 +1,96 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Advantech.Motion;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using AssistClient.UI.PropExtend;
using static AssistClient.UI.UIAxisDev;
namespace AssistClient.UI
{
//[TypeConverter(typeof(PropertySorter))] //此属性使类无法序列化和反序列化
public class SizeLibProp
{
//[PropertyOrder(1), Browsable(true), Category("1 数据"), DisplayName("1.1 引擎路径"), Description("引擎路径")]
//public string EnginePath { get; set; }
[PropertyOrder(1), Browsable(true), Category("1 数据"), DisplayName("1.2 引擎文件名"), Description("引擎文件名")]
public string EngineName { get; set; }
[PropertyOrder(1), Browsable(true), Category("1 数据"), DisplayName("1.3 源图"), Description("源图"), JsonIgnore]
public string BmpPath { get; set; }
[PropertyOrder(1), Browsable(true), Category("1 数据"), DisplayName("1.4 索引"), Description("索引 0-9")]
public int Index { get; set; }
[PropertyOrder(24), Browsable(true), Category("1 数据"), DisplayName("1.5 X轴反馈位置(mm)"), Description("实际/反馈位置"), JsonIgnore]
public double PosX { get; set; }
[PropertyOrder(24), Browsable(true), Category("1 数据"), DisplayName("1.5 Y轴反馈位置(mm)"), Description("实际/反馈位置"), JsonIgnore]
public double PosY { get; set; }
[PropertyOrder(15), Browsable(true), Category("2 结果"), DisplayName("PT1"), Description("结果"), ReadOnly(true), JsonIgnore]
public double PT1 { get; set; }
[PropertyOrder(15), Browsable(true), Category("2 结果"), DisplayName("PT2"), Description("结果"), ReadOnly(true), JsonIgnore]
public double PT2 { get; set; }
[PropertyOrder(15), Browsable(true), Category("2 结果"), DisplayName("Shanxian"), Description("结果"), ReadOnly(true), JsonIgnore]
public double Shanxian { get; set; }
//[PropertyOrder(15), Browsable(true), Category("2 结果"), DisplayName("RowP"), Description("结果"), ReadOnly(true), JsonIgnore]
//public double RowP { get; set; }
[PropertyOrder(15), Browsable(true), Category("2 结果"), DisplayName("Circle_Ymm"), Description("结果"), ReadOnly(true), JsonIgnore]
public double Circle_Ymm { get; set; }
[PropertyOrder(15), Browsable(true), Category("2 结果"), DisplayName("Circle_Xmm"), Description("结果"), ReadOnly(true), JsonIgnore]
public double Circle_Xmm { get; set; }
[PropertyOrder(15), Browsable(true), Category("2 结果"), DisplayName("offsetX"), Description("结果"), ReadOnly(true), JsonIgnore]
public double offsetX { get; set; }
[PropertyOrder(15), Browsable(true), Category("2 结果"), DisplayName("offsetY"), Description("结果"), ReadOnly(true), JsonIgnore]
public double offsetY { get; set; }
[PropertyOrder(15), Browsable(true), Category("2 结果"), DisplayName("Mark点"), Description("Mark点"), ReadOnly(true), JsonIgnore]
public double[] MarkPointList { get; set; }
[PropertyOrder(15), Browsable(true), Category("2 结果"), DisplayName("信息"), Description("信息"), ReadOnly(true), JsonIgnore]
public string resultInfo { get; set; }
//====
[PropertyOrder(25), Browsable(true), Category("3 控制"), DisplayName("3.1 运行前Sleep(ms)"), Description("休息时间")]
public uint SleepPre { get; set; }
[PropertyOrder(26), Browsable(true), Category("3 控制"), DisplayName("3.2 运行后Sleep(ms)"), Description("休息时间")]
public uint SleepLater { get; set; }
[PropertyOrder(27), Browsable(true), Category("3 控制"), DisplayName("3.4 禁用工序"), Description("禁用本工序")]
public bool Disable { get; set; }
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public string serialize()
{
return JsonConvert.SerializeObject(this);
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public void deserialize(string json)
{
var o= JsonConvert.DeserializeObject<SizeLibProp>(json);
Type type = o.GetType();
System.Reflection.PropertyInfo[] properties = type.GetProperties();
foreach (System.Reflection.PropertyInfo property in properties)
{
string name = property.Name;
if (!type.GetProperty(name).IsDefined(typeof(JsonIgnoreAttribute), true))
{
var value = property.GetValue(o);
this.GetType().GetProperty(name).SetValue(this, value);
}
}
}
}
}

View File

@ -0,0 +1,78 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Advantech.Motion;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using AssistClient.UI.PropExtend;
using static AssistClient.UI.UIAxisDev;
namespace AssistClient.UI
{
//[TypeConverter(typeof(PropertySorter))] //此属性使类无法序列化和反序列化
public class SmallAxisDevProp
{
public SmallAxisDevProp( string comName) {
ComName = comName;
}
[PropertyOrder(1), Browsable(true), Category("1 设备"), DisplayName("端口号"), Description("端口号"), ReadOnly(true), JsonIgnore]
public string ComName { get;set; }
//
[PropertyOrder(23), Browsable(true), Category("2 位置"), DisplayName("命令脉冲"), Description("命令脉冲") ]
//public SmallAxCmdPos CmdPos { get; set; }
public int CmdPos { get; set; }
[PropertyOrder(11), Browsable(true), Category("3 状态"), DisplayName("3.1 运动中"), Description("运动中"), ReadOnly(true), JsonIgnore]
public bool Moving { get; set; }
[PropertyOrder(23), Browsable(true), Category("3 状态"), DisplayName("3.2 最大脉冲"), Description("最大脉冲"), ReadOnly(true), JsonIgnore]
public int MaxPPU { get; set; }
[PropertyOrder(24), Browsable(true), Category("3 状态"), DisplayName("3.3 反馈脉冲"), Description("实际/反馈脉冲"), ReadOnly(true), JsonIgnore]
public int ActualPPU { get; set; }
[PropertyOrder(25), Browsable(true), Category("4 控制"), DisplayName("4.1 运行前Sleep(ms)"), Description("休息时间")]
public uint SleepPre { get; set; }
[PropertyOrder(26), Browsable(true), Category("4 控制"), DisplayName("4.2 运行后Sleep(ms)"), Description("休息时间")]
public uint SleepLater { get; set; }
[PropertyOrder(27), Browsable(true), Category("4 控制"), DisplayName("4.4 禁用工序"), Description("禁用本工序")]
public bool Disable { get; set; }
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public string serialize()
{
return JsonConvert.SerializeObject(this);
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public void deserialize(string json)
{
var o= JsonConvert.DeserializeObject<SmallAxisDevProp>(json);
Type type = o.GetType();
System.Reflection.PropertyInfo[] properties = type.GetProperties();
foreach (System.Reflection.PropertyInfo property in properties)
{
string name = property.Name;
if (!type.GetProperty(name).IsDefined(typeof(JsonIgnoreAttribute), true))
{
var value = property.GetValue(o);
this.GetType().GetProperty(name).SetValue(this, value);
}
}
}
}
}

View File

@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Advantech.Motion;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using AssistClient.UI.PropExtend;
using static AssistClient.UI.UIAxisDev;
namespace AssistClient.UI
{
//[TypeConverter(typeof(PropertySorter))] //此属性使类无法序列化和反序列化
public class TensionDevProp
{
public TensionDevProp(int portNum) {
PortNum = portNum;
}
[PropertyOrder(1), Browsable(true), Category("1 设备"), DisplayName("端口号"), Description("端口号"), ReadOnly(true), JsonIgnore]
public int PortNum { get;private set; }
//
[PropertyOrder(11), Browsable(true), Category("2 数据"), DisplayName("单位"), Description("单位"), ReadOnly(true), JsonIgnore]
public string Unit { get; set; }
[PropertyOrder(12), Browsable(true), Category("2 数据"), DisplayName("张力值"), Description("张力值"), ReadOnly(true), JsonIgnore]
public double TensionValue { get; set; }
[PropertyOrder(91), Browsable(true), Category("3 阀值"), DisplayName("阀值上限"), Description("阀值上限")]
public double LimitThresholdVal { get; set; }
[PropertyOrder(92), Browsable(true), Category("3 阀值"), DisplayName("阀值下限"), Description("阀值下限")]
public double LowerThresholdVal { get; set; }
[PropertyOrder(25), Browsable(true), Category("4 控制"), DisplayName("4.1 运行前Sleep(ms)"), Description("休息时间")]
public uint SleepPre { get; set; }
[PropertyOrder(26), Browsable(true), Category("4 控制"), DisplayName("4.2 运行后Sleep(ms)"), Description("休息时间")]
public uint SleepLater { get; set; }
[PropertyOrder(27), Browsable(true), Category("4 控制"), DisplayName("4.4 禁用工序"), Description("禁用本工序")]
public bool Disable { get; set; }
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public string serialize()
{
return JsonConvert.SerializeObject(this);
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public void deserialize(string json)
{
var o= JsonConvert.DeserializeObject<TensionDevProp>(json);
Type type = o.GetType();
System.Reflection.PropertyInfo[] properties = type.GetProperties();
foreach (System.Reflection.PropertyInfo property in properties)
{
string name = property.Name;
if (!type.GetProperty(name).IsDefined(typeof(JsonIgnoreAttribute), true))
{
var value = property.GetValue(o);
this.GetType().GetProperty(name).SetValue(this, value);
}
}
}
}
}

View File

@ -0,0 +1,284 @@
namespace AssistClient.UI
{
partial class UIAxisDev
{
/// <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
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UIAxisDev));
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.tsbtnOpenDev = new System.Windows.Forms.ToolStripButton();
this.tbtnSave = new System.Windows.Forms.ToolStripButton();
this.tssSave = new System.Windows.Forms.ToolStripSeparator();
this.tbtnRun = new System.Windows.Forms.ToolStripButton();
this.tbtnStop = new System.Windows.Forms.ToolStripButton();
this.tbtnRestState = new System.Windows.Forms.ToolStripButton();
this.tbtnResetPos = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.tbtnHome = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.tbtnJogOnOff = new System.Windows.Forms.ToolStripButton();
this.tbtnLeft = new System.Windows.Forms.ToolStripButton();
this.tbtnRight = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
this.tbtnExport = new System.Windows.Forms.ToolStripButton();
this.tbtnImport = new System.Windows.Forms.ToolStripButton();
this.propertyGrid1 = new System.Windows.Forms.PropertyGrid();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.txtLog = new System.Windows.Forms.ToolStripStatusLabel();
this.toolStrip1.SuspendLayout();
this.statusStrip1.SuspendLayout();
this.SuspendLayout();
//
// toolStrip1
//
this.toolStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tsbtnOpenDev,
this.tbtnSave,
this.tssSave,
this.tbtnRun,
this.tbtnStop,
this.tbtnRestState,
this.tbtnResetPos,
this.toolStripSeparator1,
this.tbtnHome,
this.toolStripSeparator2,
this.tbtnJogOnOff,
this.tbtnLeft,
this.tbtnRight,
this.toolStripSeparator3,
this.tbtnExport,
this.tbtnImport});
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Padding = new System.Windows.Forms.Padding(0, 0, 3, 0);
this.toolStrip1.Size = new System.Drawing.Size(1178, 38);
this.toolStrip1.TabIndex = 26;
this.toolStrip1.Text = "toolStrip7";
//
// tsbtnOpenDev
//
this.tsbtnOpenDev.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnOpenDev.Image")));
this.tsbtnOpenDev.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnOpenDev.Name = "tsbtnOpenDev";
this.tsbtnOpenDev.Size = new System.Drawing.Size(110, 33);
this.tsbtnOpenDev.Text = "打开设备";
this.tsbtnOpenDev.Click += new System.EventHandler(this.tsbtnOpenDev_Click);
//
// tbtnSave
//
this.tbtnSave.Image = ((System.Drawing.Image)(resources.GetObject("tbtnSave.Image")));
this.tbtnSave.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnSave.Name = "tbtnSave";
this.tbtnSave.Size = new System.Drawing.Size(74, 33);
this.tbtnSave.Text = "保存";
this.tbtnSave.Click += new System.EventHandler(this.tbtnSave_Click);
//
// tssSave
//
this.tssSave.Name = "tssSave";
this.tssSave.Size = new System.Drawing.Size(6, 38);
//
// tbtnRun
//
this.tbtnRun.Image = ((System.Drawing.Image)(resources.GetObject("tbtnRun.Image")));
this.tbtnRun.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnRun.Name = "tbtnRun";
this.tbtnRun.Size = new System.Drawing.Size(74, 33);
this.tbtnRun.Text = "执行";
this.tbtnRun.Click += new System.EventHandler(this.tbtnRun_Click);
//
// tbtnStop
//
this.tbtnStop.Image = ((System.Drawing.Image)(resources.GetObject("tbtnStop.Image")));
this.tbtnStop.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnStop.Name = "tbtnStop";
this.tbtnStop.Size = new System.Drawing.Size(74, 33);
this.tbtnStop.Text = "停止";
this.tbtnStop.ToolTipText = "停止";
this.tbtnStop.Click += new System.EventHandler(this.tbtnStop_Click);
//
// tbtnRestState
//
this.tbtnRestState.Image = ((System.Drawing.Image)(resources.GetObject("tbtnRestState.Image")));
this.tbtnRestState.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnRestState.Name = "tbtnRestState";
this.tbtnRestState.Size = new System.Drawing.Size(110, 33);
this.tbtnRestState.Text = "状态重置";
this.tbtnRestState.ToolTipText = "重置轴状态";
this.tbtnRestState.Click += new System.EventHandler(this.tbtnRestState_Click);
//
// tbtnResetPos
//
this.tbtnResetPos.Image = ((System.Drawing.Image)(resources.GetObject("tbtnResetPos.Image")));
this.tbtnResetPos.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnResetPos.Name = "tbtnResetPos";
this.tbtnResetPos.Size = new System.Drawing.Size(128, 33);
this.tbtnResetPos.Text = "计数器重置";
this.tbtnResetPos.ToolTipText = "重置轴状态";
this.tbtnResetPos.Click += new System.EventHandler(this.tbtnResetPos_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(6, 38);
//
// tbtnHome
//
this.tbtnHome.Image = ((System.Drawing.Image)(resources.GetObject("tbtnHome.Image")));
this.tbtnHome.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnHome.Name = "tbtnHome";
this.tbtnHome.Size = new System.Drawing.Size(92, 33);
this.tbtnHome.Text = "回原点";
this.tbtnHome.Click += new System.EventHandler(this.tbtnHome_Click);
//
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(6, 38);
//
// tbtnJogOnOff
//
this.tbtnJogOnOff.Image = ((System.Drawing.Image)(resources.GetObject("tbtnJogOnOff.Image")));
this.tbtnJogOnOff.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnJogOnOff.Name = "tbtnJogOnOff";
this.tbtnJogOnOff.Size = new System.Drawing.Size(104, 33);
this.tbtnJogOnOff.Text = "开启Jog";
this.tbtnJogOnOff.Click += new System.EventHandler(this.tbtnJogOnOff_Click);
//
// tbtnLeft
//
this.tbtnLeft.Image = ((System.Drawing.Image)(resources.GetObject("tbtnLeft.Image")));
this.tbtnLeft.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnLeft.Name = "tbtnLeft";
this.tbtnLeft.Size = new System.Drawing.Size(76, 33);
this.tbtnLeft.Text = "Jog-";
this.tbtnLeft.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tbtnLeft_MouseDown);
this.tbtnLeft.MouseUp += new System.Windows.Forms.MouseEventHandler(this.tbtnLeft_MouseUp);
//
// tbtnRight
//
this.tbtnRight.Image = ((System.Drawing.Image)(resources.GetObject("tbtnRight.Image")));
this.tbtnRight.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnRight.Name = "tbtnRight";
this.tbtnRight.Size = new System.Drawing.Size(81, 33);
this.tbtnRight.Text = "Jog+";
this.tbtnRight.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tbtnRight_MouseDown);
this.tbtnRight.MouseUp += new System.Windows.Forms.MouseEventHandler(this.tbtnRight_MouseUp);
//
// toolStripSeparator3
//
this.toolStripSeparator3.Name = "toolStripSeparator3";
this.toolStripSeparator3.Size = new System.Drawing.Size(6, 38);
//
// tbtnExport
//
this.tbtnExport.Image = ((System.Drawing.Image)(resources.GetObject("tbtnExport.Image")));
this.tbtnExport.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnExport.Name = "tbtnExport";
this.tbtnExport.Size = new System.Drawing.Size(74, 33);
this.tbtnExport.Text = "导出";
this.tbtnExport.Click += new System.EventHandler(this.tbtnExport_Click);
//
// tbtnImport
//
this.tbtnImport.Image = ((System.Drawing.Image)(resources.GetObject("tbtnImport.Image")));
this.tbtnImport.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnImport.Name = "tbtnImport";
this.tbtnImport.Size = new System.Drawing.Size(74, 33);
this.tbtnImport.Text = "导入";
this.tbtnImport.Click += new System.EventHandler(this.tbtnImport_Click);
//
// propertyGrid1
//
this.propertyGrid1.Dock = System.Windows.Forms.DockStyle.Fill;
this.propertyGrid1.LineColor = System.Drawing.SystemColors.ActiveCaption;
this.propertyGrid1.Location = new System.Drawing.Point(0, 38);
this.propertyGrid1.Name = "propertyGrid1";
this.propertyGrid1.Size = new System.Drawing.Size(1178, 561);
this.propertyGrid1.TabIndex = 31;
this.propertyGrid1.ToolbarVisible = false;
//
// statusStrip1
//
this.statusStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.txtLog});
this.statusStrip1.Location = new System.Drawing.Point(0, 599);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Padding = new System.Windows.Forms.Padding(2, 0, 14, 0);
this.statusStrip1.Size = new System.Drawing.Size(1178, 22);
this.statusStrip1.TabIndex = 30;
this.statusStrip1.Text = "statusStrip1";
//
// txtLog
//
this.txtLog.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(0)))), ((int)(((byte)(0)))));
this.txtLog.Name = "txtLog";
this.txtLog.Size = new System.Drawing.Size(0, 15);
//
// UIAxisDev
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.propertyGrid1);
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.toolStrip1);
this.Name = "UIAxisDev";
this.Size = new System.Drawing.Size(1178, 621);
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripButton tbtnRun;
private System.Windows.Forms.ToolStripButton tbtnExport;
private System.Windows.Forms.ToolStripButton tbtnImport;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.ToolStripButton tbtnHome;
private System.Windows.Forms.ToolStripButton tbtnLeft;
private System.Windows.Forms.ToolStripButton tbtnRight;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.ToolStripButton tbtnJogOnOff;
private System.Windows.Forms.ToolStripButton tbtnStop;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
private System.Windows.Forms.ToolStripButton tbtnRestState;
private System.Windows.Forms.ToolStripButton tbtnResetPos;
private System.Windows.Forms.PropertyGrid propertyGrid1;
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel txtLog;
private System.Windows.Forms.ToolStripButton tbtnSave;
private System.Windows.Forms.ToolStripSeparator tssSave;
private System.Windows.Forms.ToolStripButton tsbtnOpenDev;
}
}

View File

@ -0,0 +1,332 @@
using Advantech.Motion;
using Newtonsoft.Json;
using AssistClient.Device;
using AssistClient.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;
using static AssistClient.Device.AxisDev;
using static AssistClient.UI.UIAxisDev;
namespace AssistClient.UI
{
public partial class UIAxisDev : UserControl
{
SynchronizationContext SyncContext = null;
public Action<string> GetParamsEvent;
//
private AxisDevProp prop = new AxisDevProp();
private AxisDev dev;
public UIAxisDev()
{
InitializeComponent();
propertyGrid1.PropertyValueChanged += propertyGrid1_PropertyValueChanged;
refreshUIState();
//获取UI线程同步上下文
SyncContext = SynchronizationContext.Current;
//init();
}
private void refreshUIState()
{
foreach (ToolStripItem item in this.toolStrip1.Items)
{
if (item.Text == "打开设备")
item.Visible = (dev == null || !dev.IsInit);
else
this.propertyGrid1.Enabled=item.Enabled = !(dev == null || !dev.IsInit);
}
}
public string getParamsData()
{
return prop.serialize();
}
public bool stopNow()
{
if (dev != null && dev.IsInit)
{
dev.stopNow();
return true;
}
else
return false;
}
public void setParamsData(string json)
{
if (json == "") return;
prop.deserialize(json);
this.propertyGrid1.Refresh();
}
public void init()
{
this.tbtnSave.Visible = tssSave.Visible = (GetParamsEvent != null);
this.propertyGrid1.SelectedObject = prop;
dev = new AxisDev();
dev.WarningEvent = (level, info) =>
{
txtLog.Text = $"({level}){info}";
};
//STATE
dev.axisStateEvent += new System.Action<int, AxisStateType, uint>((axisIndex, type, stateValue) =>
{
if (axisIndex != (int)prop.AxisIndex)
return;
switch (type)
{
case AxisStateType.AxisState:
if (prop.AxState != (AxisState)stateValue)
{
prop.AxState = (AxisState)stateValue;
this.refreshUI();
}
break;
case AxisStateType.AxisIOState:
if (prop.AxIOStatus != stateValue)
{
prop.AxIOStatus = stateValue;
prop.ALM = (stateValue & (uint)Ax_Motion_IO.AX_MOTION_IO_ALM) > 0;//需IO close
prop.EMG = (stateValue & (uint)Ax_Motion_IO.AX_MOTION_IO_EMG) > 0;//需重置 state
prop.LMTP = (stateValue & (uint)Ax_Motion_IO.AX_MOTION_IO_LMTP) > 0;//右极限 true->false
prop.LMTN = (stateValue & (uint)Ax_Motion_IO.AX_MOTION_IO_LMTN) > 0;//左极限
prop.ORG = (stateValue & (uint)Ax_Motion_IO.AX_MOTION_IO_ORG) > 0;
prop.EZ = (stateValue & (uint)Ax_Motion_IO.AX_MOTION_IO_EZ) > 0;
prop.SVON = (stateValue & (uint)Ax_Motion_IO.AX_MOTION_IO_SVON) > 0;
this.refreshUI();
}
break;
case AxisStateType.AxisMotionState:
if (prop.AxMotionState != stateValue)
{
prop.AxMotionState = stateValue;
this.refreshUI();
}
break;
}
});
//位置POS
dev.axisPosEvent += new System.Action<int, AxisPosType, double>((axisIndex, type, pos) =>
{
if (axisIndex != (int)prop.AxisIndex)
return;
switch (type)
{
case AxisPosType.CmdPos:
if (prop.CmdPos != pos)
{
prop.CmdPos = pos;
this.refreshUI();
}
break;
case AxisPosType.ActualPos:
if (prop.ActualPos != pos)
{
prop.ActualPos = pos;
this.refreshUI();
}
break;
}
});
if (!dev.start(Config.Axis_PulseOutMode,true))
{
this.closeDev();
return;
}
prop.DeviceNum = dev.DeviceNum.ToString();
refreshAxisVelParam();
refreshUIState();
}
private void refreshUI()
{
SyncContext.Post(m =>
{
var result = m as string;
propertyGrid1.Refresh();
tbtnJogOnOff.Text = (prop.AxState == AxisState.STA_AX_EXT_JOG) ? "关闭Jog" : "开启Jog";
tbtnLeft.Enabled = tbtnRight.Enabled = (prop.AxState == AxisState.STA_AX_EXT_JOG);
}, "异步操作完成结果");
}
private void refreshAxisVelParam()
{
int axisIndex = (int)prop.AxisIndex;
//prop.HomeMode = (AxitHomeMode)Config.Axis_HomeMode[axisIndex];
var values = dev.getAxisVelParam(axisIndex);
prop.VelLow = dev.tomm(values[0], Config.Axis_MM2PulseNum[axisIndex]);
prop.VelHigh = dev.tomm(values[1], Config.Axis_MM2PulseNum[axisIndex]);
prop.Acc = dev.tomm(values[2], Config.Axis_MM2PulseNum[axisIndex]);
prop.Dec = dev.tomm(values[3], Config.Axis_MM2PulseNum[axisIndex]);
}
private void closeDev()
{
try
{
if (dev == null)
return;
dev.stop();
}
catch (Exception ex)
{
this.refreshUIState();
MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
protected override void OnHandleDestroyed(EventArgs e)
{
base.OnHandleDestroyed(e);
// 在此添加需要手动释放资源的代码
this.closeDev();
}
private void tbtnRun_Click(object sender, EventArgs e)
{
try
{
dev.setAxisVelParam(prop.VelLow, prop.VelHigh, prop.Acc, prop.Dec, (int)prop.AxisIndex);
dev.move_ptp((int)prop.AxisIndex, prop.Value, prop.MoveMode);
//running...
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void tbtnExport_Click(object sender, EventArgs e)
{
string filePath = FileUtil.saveAsFile($"Axis{(int)prop.AxisIndex}配置.json", "JSON|*.json");
if (filePath != "")
{
string jsonText = prop.serialize();
File.WriteAllText(filePath, jsonText);
MessageBox.Show("保存成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void tbtnImport_Click(object sender, EventArgs e)
{
string filePath = FileUtil.openFile("JSON|*.json");
if (filePath != "")
{
string jsonText = File.ReadAllText(filePath);
prop.deserialize(jsonText);
this.propertyGrid1.Refresh();
//this.propertyGrid1.SelectedObject= axisProp;
//MessageBox.Show("加载成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void tbtnHome_Click(object sender, EventArgs e)
{
int axitIndex = (int)prop.AxisIndex;
dev.setAxisVelParam(prop.VelLow, prop.VelHigh, prop.Acc, prop.Dec, (int)prop.AxisIndex);
//dev.setAxisVelParam(prop.VelLow, prop.VelHigh, prop.Acc, prop.Dec, (int)prop.AxisIndex,true);
dev.home(axitIndex, (uint)Config.Axis_HomeMode[axitIndex], (uint)Config.Axis_HomeDir[axitIndex]);
//if (prop.DeviceType == AxisType.默认)
//{
// dev.home((int)prop.AxisIndex);
//}
//else //直线电机
//{
// //dev.move_ptp((int)prop.AxisIndex, - prop.ActualPos, false);
// dev.move_ptp((int)prop.AxisIndex, 0, true);
//}
}
private void tbtnLeft_MouseDown(object sender, MouseEventArgs e)
{
dev.jog((int)prop.AxisIndex, 1);
}
private void tbtnLeft_MouseUp(object sender, MouseEventArgs e)
{
dev.stopDec((int)prop.AxisIndex);
}
private void tbtnRight_MouseDown(object sender, MouseEventArgs e)
{
dev.jog((int)prop.AxisIndex, 0);
}
private void tbtnRight_MouseUp(object sender, MouseEventArgs e)
{
dev.stopDec((int)prop.AxisIndex);
}
private void tbtnJogOnOff_Click(object sender, EventArgs e)
{
if(prop.AxState==AxisState.STA_AX_EXT_JOG)
{
dev.closeJogMode((int)prop.AxisIndex);
//tbtnJogOnOff.Text = "开启Jog";
}
else
{
dev.setAxisVelParam(prop.VelLow, prop.VelHigh, prop.Acc, prop.Dec, (int)prop.AxisIndex);
dev.openJogMode((int)prop.AxisIndex);
//tbtnJogOnOff.Text = "关闭Jog";
}
}
private void tbtnStop_Click(object sender, EventArgs e)
{
dev.stopDec((int)prop.AxisIndex);
}
private void tbtnRestState_Click(object sender, EventArgs e)
{
dev.resetAxisState((int)prop.AxisIndex);
}
private void tbtnResetPos_Click(object sender, EventArgs e)
{
dev.resetCmdPosition((int)prop.AxisIndex);
dev.resetActualPosition((int)prop.AxisIndex);
}
private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
//其中包含了两个重要的属性OldValue和ChangeItem。
//ChangeItem是“PropertyDescriptorGridEntry”类型。一般可以通过ChangeItem.PropertyDescriptor.ComponentType查找到属性的实际类型。
//而通过ChangeItem的Label则可以查看到当前在属性编辑输入框中显示的值。
string className = e.ChangedItem.PropertyDescriptor.ComponentType.Name;
string propertyName = e.ChangedItem.PropertyDescriptor.Name;
var oldValue = e.OldValue;
var newValue = e.ChangedItem.Value;
switch (propertyName)
{
case "AxisIndex":
refreshAxisVelParam();
break;
}
}
private void tbtnSave_Click(object sender, EventArgs e)
{
GetParamsEvent?.Invoke(prop.serialize());
}
private void tsbtnOpenDev_Click(object sender, EventArgs e)
{
this.init();
}
}
}

View File

@ -0,0 +1,387 @@
<?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="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="tsbtnOpenDev.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
I3hAwL+/HJ1QMufZxQAAAABJRU5ErkJggg==
</value>
</data>
<data name="tbtnSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAIeSURBVFhH7ZfLShxBFIaPBCRCguALBJVkE3BnJMHLRtQ8
wEAkaseuqu46rS7EN3AXkk0kD5CLGEHwBbITXXoBF1lmJ64V0RByOVXU9HQ5NTNdPY0g+MNHz1TV+fuf
6tM9M3AnhzogSkaJqcJwOQk8eWr8PFSpdAKLv4PAf6XAcdU455TAwTqT9hk37jnE5UhayPAnfYIvIOKv
/sjPEOIP7fMGTyCKus0ZWihKhtMAHD+Z0WLi8m3qJeSWGW2hbAAhN8xoMQm5VvPSfoGZaaJsAIbfzGh+
MZynnYv0a44frADTeAFh8kjPNVQ7AZaXu6jur65V4vg+9aoSxns006HnnWonQBg+pLoz4lK/5/Jd6mUh
V/S8U1YP4LoZzackeQCvZv7oWiWrCS229bxTdoAmCxtI37ameQV+zHjVaLqzdgC1nS/MjJ8YDlDtacar
hkcAhWqqY+KAHjCHraF1HI8gCH6b+no8A5TP7QwQBOeFqN4VWbwCKBMhXwJjPYWI48fks2t5+u0ANVa7
EphYnp6X4Bd19RKIZMgbFj8jv6n0a7nK7WzCMvEMcEmXYA74whPdUOqYF7U+ip4Dk/uW5803oUTL03sH
hJwFIfphHvv08Tpq3AVf7KV6+pGrH9E5A2R/lNqo7wQ/XA8hjdw0Z3NI3TrOojJpFiAI7tOinfqikng9
c0W7PGnO1kCVyj1aPEb94P7bVRSBE7ov7mQJ4D9vFWX+msbQGwAAAABJRU5ErkJggg==
</value>
</data>
<data name="tbtnRun.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAHnSURBVFhH7dfZK4RRGAbwzxKSklJKuVAuXCgXLlwoF8qF
Ev8Dg7GPfTf29d6fYd93Yx3bMDdISkqJZM8Yy8PRyPK9M987U74b3um5/j3nm3NOHel/fk6HOUnfYU5E
+3YC2rbj0bYVh1ZTLFpMMWjejEbTRhQaNyLRsB6B+rVw1K2FQb8ailpjCGqMwaheCULVciAqlwNQseSP
8kU/lC/4omzBB6UGL72NoafTnIxfw+e9UWLwQvGcJ2zc9/nVlX/Bi2Y9UDjtLv8SquEz7ih4i439HDVx
3bSbvAAX372YxMe4iuumqALMlb/8+LmC509K8gLcz/6CJ1mcxfMmiALc//wZVjLO4LnjRAHuhnuCxW64
eM4YUYCDiw33iDuH4eDZo0QBDi42nBU3ilHCs0aIAhxc7PYHXLLiCM8cJgpwcLHbLThnxx6uHSIKcHBx
1O5xyo49XDtIFODg4qjd4YQVR3jGAFGAg4tzfotjxSjh6VQBDi7O+Q2OHIaDp/cTBTi4uGSucWg3XDyt
jyjAwcUlc4UDMs7gGqoABxc33CX2ZXEW1/QSBTi4uOEusPctruCpPUQBDi6uV+NZ1xu88x5XcboAA1e6
Xrk4WUBNnCwgHg1q4SndEv1AUQMXsXH0iEeD6iv/wyNJrzzCmH5Y8iSuAAAAAElFTkSuQmCC
</value>
</data>
<data name="tbtnStop.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAP5SURBVFhH7ZfLS1RxFMen9i37G9q2ad1zkZWVOjozmqW9
W2VUmxIsKnqQumqjFUFQ0LvosehFYFT0gCKIBIvehG4yKknnfvp9f+feGcPRmWtCizpwxPnde77f3++8
fucm/ksxCTKZqmxNzYHYmkrtl20IMz4Jli1rpLoar5lMPI3samsbQrh4EqxcOWWgsrKXdevg3Tv49Ak+
fixN9a5snK0whBXCli7ZTKaNhQvh8WO4exeammDbttJU78pGtg5DWCFsaRLU1U3rmzkzy+7d8P07pNOw
ZAlUVpameldh+PEDYQhLmCF8cclWV1+logI+f4bOTn+KETEuprI5etQwli5FmCH82BLU1paxaBEcO2Zx
1GnkgUIkY6lsHLHPCWE5TGGHNIWFlpbJg8lkNytWwM+f0Nycd+d4VLY7dsDgICxfjsd2HCHdSHFxamLB
Arh92xJI/xcCjqMKxdOncOuWxxNHSPe7BI2NU79VVPSzZYudfu1aSCYLg8bRqirYsAGyWdi8GXGIK6TN
SzadPkx5Obx6BefOQVmZxVFrygk1FWW4TiTVekSg5/pdU6PGY67X2uLFhiGsy5cN2627LtkZ0po4o+l9
5eUBbW3w5QukUkZYVwdHjsDZs7BpE+zaBadOwYkTcPKkvaP1ixdtzcXZJ97Bg3DmDHR0GIY8qY2ppFtb
8VyO08gTiUlDyWSXJ+3vh/b2/KlPn7aGsm+fN2TjRrhyBd6+tc2o6bx5g9/4+fPw/Ll55OVLOHQIrl0z
FZ68prWvX/0BPafjTgTp9BzvqgsX4MULe1GuVR/Ys8fWdNrVq2H+fNi+3ZJ0xgy4ccNKbPZsmDcPnj2z
jd27h8+l48fhwQM7TBTOnh7jcpxBKjU3oT8FNyADlaOIRdLdbc9EIK/MmmWhuXnTNqCTK8Yu0fxGHj2y
uK9fb6EabQOjhkCxVBd8+BCuX4dLl6wsd+40D2gzivmTJ9DVZe5XyGR7/749U/LZjTh6CHweREko8igJ
pUoeJZncrgzXWn09rFplJ9JzEcgrW7fmu6a8puSLSjGqDiWhy5ffkjCSXBm+fp0vQxmJQO4VcBQaAUbg
+q3yHN4zhj8XRlSGwnYcI8pQkmtEOola55o1E9uIgsAn5qiNSJJrxXfuTHwrFuZYrViSu4waGswLE3EZ
tbTA0JCvqKKXkcRfx9q1avj9+3xiFSIYS2WjStJ4JiyHWfQ6jsQPJEqs3t4/G0jUxvv6fJKWPJBIND75
kWzvXhurdBp5QpsqRaOwDQwgjNgjmcQPpWqhSiA1mrhDqWxkq9sv7lAqyY3lKqEPH+KP5bJxtuMeyyW5
D5PhjaVUlY214fF9mETyVz/N/gFJJH4B9DKMYQE851AAAAAASUVORK5CYII=
</value>
</data>
<data name="tbtnRestState.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
gnt5/Qvn251CmZhrHQAAAABJRU5ErkJggg==
</value>
</data>
<data name="tbtnResetPos.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="tbtnHome.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAARwSURBVFhH1ZZtTFNXGMePwLrpmG9b5ggGppHgHNlMutmN
sLiwbJqxl8TEDy5ZFgMKdPUFcVCBUqDQuRk/zqHTsJdoGJhsRRyI1IuWQq/0ZUBnYQ1IkMiodFgKHUXa
Z+fCsXh77y0v6gf/zf/D7T3n+Z2X5znnoidaSuOmmBLTRjF5fLw63vLWUrVJ8onKJK5QGjY5SowJUGx8
BYra4kB5fT0UXo8FBb1Wq2iNkucb1qwj3R5eVVU7w8vMiZlKwxZHqUkMKtNm4IMX0mtBYYiCAsOLkN/6
POQ1rzgrb1m+gYRZnEraE+PxrLvKzBJYELxlFRxpWQ5SKtKbq1smJ+EWJrUpabuaftO9WLhcHwny5mWQ
27wUcnSiCqUViUjouVVmTtqqphK9jwb+NHx1TQTZVEQlCR9aqj/fWae2bHHMBT9ukcD3ndvgpPVD+K4j
OST88NWnsCPgUFNYPsEIS21JbBKCM/79Zg4Mjt8Af9Bv/J4TDP+cgaNt8bzw7KZwOESFwQEKbSYorkot
b6cIwY/hGd8aM2HUVEh7fW441/U5LzzryhI4qF3SQHBclZolRj74N+Y3wDnRCz6YnLcru3bzweFAIwLZ
JZRMkLP62iQRC+25baQOz+0/jm972qHPrQfP1DDnndfvgmNtr3Hg+y9P+2eCnZXKKJbzwX/s2gX3YJxl
u0sL35oSWAmn6c0Cj8/Jatd+p5oPDtIG5CTYWamMr2uC4Uy2m4fP4QUdDbh/zAAFuOT4sr2yezer7YR/
BPKurWbB9zVMbwFj9nFdQifYg+FMnQ9P2mECRgIut34QstR6RptY7U93fMqBf1k/7fcJekbFxrjBYHgR
HYN3czjgMf8grvUVgnAm4Rr7Vaw+1d1SDlxahyDjIvqMoGekNMQ5HoQzJ5ySjgYPDAXs9g/AEf1zIev8
cn8xq091dwYHnvkHzwDy6Vj7g/D7x+vQZAdOp9sBn+h8VxDOJNzfo/Ws9qfaP+LAMy8i2FuLthP0jBR0
rIbvbDfcKQc33Aq4Z6wR5LpneeG/2Hax2rr8fZBzZSUHjmcPaZqgJFTQ0XK+i6Xc+h7O5z6WO+9WQSn9
cgCOLxr4rWcfjPjsrHa04wdeeLqGpwwxXCx0qxmdZ8AFvRzf9FBgG62Bf33dnHfMf0rdei68Fi//BVRB
sGzl6VcZ+W61IsNLGKaFu2Cft0+1f8wLT7+AYE8N2kqQbOXpV6YIXalFrVFgdf2KK7s7pIemLHDCsk0Q
nlaD6giOX3JdpDZUnf9k2wE3Rs9jmI3lAa8eLvUXQi71giB8bw2aSqsNcR0zytU9E5PdLHKEKjXmbC/Q
rYGj9KvTLmvdyFtqQXDG8/s+xINIklIirxCc72yfC47L7iwJPz9lXw1PPkxFOB8FHCddxc6qBXyU3lcW
hTYcpML+Wiw8tQZ59miQjIRbnPDIw/c3olRZPRpYCBzP+jSefQwJ8/BS4iWUNaAU7JMYbg+Gf1GL3Om4
xDBchh1Nuj1epdaj1Rl1KJ48PolC6H+BVsJLPWxk5wAAAABJRU5ErkJggg==
</value>
</data>
<data name="tbtnJogOnOff.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAHISURBVFhH7dfJLwNhGAbwsYRGJEgkEomDxMFB4uDgIHGQ
OEiE/4Gq2ndKUbuq/8W+L0XVrmhPEomDg4NLSSNE8DB0api387VNfRfe5LnMHH7PN8uXfML//ByLq8Rk
cRVjzFkEs7MQ5rMCjJ7mY+Q0D8MnuRhy5GDQkY2B4yz0H2Wi7ygDpsN09B6koecgFd37KTDuJaNrLwmd
uwkw7MTDYI9Dh12DdluMycvQM+4qxa/h27Fos8WgdSsaXu77/OrKZXjLZhSarZHKJ8EN34hE03u87Nfw
xButEcoCPPHGdaoAR7xhTVAW4InXrxIFeOJ1K0SBcOLiqOG1y0SBcOGvePmIGl6zRBQIB/6CJ1/U8OpF
ogALf8aDX7xn5/O+PGp41QJRgLXyJ3g+8hNvt2l89+RRw/XzRAHWY3+E2xc5Lr8uhYXr54gCrHf+gJtv
MdoTFdfEBIJXzhIFWB/cPa6ZCRTXUQXUcOmde3DlN8HguhmiAAuXfrU7XCoSLF4xTRQIBJe211tc+BIK
rqUKBIpLO5wb5yHj2imiQDA4a5Nh4eWTRAGeOF2AI04W4ImTBcRDAy+8bEKgDyg8cDFejh7x0MB95X94
BOENt7Qt5r1VNxkAAAAASUVORK5CYII=
</value>
</data>
<data name="tbtnLeft.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAHlSURBVFhH7dfZK0RRHAfwYwlJSSmlPCgPHpQHDx6UB+VB
if/Bvu/7NvZl/CHe7LsxGMNgrPMiSUkpKdmzz88ZOTXO73LPPbgv/Kbv8+d77u/MrUv+h5+0fmJIHyDg
noxBmiECmTRZwzQjBLJpckZpxgjkjhPImyCQP0mgYIpA4TSBohkCxSYCJbMeUGL2gNI5TygzexreGeXh
4R/FacrnvaBiwRveuY/zqyd3wystPlBl8cFPQjd80ReqrX74KeiJ11j9Py8gi5/D7ltMxy2qeM1SgHIB
eXzvQ9Tw2uVAXEAWv4B9FDW8zhakUEACv4QDFBG83haMC2jFr+AQRRRvWAnBBbTg13CEogVvXA1VKCCI
38Axila8aTUMFxDBb+EERQY3rIXjAmr4HZyiyOLN9giFAl/grjfcPZyhyOIt9khc4CucvV4f6L+cjwze
uh6FC6jh7PX6SO88H61420Y0LiCCs50/0evHRwvevhGDC4jibOfP9BbwEcU7NmNxAS042/kLXQAfEbxz
Kw4X0IqznTvp2fmo4V1b8biADM527uR+anj3dgIuIIuznbNZP+1Txbt3EhUKfAMX2bk73rOThAvoiRsd
ybiA66NBL9zoSFH+QNED73Wk4tO7j+ujQfeT/+Eh5BVDb1Kg4N0zSAAAAABJRU5ErkJggg==
</value>
</data>
<data name="tbtnRight.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAHVSURBVFhH7dfJK0VhGAbwYwhJSSmlLJSFhbKwsFAWykKJ
/8E8z/N0zeMfYmee53nmcjeSlJSSkjmzh6N7MrxvzvcdORve27P+Pd95b199yv98nVZbjKXVFo2WrSg0
b0WieTMCTdZwNFrD0LARivr1ENStB6N2LQg1q4GoXg2AZcUfVct+qFz2RcWSD8oXvVG26IXSBU+UzHug
ZM4dxXNuKJpxsdgZftpssfg1fNYVhTMuKJh2hp37PL968g94/pQT8iYc6ZcwDZ90RO5r7Oz7mInnTDjQ
AiL42nE7tPkJnjPOFRA4+fOXn1E8e0yhBUQ++zMeSYzgWaNMAdGdP+GeRBbPHGEKyPzhHnFLIoNnDDMF
RHFt5w+4JhHF04eYAjK4tvN7XJKI4GmDTAFZXNv5Hc5I9PDUAaaAEVzb+S1OSL7DU/qZAkZxdec3OCb5
Dk/pYwoYxa9xRKKHJ/cyBYzgVzgkEcGTuAKy+CUOSETxpB6mgAx+gX0SGTyxmykgip9jj0QWT+AKiOBn
2CUxgid0MQX0cPWGO8XOpxjF4zuZAnq4er2OHda8wttv+QnOF9DBRa5XUZwtYCbOFlAfDWbhcR0K/0Ax
A1dj5/hRHw2mn/wPj6K8APh2UqDO6R6xAAAAAElFTkSuQmCC
</value>
</data>
<data name="tbtnExport.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAMlSURBVFhH5VZJaBRREC1cQD15cD8oCnoQRBFEEHG5iCCK
Ry9uGBDBqLh7kEbM9K/JGCIiSgwaMKbn/z8JgdxEJQqexB1URHE7KCi4gRuKWtX/d8/0dHcW08nFB4/p
rnpVv/pP/QUyh8ovBYkSNB6CbmeEtQ4RpFgCx53fNPgfyxvQnp9pvUMA6Z6qGNywKD6AzK+1ij5A108C
JXb60yjxCmhxlRK1QruYYRXpUHgiVkBAKeqsqgdoUUPi97FgphLnrCqOjsIE8s+hAnRibECFF31tIhTu
SAwKqMQ+qzSQYi7ZGinuNnjO58SYZL6iv2S5zWKhcSo1z68q4UfTzWIPKHelVVKhhenk86q0/aPfqKLW
ZiQoka8SdUFH3WTrLYObSeOnKu2/U4oGk5iXS9nxGLQebhwVULilQpMd/cE88Sw0KNxthyxDitWRoCwJ
TU0joe3oy9DAm0klVG482ZNXxkDJDRwvwF1ghzbQ4kwkKCsqcdn/uB5noL0wDVrwZyQwC4bNx6gugA+T
AMo9EAlMo8TXNFO3wMMnif6AZr9YZ7Nb9FSAxmuhPcbcQ/oP99LSnA+qYbTRiw3JWmJR3KEpn+3rIkgr
oLNxbPIOl3tnlmTCUtW4Na4nSmyBFmeUVVUhrQBdPy+SxPASePkpvj8JGhdH9LzjKdxuvSlIK4B/K5NJ
cd639wY+Uy7UvaGYm1DCRdYaBedWooP+spr0AkpiWWjjI7k/6HLG2KdkcMMGudNngI5Xfm/DL+DlJvq2
rODhAz93s/M1XkCwD3Bnn8QfNKWH/fcsUczdDz8udQYYCpsz/3qGxEfRAviSEBYgVlkZQNuxcfYpO/Dy
1fi8XIDjDAPtPg0L0LjLSgcHfM9odb77Y/E+40Nhd0UBd41xkMBXu2AsKV5YY2zPP5t+eRwAVH495f4W
jhNedHnbbcW3ocOQ7gCikxrmCP3W0vtmmqmN9LypT2StEtso7iDxND3fs3kN+Q5adGeZAhh8U+VlVyka
VNLBFUPJXUjO63FxhuRNSOXX2BFTwIcK3w01IjVKgW5J9elEw1Iv1LifPnBF4in6HwPgL+Chdk9/0QNQ
AAAAAElFTkSuQmCC
</value>
</data>
<data name="tbtnImport.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAMxSURBVFhH7VdNaBNREE5FVFQUq2m7u9mkv6YEIv6Agpd6
afGmhyJ48+RBEAWt3X2728W0USteBKEn0YOIQgWvetBeRPRiEQQR9SJRCrX+tCVNk53ne5t5bdImu2kT
CkI/GLL53sy8b+fNziaBQigGPSYR54XSn/3apGU/lTNJy35WSPaDosM+DK0ekgY9Msn8UAillZpMoA/D
q4NsQlTqy3zHxPcV4gwqujMkEydZzth6QuqnYUxRHdiGz/N35CSRWlsoZ1IOFxAyIY5USbQmoCNiODfb
bdiB1DLsTdLOFgu6mU9PPAFx26YbcKk8sPSsAnQ/UiWhGs6o62s6T5FyEbOhPmI6g6qW/Rgy8rlC3Ng1
b1i2Nhy74XFcQoBE4CBSJcGO6pnwbTbgPOfabHpSMhb6Z2Hzwu/c1Msz0xELLrqJlkI4+QlQrdzrhaRX
Zv+EDWdE3LGfseq6n6wao8dvw2ZMmYdw8hMQMnLvhO9KjQsVlQkbdCxg042YtnIBTSQ3LnyrNdZPd7uE
CEH6HgFrssIklViDkZ5SSe5tSMu9kvTc+5AxPSPWVHYcbmJBeAng57aSScmSv2yxoTd+ne7CFC5aktDY
OgCnw6bzKGzRsy4pgrwESDbdquiZicJNSlm9MTnXLBJXChFcrYDguYlMdBCOYkjlEAl8jiAYNhfPr6Sx
icomYOlnPUDr8GI5RAIvAV236J6dF36l/Z57vh4bgsMYlgcbxzJrRDbI7iBTDBHsJSBAaR3r5nExULyM
Py1d9+gWjAwEbbqd8/wpQKoYItBTAEM0AVHVcp7IRvaLZKTmRVwpa7acIQxzBfD+4FVAqhgiyE+AAH/D
xWwa5m+9iAmX2Hh9wKujGrN/F6ed8xjday+gHDqvwe4OC4602XCqPQlBpNdOQDmsC1gX8P8IkPvhAFI1
ReMl2FZPJuc8BKSAC/D7Wb5asKG1SSKpeUnLvUGqGGy+j7lV0IEgVVNIOnTn8zsPkSqGpNFDQS39E51G
ZB1MZgNVGwGLvQGHJUJ/89z8/yduuRysAU80kPSUK6LGxsvPhFzFrcqDHUFvA5n/VirJas29e51quMUS
BAL/AK8VNEPJuEj/AAAAAElFTkSuQmCC
</value>
</data>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>332, 17</value>
</metadata>
</root>

View File

@ -0,0 +1,86 @@
namespace AssistClient.UI
{
partial class UICodeScannerDev
{
/// <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
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.propertyGrid1 = new System.Windows.Forms.PropertyGrid();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.txtLog = new System.Windows.Forms.ToolStripStatusLabel();
this.statusStrip1.SuspendLayout();
this.SuspendLayout();
//
// propertyGrid1
//
this.propertyGrid1.Dock = System.Windows.Forms.DockStyle.Fill;
this.propertyGrid1.HelpVisible = false;
this.propertyGrid1.LineColor = System.Drawing.SystemColors.ActiveCaption;
this.propertyGrid1.Location = new System.Drawing.Point(0, 0);
this.propertyGrid1.Name = "propertyGrid1";
this.propertyGrid1.Size = new System.Drawing.Size(1008, 599);
this.propertyGrid1.TabIndex = 35;
this.propertyGrid1.ToolbarVisible = false;
//
// statusStrip1
//
this.statusStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.txtLog});
this.statusStrip1.Location = new System.Drawing.Point(0, 599);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(1008, 22);
this.statusStrip1.TabIndex = 34;
this.statusStrip1.Text = "statusStrip1";
//
// txtLog
//
this.txtLog.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(0)))), ((int)(((byte)(0)))));
this.txtLog.Name = "txtLog";
this.txtLog.Size = new System.Drawing.Size(0, 15);
//
// UICodeScannerDev
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.propertyGrid1);
this.Controls.Add(this.statusStrip1);
this.Name = "UICodeScannerDev";
this.Size = new System.Drawing.Size(1008, 621);
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.PropertyGrid propertyGrid1;
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel txtLog;
}
}

View File

@ -0,0 +1,138 @@
using Advantech.Motion;
using Newtonsoft.Json;
using AssistClient.Device;
using AssistClient.UI.PropExtend;
using AssistClient.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;
namespace AssistClient.UI
{
public partial class UICodeScannerDev : UserControl
{
SynchronizationContext SyncContext = null;
//
public class CodeScannerProp
{
[PropertyOrder(1), Browsable(true), Category("数据"), DisplayName("Code"), Description("Code"), ReadOnly(true), JsonIgnore]
public string code { get; set; }
public string serialize()
{
return JsonConvert.SerializeObject(this);
}
}
private CodeScannerProp prop = new CodeScannerProp();
private CodeScannerDev dev;
public UICodeScannerDev()
{
InitializeComponent();
propertyGrid1.PropertyValueChanged += propertyGrid1_PropertyValueChanged;
//this.toolStrip1.Enabled = false;
this.propertyGrid1.Enabled = false;
//获取UI线程同步上下文
SyncContext = SynchronizationContext.Current;
init();
}
//public string getParamsData()
//{
// return prop.serialize();
//}
//public void setParamsData(string json)
//{
//if (json == "") return;
// prop.deserialize(json);
// this.propertyGrid1.Refresh();
//}
public void init()
{
this.propertyGrid1.SelectedObject = prop;
dev = new CodeScannerDev();
dev.WarningEvent = (level, info) =>
{
txtLog.Text = $"({level}){info}";
};
//IN
dev.ScanerEvent += new System.Action<string>((data) =>
{
prop.code = data;
this.refreshUI();
});
if (!dev.start())
{
this.closeDev();
return;
}
//this.toolStrip1.Enabled = true;
this.propertyGrid1.Enabled = true;
}
private void refreshUI()
{
SyncContext.Post(m =>
{
var result = m as string;
propertyGrid1.Refresh();
//tbtnJogOnOff.Text = (prop.AxState == AxisState.STA_AX_EXT_JOG) ? "关闭Jog" : "开启Jog";
//tbtnLeft.Enabled = tbtnRight.Enabled = (prop.AxState == AxisState.STA_AX_EXT_JOG);
}, "异步操作完成结果");
}
private void closeDev()
{
try
{
if (dev == null)
return;
dev.stop();
}
catch (Exception ex)
{
//this.toolStrip1.Enabled = false;
this.propertyGrid1.Enabled = false;
MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
protected override void OnHandleDestroyed(EventArgs e)
{
base.OnHandleDestroyed(e);
// 在此添加需要手动释放资源的代码
this.closeDev();
}
private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
//其中包含了两个重要的属性OldValue和ChangeItem。
//ChangeItem是“PropertyDescriptorGridEntry”类型。一般可以通过ChangeItem.PropertyDescriptor.ComponentType查找到属性的实际类型。
//而通过ChangeItem的Label则可以查看到当前在属性编辑输入框中显示的值。
string className = e.ChangedItem.PropertyDescriptor.ComponentType.Name;
string propertyName = e.ChangedItem.PropertyDescriptor.Name;
var oldValue = e.OldValue;
var newValue = e.ChangedItem.Value;
switch (propertyName)
{
case "xxx":
//refreshAxisVelParam();
break;
}
}
}
}

View File

@ -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=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>17, 17</value>
</metadata>
</root>

View File

@ -0,0 +1,179 @@
namespace AssistClient.UI
{
partial class UIDefectLib
{
/// <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
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UIDefectLib));
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.tsbtnOpenDev = new System.Windows.Forms.ToolStripButton();
this.tbtnSave = new System.Windows.Forms.ToolStripButton();
this.tssSave = new System.Windows.Forms.ToolStripSeparator();
this.tbtnRun = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.tbtnExport = new System.Windows.Forms.ToolStripButton();
this.tbtnImport = new System.Windows.Forms.ToolStripButton();
this.propertyGrid1 = new System.Windows.Forms.PropertyGrid();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.txtLog = new System.Windows.Forms.ToolStripStatusLabel();
this.toolStrip1.SuspendLayout();
this.statusStrip1.SuspendLayout();
this.SuspendLayout();
//
// toolStrip1
//
this.toolStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tsbtnOpenDev,
this.tbtnSave,
this.tssSave,
this.tbtnRun,
this.toolStripSeparator1,
this.tbtnExport,
this.tbtnImport});
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(1008, 38);
this.toolStrip1.TabIndex = 26;
this.toolStrip1.Text = "toolStrip7";
//
// tsbtnOpenDev
//
this.tsbtnOpenDev.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnOpenDev.Image")));
this.tsbtnOpenDev.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnOpenDev.Name = "tsbtnOpenDev";
this.tsbtnOpenDev.Size = new System.Drawing.Size(110, 33);
this.tsbtnOpenDev.Text = "打开设备";
this.tsbtnOpenDev.Click += new System.EventHandler(this.tsbtnOpenDev_Click);
//
// tbtnSave
//
this.tbtnSave.Image = ((System.Drawing.Image)(resources.GetObject("tbtnSave.Image")));
this.tbtnSave.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnSave.Name = "tbtnSave";
this.tbtnSave.Size = new System.Drawing.Size(74, 33);
this.tbtnSave.Text = "保存";
this.tbtnSave.Click += new System.EventHandler(this.tbtnSave_Click);
//
// tssSave
//
this.tssSave.Name = "tssSave";
this.tssSave.Size = new System.Drawing.Size(6, 38);
//
// tbtnRun
//
this.tbtnRun.Image = ((System.Drawing.Image)(resources.GetObject("tbtnRun.Image")));
this.tbtnRun.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnRun.Name = "tbtnRun";
this.tbtnRun.Size = new System.Drawing.Size(74, 33);
this.tbtnRun.Text = "执行";
this.tbtnRun.Click += new System.EventHandler(this.tbtnRun_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(6, 38);
//
// tbtnExport
//
this.tbtnExport.Image = ((System.Drawing.Image)(resources.GetObject("tbtnExport.Image")));
this.tbtnExport.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnExport.Name = "tbtnExport";
this.tbtnExport.Size = new System.Drawing.Size(74, 33);
this.tbtnExport.Text = "导出";
this.tbtnExport.Click += new System.EventHandler(this.tbtnExport_Click);
//
// tbtnImport
//
this.tbtnImport.Image = ((System.Drawing.Image)(resources.GetObject("tbtnImport.Image")));
this.tbtnImport.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnImport.Name = "tbtnImport";
this.tbtnImport.Size = new System.Drawing.Size(74, 33);
this.tbtnImport.Text = "导入";
this.tbtnImport.Click += new System.EventHandler(this.tbtnImport_Click);
//
// propertyGrid1
//
this.propertyGrid1.Dock = System.Windows.Forms.DockStyle.Fill;
this.propertyGrid1.LineColor = System.Drawing.SystemColors.ActiveCaption;
this.propertyGrid1.Location = new System.Drawing.Point(0, 38);
this.propertyGrid1.Name = "propertyGrid1";
this.propertyGrid1.Size = new System.Drawing.Size(1008, 583);
this.propertyGrid1.TabIndex = 33;
this.propertyGrid1.ToolbarVisible = false;
//
// statusStrip1
//
this.statusStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.txtLog});
this.statusStrip1.Location = new System.Drawing.Point(0, 590);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Padding = new System.Windows.Forms.Padding(2, 0, 14, 0);
this.statusStrip1.Size = new System.Drawing.Size(1008, 31);
this.statusStrip1.TabIndex = 34;
this.statusStrip1.Text = "statusStrip1";
//
// txtLog
//
this.txtLog.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(0)))), ((int)(((byte)(0)))));
this.txtLog.Name = "txtLog";
this.txtLog.Size = new System.Drawing.Size(46, 24);
this.txtLog.Text = "状态";
//
// UIDefectLib
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.propertyGrid1);
this.Controls.Add(this.toolStrip1);
this.Name = "UIDefectLib";
this.Size = new System.Drawing.Size(1008, 621);
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripButton tbtnRun;
private System.Windows.Forms.ToolStripButton tbtnExport;
private System.Windows.Forms.ToolStripButton tbtnImport;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.PropertyGrid propertyGrid1;
private System.Windows.Forms.ToolStripButton tbtnSave;
private System.Windows.Forms.ToolStripSeparator tssSave;
private System.Windows.Forms.ToolStripButton tsbtnOpenDev;
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel txtLog;
}
}

View File

@ -0,0 +1,240 @@
using Advantech.Motion;
using Newtonsoft.Json;
using OpenCvSharp;
using AssistClient.Device;
using AssistClient.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static AssistClient.Device.DefectLib;
namespace AssistClient.UI
{
public partial class UIDefectLib : UserControl
{
SynchronizationContext SyncContext = null;
public Action<string> GetParamsEvent;
//
private DefectLibProp prop = new DefectLibProp(Config.Defect_CutSize,Config.Defect_ReSize,Config.Defect_Thresholds);
private DefectLib dev;
public UIDefectLib()
{
InitializeComponent();
propertyGrid1.PropertyValueChanged += propertyGrid1_PropertyValueChanged;
refreshUIState();
//获取UI线程同步上下文
SyncContext = SynchronizationContext.Current;
//init();
}
private string szLog;
private void refreshUIState()
{
foreach (ToolStripItem item in this.toolStrip1.Items)
{
if (item.Text == "打开设备")
item.Visible = (dev == null || !dev.IsInit);
else
this.propertyGrid1.Enabled = item.Enabled = !(dev == null || !dev.IsInit);
}
}
public void init()
{
this.tbtnSave.Visible = tssSave.Visible = (GetParamsEvent != null);
this.propertyGrid1.SelectedObject = prop;
dev = new DefectLib();
dev.WarningEvent = (level, info) =>
{
szLog = $"({level}){info}";
txtLog.Text = $"({level}){info}";
};
//DATA
dev.finishEvent += new System.Action<DefectTask>((task) =>
{
DateTime t1= DateTime.Now;
var t2=t1-task.nowTime;
var t3= t2.Milliseconds;
prop.InformationList = JsonConvert.SerializeObject(task.informationList);
prop.resultInfo = task.isSucceed ? "成功" : task.resultInfo;
this.refreshUI();
});
if (!dev.start())
{
this.closeDev();
return;
}
refreshUIState();
}
public string getParamsData()
{
return prop.serialize();
}
public void setParamsData(string json)
{
if (json == "") return;
prop.deserialize(json);
this.propertyGrid1.Refresh();
}
private void refreshUI()
{
SyncContext.Post(m =>
{
var result = m as string;
propertyGrid1.Refresh();
//txtLog.Text = szLog;//不显示
//tbtnJogOnOff.Text = (prop.AxState == AxisState.STA_AX_EXT_JOG) ? "关闭Jog" : "开启Jog";
//tbtnLeft.Enabled = tbtnRight.Enabled = (prop.AxState == AxisState.STA_AX_EXT_JOG);
}, "异步操作完成结果");
}
private void closeDev()
{
try
{
if (dev == null)
return;
dev.stop();
}
catch (Exception ex)
{
refreshUIState();
MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
protected override void OnHandleDestroyed(EventArgs e)
{
base.OnHandleDestroyed(e);
// 在此添加需要手动释放资源的代码
this.closeDev();
}
private void tbtnRun_Click(object sender, EventArgs e)
{
if (!Util.IsNumber(prop.ThresholdsClass.Replace("-", "").Replace(",", "").Replace(";", "").Replace(".", "")))
{
txtLog.Text = "种类阀值只可输入数字!";
return;
}
if (!verifyThresholdsCount(prop.ThresholdsClass, prop.ThresholdsClassCount))
{
txtLog.Text = "输入种类阀值与数量不一致!";
return;
}
try
{
prop.resultInfo = "";
dev.add(new DefectTask()
{
nowTime= DateTime.Now,
bmp=new Mat(prop.BmpPath),
cut_size=prop.CutSize,
resize=prop.Resize,
thresholds=prop.Thresholds,
thresholdsClass = prop.ThresholdsClass,
//finishEvent = (res) =>
//{
//}
});
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void tbtnExport_Click(object sender, EventArgs e)
{
string filePath = FileUtil.saveAsFile($"DefectLib Config.json", "JSON|*.json");
if (filePath != "")
{
string jsonText = prop.serialize();
File.WriteAllText(filePath, jsonText);
MessageBox.Show("保存成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void tbtnImport_Click(object sender, EventArgs e)
{
string filePath = FileUtil.openFile("JSON|*.json");
if (filePath != "")
{
string jsonText = File.ReadAllText(filePath);
prop.deserialize(jsonText);
this.propertyGrid1.Refresh();
//this.propertyGrid1.SelectedObject= prop;
//MessageBox.Show("加载成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
//其中包含了两个重要的属性OldValue和ChangeItem。
//ChangeItem是“PropertyDescriptorGridEntry”类型。一般可以通过ChangeItem.PropertyDescriptor.ComponentType查找到属性的实际类型。
//而通过ChangeItem的Label则可以查看到当前在属性编辑输入框中显示的值。
string className = e.ChangedItem.PropertyDescriptor.ComponentType.Name;
string propertyName = e.ChangedItem.PropertyDescriptor.Name;
var oldValue = e.OldValue;
var newValue = e.ChangedItem.Value;
switch (propertyName)
{
case "ThresholdsClass":
if(!Util.IsNumber(newValue.ToString().Replace("-","").Replace(",", "").Replace(";", "").Replace(".", "")))
txtLog.Text = "种类阀值只可输入数字!";
else if (!verifyThresholdsCount(newValue.ToString(), prop.ThresholdsClassCount))
txtLog.Text = "输入种类阀值与数量不一致!";
else
txtLog.Text = "";
break;
case "ThresholdsClassCount":
if (!verifyThresholdsCount(prop.ThresholdsClass, (int)newValue))
txtLog.Text = "输入种类阀值与数量不一致!";
else
txtLog.Text = "";
break;
}
}
private void tbtnSave_Click(object sender, EventArgs e)
{
if (!Util.IsNumber(prop.ThresholdsClass.Replace("-", "").Replace(",", "").Replace(";", "").Replace(".", "")))
{
txtLog.Text = "种类阀值只可输入数字!";
return;
}
if (!verifyThresholdsCount(prop.ThresholdsClass, prop.ThresholdsClassCount))
{
txtLog.Text = "输入种类阀值与数量不一致!";
return;
}
GetParamsEvent?.Invoke(prop.serialize());
}
private void tsbtnOpenDev_Click(object sender, EventArgs e)
{
szLog = txtLog.Text = "";
this.init();
}
private bool verifyThresholdsCount(string szThresholdsClass,int iThresholdsClassCount)
{
return szThresholdsClass.Trim().TrimEnd(new char[] { ',', ';' })
.Split(new char[] { ',', ';' }).Count() == iThresholdsClassCount;
}
}
}

View File

@ -0,0 +1,230 @@
<?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="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="tsbtnOpenDev.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
n+ABAf8Cp5CdYvXLdKIAAAAASUVORK5CYII=
</value>
</data>
<data name="tbtnSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAIdSURBVFhH7ZdPaxNBGMbfIJQKlkK/QFHRi+BNS4t/LmLS
D5Bj3O7OzO68qx6C38Cb6MXSD9CqWKHQL+BN2mOr4MFjb8WzUlqR/nlnmGx2zCTZ2SxCIA/82GRm3mef
zL67SWAih2oQpw+IRmm4rANPbxk/DzWbU8CSzyDwvBI4vjTOBSXwTo/J6Dwy7gXE5f2skOEBfYJ3IJL3
/sgNiPCH9lnBQ4jjWXOGIYrTe1kAjutmtJy4fJV5CbllRocoH0DIj2a0nIRc7Xppv8DMDFA+AMNNM1pc
DEPauVi/5vjWCtDCI4jSeT3XV6MEaLcvU92ZrlXi+Cbz6hAluzRT0/NOjRIgimao7hdxrN9z+TrzspAv
9LxTVg/gBzNaTGl6BVrhqa5VsprQYlvPO2UHGLCwj/Rta5pX4FrOq8vAnbUDqO1cMjN+Yniban/mvLp4
BFCopvpO7NMD5utwaB3HbxCEf019L54Bqmc8AwTh71J07oo8XgGUiZDLwNhcKZLkBvnsWJ5+O0CNNaoE
ppan5yX4Q139HES64A1L7pJfI/ta7jCeTVglngGO6RI8Af70pm4odSyKWh/Hi8DknuX5/5tQouXpvQNC
tkCI6xDiNX38FzXugj+7SvX0I1c/ogsGyP8otVHfCX64HkIa+cmczSF16ziLqmRQgCCYpkVfeosqohWe
0C7Xzdn6qNm8RIsfUj+4/3aVReBj3RcTWQK4AF41Zkfj/gngAAAAAElFTkSuQmCC
</value>
</data>
<data name="tbtnRun.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAHnSURBVFhH7dfZK4RRGAbwzxKSklJKuVAuXCgXLlwoF8qF
Ev8Dg7GPfTf29d6fYd93Yx3bMDdISkqJZM8Yy8PRyPK9M987U74b3um5/j3nm3NOHel/fk6HOUnfYU5E
+3YC2rbj0bYVh1ZTLFpMMWjejEbTRhQaNyLRsB6B+rVw1K2FQb8ailpjCGqMwaheCULVciAqlwNQseSP
8kU/lC/4omzBB6UGL72NoafTnIxfw+e9UWLwQvGcJ2zc9/nVlX/Bi2Y9UDjtLv8SquEz7ih4i439HDVx
3bSbvAAX372YxMe4iuumqALMlb/8+LmC509K8gLcz/6CJ1mcxfMmiALc//wZVjLO4LnjRAHuhnuCxW64
eM4YUYCDiw33iDuH4eDZo0QBDi42nBU3ilHCs0aIAhxc7PYHXLLiCM8cJgpwcLHbLThnxx6uHSIKcHBx
1O5xyo49XDtIFODg4qjd4YQVR3jGAFGAg4tzfotjxSjh6VQBDi7O+Q2OHIaDp/cTBTi4uGSucWg3XDyt
jyjAwcUlc4UDMs7gGqoABxc33CX2ZXEW1/QSBTi4uOEusPctruCpPUQBDi6uV+NZ1xu88x5XcboAA1e6
Xrk4WUBNnCwgHg1q4SndEv1AUQMXsXH0iEeD6iv/wyNJrzzCmH5Y8iSuAAAAAElFTkSuQmCC
</value>
</data>
<data name="tbtnExport.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAMlSURBVFhH5VZJaBRREC1cQD15cD8oCnoQRBFEEHG5iCCK
Ry9uGBDBqLjnII2Y6V+dMQQ8GGLQgDEz//9JCOQmKlHwJO6gIorbQUHBDdxQ1Kr+v3ump7uzmE4uPnhM
d9Wr+tV/6i+QOZS3EiRK0FgHvc4Yax0hSLECmp3fNPgfyxvQ6c213hGAdE9XDG5YFB9AehutYgDQDdNA
ib3+NEq8AlpcpUTt0CnmWEU6FJ6KFRBQinqr6gNa1JD4fSyYqcQ5q4qjKz+F/AuoAJ0YG1DhRV+bCIV7
EoMCKnHIKg2kWEi2Joq7DQXnc2JMMl/RX7LaZrHQOJOa51eV8KPpZnEAlLvWKqnQ/GzyFaq0g6PfqKLW
ZiQo4VWJeqCrfrr1lsHNpPFTlfbfKUWjSczLpex4DFqPNo4KKNxRocmO/mAF8Sw0KNxvhyxDivWRoCwJ
LS1joePEy9DAm0klVG4y2ZNXxlDJDRwvwF1ihzbQ4kwkKCsqcdn/uD5noDM/C9rwZyQwC4bNx6gugA+T
AMo9EglMo8TXNFO3oIBPEv0BzX6xyWa36KsAjddCe4y5h/QfHqSluRhU43ijF1uStcSiuENTPt/XRZBW
QHfTxOQdLvfOLMmEpapxZ1xPlNgGbc44q6pCWgG6YVEkieElKHgzfH8SNC6P6HnHU7jbelOQVgD/ViaT
4rxv7w98plyof0MxN6GEy6w1Cs6tRBf9ZTXpBZTEqtDGR/Jg0ONMsE/J4IYNcqfPAB2v/N6BX6CQm+rb
skIBH/i5W52v8QKCfYA7uxl/0JQe89+zRDF3P/y41BlgKGzN/OsZEh9FC+BLQliAWGdlAB0nJ9mn7MDL
V+PzcgGOMwq0+zQsQOM+Kx0e8D2j3fnuj8X7jA+FvRUF3DXGYQJf7YKxpHhhjbE9/2z65XEIUN5myv0t
HCe86PK2245vQ4ch3QFENzXMcfqtpfftNFNb6XnbgMhaJXZR3FFiMz3fs3kN+Q5adOeZAhh8U+VlVyka
VtLBFUPJXUrO63FxhuRNSHkb7Igp4EOF74YakRolT7ekhnSiYakfajxMH7gm8RT9jwHwF2CndnhIXpjb
AAAAAElFTkSuQmCC
</value>
</data>
<data name="tbtnImport.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAMwSURBVFhH7VfNaxNREE9FVFQUq2m7u9mkn6YEIn6Agpd6
afGmhyL4DygIolBrd9/udjFt1IoXQehJ9CCiUMGrHrQXEb1YBEFEvQiKEOtHW9I02Xm+t5nXJu1mN21K
QegPhmx+b2beb+fNziahUigGPSYR57kykP/SpOU/VjJJy39SSP69osM+DK0dkgY9Msl9Vwil1ZpMoB/D
a4NsQlzqz33DxPcU4gwpujMsEyddydh6ShqgUUxRG9iGz4p35KSRWlsoZzMOFxAxIYmUJ1pT0BEznBvt
NuxAagn2pmlniwXdzKcnmYKkbdMNuFQZWHpWAbofKU+ohjPm+prOE6RcJGyoj5nOkKrlP0SMYq4IN3bN
G5atjSSu+xyXECAROIiUJ9hRPRW+zQac51ybTU9Kxnz/zG9e+p2beml6KmbBRTfRYginIAGqVXg1n/Ty
zJ+o4YyKOw4yVl33k1Vj7Pgt2IwpixBOQQIiRuGt8F2ucaGiMlGDjodsuhHTVi+giRQmhG+txvrpTpcQ
IcjAI2BNVpqkGmswspMqKbyJaIWXkl54FzGmpsWayo7DTSwIPwH83JYzKVnyFy029Cav0V2YwkVLGhpb
B+F01HQeRi16xiVFkJ8AyaZbFT33o3QTL6s3MrPNInG1EMG1Cgify+TiQ3AUQ6qHSBBwBOGouXB+nsYm
KpuA3s96iNbhxVKIBH4Cum7SPTsv/MoGPfd8PTEMhzGsCDaOZdaIbJDdRqYcIthPQIjSOtbNE2Kg+Bl/
Wrru0i0YGQrbdDvn+VOAVDlEoK8AhngK4qrlPJaN/GfJyMyJOC9rtpxhDHMF8P7gVUCqHCIoSIAAf8Ml
bBrlb72YCX1svN7n1VGNmb8L0855hO6rL6ASOq/C7g4LjrTZcKo9DWGk105AJawLWBfw/wiQB+AAUquK
xj7YVk8ysz4CMsAFBP0sXynY0NokkcycpBVeI1UONt/H3SroQJBaVUg6dBfzOw+QKoek0UNhLfsTnUZl
HUxmgzUbAYu9AUckQn/z3Pz/J265FKwBTzSQ7KQrYpWNl58JuYJbVQY7gt4GMvfVK8lKzb17nWq4xSKE
Qv8A7O40mQFf7ZYAAAAASUVORK5CYII=
</value>
</data>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>498, 17</value>
</metadata>
</root>

View File

@ -0,0 +1,148 @@
namespace AssistClient.UI
{
partial class UIForLib
{
/// <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
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UIForLib));
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.txtLog = new System.Windows.Forms.ToolStripStatusLabel();
this.propertyGrid1 = new System.Windows.Forms.PropertyGrid();
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.tbtnSave = new System.Windows.Forms.ToolStripButton();
this.tssSave = new System.Windows.Forms.ToolStripSeparator();
this.tbtnExport = new System.Windows.Forms.ToolStripButton();
this.tbtnImport = new System.Windows.Forms.ToolStripButton();
this.statusStrip1.SuspendLayout();
this.toolStrip1.SuspendLayout();
this.SuspendLayout();
//
// statusStrip1
//
this.statusStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.txtLog});
this.statusStrip1.Location = new System.Drawing.Point(0, 599);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Padding = new System.Windows.Forms.Padding(2, 0, 14, 0);
this.statusStrip1.Size = new System.Drawing.Size(1008, 22);
this.statusStrip1.TabIndex = 28;
this.statusStrip1.Text = "statusStrip1";
//
// txtLog
//
this.txtLog.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(0)))), ((int)(((byte)(0)))));
this.txtLog.Name = "txtLog";
this.txtLog.Size = new System.Drawing.Size(0, 15);
//
// propertyGrid1
//
this.propertyGrid1.Dock = System.Windows.Forms.DockStyle.Fill;
this.propertyGrid1.LineColor = System.Drawing.SystemColors.ActiveCaption;
this.propertyGrid1.Location = new System.Drawing.Point(0, 38);
this.propertyGrid1.Name = "propertyGrid1";
this.propertyGrid1.Size = new System.Drawing.Size(1008, 561);
this.propertyGrid1.TabIndex = 31;
this.propertyGrid1.ToolbarVisible = false;
this.propertyGrid1.PropertyValueChanged += new System.Windows.Forms.PropertyValueChangedEventHandler(this.propertyGrid1_PropertyValueChanged);
//
// toolStrip1
//
this.toolStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tbtnSave,
this.tssSave,
this.tbtnExport,
this.tbtnImport});
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Padding = new System.Windows.Forms.Padding(0, 0, 3, 0);
this.toolStrip1.Size = new System.Drawing.Size(1008, 38);
this.toolStrip1.TabIndex = 30;
this.toolStrip1.Text = "toolStrip7";
//
// tbtnSave
//
this.tbtnSave.Image = ((System.Drawing.Image)(resources.GetObject("tbtnSave.Image")));
this.tbtnSave.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnSave.Name = "tbtnSave";
this.tbtnSave.Size = new System.Drawing.Size(74, 33);
this.tbtnSave.Text = "保存";
this.tbtnSave.Click += new System.EventHandler(this.tbtnSave_Click);
//
// tssSave
//
this.tssSave.Name = "tssSave";
this.tssSave.Size = new System.Drawing.Size(6, 38);
//
// tbtnExport
//
this.tbtnExport.Image = ((System.Drawing.Image)(resources.GetObject("tbtnExport.Image")));
this.tbtnExport.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnExport.Name = "tbtnExport";
this.tbtnExport.Size = new System.Drawing.Size(74, 33);
this.tbtnExport.Text = "导出";
this.tbtnExport.Click += new System.EventHandler(this.tbtnExport_Click);
//
// tbtnImport
//
this.tbtnImport.Image = ((System.Drawing.Image)(resources.GetObject("tbtnImport.Image")));
this.tbtnImport.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnImport.Name = "tbtnImport";
this.tbtnImport.Size = new System.Drawing.Size(74, 33);
this.tbtnImport.Text = "导入";
this.tbtnImport.Click += new System.EventHandler(this.tbtnImport_Click);
//
// UIForLib
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.propertyGrid1);
this.Controls.Add(this.toolStrip1);
this.Controls.Add(this.statusStrip1);
this.Name = "UIForLib";
this.Size = new System.Drawing.Size(1008, 621);
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel txtLog;
private System.Windows.Forms.PropertyGrid propertyGrid1;
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripButton tbtnSave;
private System.Windows.Forms.ToolStripSeparator tssSave;
private System.Windows.Forms.ToolStripButton tbtnExport;
private System.Windows.Forms.ToolStripButton tbtnImport;
}
}

View File

@ -0,0 +1,125 @@
using Advantech.Motion;
using Newtonsoft.Json;
using AssistClient.Device;
using AssistClient.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;
namespace AssistClient.UI
{
public partial class UIForLib : UserControl
{
SynchronizationContext SyncContext = null;
public Action<string> GetParamsEvent;
//
private ForProp prop = new ForProp();
public UIForLib()
{
InitializeComponent();
propertyGrid1.PropertyValueChanged += propertyGrid1_PropertyValueChanged;
//获取UI线程同步上下文
SyncContext = SynchronizationContext.Current;
init();
}
public void init()
{
this.tbtnSave.Visible = tssSave.Visible = (GetParamsEvent != null);
txtLog.Text = "";
this.propertyGrid1.SelectedObject = prop;
}
public string getParamsData()
{
return prop.serialize();
}
public void setParamsData(string json)
{
if (json == "") return;
prop.deserialize(json);
this.propertyGrid1.Refresh();
}
private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
//其中包含了两个重要的属性OldValue和ChangeItem。
//ChangeItem是“PropertyDescriptorGridEntry”类型。一般可以通过ChangeItem.PropertyDescriptor.ComponentType查找到属性的实际类型。
//而通过ChangeItem的Label则可以查看到当前在属性编辑输入框中显示的值。
string className = e.ChangedItem.PropertyDescriptor.ComponentType.Name;
string propertyName = e.ChangedItem.PropertyDescriptor.Name;
var oldValue = e.OldValue;
var newValue = e.ChangedItem.Value;
switch (propertyName)
{
case "GotoStepIndex":
if ((int)newValue < 1)
{
prop.GotoStepIndex = 1;
this.refreshUI();
}
break;
case "LimitNum":
if ((int)newValue < 1)
{
prop.LimitNum = 1;
this.refreshUI();
}
break;
}
}
private void refreshUI()
{
SyncContext.Post(m =>
{
var result = m as string;
propertyGrid1.Refresh();
//tbtnJogOnOff.Text = (prop.AxState == AxisState.STA_AX_EXT_JOG) ? "关闭Jog" : "开启Jog";
//tbtnLeft.Enabled = tbtnRight.Enabled = (prop.AxState == AxisState.STA_AX_EXT_JOG);
}, "异步操作完成结果");
}
private void tbtnSave_Click(object sender, EventArgs e)
{
GetParamsEvent?.Invoke(prop.serialize());
}
private void tbtnExport_Click(object sender, EventArgs e)
{
prop.UniqueId = DateTime.Now.Ticks;
string filePath = FileUtil.saveAsFile($"For配置.json", "JSON|*.json");
if (filePath != "")
{
string jsonText = prop.serialize();
File.WriteAllText(filePath, jsonText);
MessageBox.Show("保存成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void tbtnImport_Click(object sender, EventArgs e)
{
string filePath = FileUtil.openFile("JSON|*.json");
if (filePath != "")
{
string jsonText = File.ReadAllText(filePath);
prop.deserialize(jsonText);
this.propertyGrid1.Refresh();
//this.propertyGrid1.SelectedObject= prop;
//MessageBox.Show("加载成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
}

View File

@ -0,0 +1,182 @@
<?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>166, 17</value>
</metadata>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>287, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="tbtnSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAIdSURBVFhH7ZdPaxNBGMbfIJQKlkK/QFHRi+BNS4t/LmLS
D5Bj3O7OzO68qx6C38Cb6MXSD9CqWKHQL+BN2mOr4MFjb8WzUlqR/nlnmGx2zCTZ2SxCIA/82GRm3mef
zL67SWAih2oQpw+IRmm4rANPbxk/DzWbU8CSzyDwvBI4vjTOBSXwTo/J6Dwy7gXE5f2skOEBfYJ3IJL3
/sgNiPCH9lnBQ4jjWXOGIYrTe1kAjutmtJy4fJV5CbllRocoH0DIj2a0nIRc7Xppv8DMDFA+AMNNM1pc
DEPauVi/5vjWCtDCI4jSeT3XV6MEaLcvU92ZrlXi+Cbz6hAluzRT0/NOjRIgimao7hdxrN9z+TrzspAv
9LxTVg/gBzNaTGl6BVrhqa5VsprQYlvPO2UHGLCwj/Rta5pX4FrOq8vAnbUDqO1cMjN+Yniban/mvLp4
BFCopvpO7NMD5utwaB3HbxCEf019L54Bqmc8AwTh71J07oo8XgGUiZDLwNhcKZLkBvnsWJ5+O0CNNaoE
ppan5yX4Q139HES64A1L7pJfI/ta7jCeTVglngGO6RI8Af70pm4odSyKWh/Hi8DknuX5/5tQouXpvQNC
tkCI6xDiNX38FzXugj+7SvX0I1c/ogsGyP8otVHfCX64HkIa+cmczSF16ziLqmRQgCCYpkVfeosqohWe
0C7Xzdn6qNm8RIsfUj+4/3aVReBj3RcTWQK4AF41Zkfj/gngAAAAAElFTkSuQmCC
</value>
</data>
<data name="tbtnExport.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAMlSURBVFhH5VZJaBRREC1cQD15cD8oCnoQRBFEEHG5iCCK
Ry9uGBDBqLh7kEbMzK/OGAIeNDFowJiZ//8kBHITlSh4EndQEcXtoKDgBm4oalX/3z3d091ZTCcXHzym
u+pV/eo/9RfIHMpdDhIlaDwCPc4oax0mSLEMmpzfNPgfyxvQ4c623mGAzJ8KDW5YEh9Auuutoh/Q9VNA
id3eNEq8AlpcpURt0CFmWUU6FJ6MFeBTijqr6gVa1JD4fSyYqcQ5q4qjszCJ/POoAJ0Y61PhRU+bCIW7
EoN8KnHAKg2kmE+2Roq7DUXnc2JMMl/RX7LSZrHQOJ2a51eV8KPpZrEPVH61VVKhhZnkK1ZpB0avUUWt
zUhQwq0SdUNn3VTrrYCbSeOnKu2/U4oGk5iXS8XxGLQeaRwhKNwW0mRHb7CieBYYFO61Q1YgxdpIUJaE
5ubR0H78ZWDgzSQMlZtI9uSVMVhyA8cLyC+yQxtocSYSlBWVuOx9XK8z0FGYAa34MxKYBYPmY1QXwIeJ
D5U/FAlMo8TXNFO3oIhPEv0+zX6xwWa36K0AjdcCe4y5h/Qf7qeluRBUw1ijF5uStcSSuENTPtfTRZBW
QFfj+OQdLvfOLMmEpapxe1xPlNgKrc4Yq6pCWgG6fkEkieElKLrTPH8SNC6N6HnHU7jTelOQVgD/hpNJ
cd6z9wU+Uy7UvaGYm1DGJdYaBedWopP+spr0AspiRWDjI3kg6HbG2adkcMP6udNngI5Xfm/HL1DMTfZs
WaGID7zcLc7XeAH+PsCd3YQ/aEqPeu9ZopS7H3xc6gwwFLZk/vUMiY+iBfAlIShArLEygPYTE+xTduDl
q/F5pQDHGQE6/zQoQOMeKx0a8D2jzfnujcX7jAeFPaEC7hrjEIGvdv5YUrywxtiefzb98jgIKHcj5f4W
jBNcdHnbbcO3gcOQ7gCiixrmGP3W0vtWmqnN9LylX2StEjso7jDxND3fs3kN+Q5ays8xBTD4psrLLiwa
UtLBFUM5v5ic1+PiDMmbkHLX2RFTwIcK3w01IjVKgW5J9elEw3If1HiQPnBV4in6HwPgL5xLdn+vDCbd
AAAAAElFTkSuQmCC
</value>
</data>
<data name="tbtnImport.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAMvSURBVFhH7VfNaxNREE9FVFQUq2m7u9mkn6YEIn6Agpd6
afGmhyL4D4gIolBrd99mu5g2asWLIPQkehBRqOBVD9qLiF4sgiCiXgTFw9aPtqRpsvN8bzOvTdrNbtoE
QegPhmx+b2beb+fNziahUigGPSYR57kylP/SouU/VjJJy39SSP69osM+DK0dkgZ9Msl9Vwil1ZpMYBDD
a4Ocgrg0mPuGie8pxBlRdGdUJk6mkrH1tDREo5iiNrANnxXvyMkg9W+hnLUdLiCSgiRSnmhPQ1fMcG50
WrADqRXYm6HdbSb0Mp++ZBqSlkU34FJlYOlZBeh+pDyhGs6E65tyniDlImFBYyzljKha/kPEKOaKcGPX
vGHZ2ljius9xCQESgYNIeYId1VPh22rAec51WPSkZCz2z+Lmpd+5qZdmZ2ImXHQTLYdwChKgmoVXi0kv
z/2OGs64uOMgY9V1P1k1Jo7fgs2YsgjhFCQgYhTeCt/VGhcqKhM16GTIohsxbfUCWkhhSvjWaqyf7vQI
EYIMPALWZKVJqrEmIzutksKbiFZ4KemFdxFjZlasqew43MSC8BPAz201k5Ilf9FmQX/yGt2FKVy0ZaC5
fRhOR1POw6hJz7ikCPITIFl0q6LnfpRu4mWNhj3fKhJXCxFcq4DwOTsXH4GjGFI9RIKAIwhHU0vn52ls
orIJ6P2sh2gDXqyESOAnoOcm3bPzws9s0HPP1xOjcBjDimDjWGaNyAbZbWTKIYL9BIQobWDdPCUGip/x
p6XnLt2CkaGwRbdznj8FSJVDBPoKYIinIa6azmPZyH+WDHtBxHlZq+mMYpgrgPcHrwJS5RBBQQIE+Bsu
YdEof+vFUjDAxut9Xh3VmPuzNO2cR+hefwGV0H0VdneZcKTDglOdGQgj/e8EVMK6gHUB/48AeQgOIFVX
NA/AtkZiz/sIsIELCPpZvlawobVJIvaCpBVeI1UONt8n3SroQJCqKyQdeov5nQdIlUPS6KGwlrXRaVzW
IcVsuGYjYLI34JhE6C+em///xC1XgjXgiSaSnXZF1Nl4+ZmQK7hVZbAj6G8iC1+9kqzV3LvXqYZbLEMo
9Bdq9jSt+sit4QAAAABJRU5ErkJggg==
</value>
</data>
</root>

View File

@ -0,0 +1,177 @@
namespace AssistClient.UI
{
partial class UIHeightDev
{
/// <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
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UIHeightDev));
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.tsbtnOpenDev = new System.Windows.Forms.ToolStripButton();
this.tbtnSave = new System.Windows.Forms.ToolStripButton();
this.tssSave = new System.Windows.Forms.ToolStripSeparator();
this.tbtnRun = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.tbtnExport = new System.Windows.Forms.ToolStripButton();
this.tbtnImport = new System.Windows.Forms.ToolStripButton();
this.propertyGrid1 = new System.Windows.Forms.PropertyGrid();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.txtLog = new System.Windows.Forms.ToolStripStatusLabel();
this.toolStrip1.SuspendLayout();
this.statusStrip1.SuspendLayout();
this.SuspendLayout();
//
// toolStrip1
//
this.toolStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tsbtnOpenDev,
this.tbtnSave,
this.tssSave,
this.tbtnRun,
this.toolStripSeparator1,
this.tbtnExport,
this.tbtnImport});
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(1008, 38);
this.toolStrip1.TabIndex = 26;
this.toolStrip1.Text = "toolStrip7";
//
// tsbtnOpenDev
//
this.tsbtnOpenDev.Image = ((System.Drawing.Image)(resources.GetObject("tsbtnOpenDev.Image")));
this.tsbtnOpenDev.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbtnOpenDev.Name = "tsbtnOpenDev";
this.tsbtnOpenDev.Size = new System.Drawing.Size(110, 33);
this.tsbtnOpenDev.Text = "打开设备";
this.tsbtnOpenDev.Click += new System.EventHandler(this.tsbtnOpenDev_Click);
//
// tbtnSave
//
this.tbtnSave.Image = ((System.Drawing.Image)(resources.GetObject("tbtnSave.Image")));
this.tbtnSave.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnSave.Name = "tbtnSave";
this.tbtnSave.Size = new System.Drawing.Size(74, 33);
this.tbtnSave.Text = "保存";
this.tbtnSave.Click += new System.EventHandler(this.tbtnSave_Click);
//
// tssSave
//
this.tssSave.Name = "tssSave";
this.tssSave.Size = new System.Drawing.Size(6, 38);
//
// tbtnRun
//
this.tbtnRun.Image = ((System.Drawing.Image)(resources.GetObject("tbtnRun.Image")));
this.tbtnRun.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnRun.Name = "tbtnRun";
this.tbtnRun.Size = new System.Drawing.Size(74, 33);
this.tbtnRun.Text = "执行";
this.tbtnRun.Click += new System.EventHandler(this.tbtnRun_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(6, 38);
//
// tbtnExport
//
this.tbtnExport.Image = ((System.Drawing.Image)(resources.GetObject("tbtnExport.Image")));
this.tbtnExport.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnExport.Name = "tbtnExport";
this.tbtnExport.Size = new System.Drawing.Size(74, 33);
this.tbtnExport.Text = "导出";
this.tbtnExport.Click += new System.EventHandler(this.tbtnExport_Click);
//
// tbtnImport
//
this.tbtnImport.Image = ((System.Drawing.Image)(resources.GetObject("tbtnImport.Image")));
this.tbtnImport.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnImport.Name = "tbtnImport";
this.tbtnImport.Size = new System.Drawing.Size(74, 33);
this.tbtnImport.Text = "导入";
this.tbtnImport.Click += new System.EventHandler(this.tbtnImport_Click);
//
// propertyGrid1
//
this.propertyGrid1.Dock = System.Windows.Forms.DockStyle.Fill;
this.propertyGrid1.LineColor = System.Drawing.SystemColors.ActiveCaption;
this.propertyGrid1.Location = new System.Drawing.Point(0, 38);
this.propertyGrid1.Name = "propertyGrid1";
this.propertyGrid1.Size = new System.Drawing.Size(1008, 561);
this.propertyGrid1.TabIndex = 33;
this.propertyGrid1.ToolbarVisible = false;
//
// statusStrip1
//
this.statusStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.txtLog});
this.statusStrip1.Location = new System.Drawing.Point(0, 599);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(1008, 22);
this.statusStrip1.TabIndex = 32;
this.statusStrip1.Text = "statusStrip1";
//
// txtLog
//
this.txtLog.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(0)))), ((int)(((byte)(0)))));
this.txtLog.Name = "txtLog";
this.txtLog.Size = new System.Drawing.Size(0, 15);
//
// UIHeightDev
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.propertyGrid1);
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.toolStrip1);
this.Name = "UIHeightDev";
this.Size = new System.Drawing.Size(1008, 621);
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripButton tbtnRun;
private System.Windows.Forms.ToolStripButton tbtnExport;
private System.Windows.Forms.ToolStripButton tbtnImport;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.PropertyGrid propertyGrid1;
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel txtLog;
private System.Windows.Forms.ToolStripButton tbtnSave;
private System.Windows.Forms.ToolStripSeparator tssSave;
private System.Windows.Forms.ToolStripButton tsbtnOpenDev;
}
}

View File

@ -0,0 +1,192 @@
using Advantech.Motion;
using Newtonsoft.Json;
using AssistClient.Device;
using AssistClient.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;
namespace AssistClient.UI
{
public partial class UIHeightDev : UserControl
{
SynchronizationContext SyncContext = null;
public Action<string> GetParamsEvent;
//
private HeightDevProp prop = new HeightDevProp(Config.HeightDev_IP,Config.HeightDev_Port);
private HeightDev dev;
public UIHeightDev()
{
InitializeComponent();
propertyGrid1.PropertyValueChanged += propertyGrid1_PropertyValueChanged;
refreshUIState();
//获取UI线程同步上下文
SyncContext = SynchronizationContext.Current;
//init();
}
private void refreshUIState()
{
foreach (ToolStripItem item in this.toolStrip1.Items)
{
if (item.Text == "打开设备")
item.Visible = (dev == null || !dev.IsInit);
else
this.propertyGrid1.Enabled = item.Enabled = !(dev == null || !dev.IsInit);
}
}
public void init()
{
this.tbtnSave.Visible = tssSave.Visible = (GetParamsEvent != null);
this.propertyGrid1.SelectedObject = prop;
dev = new HeightDev(true);
dev.WarningEvent = (level, info) =>
{
txtLog.Text = $"({level}){info}";
};
//DATA
dev.HeightEvent += new System.Action<double>((value) =>
{
prop.HeightValue = value;
this.refreshUI();
});
if (!dev.start(prop.IP, prop.Port))
{
this.closeDev();
return;
}
refreshUIState();
}
public string getParamsData()
{
return prop.serialize();
}
public void setParamsData(string json)
{
if (json == "") return;
prop.deserialize(json);
this.propertyGrid1.Refresh();
}
private void refreshUI()
{
SyncContext.Post(m =>
{
var result = m as string;
propertyGrid1.Refresh();
//tbtnJogOnOff.Text = (prop.AxState == AxisState.STA_AX_EXT_JOG) ? "关闭Jog" : "开启Jog";
//tbtnLeft.Enabled = tbtnRight.Enabled = (prop.AxState == AxisState.STA_AX_EXT_JOG);
}, "异步操作完成结果");
}
private void closeDev()
{
try
{
if (dev == null)
return;
dev.stop();
}
catch (Exception ex)
{
refreshUIState();
MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
protected override void OnHandleDestroyed(EventArgs e)
{
base.OnHandleDestroyed(e);
// 在此添加需要手动释放资源的代码
this.closeDev();
}
private void tbtnRun_Click(object sender, EventArgs e)
{
try
{
//var res=dev.setDigitalValue(prop.ChannelIndex, prop.DigitalValue);
//if (!res)
// throw new Exception("设置失败!");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void tbtnExport_Click(object sender, EventArgs e)
{
string filePath = FileUtil.saveAsFile($"Light配置.json", "JSON|*.json");
if (filePath != "")
{
string jsonText = prop.serialize();
File.WriteAllText(filePath, jsonText);
MessageBox.Show("保存成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void tbtnImport_Click(object sender, EventArgs e)
{
string filePath = FileUtil.openFile("JSON|*.json");
if (filePath != "")
{
string jsonText = File.ReadAllText(filePath);
prop.deserialize(jsonText);
this.propertyGrid1.Refresh();
//this.propertyGrid1.SelectedObject= prop;
//MessageBox.Show("加载成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
//其中包含了两个重要的属性OldValue和ChangeItem。
//ChangeItem是“PropertyDescriptorGridEntry”类型。一般可以通过ChangeItem.PropertyDescriptor.ComponentType查找到属性的实际类型。
//而通过ChangeItem的Label则可以查看到当前在属性编辑输入框中显示的值。
string className = e.ChangedItem.PropertyDescriptor.ComponentType.Name;
string propertyName = e.ChangedItem.PropertyDescriptor.Name;
var oldValue = e.OldValue;
var newValue = e.ChangedItem.Value;
switch (propertyName)
{
//case "ChannelIndex":
// if((int)newValue <1 || (int)newValue >4)
// {
// prop.ChannelIndex = (int)oldValue;
// this.refreshUI();
// }
// else
// {
// dev.getDigitalValue((int)newValue);
// }
// break;
}
}
private void tbtnSave_Click(object sender, EventArgs e)
{
GetParamsEvent?.Invoke(prop.serialize());
}
private void tsbtnOpenDev_Click(object sender, EventArgs e)
{
this.init();
}
}
}

View File

@ -0,0 +1,230 @@
<?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="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="tsbtnOpenDev.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
n+ABAf8Cp5CdYvXLdKIAAAAASUVORK5CYII=
</value>
</data>
<data name="tbtnSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAIcSURBVFhH7ZdNaxNBGMefIpQKlkK/QLFiL4I3Wyx9uYhJ
P0COZtt52Z1ntYfiN+hN9KL4AXzDFgS/gDepR2uhB4+9Fc+W0oqofWaYbHaaSbKzWYRA/vBjk5l5/vvP
7LObBEbyaAzidIWol0aoGoj0lvULUKMxDjz5BBL/VYLAbetcUBLvdJgMzj3rXkBCLWeFHI/oE7wBmbwN
R70Ght+NzzoeQxxP2TP0UZwuZQEEvrKj5STUk8xLqg92tI/yAaR6b0fLSaoXbS/jF9mZHsoH4LhjR4uL
4wbtXGxeC3zuBGjiKbB0xsx11SABtrauUt1fU6sl8Fnm1YIlX2hmzMx7NUgAxiap7idxZt4L9TTzclCP
zbxXTg/gOztaTGl6DZrsj6nVcprQ4aOZ98oN0GNhF5nb1javxJc5rzY9d9YNoLdz0c6EieNtqv2R82oT
EECjm+qQ2KcHzLf+0DqBBxCx37a+k8AA1TOcASJ2UorWXZEnKIA2kWoNOJ8uRZLcJJ89xzNsB6ixBpXE
1PEMvAS/qKs3QaYLwfBknvzq2ddyi+FswioJDHBGl6AJ4uGcaSh9LIpeH8d3gauvjuf/b0KFjmfwDkj1
AKS8ARs4a46X0eM+xKPrVE8/cs0jumCA/I9SF/2dEIbvIWRQu/ZsHulbx1tUJb0CRNEELfrcWVQRTXZO
u1yzZ+uiRuMKLV6lfvD/7SqLxPumL0ZyBHABC1BmYPLlTLYAAAAASUVORK5CYII=
</value>
</data>
<data name="tbtnRun.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAHnSURBVFhH7dfZK4RRGAbwzxKSklJKuVAuXCgXLlwoF8qF
Ev8Dg7GPfTf29d6fYd93Yx3bMDdISkqJZM8Yy8PRyPK9M987U74b3um5/j3nm3NOHel/fk6HOUnfYU5E
+3YC2rbj0bYVh1ZTLFpMMWjejEbTRhQaNyLRsB6B+rVw1K2FQb8ailpjCGqMwaheCULVciAqlwNQseSP
8kU/lC/4omzBB6UGL72NoafTnIxfw+e9UWLwQvGcJ2zc9/nVlX/Bi2Y9UDjtLv8SquEz7ih4i439HDVx
3bSbvAAX372YxMe4iuumqALMlb/8+LmC509K8gLcz/6CJ1mcxfMmiALc//wZVjLO4LnjRAHuhnuCxW64
eM4YUYCDiw33iDuH4eDZo0QBDi42nBU3ilHCs0aIAhxc7PYHXLLiCM8cJgpwcLHbLThnxx6uHSIKcHBx
1O5xyo49XDtIFODg4qjd4YQVR3jGAFGAg4tzfotjxSjh6VQBDi7O+Q2OHIaDp/cTBTi4uGSucWg3XDyt
jyjAwcUlc4UDMs7gGqoABxc33CX2ZXEW1/QSBTi4uOEusPctruCpPUQBDi6uV+NZ1xu88x5XcboAA1e6
Xrk4WUBNnCwgHg1q4SndEv1AUQMXsXH0iEeD6iv/wyNJrzzCmH5Y8iSuAAAAAElFTkSuQmCC
</value>
</data>
<data name="tbtnExport.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAMlSURBVFhH5VZJaBRREC1cQD15cD8oCnoQRBFEEHG5iCCK
Ry9uGBDBqLh7kEbMzK/OGAIelDFowJiZ//8kBHITlSh4EndQEcXtoKDgBm4oalX/3z3d091ZTCcXHzym
u+pV/eo/9RfIHMpdDhIlaDwCPc4oax0mSLEMis5vGvyP5Q3ocGdb7zBA5k+FBjcsiw8g3fVW0Q/oximg
xG5vGiVeAS2uUqI26BCzrCIdCk/GCvApRYNV9QIt6kj8PhbMVOKcVcXRWZhE/nlUgE6M9anwoqdNhMJd
iUE+lThglQZSzCdbM8XdhpLzOTEmma/oL1lps1honE7N86tG+NF0s9gHKr/aKqnQwkzylWq0A6PXqKLe
ZiQo4daIuqGzYar1VsHNpPFTjfbfKUWTSczLpep4DFqPNI4QFG4LabKjN1hJPAsMCvfaIauQYm0kKEtC
sTga2o+/DAy8mYShchPJnrwyBktu4HgB+UV2aAMtzkSCsqISl72P63UGOgozoBV/RgKzYNB8jNoC+DDx
ofKHIoFplPiaZuoWlPBJot+n2S822OwWvRWg8VpgjzH3kP7D/bQ0F4JqGmv0YlOyllgWd2jK53q6CNIK
6Goen7zD5d6ZJZmwVDVuj+uJEluh1RljVTVIK0A3LogkMbwEJXea50+CxqURPe94CndabwrSCuDfcDIp
znv2vsBnyoWGNxRzEyq4xFqj4NxKdNJfVpdeQEWsCGx8JA8E3c44+5QMblg/d/oM0PHK7+34BUq5yZ4t
K5TwgZe7xfkaL8DfB7izi/iDpvSo954lyrn7wcelzgBDYUvmX8+Q+ChaAF8SggLEGisDaD8xwT5lB16+
Gp9XC3CcEaDzT4MCNO6x0qEB3zPanO/eWLzPeFDYEyrgrjEOEfhq548lxQtrjO35Z9Mvj4OAcjdS7m/B
OMFFl7fdNnwbOAzpDiC6qGGO0W89vW+lmdpMz1v6RdYqsYPiDhNP0/M9m9eQ76Dl/BxTAINvqrzswqIh
JR1cMVTyi8l5PS7OkLwJKXedHTEFfKjw3VAjUqMU6JbUmE40rPRBjQfpA1clnqL/MQD+Atfvdob4v0Iq
AAAAAElFTkSuQmCC
</value>
</data>
<data name="tbtnImport.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAMvSURBVFhH7VfNaxNREE9FVFQUq2m7u9mkn6YEIn6Agpd6
afGmhyL4DwgKolBrd9/udjFt1IoXQehJ9CCiUMGrHrQXEb1YBEFEvQiKB9ePtqRpsvN8bzOvTdpkN21C
QegPhmx+b2beb+fNziahYigGPSYR97kylPvSouU+VjJJy31SSO69osM+DK0dkgZ9Msl+Vwil1ZpMYBDD
a4NsQlwazH7DxPcU4o4oujsqEzddydh6ShqiUUxRG9iGzwp35KaRWlsoZx2XC4iYkESqLNpT0BUz3Bud
NuxAahn2pml3mwW9zKcvmYKkbdMNuFQZWHpWAbofqbJQDXfC8zXdJ0h5SNjQGDPdEVXLfYgYhVwRbuya
NyxbG0tc9zkuIUAicBCpsmBH9VT4thpwnnMdNj0pGQv9s7B58Xdu6qWZ6ZgFF71ESyGcggSoVv7VQtLL
s3+ihjsu7jjIWHW9T1aNieO3YDOmLEA4BQmIGPm3wnelxoWKykQNOhmy6UZMW72AFpKfEr61GuunOz1C
hCADj4A1WXGSaqzJyDgqyb+JaPmXkp5/FzGmZ8Sayo7DSywIPwH83FYyKVnyF2029Cev0V2YwkNbGprb
h+F01HQfRi16xiNFkJ8AyaZbFT37o3iTctZoOHOtInG1EMG1Cgifc7LxETiKIdVDJAg4gnDUXDy/ssYm
KpuA5Z/1EG3Ai+UQCfwE9Nyke3Ze+JUJeu75emIUDmNYAWwcy6wR2SC7jUwpRLCfgBClDaybp8RA8TP+
tPTcpVswMhS26XbO86cAqVKIQF8BDPEUxFXLfSwbuc+S4cyLuHLWarmjGOYJ4P3Bq4BUKURQkAAB/oZL
2DTK33oxEwbYeL3Pq6Mas38Xp537CN3rL6ASuq/C7i4LjnTYcKozDWGk105AJawLWBfw/wiQh+AAUnVF
8wBsayTOnI8AB7iAoJ/lqwUbWpsk4sxLWv41UqVg833Sq4IOBKm6QtKht5DffYBUKSSNHgprmZ/oNC7r
YDIbrtkIWOwNOCYR+pvn5v8/ccvlYA14oolkHE9EnY2Xnwm5gltVBjuC/iYy/7VcktWad/c61XCLJQiF
/gHo7zTBoXgqhgAAAABJRU5ErkJggg==
</value>
</data>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>498, 17</value>
</metadata>
</root>

View File

@ -0,0 +1,148 @@
namespace AssistClient.UI
{
partial class UIIFLib
{
/// <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
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UIIFLib));
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.txtLog = new System.Windows.Forms.ToolStripStatusLabel();
this.propertyGrid1 = new System.Windows.Forms.PropertyGrid();
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.tbtnSave = new System.Windows.Forms.ToolStripButton();
this.tssSave = new System.Windows.Forms.ToolStripSeparator();
this.tbtnExport = new System.Windows.Forms.ToolStripButton();
this.tbtnImport = new System.Windows.Forms.ToolStripButton();
this.statusStrip1.SuspendLayout();
this.toolStrip1.SuspendLayout();
this.SuspendLayout();
//
// statusStrip1
//
this.statusStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.txtLog});
this.statusStrip1.Location = new System.Drawing.Point(0, 599);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Padding = new System.Windows.Forms.Padding(2, 0, 14, 0);
this.statusStrip1.Size = new System.Drawing.Size(1008, 22);
this.statusStrip1.TabIndex = 28;
this.statusStrip1.Text = "statusStrip1";
//
// txtLog
//
this.txtLog.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(0)))), ((int)(((byte)(0)))));
this.txtLog.Name = "txtLog";
this.txtLog.Size = new System.Drawing.Size(0, 15);
//
// propertyGrid1
//
this.propertyGrid1.Dock = System.Windows.Forms.DockStyle.Fill;
this.propertyGrid1.LineColor = System.Drawing.SystemColors.ActiveCaption;
this.propertyGrid1.Location = new System.Drawing.Point(0, 38);
this.propertyGrid1.Name = "propertyGrid1";
this.propertyGrid1.Size = new System.Drawing.Size(1008, 561);
this.propertyGrid1.TabIndex = 31;
this.propertyGrid1.ToolbarVisible = false;
this.propertyGrid1.PropertyValueChanged += new System.Windows.Forms.PropertyValueChangedEventHandler(this.propertyGrid1_PropertyValueChanged);
//
// toolStrip1
//
this.toolStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tbtnSave,
this.tssSave,
this.tbtnExport,
this.tbtnImport});
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Padding = new System.Windows.Forms.Padding(0, 0, 3, 0);
this.toolStrip1.Size = new System.Drawing.Size(1008, 38);
this.toolStrip1.TabIndex = 30;
this.toolStrip1.Text = "toolStrip7";
//
// tbtnSave
//
this.tbtnSave.Image = ((System.Drawing.Image)(resources.GetObject("tbtnSave.Image")));
this.tbtnSave.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnSave.Name = "tbtnSave";
this.tbtnSave.Size = new System.Drawing.Size(74, 33);
this.tbtnSave.Text = "保存";
this.tbtnSave.Click += new System.EventHandler(this.tbtnSave_Click);
//
// tssSave
//
this.tssSave.Name = "tssSave";
this.tssSave.Size = new System.Drawing.Size(6, 38);
//
// tbtnExport
//
this.tbtnExport.Image = ((System.Drawing.Image)(resources.GetObject("tbtnExport.Image")));
this.tbtnExport.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnExport.Name = "tbtnExport";
this.tbtnExport.Size = new System.Drawing.Size(74, 33);
this.tbtnExport.Text = "导出";
this.tbtnExport.Click += new System.EventHandler(this.tbtnExport_Click);
//
// tbtnImport
//
this.tbtnImport.Image = ((System.Drawing.Image)(resources.GetObject("tbtnImport.Image")));
this.tbtnImport.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tbtnImport.Name = "tbtnImport";
this.tbtnImport.Size = new System.Drawing.Size(74, 33);
this.tbtnImport.Text = "导入";
this.tbtnImport.Click += new System.EventHandler(this.tbtnImport_Click);
//
// UIIFLib
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.propertyGrid1);
this.Controls.Add(this.toolStrip1);
this.Controls.Add(this.statusStrip1);
this.Name = "UIIFLib";
this.Size = new System.Drawing.Size(1008, 621);
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel txtLog;
private System.Windows.Forms.PropertyGrid propertyGrid1;
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripButton tbtnSave;
private System.Windows.Forms.ToolStripSeparator tssSave;
private System.Windows.Forms.ToolStripButton tbtnExport;
private System.Windows.Forms.ToolStripButton tbtnImport;
}
}

View File

@ -0,0 +1,125 @@
using Advantech.Motion;
using Newtonsoft.Json;
using AssistClient.Device;
using AssistClient.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;
namespace AssistClient.UI
{
public partial class UIIFLib : UserControl
{
SynchronizationContext SyncContext = null;
public Action<string> GetParamsEvent;
//
private IFProp prop = new IFProp();
public UIIFLib()
{
InitializeComponent();
propertyGrid1.PropertyValueChanged += propertyGrid1_PropertyValueChanged;
//获取UI线程同步上下文
SyncContext = SynchronizationContext.Current;
init();
}
public void init()
{
this.tbtnSave.Visible = tssSave.Visible = (GetParamsEvent != null);
txtLog.Text = "";
this.propertyGrid1.SelectedObject = prop;
}
public string getParamsData()
{
return prop.serialize();
}
public void setParamsData(string json)
{
if (json == "") return;
prop.deserialize(json);
this.propertyGrid1.Refresh();
}
private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
//其中包含了两个重要的属性OldValue和ChangeItem。
//ChangeItem是“PropertyDescriptorGridEntry”类型。一般可以通过ChangeItem.PropertyDescriptor.ComponentType查找到属性的实际类型。
//而通过ChangeItem的Label则可以查看到当前在属性编辑输入框中显示的值。
string className = e.ChangedItem.PropertyDescriptor.ComponentType.Name;
string propertyName = e.ChangedItem.PropertyDescriptor.Name;
var oldValue = e.OldValue;
var newValue = e.ChangedItem.Value;
switch (propertyName)
{
case "GotoStepIndex":
if ((int)newValue < 1)
{
prop.GotoStepIndex = 1;
this.refreshUI();
}
break;
case "LimitNum":
if ((int)newValue < 1)
{
prop.LimitNum = 1;
this.refreshUI();
}
break;
}
}
private void refreshUI()
{
SyncContext.Post(m =>
{
var result = m as string;
propertyGrid1.Refresh();
//tbtnJogOnOff.Text = (prop.AxState == AxisState.STA_AX_EXT_JOG) ? "关闭Jog" : "开启Jog";
//tbtnLeft.Enabled = tbtnRight.Enabled = (prop.AxState == AxisState.STA_AX_EXT_JOG);
}, "异步操作完成结果");
}
private void tbtnSave_Click(object sender, EventArgs e)
{
GetParamsEvent?.Invoke(prop.serialize());
}
private void tbtnExport_Click(object sender, EventArgs e)
{
prop.UniqueId = DateTime.Now.Ticks;
string filePath = FileUtil.saveAsFile($"IF配置.json", "JSON|*.json");
if (filePath != "")
{
string jsonText = prop.serialize();
File.WriteAllText(filePath, jsonText);
MessageBox.Show("保存成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void tbtnImport_Click(object sender, EventArgs e)
{
string filePath = FileUtil.openFile("JSON|*.json");
if (filePath != "")
{
string jsonText = File.ReadAllText(filePath);
prop.deserialize(jsonText);
this.propertyGrid1.Refresh();
//this.propertyGrid1.SelectedObject= prop;
//MessageBox.Show("加载成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
}

View File

@ -0,0 +1,182 @@
<?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>166, 17</value>
</metadata>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>287, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="tbtnSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAIeSURBVFhH7ZdPSxtBGMZfKUiFiuAXkFb0UuitFaV/LsXo
B8gt7a47M7vzbtuD9Bv0VuxF6QdoVbRQ6BfoTerRKvTg0VvpuSK2iH/eGSabnWaS7GyWQsAHfmwyM++z
T2bf3SRwLYeGIE4fEwul4bIGPL1r/DxUrw8DS76CwMtK4PjGOBeUwPttJv3z1LgXEJePskKGR/QJ1kEk
G/7IjxDhofYJ8SfE8Zg5Qw/F6cMsAMcPZrScuHybeQn52Yz2UD6AkFtmtJyEXGt5ab/AzHRRPgDDbTNa
XAyXaOdi/ZrjqhWggScQpRN6rqP6CbC8PEJ1F7pWieO7zKtJlOzSzJCed6qfAFE0SnW/iVP9nsuVzMtC
vtbzTlk9gJtmtJjS9BY0wnNdq2Q1ocUXPe+UHaDLwg7St61pXoHvc14tuu6sHUBt55yZ8RPDe1T7K+fV
wiOAQjXVD+I7PWD2e0PrOB5AEJ6Z+nY8A1TPYAYIwuNSNO+KPF4BlImQi8DYeCmSZIp8vlmefjtAjdWv
BKaWp+cl+Etd/QpEOuMNSx6Q30L2tdxkMJuwSjwDnNIleA78xbRuKHUsilofx7PA5J7l+f+bUKLl6b0D
Qj4DISZhCe/o47+ocRf85W2qpx+5+hFdMED+R6mN+k7ww/UQ0shP5mwOqVvHWVQl3QIEwU1atNNeVBGN
8A/tcs2crYPq9Ru0+An1g/tvV1kEzuu+uJYlgCuxGmYu25SKJQAAAABJRU5ErkJggg==
</value>
</data>
<data name="tbtnExport.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAMlSURBVFhH5VZJaBRREC1cQD15cD8oCnoQRBFEEHG5iCCK
Ry9uGBDBqLjnII2Y6V+dMQQ8GGLQgDEz//9JCOQmKlHwJO6gIorbQUHBDdxQ1Kr+v3ump7uzmE4uPnhM
d9Wr+tV/6i+QOZS3EiRK0FgHvc4Yax0hSLECmp3fNPgfyxvQ6c213hGAdE9XDG5YFB9AehutYgDQDdNA
ib3+NEq8AlpcpUTt0CnmWEU6FJ6KFRBQinqr6gNa1JD4fSyYqcQ5q4qjKz+F/AuoAJ0YG1DhRV+bCIV7
EoMCKnHIKg2kWEi2Joq7DQXnc2JMMl/RX7LaZrHQOJOa51eV8KPpZnEAlLvWKqnQ/GzyFaq0g6PfqKLW
ZiQo4VWJeqCrfrr1lsHNpPFTlfbfKUWjSczLpex4DFqPNo4KKNxRocmO/mAF8Sw0KNxvhyxDivWRoCwJ
LS1joePEy9DAm0klVG4y2ZNXxlDJDRwvwF1ihzbQ4kwkKCsqcdn/uD5noDM/C9rwZyQwC4bNx6gugA+T
AMo9EglMo8TXNFO3oIBPEv0BzX6xyWa36KsAjddCe4y5h/QfHqSluRhU43ijF1uStcSiuENTPt/XRZBW
QHfTxOQdLvfOLMmEpapxZ1xPlNgGbc44q6pCWgG6YVEkieElKHgzfH8SNC6P6HnHU7jbelOQVgD/ViaT
4rxv7w98plyof0MxN6GEy6w1Cs6tRBf9ZTXpBZTEqtDGR/Jg0ONMsE/J4IYNcqfPAB2v/N6BX6CQm+rb
skIBH/i5W52v8QKCfYA7uxl/0JQe89+zRDF3P/y41BlgKGzN/OsZEh9FC+BLQliAWGdlAB0nJ9mn7MDL
V+PzcgGOMwq0+zQsQOM+Kx0e8D2j3fnuj8X7jA+FvRUF3DXGYQJf7YKxpHhhjbE9/2z65XEIUN5myv0t
HCe86PK2245vQ4ch3QFENzXMcfqtpfftNFNb6XnbgMhaJXZR3FFiMz3fs3kN+Q5adOeZAhh8U+VlVyka
VtLBFUPJXUrO63FxhuRNSHkb7Igp4EOF74YakRolT7ekhnSiYakfajxMH7gm8RT9jwHwF2CndnhIXpjb
AAAAAElFTkSuQmCC
</value>
</data>
<data name="tbtnImport.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAMwSURBVFhH7VfNaxNREE9FVFQUq2m7u9mkn6YEIn6Agpd6
afGmhyL4DygIolBrd9/udjFt1IoXQehJ9CCiUMGrHrQXEb1YBEFEvQiKEOtHW9I02Xm+t5nXJu1mN21K
QegPhmx+b2beb+fNziahUigGPSYR57kykP/SpOU/VjJJy39SSP69osM+DK0dkgY9Msl9Vwil1ZpMoB/D
a4NsQlzqz33DxPcU4gwpujMsEyddydh6ShqgUUxRG9iGz4p35KSRWlsoZzMOFxAxIYmUJ1pT0BEznBvt
NuxAagn2pmlniwXdzKcnmYKkbdMNuFQZWHpWAbofKU+ohjPm+prOE6RcJGyoj5nOkKrlP0SMYq4IN3bN
G5atjSSu+xyXECAROIiUJ9hRPRW+zQac51ybTU9Kxnz/zG9e+p2beml6KmbBRTfRYginIAGqVXg1n/Ty
zJ+o4YyKOw4yVl33k1Vj7Pgt2IwpixBOQQIiRuGt8F2ucaGiMlGDjodsuhHTVi+giRQmhG+txvrpTpcQ
IcjAI2BNVpqkGmswspMqKbyJaIWXkl54FzGmpsWayo7DTSwIPwH83JYzKVnyFy029Cav0V2YwkVLGhpb
B+F01HQeRi16xiVFkJ8AyaZbFT33o3QTL6s3MrPNInG1EMG1Cgify+TiQ3AUQ6qHSBBwBOGouXB+nsYm
KpuA3s96iNbhxVKIBH4Cum7SPTsv/MoGPfd8PTEMhzGsCDaOZdaIbJDdRqYcIthPQIjSOtbNE2Kg+Bl/
Wrru0i0YGQrbdDvn+VOAVDlEoK8AhngK4qrlPJaN/GfJyMyJOC9rtpxhDHMF8P7gVUCqHCIoSIAAf8Ml
bBrlb72YCX1svN7n1VGNmb8L0855hO6rL6ASOq/C7g4LjrTZcKo9DWGk105AJawLWBfw/wiQB+AAUquK
xj7YVk8ysz4CMsAFBP0sXynY0NokkcycpBVeI1UONt/H3SroQJBaVUg6dBfzOw+QKoek0UNhLfsTnUZl
HUxmgzUbAYu9AUckQn/z3Pz/J265FKwBTzSQ7KQrYpWNl58JuYJbVQY7gt4GMvfVK8lKzb17nWq4xSKE
Qv8A7O40mQFf7ZYAAAAASUVORK5CYII=
</value>
</data>
</root>

Some files were not shown because too many files have changed in this diff Show More